From 8e20a9aba4f8313b83fb76914dbd8033958deef1 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Wed, 11 Oct 2023 21:49:25 +0400 Subject: [PATCH 001/184] Initial commit --- zero_bin/.gitignore | 1 + zero_bin/Cargo.lock | 2534 ++++++++++++++++++++++++++++++++++ zero_bin/Cargo.toml | 24 + zero_bin/README.md | 26 + zero_bin/data/block_121.json | 189 +++ zero_bin/rust-toolchain.toml | 2 + zero_bin/rustfmt.toml | 3 + zero_bin/src/cli.rs | 16 + zero_bin/src/http.rs | 44 + zero_bin/src/init.rs | 11 + zero_bin/src/main.rs | 31 + zero_bin/src/prover_input.rs | 93 ++ zero_bin/src/stdio.rs | 19 + 13 files changed, 2993 insertions(+) create mode 100644 zero_bin/.gitignore create mode 100644 zero_bin/Cargo.lock create mode 100644 zero_bin/Cargo.toml create mode 100644 zero_bin/README.md create mode 100644 zero_bin/data/block_121.json create mode 100644 zero_bin/rust-toolchain.toml create mode 100644 zero_bin/rustfmt.toml create mode 100644 zero_bin/src/cli.rs create mode 100644 zero_bin/src/http.rs create mode 100644 zero_bin/src/init.rs create mode 100644 zero_bin/src/main.rs create mode 100644 zero_bin/src/prover_input.rs create mode 100644 zero_bin/src/stdio.rs diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/zero_bin/.gitignore @@ -0,0 +1 @@ +/target diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock new file mode 100644 index 000000000..7860a8d29 --- /dev/null +++ b/zero_bin/Cargo.lock @@ -0,0 +1,2534 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[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 = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "const-random", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[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.38", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[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 = "base64" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" + +[[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 = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "bytecheck" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets", +] + +[[package]] +name = "clap" +version = "4.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "clap_lex" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "const-random" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368a7a772ead6ce7e1de82bfb04c485f3db8ec744f72925af5735e29a22cc18e" +dependencies = [ + "const-random-macro", + "proc-macro-hack", +] + +[[package]] +name = "const-random-macro" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" +dependencies = [ + "getrandom", + "once_cell", + "proc-macro-hack", + "tiny-keccak", +] + +[[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 = "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-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.38", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "deranged" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +dependencies = [ + "serde", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "enum-as-inner" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "eth_trie_utils" +version = "0.6.0" +source = "git+https://github.com/mir-protocol/eth_trie_utils.git?rev=e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5#e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5" +dependencies = [ + "bytes", + "enum-as-inner", + "ethereum-types", + "hex", + "keccak-hash 0.10.0", + "log", + "num-traits", + "parking_lot", + "rlp", + "serde", + "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 0.8.0", + "impl-rlp", + "impl-serde", + "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 0.8.0", + "impl-rlp", + "impl-serde", + "primitive-types 0.12.2", + "uint", +] + +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "static_assertions", +] + +[[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 = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[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 = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + +[[package]] +name = "hashbrown" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +dependencies = [ + "ahash 0.8.3", + "allocator-api2", + "rayon", + "serde", +] + +[[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[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 = "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", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.9", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[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 = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +dependencies = [ + "equivalent", + "hashbrown 0.14.1", + "serde", +] + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jemalloc-sys" +version = "0.5.4+5.3.0-patched" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "jemallocator" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc" +dependencies = [ + "jemalloc-sys", + "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 = "keccak-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2bd4c29270e724d3eaadf7bdc8700af4221fc0ed771b855eadcd1b98d52851" +dependencies = [ + "primitive-types 0.10.1", + "tiny-keccak", +] + +[[package]] +name = "keccak-hash" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b286e6b663fb926e1eeb68528e69cb70ed46c6d65871a21b2215ae8154c6d3c" +dependencies = [ + "primitive-types 0.12.2", + "tiny-keccak", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" + +[[package]] +name = "linux-raw-sys" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", + "serde", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[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 = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[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", + "rand", +] + +[[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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[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 = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parity-scale-codec" +version = "3.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +dependencies = [ + "proc-macro-crate 1.3.1", + "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", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35513f630d46400a977c4cb58f78e1bfbe01434316e60c37d27b9ad6139c66d8" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9fc1b9e7057baba189b5c626e2d6f40681ae5b6eb064dc7c7834101ec8123a" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "pest_meta" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df74e9e7ec4053ceb980e7c0c8bd3594e977fde1af91daba9c928e8e8c6708d" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[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.38", +] + +[[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 = "plonky2" +version = "0.1.4" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +dependencies = [ + "ahash 0.8.3", + "anyhow", + "getrandom", + "hashbrown 0.14.1", + "itertools", + "keccak-hash 0.8.0", + "log", + "num", + "plonky2_field", + "plonky2_maybe_rayon", + "plonky2_util", + "rand", + "rand_chacha", + "serde", + "serde_json", + "static_assertions", + "unroll", +] + +[[package]] +name = "plonky2_evm" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +dependencies = [ + "anyhow", + "bytes", + "env_logger", + "eth_trie_utils", + "ethereum-types", + "hashbrown 0.14.1", + "hex-literal", + "itertools", + "jemallocator", + "keccak-hash 0.10.0", + "log", + "num", + "num-bigint", + "once_cell", + "pest", + "pest_derive", + "plonky2", + "plonky2_maybe_rayon", + "plonky2_util", + "rand", + "rand_chacha", + "rlp", + "rlp-derive", + "serde", + "serde_json", + "static_assertions", + "tiny-keccak", +] + +[[package]] +name = "plonky2_field" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +dependencies = [ + "anyhow", + "itertools", + "num", + "plonky2_util", + "rand", + "serde", + "static_assertions", + "unroll", +] + +[[package]] +name = "plonky2_maybe_rayon" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +dependencies = [ + "rayon", +] + +[[package]] +name = "plonky2_util" +version = "0.1.1" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" + +[[package]] +name = "plonky_block_proof_gen" +version = "0.1.0" +source = "git+https://github.com/mir-protocol/plonky-block-proof-gen.git?rev=6a64f9be4616931c042aaf932d2483529e1db9bf#6a64f9be4616931c042aaf932d2483529e1db9bf" +dependencies = [ + "ethereum-types", + "log", + "paste", + "plonky2", + "plonky2_evm", + "serde", +] + +[[package]] +name = "plonky_edge_block_trace_parser" +version = "0.1.0" +source = "git+https://github.com/mir-protocol/plonky-edge-block-trace-parser.git?rev=0e5f70f673439434480ef74a1f4a7430859524b4#0e5f70f673439434480ef74a1f4a7430859524b4" +dependencies = [ + "eth_trie_utils", + "ethereum-types", + "hex", + "keccak-hash 0.10.0", + "log", + "plonky2_evm", + "plonky_block_proof_gen", + "rlp", + "rlp-derive", + "rust_decimal", + "serde", + "serde_json", + "serde_with", + "thiserror", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "primitive-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" +dependencies = [ + "fixed-hash 0.7.0", + "uint", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash 0.8.0", + "impl-codec", + "impl-rlp", + "impl-serde", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[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-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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 = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[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 = "regex" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.1", + "regex-syntax 0.8.0", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.0", +] + +[[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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3cbb081b9784b07cceb8824c8583f86db4814d172ab043f3c23f7dc600bf83d" + +[[package]] +name = "rend" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +dependencies = [ + "bitvec", + "bytecheck", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "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 = "rust_decimal" +version = "1.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand", + "rkyv", + "serde", + "serde_json", +] + +[[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 = "rustix" +version = "0.38.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a74ee2d7c2581cd139b42447d7d9389b889bdaad3a73f1ebb16f2a3237bb19c" +dependencies = [ + "bitflags 2.4.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[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 = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[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_derive" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "serde_json" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +dependencies = [ + "itoa", + "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 = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca3b16a3d82c4088f343b7480a93550b3eabe1a358569c2dfe38bbcead07237" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.0.2", + "serde", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e6be15c453eb305019bfa438b1593c731f36a289a7853f7707ee29e870b3b3c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "smallvec" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[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.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "termcolor" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" +dependencies = [ + "deranged", + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +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.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.4", + "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.38", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.0.2", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[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", + "log", + "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.38", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[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 = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unroll" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad948c1cb799b1a70f836077721a92a35ac177d4daddf4c20a633786d4cf618" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "uuid" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "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.38", + "wasm-bindgen-shared", +] + +[[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.38", + "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 = "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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +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" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets", +] + +[[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.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711d82167854aff2018dfd193aa0fef5370f456732f0d5a0c59b0f1b4b907" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zero-bin" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "clap", + "ethereum-types", + "plonky2_evm", + "plonky_block_proof_gen", + "plonky_edge_block_trace_parser", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml new file mode 100644 index 000000000..6f5bc41c7 --- /dev/null +++ b/zero_bin/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "zero-bin" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +plonky_edge_block_trace_parser = { git = "https://github.com/mir-protocol/plonky-edge-block-trace-parser.git", rev = "0e5f70f673439434480ef74a1f4a7430859524b4" } +plonky_block_proof_gen = { git = "https://github.com/mir-protocol/plonky-block-proof-gen.git", rev = "6a64f9be4616931c042aaf932d2483529e1db9bf" } +plonky2_evm = { git = "https://github.com/mir-protocol/plonky2.git", rev = "0b5ac312c0f9efdcc6d85c10256d2843d42215a2" } +clap = { version = "4.4.6", features = ["derive"] } +tracing = "0.1.37" +tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } +anyhow = "1.0.75" +serde_json = "1.0.107" +serde = "1.0.188" +ethereum-types = "0.14.1" +axum = "0.6.20" +tokio = { version = "1.33.0", features = ["full"] } + +[patch.crates-io] +# TODO: Remove `eth_trie_utils` patch once version `0.7.0` is released... +eth_trie_utils = { git = "https://github.com/mir-protocol/eth_trie_utils.git", rev = "e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5" } diff --git a/zero_bin/README.md b/zero_bin/README.md new file mode 100644 index 000000000..1c4ec6f61 --- /dev/null +++ b/zero_bin/README.md @@ -0,0 +1,26 @@ +# Zero Bin + +A quick and dirty way to prove a block with plonky2. No orchestration. No distributed computation. Just a single instance of plonky2 running on a single machine. + +## Usage + +Pass JSON formatted prover input to stdin or over HTTP. See [data/block_121.json](data/block_121.json) for an example of the expected format. + +### stdin + +```bash +cat ./data/block_121.json | RUST_LOG=debug cargo r --release +``` + +### HTTP + +Start the server +```bash +RUST_LOG=debug cargo r --release -- --mode http +``` +Wait for initialization. + +Once initialized, send a request: +```bash +curl -X POST -H "Content-Type: application/json" -d @./data/block_121.json http://localhost:8080/prove +``` \ No newline at end of file diff --git a/zero_bin/data/block_121.json b/zero_bin/data/block_121.json new file mode 100644 index 000000000..f91ea1bcc --- /dev/null +++ b/zero_bin/data/block_121.json @@ -0,0 +1,189 @@ +{ + "metadata": { + "parentHash": "0x405914e496bbbd71f0d8c6d77162f010152187ccc5d8661fb0d16f1f78b4c0a7", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0xc6f86915245e154ff04ad95750306392c82efde8", + "stateRoot": "0xdb98b1bcd03585215dbb1e15321b307f1acd502123e20d002901e927eb1e7c0d", + "transactionsRoot": "0x66349cfbf1e3a6ca24b6d02481ea6a857e3b4ef896886b89b497803168eb8b6b", + "receiptsRoot": "0xf13eb20e97ae7f97e6f1209661cda58016215d6bbe7fbae912e88c5087c20667", + "logsBloom": "0x20000000000000000000000000800000000000000001000200000000000000000000000040000000000000000000000000003000000000000000001000000000001000000000000800000008000000000040000000000000000000000000000000000000020000000002000000100800200002004000000000000010000000000000000000000000000000000000040000000000000400000000000000000000000000000000000020000000010000000000000000000040000000000400000000101002000000000400000000000000000000000000000020000000000020002000000000000000000000000000000000000000000000000008100000080000", + "difficulty": "0x1", + "totalDifficulty": "0x1", + "size": "0x446", + "number": "0x79", + "gasLimit": "0x1c9c380", + "gasUsed": "0x3e928", + "timestamp": "0x651e825b", + "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f8b0c0f843b84024cbb44013a00b09a88dc08c95cc43e563a452a9223aa7bdf72e1084b5fcc0a904aae2f7061a2dd7ec7ab444b12839f64f46b058769fea44ce0e79a52798eb3807c28080f8658001a0527b2584444cf0f3f5c22df4f24e98d34da9ae7166f259a64b76717cb0fcb76aa0527b2584444cf0f3f5c22df4f24e98d34da9ae7166f259a64b76717cb0fcb76aa00000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0xadce6e5230abe012342a44e4e9b6d05997d6f015387ae0e59be924afc7ec70c1", + "nonce": "0x0000000000000000", + "hash": "0x3215285d3da9f5390af276f78561f23da49fc42e0c210847b81870d45c76fb54", + "transactions": [ + { + "nonce": "0x1021", + "gasPrice": "0x3ca49675", + "maxPriorityFeePerGas": "0x3ca49551", + "maxFeePerGas": "0x3ca498b3", + "gas": "0x1ff84", + "to": "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e", + "value": "0x0", + "input": "0x248b71fc000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000004", + "v": "0x0", + "r": "0x9870854a011f1e2d9e19d97747a1553f8790def21586886b434b1d682e8df5db", + "s": "0x35a8a125e1de786b621f99e4a40ebced58599bd66db42f2957c5787cae5e52c4", + "hash": "0xf9aab78a5b8fb3586ffba16dfda2c6221cfeffa3b090fe968650f7977c1a850b", + "from": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", + "blockHash": "0x3215285d3da9f5390af276f78561f23da49fc42e0c210847b81870d45c76fb54", + "blockNumber": "0x79", + "transactionIndex": "0x0", + "chainId": "0x7d1", + "type": "0x2" + }, + { + "nonce": "0x1022", + "gasPrice": "0x3ca33c3c", + "maxPriorityFeePerGas": "0x3ca33b18", + "maxFeePerGas": "0x3ca33e7a", + "gas": "0x1ff84", + "to": "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e", + "value": "0x0", + "input": "0x248b71fc000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000004", + "v": "0x0", + "r": "0xb77652968607b73b54caf5a1e9ecad604c06f12c9739b725d568011abb72a6a3", + "s": "0x622585790ea08cbc1b9386e1b180e83238ee3333263c75d849fa18d3f65bfcb1", + "hash": "0x92385687b7a0068beacd3fdc06fa5e84d973eedfa8d16913c146a05827e6be9f", + "from": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", + "blockHash": "0x3215285d3da9f5390af276f78561f23da49fc42e0c210847b81870d45c76fb54", + "blockNumber": "0x79", + "transactionIndex": "0x1", + "chainId": "0x7d1", + "type": "0x2" + } + ], + "uncles": [], + "baseFeePerGas": "0x124" + }, + "trace": { + "accountTrie": { + "092dd3cec26eeaa3d5cbb58fda6ad5d3038a280f23e8409eaef2147d7dd1c669": "f85180a031d1eb10fdf37ef90417d463e9e3d1dad5bab6a3e8b38ccc4eaa744250317457808080a03d30ddc70d916077f85f0821c304dbef76e595b4a1b2f149b87bee1ea39dd0a08080808080808080808080", + "35f869aed035cff0227bb6634af02dcf74b27393a2598894e00a862d5419c083": "f901b1a0f8c14d364267234dce85ddd7c58e15611d8b145448659fe025b0c7f9ece62d338080a04b4d7bb0b1f18bb7feac4596c9b8bcca0d4e1a57f5d2a93511172c822d460c00a0511436e82a7f32620c43b42c29d7896f469642fdcc1401663d04b44d444468e2a0e16fbc424e9f795c3895a477916db9b85777aafe91a64ca5b62f33f20e459830a086698225dec11e23a58f3e000245581f67842bec7da80ed5338cf783613990e4a0e5b001f6499ffcb038ac7e3384b3e8e268ad66b34c569753a7ec96a325666804a0364969fa64ed1edef177b8a87bbe20e26615582bf935df361abf64c0b7e2b589a0a8721acbe838c6537413119c5986baeed9252ce4cc888ae536037ce23c03a573a0092dd3cec26eeaa3d5cbb58fda6ad5d3038a280f23e8409eaef2147d7dd1c669a0edb7252c46e0cd0c366b8a6133e11caa531e0045f5e49c613dc88971ed19ae2aa0b89705489ca6a9e5e342a919a71c0306d39a8e138fcc3fa97adf2f9c13c0f6a380a03c249771d4d8ec7faffee6a9363bb9ec4541b86468f6345e549a99d3b0ed662ba07d52c7804c3da36c9c91aecd5410fdf7c81fa77d548d722c36a74fc4bd22739580", + "3d30ddc70d916077f85f0821c304dbef76e595b4a1b2f149b87bee1ea39dd0a0": "f85180a046490d5d18dbbbc0659037c4aa08844669ee0edd65234966c248b4f6547d138480808080808080808080a0b352e4c72d853473be5eac69cf10adfdc61a3747ec26a4b424f0a29292fc1d3780808080", + "412ab9b2d76b1c92377724ce0af56a403e73b536165cccba2e7075f4c9f62a2d": "f873a020a96499cb97ce4ad00da64466a7e05c44631052075767b72ab492533785fb4eb850f84e808ad3c21c5fdef72337f0fca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "46490d5d18dbbbc0659037c4aa08844669ee0edd65234966c248b4f6547d1384": "f8769f3eec2b84f0ba344fd4b4d2f022469febe7a772c4789acfc119eb558ab1da3db854f8528210218c033b2e3c649ca90fa48771f2a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "9df0685a238a59acbc495a3ecd6dedf9ced7c4313877ab2957897ef684348f99": "f869a020417f50fc699ebb817e23468e114836fb4578b6281ced73df8cbbfefb427243b846f8440180a01d6bbbb263e54f0f47dd5777eef1413e0b9c66611dd3fcf20efe043e44ec10c1a05deadf02dd8344275283fee394945c5e15787054e0eef21f50c960fd91323297", + "c86e63f0026de73a58da150280832d273f079383e2bd0d8f5e3c522657cf14cd": "f873a02080c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312ab850f84e808ad3c21bd8644e401dbf3fa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "e16fbc424e9f795c3895a477916db9b85777aafe91a64ca5b62f33f20e459830": "f851808080a0c86e63f0026de73a58da150280832d273f079383e2bd0d8f5e3c522657cf14cd80a05c9df0e1f025a1aaf721bd81429fd72ee03f9d803127203461a6aab1dacb2d098080808080808080808080", + "edb7252c46e0cd0c366b8a6133e11caa531e0045f5e49c613dc88971ed19ae2a": "f8718080808080a0412ab9b2d76b1c92377724ce0af56a403e73b536165cccba2e7075f4c9f62a2d8080a0d7c9bf3c020f4e9f196b7fa7e3d6921e8cddc4b8ae15587dd97f57beb343feb2808080808080a09df0685a238a59acbc495a3ecd6dedf9ced7c4313877ab2957897ef684348f9980" + }, + "storageTrie": { + "0e57bbe9bec24e1e516455ee894052ea224e4ae9abd8811ba4808fdde77c82a8": "f7a03ed6b174b60e64730a011130c9f953524c9b8b0209c3e867b353a7b046cd82559594deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "1d6bbbb263e54f0f47dd5777eef1413e0b9c66611dd3fcf20efe043e44ec10c1": "f90171a070fb015586e0a368b512032cfbd5fceda086a67bf6be30dd6bf82bccf4bae3cfa08e6f7b615d5dc6c52ebeb7a8cce3ffdfdc317748aa1f3d53a6d275e2cea447a880a05db0bc99b931e2f9e00ea24a60ed6f1c516a7b79d460953a809474286a9300d4a0bcb94c1f011fe547216d53e5d41f555ee8975c65ac930bb3c90d08a171faa9768080a03c057c0580bdfbb2cc6cf737053aa40e30f453a229e1119d22ff5c53f2252bf9a0e8b984619133ebc0f5404ee0e44de060352e18e085ed514f6750dc74e0daa9ff80a067c40ea83df3e9b196f83a9fc87ca8b2e2a5d60566773d067c41553aa5bf8d76a00e57bbe9bec24e1e516455ee894052ea224e4ae9abd8811ba4808fdde77c82a880a093a828ccb30e10ab34cdea0172558edac8157114b2835406b5688b9ead26d506a0bc1ea64f9f073abe598d717cb99d991319e00529f0774f87ad1edb3c2aeeba1fa0b31bceaf1564875cd3753188c6d491c0457329fbabc4bf1cd0f71dc8dd49fc9080", + "3488f0cb2ebe2fbb01f16fa1cc60cdd0c3a2e6cb65d335a459e0bb6468cd0ffa": "f851808080a0425ef1e6e961d2683e8f2577244b80422e7075c353366d7c430dfc27baa8183f8080808080a06778e23bfda09232af2b334565e68e4f6e1f7d7ffab3d7041a2ba1e8ac48b9b180808080808080", + "3c057c0580bdfbb2cc6cf737053aa40e30f453a229e1119d22ff5c53f2252bf9": "f7a039f133c7c61f4bd0d986fb30e6010fd6cfd571bdf11f16bb6f7d4a2702f44b009594deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "425ef1e6e961d2683e8f2577244b80422e7075c353366d7c430dfc27baa8183f": "e19f35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b11", + "5db0bc99b931e2f9e00ea24a60ed6f1c516a7b79d460953a809474286a9300d4": "f851808080808080a0fc9373511cbd22a6567d32e872d823111ab57bdcdd8bbc5b402df94174b1cba68080808080808080a0635f3543c5cb41fd454c2a67c9c110c0b4e120800d1b726b6041004bb51d6a5280", + "635f3543c5cb41fd454c2a67c9c110c0b4e120800d1b726b6041004bb51d6a52": "f851808080808080a09e13a84af1df53bb92e90fc76cbf56745cb6c71b6dde67c0c24e78507c5a7c8d8080a02661ccc381b0ebe98b07ca5f1058cf14dae77953fff05be55bb59e11b7f1571780808080808080", + "67c40ea83df3e9b196f83a9fc87ca8b2e2a5d60566773d067c41553aa5bf8d76": "f851808080a0e5f805662f65d24defa0d20e67807723b8f55090bb0dd3fa38ba9d489c458aec80808080808080a090421947a15980b99d6d0978c01011764d3200156b83942a5cf57c92c947a0088080808080", + "70fb015586e0a368b512032cfbd5fceda086a67bf6be30dd6bf82bccf4bae3cf": "f85180808080a0f833e01f279ec7f9b3ea9a88d559551bd5e2acb373e50abea678a2fa2481e74e808080808080a006ea1cfe6cc7232238541a1be734911cff7f21e1dcfe5d6d7219b62b8974dec18080808080", + "93a828ccb30e10ab34cdea0172558edac8157114b2835406b5688b9ead26d506": "f7a0319823ef1abef2d5a22cd02af62596bf1f9661224438df0b084726fe28c7d0ac9594deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "b31bceaf1564875cd3753188c6d491c0457329fbabc4bf1cd0f71dc8dd49fc90": "f7a030df3dcda05b4fbd9c655cde3d5ceb211e019e72ec816e127a59e7195f2cd7f5959485da99c8a7c2c95964c8efd687e95e632fc533d6", + "e5f805662f65d24defa0d20e67807723b8f55090bb0dd3fa38ba9d489c458aec": "e2a020274d838c103e9f9bc29f202d8ca1c20b69ed320596d739da4d0a930f8ab17a0f", + "e8b984619133ebc0f5404ee0e44de060352e18e085ed514f6750dc74e0daa9ff": "f85180808080808080808080a03488f0cb2ebe2fbb01f16fa1cc60cdd0c3a2e6cb65d335a459e0bb6468cd0ffa80a0ee2ce179d55660c94f3718928bf9ceab145fe91fa24a55552f7a15fe8400fa1b80808080" + }, + "parentStateRoot": "0x35f869aed035cff0227bb6634af02dcf74b27393a2598894e00a862d5419c083", + "transactionTraces": [ + { + "txn": "0x02f8b48207d1821021843ca49551843ca498b38301ff8494ec59ea1acb9fc9f630b2dce73790ed8be0ac036e80b844248b71fc000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000004c080a09870854a011f1e2d9e19d97747a1553f8790def21586886b434b1d682e8df5dba035a8a125e1de786b621f99e4a40ebced58599bd66db42f2957c5787cae5e52c4", + "delta": { + "0x0000000000000000000000000000000000000000": { + "address": "0x0000000000000000000000000000000000000000", + "read": true + }, + "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6": { + "address": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", + "nonce": 4130, + "read": true + }, + "0xC6F86915245e154ff04aD95750306392C82eFdE8": { + "address": "0xC6F86915245e154ff04aD95750306392C82eFdE8", + "read": true + }, + "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e": { + "address": "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x1cb7ce0668e72b96f704af9e1445a9dc6f6ac599eec355bfcfe4d3befbb001be": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "0x50a82f9cbcdfaca82fe46b4a494d325ee6dc33d1fa55b218ab142e6cc2c8a58b": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "0x9998fe8c12a1a1395171fc2449145bb1f0c273bfc80ab4ea62eb7a9cb439450c": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "0xa29f2962b8badecbf4d3036e28fcd7dcf22db126f130193790f7698ee4d3dd84": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": "0x0000000000000000000000000000000000000000000000000000000000000013" + }, + "storage_read": { + "0x0000000000000000000000000000000000000000000000000000000000000004": {}, + "0x1cb7ce0668e72b96f704af9e1445a9dc6f6ac599eec355bfcfe4d3befbb001be": {}, + "0x50a82f9cbcdfaca82fe46b4a494d325ee6dc33d1fa55b218ab142e6cc2c8a58b": {}, + "0x9998fe8c12a1a1395171fc2449145bb1f0c273bfc80ab4ea62eb7a9cb439450c": {}, + "0xa29f2962b8badecbf4d3036e28fcd7dcf22db126f130193790f7698ee4d3dd84": {}, + "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": {} + }, + "code_read": "YIBgQFI0gBVhABBXYACA/VtQYAQ2EGEAqVdgADVg4ByAY0KELg4RYQBxV4BjQoQuDhRhAWJXgGNjUiEeFGEBfleAY3CggjEUYQGuV4Bjoiy0ZRRhAd5XgGO4jU/eFGEB+leAY+mF6cUUYQIWV2EAqVZbgGMB/8mnFGEArleAYwgYEvwUYQDeV4BjCV6nsxRhAQ5XgGMjuHLdFGEBKleAYySLcfwUYQFGV1tgAID9W2EAyGAEgDYDgQGQYQDDkZBhEj9WW2ECRlZbYEBRYQDVkZBhEodWW2BAUYCRA5DzW2EA+GAEgDYDgQGQYQDzkZBhEthWW2EDGFZbYEBRYQEFkZBhE0ZWW2BAUYCRA5DzW2EBKGAEgDYDgQGQYQEjkZBhE41WW2ED9VZbAFthAURgBIA2A4EBkGEBP5GQYRPNVlthBd1WWwBbYQFgYASANgOBAZBhAVuRkGETjVZbYQjJVlsAW2EBfGAEgDYDgQGQYQF3kZBhE81WW2EI11ZbAFthAZhgBIA2A4EBkGEBk5GQYRLYVlthCg9WW2BAUWEBpZGQYRNGVltgQFGAkQOQ81thAchgBIA2A4EBkGEBw5GQYRQgVlthCrpWW2BAUWEB1ZGQYRRcVltgQFGAkQOQ81thAfhgBIA2A4EBkGEB85GQYRSjVlthC3FWWwBbYQIUYASANgOBAZBhAg+RkGEVSFZbYQxuVlsAW2ECMGAEgDYDgQGQYQIrkZBhFdBWW2ENrFZbYEBRYQI9kZBhEodWW2BAUYCRA5DzW2AAf4CsWM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe/////////////////////////////////////8ZFoJ7/////////////////////////////////////xkWFIBhAxFXUH8B/8mnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHv/////////////////////////////////////GRaCe/////////////////////////////////////8ZFhRbkFCRkFBWW2AAgHP//////////////////////////xZgAICEgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8WA2EDuldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEDsZBhFm1WW2BAUYCRA5D9W2ACYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xaQUJGQUFZbYACAYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xaQUIBz//////////////////////////8WM3P//////////////////////////xYUgGEE7FdQYANgAIJz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYAAzc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEYP8WW2EFK1dgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEFIpBhFtlWW2BAUYCRA5D9W4JgAmAAhIFSYCABkIFSYCABYAAgYABhAQAKgVSBc///////////////////////////AhkWkINz//////////////////////////8WAheQVVCBg3P//////////////////////////xaCc///////////////////////////Fn+MW+Hl6+x9W9FPcUJ9HoTz3QMUwPeyKR5bIArIx8O5JWBAUWBAUYCRA5CkUFBQVltgAICCgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8Wg3P//////////////////////////xYUYQZ9V2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQZ0kGEXRVZbYEBRgJEDkP1bYABz//////////////////////////8WgnP//////////////////////////xYDYQbsV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQbjkGEXsVZbYEBRgJEDkP1bYQb3gzODYQ3bVlthBzZXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhBy2QYRbZVltgQFGAkQOQ/VtgAYBgAIVz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACCglRhB4WRkGEYAFZbklBQgZBVUGABgGAAhHP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBgAIKCVGEH25GQYRg0VluSUFCBkFVQgWAAgIOBUmAgAZCBUmAgAWAAIGAAYQEACoFUgXP//////////////////////////wIZFpCDc///////////////////////////FgIXkFVQYAJgAIKBUmAgAZCBUmAgAWAAIGAAYQEACoFUkHP//////////////////////////wIZFpBVgIJz//////////////////////////8WhHP//////////////////////////xZ/3fJSrRviyJtpwrBo/DeNqpUrp/FjxKEWKPVaTfUjs+9gQFFgQFGAkQOQpFBQUFZbYQjTgoJhDw9WW1BQVlthCOKDg4NhBd1WW2AAgnP//////////////////////////xY7FIBhCctXUGMVC3oCYOAbe/////////////////////////////////////8ZFoJz//////////////////////////8WYxULegIzhoVgQFGEY/////8WYOAbgVJgBAFhCWeTkpGQYRifVltgIGBAUYCDA4FgAIda8RWAFWEJhlc9YACAPj1gAP1bUFBQUGBAUT1gHxlgH4IBFoIBgGBAUlCBAZBhCaqRkGEY/lZbe/////////////////////////////////////8ZFhRbYQoKV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQoBkGEZd1ZbYEBRgJEDkP1bUFBQVltgAIBgAIOBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEc///////////////////////////FpBQYABz//////////////////////////8WgXP//////////////////////////xYDYQq1V2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQqskGEWbVZbYEBRgJEDkP1bkZBQVltgAIBz//////////////////////////8WgnP//////////////////////////xYDYQsqV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQshkGEZ41ZbYEBRgJEDkP1bYAFgAINz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgVJBQkZBQVluAYANgADNz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAYQEACoFUgWD/AhkWkIMVFQIXkFVQgXP//////////////////////////xYzc///////////////////////////Fn8XMH6rOathB+iJmEWtPVm9llPyAPIgkgSJyitZN2lsMYNgQFFhDGKRkGESh1ZbYEBRgJEDkKNQUFZbYQx5hYWFYQXdVltgAIRz//////////////////////////8WOxSAYQ1mV1BjFQt6AmDgG3v/////////////////////////////////////GRaEc///////////////////////////FmMVC3oCM4iHh4dgQFGGY/////8WYOAbgVJgBAFhDQKVlJOSkZBhGlBWW2AgYEBRgIMDgWAAh1rxFYAVYQ0hVz1gAIA+PWAA/VtQUFBQYEBRPWAfGWAfggEWggGAYEBSUIEBkGENRZGQYRj+Vlt7/////////////////////////////////////xkWFFthDaVXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhDZyQYRl3VltgQFGAkQOQ/VtQUFBQUFZbYANgIFKBYABSYEBgACBgIFKAYABSYEBgACBgAJFQkVCQVJBhAQAKkARg/xaBVltgAINz//////////////////////////8Wg3P//////////////////////////xYUgGEOnVdQYANgAIVz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEYP8WW4BhDwZXUGACYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8Wg3P//////////////////////////xYUW5BQk5JQUFBWW2AAYARUkFBgAHP//////////////////////////xaDc///////////////////////////FgNhD4VXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhD3yQYRrqVltgQFGAkQOQ/VtgAHP//////////////////////////xZgAICDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8WFGEQJldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEQHZBhG1ZWW2BAUYCRA5D9W38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZIIRFWEQiVdgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEQgJBhG+hWW2BAUYCRA5D9W4Fv/////////////////////xZgAWAAhXP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBgAIKCVGEQ6pGQYRg0VluSUFCBkFVQYACBkFBgAFuDgRAVYRHPV4GFc///////////////////////////FmAAc///////////////////////////Fn/d8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz72BAUWBAUYCRA5CkhGAAgISBUmAgAZCBUmAgAWAAIGAAYQEACoFUgXP//////////////////////////wIZFpCDc///////////////////////////FgIXkFVQgYBhEbmQYRwIVluSUFCAgGERx5BhHAhWW5FQUGEQ+VZbUIBgBIGQVVBQUFBQVltgAID9W2AAgP1bYAB//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCFpBQkZBQVlthEhyBYRHnVluBFGESJ1dgAID9W1BWW2AAgTWQUGESOYFhEhNWW5KRUFBWW2AAYCCChAMSFWESVVdhElRhEd1WW1tgAGESY4SChQFhEipWW5FQUJKRUFBWW2AAgRUVkFCRkFBWW2ESgYFhEmxWW4JSUFBWW2AAYCCCAZBQYRKcYACDAYRhEnhWW5KRUFBWW2AAgZBQkZBQVlthErWBYRKiVluBFGESwFdgAID9W1BWW2AAgTWQUGES0oFhEqxWW5KRUFBWW2AAYCCChAMSFWES7ldhEu1hEd1WW1tgAGES/ISChQFhEsNWW5FQUJKRUFBWW2AAc///////////////////////////ghaQUJGQUFZbYABhEzCCYRMFVluQUJGQUFZbYRNAgWETJVZbglJQUFZbYABgIIIBkFBhE1tgAIMBhGETN1ZbkpFQUFZbYRNqgWETJVZbgRRhE3VXYACA/VtQVltgAIE1kFBhE4eBYRNhVluSkVBQVltgAIBgQIOFAxIVYROkV2ETo2ER3VZbW2AAYROyhYKGAWETeFZbklBQYCBhE8OFgoYBYRLDVluRUFCSUJKQUFZbYACAYABgYISGAxIVYRPmV2ET5WER3VZbW2AAYRP0hoKHAWETeFZbk1BQYCBhFAWGgocBYRN4VluSUFBgQGEUFoaChwFhEsNWW5FQUJJQklCSVltgAGAggoQDEhVhFDZXYRQ1YRHdVltbYABhFESEgoUBYRN4VluRUFCSkVBQVlthFFaBYRKiVluCUlBQVltgAGAgggGQUGEUcWAAgwGEYRRNVluSkVBQVlthFICBYRJsVluBFGEUi1dgAID9W1BWW2AAgTWQUGEUnYFhFHdWW5KRUFBWW2AAgGBAg4UDEhVhFLpXYRS5YRHdVltbYABhFMiFgoYBYRN4VluSUFBgIGEU2YWChgFhFI5WW5FQUJJQkpBQVltgAID9W2AAgP1bYACA/VtgAICDYB+EARJhFQhXYRUHYRTjVltbgjWQUGf//////////4ERFWEVJVdhFSRhFOhWW1tgIIMBkVCDYAGCAoMBERVhFUFXYRVAYRTtVltbklCSkFBWW2AAgGAAgGAAYICGiAMSFWEVZFdhFWNhEd1WW1tgAGEVcoiCiQFhE3hWW5VQUGAgYRWDiIKJAWETeFZblFBQYEBhFZSIgokBYRLDVluTUFBgYIYBNWf//////////4ERFWEVtVdhFbRhEeJWW1thFcGIgokBYRTyVluSUJJQUJKVUJKVkJNQVltgAIBgQIOFAxIVYRXnV2EV5mER3VZbW2AAYRX1hYKGAWETeFZbklBQYCBhFgaFgoYBYRN4VluRUFCSUJKQUFZbYACCglJgIIIBkFCSkVBQVlt/dG9rZW4gZG9lc24ndCBleGlzdAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRZXYBODYRYQVluRUGEWYoJhFiFWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEWhoFhFkpWW5BQkZBQVlt/bm90IGF1dGhvcml6ZWQAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRbDYA6DYRYQVluRUGEWzoJhFo1WW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEW8oFhFrZWW5BQkZBQVlt/ZnJvbSAhPSBvd25lcgAAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRcvYA2DYRYQVluRUGEXOoJhFvlWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEXXoFhFyJWW5BQkZBQVlt/dHJhbnNmZXIgdG8gemVybyBhZGRyZXNzAAAAAAAAAABgAIIBUlBWW2AAYRebYBiDYRYQVluRUGEXpoJhF2VWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEXyoFhF45WW5BQkZBQVlt/Tkh7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAFJgEWAEUmAkYAD9W2AAYRgLgmESolZbkVBhGBaDYRKiVluSUIKCA5BQgYERFWEYLldhGC1hF9FWW1uSkVBQVltgAGEYP4JhEqJWW5FQYRhKg2ESolZbklCCggGQUICCERVhGGJXYRhhYRfRVltbkpFQUFZbYACCglJgIIIBkFCSkVBQVltQVltgAGEYiWAAg2EYaFZbkVBhGJSCYRh5VltgAIIBkFCRkFBWW2AAYICCAZBQYRi0YACDAYZhEzdWW2EYwWAggwGFYRM3VlthGM5gQIMBhGEUTVZbgYEDYGCDAVJhGN+BYRh8VluQUJSTUFBQUFZbYACBUZBQYRj4gWESE1ZbkpFQUFZbYABgIIKEAxIVYRkUV2EZE2ER3VZbW2AAYRkihIKFAWEY6VZbkVBQkpFQUFZbf3Vuc2FmZSByZWNpcGllbnQAAAAAAAAAAAAAAAAAAAAAYACCAVJQVltgAGEZYWAQg2EWEFZbkVBhGWyCYRkrVltgIIIBkFCRkFBWW2AAYCCCAZBQgYEDYACDAVJhGZCBYRlUVluQUJGQUFZbf293bmVyID0gemVybyBhZGRyZXNzAAAAAAAAAAAAAAAAYACCAVJQVltgAGEZzWAUg2EWEFZbkVBhGdiCYRmXVltgIIIBkFCRkFBWW2AAYCCCAZBQgYEDYACDAVJhGfyBYRnAVluQUJGQUFZbgoGDN2AAg4MBUlBQUFZbYABgHxlgH4MBFpBQkZBQVltgAGEaL4OFYRhoVluTUGEaPIOFhGEaA1ZbYRpFg2EaElZbhAGQUJOSUFBQVltgAGCAggGQUGEaZWAAgwGIYRM3VlthGnJgIIMBh2ETN1ZbYRp/YECDAYZhFE1WW4GBA2BggwFSYRqSgYSGYRojVluQUJaVUFBQUFBQVlt/bWludCB0byB6ZXJvIGFkZHJlc3MAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRrUYBSDYRYQVluRUGEa34JhGp5WW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEbA4FhGsdWW5BQkZBQVlt/YWxyZWFkeSBtaW50ZWQAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRtAYA6DYRYQVluRUGEbS4JhGwpWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEbb4FhGzNWW5BQkZBQVlt/RVJDNzIxQTogcXVhbnRpdHkgdG8gbWludCB0b28gaGlgAIIBUn9naAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAgggFSUFZbYABhG9JgIoNhFhBWW5FQYRvdgmEbdlZbYECCAZBQkZBQVltgAGAgggGQUIGBA2AAgwFSYRwBgWEbxVZbkFCRkFBWW2AAYRwTgmESolZbkVB///////////////////////////////////////////+CA2EcRVdhHERhF9FWW1tgAYIBkFCRkFBW/qJkaXBmc1giEiB0ShnjEsZGBJjOoPQklISOU39GbAYmnRiOIVC0F6mikmRzb2xjQwAIEQAz", + "touched": true, + "read": true + } + }, + "receiptRoot": "0x6356499c40375bd0f85ee7d7a9e1b7ed87cb9b271e45af8cfc56a8d8d3bef39a", + "receipt": "0x02f90383018301ff84b9010020000000000000000000000000800000000000000001000200000000000000000000000040000000000000000000000000002000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000002000000100800000002004000000000000010000000000000000000000000000000000000040000000000000400000000000000000000000000000000000020000000000000000000000000000040000000000400000000001002000000000400000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000100000000000f90278f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001180f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001280f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001380f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001480", + "txnRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "hash": "0xf9aab78a5b8fb3586ffba16dfda2c6221cfeffa3b090fe968650f7977c1a850b", + "gasUsed": 130948, + "bloom": "0x20000000000000000000000000800000000000000001000200000000000000000000000040000000000000000000000000002000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000002000000100800000002004000000000000010000000000000000000000000000000000000040000000000000400000000000000000000000000000000000020000000000000000000000000000040000000000400000000001002000000000400000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000100000000000" + }, + { + "txn": "0x02f8b48207d1821022843ca33b18843ca33e7a8301ff8494ec59ea1acb9fc9f630b2dce73790ed8be0ac036e80b844248b71fc000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000004c080a0b77652968607b73b54caf5a1e9ecad604c06f12c9739b725d568011abb72a6a3a0622585790ea08cbc1b9386e1b180e83238ee3333263c75d849fa18d3f65bfcb1", + "delta": { + "0x0000000000000000000000000000000000000000": { + "address": "0x0000000000000000000000000000000000000000", + "read": true + }, + "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6": { + "address": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", + "nonce": 4131, + "read": true + }, + "0xC6F86915245e154ff04aD95750306392C82eFdE8": { + "address": "0xC6F86915245e154ff04aD95750306392C82eFdE8", + "read": true + }, + "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e": { + "address": "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x1da244b7f8b81d82e17fde46fbf307da20557945243b38ef4c87c9487b59901b": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "0x52774d722ab93275a0199da6072cca5400bf7f03bf064dd4a2b1af238c418d49": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0xb44b86596a635358e7aa60b17d32860c3f1efe2d3e53fb82c0bb23213b9c4be3": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "0xdc275f13e83bcad5305f77e8f2f06c8d9840ee8b7d606ee958f86f59784b2de3": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef" + }, + "storage_read": { + "0x0000000000000000000000000000000000000000000000000000000000000004": {}, + "0x1da244b7f8b81d82e17fde46fbf307da20557945243b38ef4c87c9487b59901b": {}, + "0x52774d722ab93275a0199da6072cca5400bf7f03bf064dd4a2b1af238c418d49": {}, + "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": {}, + "0xb44b86596a635358e7aa60b17d32860c3f1efe2d3e53fb82c0bb23213b9c4be3": {}, + "0xdc275f13e83bcad5305f77e8f2f06c8d9840ee8b7d606ee958f86f59784b2de3": {} + }, + "code_read": "YIBgQFI0gBVhABBXYACA/VtQYAQ2EGEAqVdgADVg4ByAY0KELg4RYQBxV4BjQoQuDhRhAWJXgGNjUiEeFGEBfleAY3CggjEUYQGuV4Bjoiy0ZRRhAd5XgGO4jU/eFGEB+leAY+mF6cUUYQIWV2EAqVZbgGMB/8mnFGEArleAYwgYEvwUYQDeV4BjCV6nsxRhAQ5XgGMjuHLdFGEBKleAYySLcfwUYQFGV1tgAID9W2EAyGAEgDYDgQGQYQDDkZBhEj9WW2ECRlZbYEBRYQDVkZBhEodWW2BAUYCRA5DzW2EA+GAEgDYDgQGQYQDzkZBhEthWW2EDGFZbYEBRYQEFkZBhE0ZWW2BAUYCRA5DzW2EBKGAEgDYDgQGQYQEjkZBhE41WW2ED9VZbAFthAURgBIA2A4EBkGEBP5GQYRPNVlthBd1WWwBbYQFgYASANgOBAZBhAVuRkGETjVZbYQjJVlsAW2EBfGAEgDYDgQGQYQF3kZBhE81WW2EI11ZbAFthAZhgBIA2A4EBkGEBk5GQYRLYVlthCg9WW2BAUWEBpZGQYRNGVltgQFGAkQOQ81thAchgBIA2A4EBkGEBw5GQYRQgVlthCrpWW2BAUWEB1ZGQYRRcVltgQFGAkQOQ81thAfhgBIA2A4EBkGEB85GQYRSjVlthC3FWWwBbYQIUYASANgOBAZBhAg+RkGEVSFZbYQxuVlsAW2ECMGAEgDYDgQGQYQIrkZBhFdBWW2ENrFZbYEBRYQI9kZBhEodWW2BAUYCRA5DzW2AAf4CsWM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe/////////////////////////////////////8ZFoJ7/////////////////////////////////////xkWFIBhAxFXUH8B/8mnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHv/////////////////////////////////////GRaCe/////////////////////////////////////8ZFhRbkFCRkFBWW2AAgHP//////////////////////////xZgAICEgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8WA2EDuldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEDsZBhFm1WW2BAUYCRA5D9W2ACYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xaQUJGQUFZbYACAYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xaQUIBz//////////////////////////8WM3P//////////////////////////xYUgGEE7FdQYANgAIJz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYAAzc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEYP8WW2EFK1dgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEFIpBhFtlWW2BAUYCRA5D9W4JgAmAAhIFSYCABkIFSYCABYAAgYABhAQAKgVSBc///////////////////////////AhkWkINz//////////////////////////8WAheQVVCBg3P//////////////////////////xaCc///////////////////////////Fn+MW+Hl6+x9W9FPcUJ9HoTz3QMUwPeyKR5bIArIx8O5JWBAUWBAUYCRA5CkUFBQVltgAICCgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8Wg3P//////////////////////////xYUYQZ9V2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQZ0kGEXRVZbYEBRgJEDkP1bYABz//////////////////////////8WgnP//////////////////////////xYDYQbsV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQbjkGEXsVZbYEBRgJEDkP1bYQb3gzODYQ3bVlthBzZXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhBy2QYRbZVltgQFGAkQOQ/VtgAYBgAIVz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACCglRhB4WRkGEYAFZbklBQgZBVUGABgGAAhHP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBgAIKCVGEH25GQYRg0VluSUFCBkFVQgWAAgIOBUmAgAZCBUmAgAWAAIGAAYQEACoFUgXP//////////////////////////wIZFpCDc///////////////////////////FgIXkFVQYAJgAIKBUmAgAZCBUmAgAWAAIGAAYQEACoFUkHP//////////////////////////wIZFpBVgIJz//////////////////////////8WhHP//////////////////////////xZ/3fJSrRviyJtpwrBo/DeNqpUrp/FjxKEWKPVaTfUjs+9gQFFgQFGAkQOQpFBQUFZbYQjTgoJhDw9WW1BQVlthCOKDg4NhBd1WW2AAgnP//////////////////////////xY7FIBhCctXUGMVC3oCYOAbe/////////////////////////////////////8ZFoJz//////////////////////////8WYxULegIzhoVgQFGEY/////8WYOAbgVJgBAFhCWeTkpGQYRifVltgIGBAUYCDA4FgAIda8RWAFWEJhlc9YACAPj1gAP1bUFBQUGBAUT1gHxlgH4IBFoIBgGBAUlCBAZBhCaqRkGEY/lZbe/////////////////////////////////////8ZFhRbYQoKV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQoBkGEZd1ZbYEBRgJEDkP1bUFBQVltgAIBgAIOBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEc///////////////////////////FpBQYABz//////////////////////////8WgXP//////////////////////////xYDYQq1V2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQqskGEWbVZbYEBRgJEDkP1bkZBQVltgAIBz//////////////////////////8WgnP//////////////////////////xYDYQsqV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQshkGEZ41ZbYEBRgJEDkP1bYAFgAINz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgVJBQkZBQVluAYANgADNz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAYQEACoFUgWD/AhkWkIMVFQIXkFVQgXP//////////////////////////xYzc///////////////////////////Fn8XMH6rOathB+iJmEWtPVm9llPyAPIgkgSJyitZN2lsMYNgQFFhDGKRkGESh1ZbYEBRgJEDkKNQUFZbYQx5hYWFYQXdVltgAIRz//////////////////////////8WOxSAYQ1mV1BjFQt6AmDgG3v/////////////////////////////////////GRaEc///////////////////////////FmMVC3oCM4iHh4dgQFGGY/////8WYOAbgVJgBAFhDQKVlJOSkZBhGlBWW2AgYEBRgIMDgWAAh1rxFYAVYQ0hVz1gAIA+PWAA/VtQUFBQYEBRPWAfGWAfggEWggGAYEBSUIEBkGENRZGQYRj+Vlt7/////////////////////////////////////xkWFFthDaVXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhDZyQYRl3VltgQFGAkQOQ/VtQUFBQUFZbYANgIFKBYABSYEBgACBgIFKAYABSYEBgACBgAJFQkVCQVJBhAQAKkARg/xaBVltgAINz//////////////////////////8Wg3P//////////////////////////xYUgGEOnVdQYANgAIVz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEYP8WW4BhDwZXUGACYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8Wg3P//////////////////////////xYUW5BQk5JQUFBWW2AAYARUkFBgAHP//////////////////////////xaDc///////////////////////////FgNhD4VXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhD3yQYRrqVltgQFGAkQOQ/VtgAHP//////////////////////////xZgAICDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8WFGEQJldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEQHZBhG1ZWW2BAUYCRA5D9W38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZIIRFWEQiVdgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEQgJBhG+hWW2BAUYCRA5D9W4Fv/////////////////////xZgAWAAhXP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBgAIKCVGEQ6pGQYRg0VluSUFCBkFVQYACBkFBgAFuDgRAVYRHPV4GFc///////////////////////////FmAAc///////////////////////////Fn/d8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz72BAUWBAUYCRA5CkhGAAgISBUmAgAZCBUmAgAWAAIGAAYQEACoFUgXP//////////////////////////wIZFpCDc///////////////////////////FgIXkFVQgYBhEbmQYRwIVluSUFCAgGERx5BhHAhWW5FQUGEQ+VZbUIBgBIGQVVBQUFBQVltgAID9W2AAgP1bYAB//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCFpBQkZBQVlthEhyBYRHnVluBFGESJ1dgAID9W1BWW2AAgTWQUGESOYFhEhNWW5KRUFBWW2AAYCCChAMSFWESVVdhElRhEd1WW1tgAGESY4SChQFhEipWW5FQUJKRUFBWW2AAgRUVkFCRkFBWW2ESgYFhEmxWW4JSUFBWW2AAYCCCAZBQYRKcYACDAYRhEnhWW5KRUFBWW2AAgZBQkZBQVlthErWBYRKiVluBFGESwFdgAID9W1BWW2AAgTWQUGES0oFhEqxWW5KRUFBWW2AAYCCChAMSFWES7ldhEu1hEd1WW1tgAGES/ISChQFhEsNWW5FQUJKRUFBWW2AAc///////////////////////////ghaQUJGQUFZbYABhEzCCYRMFVluQUJGQUFZbYRNAgWETJVZbglJQUFZbYABgIIIBkFBhE1tgAIMBhGETN1ZbkpFQUFZbYRNqgWETJVZbgRRhE3VXYACA/VtQVltgAIE1kFBhE4eBYRNhVluSkVBQVltgAIBgQIOFAxIVYROkV2ETo2ER3VZbW2AAYROyhYKGAWETeFZbklBQYCBhE8OFgoYBYRLDVluRUFCSUJKQUFZbYACAYABgYISGAxIVYRPmV2ET5WER3VZbW2AAYRP0hoKHAWETeFZbk1BQYCBhFAWGgocBYRN4VluSUFBgQGEUFoaChwFhEsNWW5FQUJJQklCSVltgAGAggoQDEhVhFDZXYRQ1YRHdVltbYABhFESEgoUBYRN4VluRUFCSkVBQVlthFFaBYRKiVluCUlBQVltgAGAgggGQUGEUcWAAgwGEYRRNVluSkVBQVlthFICBYRJsVluBFGEUi1dgAID9W1BWW2AAgTWQUGEUnYFhFHdWW5KRUFBWW2AAgGBAg4UDEhVhFLpXYRS5YRHdVltbYABhFMiFgoYBYRN4VluSUFBgIGEU2YWChgFhFI5WW5FQUJJQkpBQVltgAID9W2AAgP1bYACA/VtgAICDYB+EARJhFQhXYRUHYRTjVltbgjWQUGf//////////4ERFWEVJVdhFSRhFOhWW1tgIIMBkVCDYAGCAoMBERVhFUFXYRVAYRTtVltbklCSkFBWW2AAgGAAgGAAYICGiAMSFWEVZFdhFWNhEd1WW1tgAGEVcoiCiQFhE3hWW5VQUGAgYRWDiIKJAWETeFZblFBQYEBhFZSIgokBYRLDVluTUFBgYIYBNWf//////////4ERFWEVtVdhFbRhEeJWW1thFcGIgokBYRTyVluSUJJQUJKVUJKVkJNQVltgAIBgQIOFAxIVYRXnV2EV5mER3VZbW2AAYRX1hYKGAWETeFZbklBQYCBhFgaFgoYBYRN4VluRUFCSUJKQUFZbYACCglJgIIIBkFCSkVBQVlt/dG9rZW4gZG9lc24ndCBleGlzdAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRZXYBODYRYQVluRUGEWYoJhFiFWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEWhoFhFkpWW5BQkZBQVlt/bm90IGF1dGhvcml6ZWQAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRbDYA6DYRYQVluRUGEWzoJhFo1WW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEW8oFhFrZWW5BQkZBQVlt/ZnJvbSAhPSBvd25lcgAAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRcvYA2DYRYQVluRUGEXOoJhFvlWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEXXoFhFyJWW5BQkZBQVlt/dHJhbnNmZXIgdG8gemVybyBhZGRyZXNzAAAAAAAAAABgAIIBUlBWW2AAYRebYBiDYRYQVluRUGEXpoJhF2VWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEXyoFhF45WW5BQkZBQVlt/Tkh7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAFJgEWAEUmAkYAD9W2AAYRgLgmESolZbkVBhGBaDYRKiVluSUIKCA5BQgYERFWEYLldhGC1hF9FWW1uSkVBQVltgAGEYP4JhEqJWW5FQYRhKg2ESolZbklCCggGQUICCERVhGGJXYRhhYRfRVltbkpFQUFZbYACCglJgIIIBkFCSkVBQVltQVltgAGEYiWAAg2EYaFZbkVBhGJSCYRh5VltgAIIBkFCRkFBWW2AAYICCAZBQYRi0YACDAYZhEzdWW2EYwWAggwGFYRM3VlthGM5gQIMBhGEUTVZbgYEDYGCDAVJhGN+BYRh8VluQUJSTUFBQUFZbYACBUZBQYRj4gWESE1ZbkpFQUFZbYABgIIKEAxIVYRkUV2EZE2ER3VZbW2AAYRkihIKFAWEY6VZbkVBQkpFQUFZbf3Vuc2FmZSByZWNpcGllbnQAAAAAAAAAAAAAAAAAAAAAYACCAVJQVltgAGEZYWAQg2EWEFZbkVBhGWyCYRkrVltgIIIBkFCRkFBWW2AAYCCCAZBQgYEDYACDAVJhGZCBYRlUVluQUJGQUFZbf293bmVyID0gemVybyBhZGRyZXNzAAAAAAAAAAAAAAAAYACCAVJQVltgAGEZzWAUg2EWEFZbkVBhGdiCYRmXVltgIIIBkFCRkFBWW2AAYCCCAZBQgYEDYACDAVJhGfyBYRnAVluQUJGQUFZbgoGDN2AAg4MBUlBQUFZbYABgHxlgH4MBFpBQkZBQVltgAGEaL4OFYRhoVluTUGEaPIOFhGEaA1ZbYRpFg2EaElZbhAGQUJOSUFBQVltgAGCAggGQUGEaZWAAgwGIYRM3VlthGnJgIIMBh2ETN1ZbYRp/YECDAYZhFE1WW4GBA2BggwFSYRqSgYSGYRojVluQUJaVUFBQUFBQVlt/bWludCB0byB6ZXJvIGFkZHJlc3MAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRrUYBSDYRYQVluRUGEa34JhGp5WW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEbA4FhGsdWW5BQkZBQVlt/YWxyZWFkeSBtaW50ZWQAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRtAYA6DYRYQVluRUGEbS4JhGwpWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEbb4FhGzNWW5BQkZBQVlt/RVJDNzIxQTogcXVhbnRpdHkgdG8gbWludCB0b28gaGlgAIIBUn9naAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAgggFSUFZbYABhG9JgIoNhFhBWW5FQYRvdgmEbdlZbYECCAZBQkZBQVltgAGAgggGQUIGBA2AAgwFSYRwBgWEbxVZbkFCRkFBWW2AAYRwTgmESolZbkVB///////////////////////////////////////////+CA2EcRVdhHERhF9FWW1tgAYIBkFCRkFBW/qJkaXBmc1giEiB0ShnjEsZGBJjOoPQklISOU39GbAYmnRiOIVC0F6mikmRzb2xjQwAIEQAz", + "touched": true, + "read": true + } + }, + "receiptRoot": "0xf13eb20e97ae7f97e6f1209661cda58016215d6bbe7fbae912e88c5087c20667", + "receipt": "0x02f90383018303e928b9010000000000000000000000000000000000000000000001000200000000000000000000000000000000000000000000000000001000000000000000001000000000001000000000000800000008000000000040000000000000000000000000000000000000020000000002000000100800200002000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000100002000000000000000000000000000000000000000020000000000020002000000000000000000000000000000000000000000000000008100000080000f90278f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001580f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001680f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001780f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001880", + "txnRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "hash": "0x92385687b7a0068beacd3fdc06fa5e84d973eedfa8d16913c146a05827e6be9f", + "gasUsed": 125348, + "bloom": "0x00000000000000000000000000000000000000000001000200000000000000000000000000000000000000000000000000001000000000000000001000000000001000000000000800000008000000000040000000000000000000000000000000000000020000000002000000100800200002000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000100002000000000000000000000000000000000000000020000000000020002000000000000000000000000000000000000000000000000008100000080000" + } + ] + } +} diff --git a/zero_bin/rust-toolchain.toml b/zero_bin/rust-toolchain.toml new file mode 100644 index 000000000..5d56faf9a --- /dev/null +++ b/zero_bin/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "nightly" diff --git a/zero_bin/rustfmt.toml b/zero_bin/rustfmt.toml new file mode 100644 index 000000000..bccbdb6fc --- /dev/null +++ b/zero_bin/rustfmt.toml @@ -0,0 +1,3 @@ +unstable_features = true +group_imports = "StdExternalCrate" +wrap_comments = true diff --git a/zero_bin/src/cli.rs b/zero_bin/src/cli.rs new file mode 100644 index 000000000..cf871b726 --- /dev/null +++ b/zero_bin/src/cli.rs @@ -0,0 +1,16 @@ +use clap::{Parser, ValueEnum}; + +#[derive(Parser)] +pub(crate) struct Cli { + #[arg(short, long, value_enum, default_value_t = Mode::StdIo)] + pub(crate) mode: Mode, + #[arg(short, long, default_value_t = 8080)] + pub(crate) port: u16, +} + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum, Default)] +pub(crate) enum Mode { + #[default] + StdIo, + Http, +} diff --git a/zero_bin/src/http.rs b/zero_bin/src/http.rs new file mode 100644 index 000000000..1e3c72838 --- /dev/null +++ b/zero_bin/src/http.rs @@ -0,0 +1,44 @@ +use std::{net::SocketAddr, sync::Arc}; + +use anyhow::Result; +use axum::{http::StatusCode, routing::post, Json, Router}; +use plonky_block_proof_gen::prover_state::ProverState; +use tracing::{debug, error, info}; + +use crate::prover_input::ProverInput; + +/// The main function for the HTTP mode. +pub(crate) async fn http_main(p_state: ProverState, port: u16) -> Result<()> { + let addr = SocketAddr::from(([0, 0, 0, 0], port)); + debug!("listening on {}", addr); + + let p_state = Arc::new(p_state); + let app = Router::new() + .route( + "/prove", + post({ + let p_state = p_state.clone(); + move |body| prove(body, p_state) + }), + ) + .with_state(Arc::new(p_state)); + + Ok(axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await?) +} + +async fn prove(Json(payload): Json, p_state: Arc) -> StatusCode { + debug!("Received payload: {:#?}", payload); + + match payload.prove(p_state.as_ref()) { + Ok(b_proof) => { + info!("Successfully proved {b_proof:#?}"); + StatusCode::OK + } + Err(e) => { + error!("Error while proving: {e:#?}"); + StatusCode::INTERNAL_SERVER_ERROR + } + } +} diff --git a/zero_bin/src/init.rs b/zero_bin/src/init.rs new file mode 100644 index 000000000..02ae73a93 --- /dev/null +++ b/zero_bin/src/init.rs @@ -0,0 +1,11 @@ +use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; +pub(crate) fn init() { + tracing_subscriber::Registry::default() + .with( + tracing_subscriber::fmt::layer() + .pretty() + .with_span_events(FmtSpan::CLOSE) + .with_filter(EnvFilter::from_default_env()), + ) + .init(); +} diff --git a/zero_bin/src/main.rs b/zero_bin/src/main.rs new file mode 100644 index 000000000..2faf94dc1 --- /dev/null +++ b/zero_bin/src/main.rs @@ -0,0 +1,31 @@ +#![feature(iter_array_chunks)] + +use anyhow::Result; +use clap::Parser; +use cli::Mode; +use plonky_block_proof_gen::prover_state::ProverStateBuilder; + +mod cli; +mod http; +mod init; +mod prover_input; +mod stdio; + +#[tokio::main] +async fn main() -> Result<()> { + init::init(); + + let cli = cli::Cli::parse(); + let p_state = ProverStateBuilder::default().build(); + + match cli.mode { + Mode::StdIo => { + stdio::stdio_main(p_state)?; + } + Mode::Http => { + http::http_main(p_state, cli.port).await?; + } + } + + Ok(()) +} diff --git a/zero_bin/src/prover_input.rs b/zero_bin/src/prover_input.rs new file mode 100644 index 000000000..ad0f3f9f9 --- /dev/null +++ b/zero_bin/src/prover_input.rs @@ -0,0 +1,93 @@ +use anyhow::Result; +use ethereum_types::{Address, Bloom, U256}; +use plonky2_evm::proof::BlockMetadata; +use plonky_block_proof_gen::{ + proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, + proof_types::{BlockLevelData, GeneratedBlockProof}, + prover_state::ProverState, +}; +use plonky_edge_block_trace_parser::edge_payloads::EdgeBlockTrace; +use serde::Deserialize; +use tracing::debug; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct EdgeBlockMetadata { + pub(crate) miner: Address, + pub(crate) logs_bloom: Bloom, + pub(crate) difficulty: U256, + pub(crate) number: U256, + pub(crate) gas_limit: U256, + pub(crate) gas_used: U256, + pub(crate) timestamp: U256, + pub(crate) base_fee_per_gas: U256, +} + +const MATIC_CHAIN_ID: usize = 2001; + +impl From for BlockMetadata { + fn from(v: EdgeBlockMetadata) -> Self { + let mut block_bloom = [U256::zero(); 8]; + + // Note that bloom can be empty. + for (i, v) in v + .logs_bloom + .as_bytes() + .iter() + .array_chunks::<32>() + .enumerate() + { + block_bloom[i] = U256::from_big_endian(&v.iter().map(|&b| *b).collect::>()[..]); + } + + Self { + block_beneficiary: v.miner, + block_timestamp: v.timestamp, + block_number: v.number, + block_difficulty: v.difficulty, + block_gaslimit: v.gas_limit, + block_chain_id: MATIC_CHAIN_ID.into(), + block_base_fee: v.base_fee_per_gas, + block_gas_used: v.gas_used, + block_bloom, + } + } +} + +#[derive(Debug, Deserialize)] +pub(crate) struct ProverInput { + pub(crate) trace: EdgeBlockTrace, + pub(crate) metadata: EdgeBlockMetadata, +} + +impl ProverInput { + pub(crate) fn prove(self, p_state: &ProverState) -> Result { + let number = self.metadata.number; + let b_data = BlockLevelData { + b_meta: self.metadata.into(), + b_hashes: Default::default(), + }; + + debug!("Proving block #{number}: {b_data:#?}"); + + let txs = self.trace.into_txn_proof_gen_payloads(number.as_u64())?; + + let mut txn_proofs = txs + .into_iter() + .map(|tx| generate_txn_proof(p_state, tx, b_data.clone())); + + // We should have at least two txs in a block, given dummy padding in + // `plonky_edge_block_trace_parser`. + let (fst, snd) = ( + txn_proofs.next().expect("Expected at least two txns")?, + txn_proofs.next().expect("Expected at least two txns")?, + ); + + let agg_proof = txn_proofs.try_fold( + generate_agg_proof(p_state, &fst.into(), &snd.into(), b_data.clone())?, + |agg, tx| generate_agg_proof(p_state, &agg.into(), &tx?.into(), b_data.clone()), + )?; + + Ok(generate_block_proof(p_state, None, &agg_proof, b_data)?) + } +} diff --git a/zero_bin/src/stdio.rs b/zero_bin/src/stdio.rs new file mode 100644 index 000000000..0c2ced5a2 --- /dev/null +++ b/zero_bin/src/stdio.rs @@ -0,0 +1,19 @@ +use std::io::Read; + +use anyhow::Result; +use plonky_block_proof_gen::prover_state::ProverState; +use tracing::info; + +use crate::prover_input::ProverInput; + +/// The main function for the stdio mode. +pub(crate) fn stdio_main(p_state: ProverState) -> Result<()> { + let mut buffer = String::new(); + std::io::stdin().read_to_string(&mut buffer)?; + + let input: ProverInput = serde_json::from_str(&buffer)?; + let proof = input.prove(&p_state)?; + info!("Successfully proved {:#?}", proof); + + Ok(()) +} From 90efff439640089b6807ef4b2075bd52fc084409 Mon Sep 17 00:00:00 2001 From: cpu Date: Wed, 11 Oct 2023 21:53:39 +0400 Subject: [PATCH 002/184] Add CI --- zero_bin/.github/workflows/ci.yml | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 zero_bin/.github/workflows/ci.yml diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml new file mode 100644 index 000000000..5acedee79 --- /dev/null +++ b/zero_bin/.github/workflows/ci.yml @@ -0,0 +1,37 @@ +on: [push, pull_request] +name: ci + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install protoc + run: sudo apt-get install -y protobuf-compiler + + - name: Install toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + profile: minimal + override: true + components: rustfmt, clippy + + - name: Run cargo clippy + uses: actions-rs/cargo@v1 + with: + command: clippy + args: -- -D warnings + + - name: Run cargo fmt --check + uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check + + - name: Run cargo test + uses: actions-rs/cargo@v1 + with: + command: test From 3626eba421bdf540a93cd4ede804d1a0154b2f41 Mon Sep 17 00:00:00 2001 From: cpu Date: Wed, 11 Oct 2023 22:07:56 +0400 Subject: [PATCH 003/184] Add note about http mode --- zero_bin/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zero_bin/README.md b/zero_bin/README.md index 1c4ec6f61..f4ec635fe 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -6,6 +6,9 @@ A quick and dirty way to prove a block with plonky2. No orchestration. No distri Pass JSON formatted prover input to stdin or over HTTP. See [data/block_121.json](data/block_121.json) for an example of the expected format. +Initializing plonky2 can take a while. +HTTP mode will allow you to run multiple proof jobs without re-initializing plonky2 between job invocations. Otherwise, every time the process is started, plonky2 will need to be re-initialized. + ### stdin ```bash From 9b5de546e936a94b69b61f80a243804c0ad4edaf Mon Sep 17 00:00:00 2001 From: cpu Date: Wed, 11 Oct 2023 22:15:11 +0400 Subject: [PATCH 004/184] Remove unnecessary with_state --- zero_bin/src/http.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/zero_bin/src/http.rs b/zero_bin/src/http.rs index 1e3c72838..e7bae547e 100644 --- a/zero_bin/src/http.rs +++ b/zero_bin/src/http.rs @@ -13,15 +13,13 @@ pub(crate) async fn http_main(p_state: ProverState, port: u16) -> Result<()> { debug!("listening on {}", addr); let p_state = Arc::new(p_state); - let app = Router::new() - .route( - "/prove", - post({ - let p_state = p_state.clone(); - move |body| prove(body, p_state) - }), - ) - .with_state(Arc::new(p_state)); + let app = Router::new().route( + "/prove", + post({ + let p_state = p_state.clone(); + move |body| prove(body, p_state) + }), + ); Ok(axum::Server::bind(&addr) .serve(app.into_make_service()) From 187958da11d85e1c108f9e2229ca21012f9aae93 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 11 Oct 2023 13:25:28 -0600 Subject: [PATCH 005/184] Updated deps --- zero_bin/Cargo.lock | 14 +++++++------- zero_bin/Cargo.toml | 6 +++--- zero_bin/src/prover_input.rs | 24 +++++++++++++++++------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 7860a8d29..dc43d5509 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1384,7 +1384,7 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" dependencies = [ "ahash 0.8.3", "anyhow", @@ -1408,7 +1408,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" dependencies = [ "anyhow", "bytes", @@ -1442,7 +1442,7 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" dependencies = [ "anyhow", "itertools", @@ -1457,7 +1457,7 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" dependencies = [ "rayon", ] @@ -1465,12 +1465,12 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=0b5ac312c0f9efdcc6d85c10256d2843d42215a2#0b5ac312c0f9efdcc6d85c10256d2843d42215a2" +source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/mir-protocol/plonky-block-proof-gen.git?rev=6a64f9be4616931c042aaf932d2483529e1db9bf#6a64f9be4616931c042aaf932d2483529e1db9bf" +source = "git+https://github.com/mir-protocol/plonky-block-proof-gen.git?rev=73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc#73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc" dependencies = [ "ethereum-types", "log", @@ -1483,7 +1483,7 @@ dependencies = [ [[package]] name = "plonky_edge_block_trace_parser" version = "0.1.0" -source = "git+https://github.com/mir-protocol/plonky-edge-block-trace-parser.git?rev=0e5f70f673439434480ef74a1f4a7430859524b4#0e5f70f673439434480ef74a1f4a7430859524b4" +source = "git+https://github.com/mir-protocol/plonky-edge-block-trace-parser.git?rev=1bc20699b91201291294914772a30de84ffdcc58#1bc20699b91201291294914772a30de84ffdcc58" dependencies = [ "eth_trie_utils", "ethereum-types", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 6f5bc41c7..251c46546 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -6,9 +6,9 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -plonky_edge_block_trace_parser = { git = "https://github.com/mir-protocol/plonky-edge-block-trace-parser.git", rev = "0e5f70f673439434480ef74a1f4a7430859524b4" } -plonky_block_proof_gen = { git = "https://github.com/mir-protocol/plonky-block-proof-gen.git", rev = "6a64f9be4616931c042aaf932d2483529e1db9bf" } -plonky2_evm = { git = "https://github.com/mir-protocol/plonky2.git", rev = "0b5ac312c0f9efdcc6d85c10256d2843d42215a2" } +plonky_edge_block_trace_parser = { git = "https://github.com/mir-protocol/plonky-edge-block-trace-parser.git", rev = "1bc20699b91201291294914772a30de84ffdcc58" } +plonky_block_proof_gen = { git = "https://github.com/mir-protocol/plonky-block-proof-gen.git", rev = "73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc" } +plonky2_evm = { git = "https://github.com/mir-protocol/plonky2.git", rev = "762e6f07b834df04be8cd290f07465a28c392c6d" } clap = { version = "4.4.6", features = ["derive"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } diff --git a/zero_bin/src/prover_input.rs b/zero_bin/src/prover_input.rs index ad0f3f9f9..355f46d0d 100644 --- a/zero_bin/src/prover_input.rs +++ b/zero_bin/src/prover_input.rs @@ -1,21 +1,24 @@ use anyhow::Result; -use ethereum_types::{Address, Bloom, U256}; +use ethereum_types::{Address, Bloom, U256, H256}; use plonky2_evm::proof::BlockMetadata; use plonky_block_proof_gen::{ proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, - proof_types::{BlockLevelData, GeneratedBlockProof}, + proof_types::{BlockLevelData, GeneratedBlockProof, OtherBlockData}, prover_state::ProverState, }; use plonky_edge_block_trace_parser::edge_payloads::EdgeBlockTrace; use serde::Deserialize; use tracing::debug; +const GENESIS_STATE_ROOT: H256 = H256::zero(); + #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct EdgeBlockMetadata { pub(crate) miner: Address, pub(crate) logs_bloom: Bloom, pub(crate) difficulty: U256, + pub(crate) mix_hash: H256, pub(crate) number: U256, pub(crate) gas_limit: U256, pub(crate) gas_used: U256, @@ -45,6 +48,7 @@ impl From for BlockMetadata { block_timestamp: v.timestamp, block_number: v.number, block_difficulty: v.difficulty, + block_random: v.mix_hash, block_gaslimit: v.gas_limit, block_chain_id: MATIC_CHAIN_ID.into(), block_base_fee: v.base_fee_per_gas, @@ -63,18 +67,24 @@ pub(crate) struct ProverInput { impl ProverInput { pub(crate) fn prove(self, p_state: &ProverState) -> Result { let number = self.metadata.number; + let b_data = BlockLevelData { b_meta: self.metadata.into(), b_hashes: Default::default(), }; - debug!("Proving block #{number}: {b_data:#?}"); + let other_data = OtherBlockData { + b_data, + genesis_state_trie_root: GENESIS_STATE_ROOT, + }; + + debug!("Proving block #{number}: {other_data:#?}"); let txs = self.trace.into_txn_proof_gen_payloads(number.as_u64())?; let mut txn_proofs = txs .into_iter() - .map(|tx| generate_txn_proof(p_state, tx, b_data.clone())); + .map(|tx| generate_txn_proof(p_state, tx, other_data.clone())); // We should have at least two txs in a block, given dummy padding in // `plonky_edge_block_trace_parser`. @@ -84,10 +94,10 @@ impl ProverInput { ); let agg_proof = txn_proofs.try_fold( - generate_agg_proof(p_state, &fst.into(), &snd.into(), b_data.clone())?, - |agg, tx| generate_agg_proof(p_state, &agg.into(), &tx?.into(), b_data.clone()), + generate_agg_proof(p_state, &fst.into(), &snd.into(), other_data.clone())?, + |agg, tx| generate_agg_proof(p_state, &agg.into(), &tx?.into(), other_data.clone()), )?; - Ok(generate_block_proof(p_state, None, &agg_proof, b_data)?) + Ok(generate_block_proof(p_state, None, &agg_proof, other_data)?) } } From 67702d1b48e620d1f0663d7c98ce1930c4414cc9 Mon Sep 17 00:00:00 2001 From: cpu Date: Tue, 24 Oct 2023 06:05:17 -0700 Subject: [PATCH 006/184] Instrument with paladin --- zero_bin/.env | 1 + zero_bin/Cargo.lock | 1397 ++++++++++++++++++--------- zero_bin/Cargo.toml | 28 +- zero_bin/README.md | 110 ++- zero_bin/data/block_121.json | 189 ---- zero_bin/leader/Cargo.toml | 19 + zero_bin/{ => leader}/src/cli.rs | 6 + zero_bin/{ => leader}/src/http.rs | 14 +- zero_bin/{ => leader}/src/init.rs | 2 +- zero_bin/leader/src/main.rs | 32 + zero_bin/leader/src/prover_input.rs | 46 + zero_bin/{ => leader}/src/stdio.rs | 6 +- zero_bin/ops/Cargo.toml | 15 + zero_bin/ops/src/lib.rs | 96 ++ zero_bin/src/main.rs | 31 - zero_bin/src/prover_input.rs | 103 -- zero_bin/worker/Cargo.toml | 14 + zero_bin/worker/src/init.rs | 11 + zero_bin/worker/src/main.rs | 25 + 19 files changed, 1354 insertions(+), 791 deletions(-) create mode 100644 zero_bin/.env delete mode 100644 zero_bin/data/block_121.json create mode 100644 zero_bin/leader/Cargo.toml rename zero_bin/{ => leader}/src/cli.rs (59%) rename zero_bin/{ => leader}/src/http.rs (67%) rename zero_bin/{ => leader}/src/init.rs (93%) create mode 100644 zero_bin/leader/src/main.rs create mode 100644 zero_bin/leader/src/prover_input.rs rename zero_bin/{ => leader}/src/stdio.rs (68%) create mode 100644 zero_bin/ops/Cargo.toml create mode 100644 zero_bin/ops/src/lib.rs delete mode 100644 zero_bin/src/main.rs delete mode 100644 zero_bin/src/prover_input.rs create mode 100644 zero_bin/worker/Cargo.toml create mode 100644 zero_bin/worker/src/init.rs create mode 100644 zero_bin/worker/src/main.rs diff --git a/zero_bin/.env b/zero_bin/.env new file mode 100644 index 000000000..93484d3c2 --- /dev/null +++ b/zero_bin/.env @@ -0,0 +1 @@ +AMQP_URI=amqp://localhost:5672 diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index dc43d5509..f3fe2b564 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -19,25 +19,15 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "cd7d5a2cecb58716e47d67d5703a249964b14c7be1ec3cad3affc295b2d1c35d" dependencies = [ "cfg-if", "const-random", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -56,18 +46,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "amq-protocol" +version = "7.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "1d40d8b2465c7959dd40cee32ba6ac334b5de57e9fca0cc756759894a4152a5d" +dependencies = [ + "amq-protocol-tcp", + "amq-protocol-types", + "amq-protocol-uri", + "cookie-factory", + "nom", + "serde", +] [[package]] -name = "android_system_properties" -version = "0.1.5" +name = "amq-protocol-tcp" +version = "7.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "9cb2100adae7da61953a2c3a01935d86caae13329fadce3333f524d6d6ce12e2" dependencies = [ - "libc", + "amq-protocol-uri", + "tcp-stream", + "tracing", +] + +[[package]] +name = "amq-protocol-types" +version = "7.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "156ff13c8a3ced600b4e54ed826a2ae6242b6069d00dd98466827cef07d3daff" +dependencies = [ + "cookie-factory", + "nom", + "serde", + "serde_json", +] + +[[package]] +name = "amq-protocol-uri" +version = "7.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "751bbd7d440576066233e740576f1b31fdc6ab86cfabfbd48c548de77eca73e4" +dependencies = [ + "amq-protocol-types", + "percent-encoding", + "url", ] [[package]] @@ -123,6 +146,9 @@ name = "anyhow" version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +dependencies = [ + "backtrace", +] [[package]] name = "arrayvec" @@ -130,17 +156,121 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0c4a4f319e45986f347ee47fef8bf5e81c9abc3f6f58dc2391439f30df65f0" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand 2.0.1", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-global-executor-trait" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33dd14c5a15affd2abcff50d84efd4009ada28a860f01c14f9d654f3e81b3f75" +dependencies = [ + "async-global-executor", + "async-trait", + "executor-trait", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite", + "log", + "parking", + "polling", + "rustix 0.37.26", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-reactor-trait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6012d170ad00de56c9ee354aef2e358359deb1ec504254e0e5a3774771de0e" +dependencies = [ + "async-io", + "async-trait", + "futures-core", + "reactor-trait", +] + +[[package]] +name = "async-task" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" + [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", "syn 2.0.38", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.1.0" @@ -213,9 +343,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "bitflags" @@ -225,9 +355,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "bitvec" @@ -251,48 +381,28 @@ dependencies = [ ] [[package]] -name = "borsh" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" -dependencies = [ - "borsh-derive", - "hashbrown 0.13.2", -] - -[[package]] -name = "borsh-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" -dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.3" +name = "block-padding" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "generic-array", ] [[package]] -name = "borsh-schema-derive-internal" -version = "0.10.3" +name = "blocking" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +checksum = "8c36a4d0d48574b3dd360b4b7d95cc651d2b6557b6402848a27d4b228a473e2a" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "async-channel", + "async-lock", + "async-task", + "fastrand 2.0.1", + "futures-io", + "futures-lite", + "piper", + "tracing", ] [[package]] @@ -307,28 +417,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" -[[package]] -name = "bytecheck" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "byteorder" version = "1.5.0" @@ -341,6 +429,15 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + [[package]] name = "cc" version = "1.0.83" @@ -357,16 +454,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "chrono" -version = "0.4.31" +name = "ciborium" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", + "ciborium-io", + "ciborium-ll", "serde", - "windows-targets", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", ] [[package]] @@ -415,28 +536,51 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "concurrent-queue" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "const-random" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368a7a772ead6ce7e1de82bfb04c485f3db8ec744f72925af5735e29a22cc18e" +checksum = "11df32a13d7892ec42d51d3d175faba5211ffe13ed25d4fb348ac9e9ce835593" dependencies = [ "const-random-macro", - "proc-macro-hack", ] [[package]] name = "const-random-macro" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ "getrandom", "once_cell", - "proc-macro-hack", "tiny-keccak", ] +[[package]] +name = "cookie-factory" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" + +[[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" @@ -445,9 +589,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "3fbc60abd742b35f2492f808e1abbb83d45f72db402e14c55057edc9c7b1e9e4" dependencies = [ "libc", ] @@ -502,58 +646,36 @@ dependencies = [ ] [[package]] -name = "darling" -version = "0.20.3" +name = "des" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" dependencies = [ - "darling_core", - "darling_macro", + "cipher", ] [[package]] -name = "darling_core" -version = "0.20.3" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.38", + "block-buffer", + "crypto-common", + "subtle", ] [[package]] -name = "darling_macro" -version = "0.20.3" +name = "doc-comment" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.38", -] +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] -name = "deranged" -version = "0.3.8" +name = "dotenvy" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" -dependencies = [ - "serde", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "either" @@ -648,6 +770,36 @@ dependencies = [ "uint", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "executor-trait" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a1052dd43212a7777ec6a69b117da52f5e52f07aec47d00c1a2b33b85d06b08" +dependencies = [ + "async-trait", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + [[package]] name = "fixed-hash" version = "0.7.0" @@ -669,6 +821,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -690,6 +854,21 @@ 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" @@ -697,6 +876,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -705,6 +885,55 @@ 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-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[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.38", +] + +[[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" @@ -717,10 +946,16 @@ 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]] @@ -753,30 +988,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.6", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" +name = "half" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" dependencies = [ - "ahash 0.8.3", + "ahash", "allocator-api2", "rayon", "serde", @@ -806,6 +1029,15 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "0.2.9" @@ -862,7 +1094,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -870,34 +1102,15 @@ dependencies = [ ] [[package]] -name = "iana-time-zone" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "idna" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ - "cc", + "unicode-bidi", + "unicode-normalization", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "impl-codec" version = "0.6.0" @@ -938,24 +1151,42 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", + "equivalent", + "hashbrown", ] [[package]] -name = "indexmap" -version = "2.0.2" +name = "inout" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "equivalent", - "hashbrown 0.14.1", - "serde", + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", ] [[package]] @@ -965,7 +1196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", - "rustix", + "rustix 0.38.20", "windows-sys", ] @@ -1033,18 +1264,65 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "lapin" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f3067a1fcfbc3fc46455809c023e69b8f6602463201010f4ae5a3b572adb9dc" +dependencies = [ + "amq-protocol", + "async-global-executor-trait", + "async-reactor-trait", + "async-trait", + "executor-trait", + "flume", + "futures-core", + "futures-io", + "parking_lot", + "pinky-swear", + "reactor-trait", + "serde", + "tracing", + "waker-fn", +] + [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "leader" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "clap", + "dotenvy", + "ethereum-types", + "ops", + "paladin-core", + "plonky_block_proof_gen", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "libc" version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "linux-raw-sys" version = "0.4.10" @@ -1053,9 +1331,9 @@ checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1104,6 +1382,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.1" @@ -1115,15 +1399,25 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", "windows-sys", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1237,12 +1531,85 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "ops" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "once_cell", + "paladin-core", + "plonky2_evm", + "plonky_block_proof_gen", + "serde", + "tokio", +] + [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "p12" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4873306de53fe82e7e484df31e1e947d61514b6ea2ed6cd7b45d63006fd9224" +dependencies = [ + "cbc", + "cipher", + "des", + "getrandom", + "hmac", + "lazy_static", + "rc2", + "sha1", + "yasna", +] + +[[package]] +name = "paladin-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9d7358ef9004e0ab1f2e4721b84f6aa8cf57fd46b2efa7732b5fd54b15e5d8" +dependencies = [ + "anyhow", + "async-trait", + "ciborium", + "clap", + "dotenvy", + "futures", + "lapin", + "paladin-opkind-derive", + "pin-project", + "serde", + "tokio", + "tokio-executor-trait", + "tokio-reactor-trait", + "tokio-util", + "tracing", + "tracing-subscriber", + "uuid", +] + +[[package]] +name = "paladin-opkind-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52db5917dc6613839e99f55194fa6049b919906aad4a558076864fb6d524315b" +dependencies = [ + "quote", + "syn 2.0.38", +] + [[package]] name = "parity-scale-codec" version = "3.6.5" @@ -1263,12 +1630,18 @@ version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro2", "quote", "syn 1.0.109", ] +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1281,9 +1654,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", @@ -1381,15 +1754,38 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pinky-swear" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d894b67aa7a4bf295db5e85349078c604edaa6fa5c8721e8eca3c7729a27f2ac" +dependencies = [ + "doc-comment", + "flume", + "parking_lot", + "tracing", +] + +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + [[package]] name = "plonky2" version = "0.1.4" source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" dependencies = [ - "ahash 0.8.3", + "ahash", "anyhow", "getrandom", - "hashbrown 0.14.1", + "hashbrown", "itertools", "keccak-hash 0.8.0", "log", @@ -1415,7 +1811,7 @@ dependencies = [ "env_logger", "eth_trie_utils", "ethereum-types", - "hashbrown 0.14.1", + "hashbrown", "hex-literal", "itertools", "jemallocator", @@ -1481,24 +1877,19 @@ dependencies = [ ] [[package]] -name = "plonky_edge_block_trace_parser" -version = "0.1.0" -source = "git+https://github.com/mir-protocol/plonky-edge-block-trace-parser.git?rev=1bc20699b91201291294914772a30de84ffdcc58#1bc20699b91201291294914772a30de84ffdcc58" +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ - "eth_trie_utils", - "ethereum-types", - "hex", - "keccak-hash 0.10.0", + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", "log", - "plonky2_evm", - "plonky_block_proof_gen", - "rlp", - "rlp-derive", - "rust_decimal", - "serde", - "serde_json", - "serde_with", - "thiserror", + "pin-project-lite", + "windows-sys", ] [[package]] @@ -1530,15 +1921,6 @@ dependencies = [ "uint", ] -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -1549,12 +1931,6 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - [[package]] name = "proc-macro2" version = "1.0.69" @@ -1564,26 +1940,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "quote" version = "1.0.33" @@ -1649,25 +2005,45 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rc2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" +dependencies = [ + "cipher", +] + +[[package]] +name = "reactor-trait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "438a4293e4d097556730f4711998189416232f009c137389e0f961d2bc0ddc58" +dependencies = [ + "async-trait", + "futures-core", + "futures-io", +] + [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.10.0" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.1", - "regex-syntax 0.8.0", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -1681,13 +2057,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.0", + "regex-syntax 0.8.2", ] [[package]] @@ -1698,45 +2074,23 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3cbb081b9784b07cceb8824c8583f86db4814d172ab043f3c23f7dc600bf83d" - -[[package]] -name = "rend" -version = "0.4.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" -dependencies = [ - "bitvec", - "bytecheck", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] -name = "rkyv_derive" -version = "0.7.42" +name = "ring" +version = "0.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", ] [[package]] @@ -1760,22 +2114,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "rust_decimal" -version = "1.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand", - "rkyv", - "serde", - "serde_json", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1790,17 +2128,86 @@ checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "rustix" -version = "0.38.18" +version = "0.37.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f3f8f960ed3b5a59055428714943298bf3fa2d4a1d53135084e0544829d995" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys", +] + +[[package]] +name = "rustix" +version = "0.38.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a74ee2d7c2581cd139b42447d7d9389b889bdaad3a73f1ebb16f2a3237bb19c" +checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.10", "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", + "sct", +] + +[[package]] +name = "rustls-connector" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "060bcc1795b840d0e56d78f3293be5f652aa1611d249b0e63ffe19f4a8c9ae23" +dependencies = [ + "log", + "rustls", + "rustls-native-certs", + "rustls-webpki", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -1813,6 +2220,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +[[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" @@ -1820,25 +2236,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "seahash" -version = "4.1.0" +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[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 = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] name = "serde" -version = "1.0.188" +version = "1.0.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" dependencies = [ "proc-macro2", "quote", @@ -1879,32 +2322,14 @@ dependencies = [ ] [[package]] -name = "serde_with" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca3b16a3d82c4088f343b7480a93550b3eabe1a358569c2dfe38bbcead07237" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.0.2", - "serde", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.3.0" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6be15c453eb305019bfa438b1593c731f36a289a7853f7707ee29e870b3b3c" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.38", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] @@ -1937,10 +2362,13 @@ dependencies = [ ] [[package]] -name = "simdutf8" -version = "0.1.4" +name = "slab" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" @@ -1950,9 +2378,9 @@ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -1960,14 +2388,29 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -1980,6 +2423,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "1.0.109" @@ -2014,6 +2463,18 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tcp-stream" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da30af7998f51ee1aa48ab24276fe303a697b004e31ff542b192c088d5630a5" +dependencies = [ + "cfg-if", + "p12", + "rustls-connector", + "rustls-pemfile", +] + [[package]] name = "termcolor" version = "1.3.0" @@ -2025,18 +2486,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", @@ -2053,34 +2514,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "time" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" -dependencies = [ - "deranged", - "itoa", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" -dependencies = [ - "time-core", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -2119,11 +2552,22 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.4", + "socket2 0.5.5", "tokio-macros", "windows-sys", ] +[[package]] +name = "tokio-executor-trait" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "802ccf58e108fe16561f35348fabe15ff38218968f033d587e399a84937533cc" +dependencies = [ + "async-trait", + "executor-trait", + "tokio", +] + [[package]] name = "tokio-macros" version = "2.1.0" @@ -2136,19 +2580,48 @@ dependencies = [ ] [[package]] -name = "toml" -version = "0.5.11" +name = "tokio-reactor-trait" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "e9481a72f36bd9cbb8d6dd349227c4783e234e4332cfe806225bc929c4b92486" dependencies = [ - "serde", + "async-trait", + "futures-core", + "futures-io", + "reactor-trait", + "tokio", + "tokio-stream", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" [[package]] name = "toml_edit" @@ -2156,7 +2629,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.2", + "indexmap", "toml_datetime", "winnow", ] @@ -2191,11 +2664,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -2204,9 +2676,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -2215,9 +2687,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -2225,12 +2697,12 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] @@ -2282,12 +2754,27 @@ dependencies = [ "static_assertions", ] +[[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.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + [[package]] name = "unroll" version = "0.1.5" @@ -2298,6 +2785,23 @@ dependencies = [ "syn 1.0.109", ] +[[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 = "utf8parse" version = "0.2.1" @@ -2306,9 +2810,13 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +dependencies = [ + "getrandom", + "rand", +] [[package]] name = "valuable" @@ -2322,6 +2830,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + [[package]] name = "want" version = "0.3.1" @@ -2391,6 +2905,16 @@ 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 = "winapi" version = "0.3.9" @@ -2422,15 +2946,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -2499,13 +3014,27 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.16" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711d82167854aff2018dfd193aa0fef5370f456732f0d5a0c59b0f1b4b907" +checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" dependencies = [ "memchr", ] +[[package]] +name = "worker" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "dotenvy", + "ops", + "paladin-core", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "wyz" version = "0.5.1" @@ -2516,19 +3045,27 @@ dependencies = [ ] [[package]] -name = "zero-bin" -version = "0.1.0" +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" + +[[package]] +name = "zerocopy" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c19fae0c8a9efc6a8281f2e623db8af1db9e57852e04cde3e754dd2dc29340f" dependencies = [ - "anyhow", - "axum", - "clap", - "ethereum-types", - "plonky2_evm", - "plonky_block_proof_gen", - "plonky_edge_block_trace_parser", - "serde", - "serde_json", - "tokio", - "tracing", - "tracing-subscriber", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc56589e9ddd1f1c28d4b4b5c773ce232910a6bb67a70133d61c9e347585efe9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", ] diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 251c46546..669ef6d2a 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -1,23 +1,17 @@ -[package] -name = "zero-bin" -version = "0.1.0" -edition = "2021" +[workspace] +members = ["leader", "worker", "ops"] +resolver = "2" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -plonky_edge_block_trace_parser = { git = "https://github.com/mir-protocol/plonky-edge-block-trace-parser.git", rev = "1bc20699b91201291294914772a30de84ffdcc58" } -plonky_block_proof_gen = { git = "https://github.com/mir-protocol/plonky-block-proof-gen.git", rev = "73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc" } -plonky2_evm = { git = "https://github.com/mir-protocol/plonky2.git", rev = "762e6f07b834df04be8cd290f07465a28c392c6d" } +[workspace.dependencies] +paladin-core = "0.1.2" +anyhow = { version = "1.0.75", features = ["backtrace"] } +dotenvy = "0.15.7" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } -tracing = "0.1.37" -tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -anyhow = "1.0.75" -serde_json = "1.0.107" -serde = "1.0.188" -ethereum-types = "0.14.1" -axum = "0.6.20" tokio = { version = "1.33.0", features = ["full"] } +serde = "1.0.183" +plonky_block_proof_gen = { git = "https://github.com/mir-protocol/plonky-block-proof-gen.git", rev = "73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc" } [patch.crates-io] # TODO: Remove `eth_trie_utils` patch once version `0.7.0` is released... diff --git a/zero_bin/README.md b/zero_bin/README.md index f4ec635fe..e22cbadf3 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -1,29 +1,119 @@ # Zero Bin -A quick and dirty way to prove a block with plonky2. No orchestration. No distributed computation. Just a single instance of plonky2 running on a single machine. +A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plonky-block-proof-gen`](https://github.com/0xPolygonZero/plonky-block-proof-gen). Given the [proof generation protocol](/leader/src/prover_input.rs) as input, generate a proof. The project is instrumented with [`paladin`](https://github.com/0xPolygonZero/paladin), and as such can distribute proof generation across multiple worker machines. + +- [Zero Bin](#zero-bin) + - [Project layout](#project-layout) + - [Ops](#ops) + - [Worker](#worker) + - [Leader](#leader) + - [Usage](#usage) + - [Paladin Runtime](#paladin-runtime) + - [Starting an AMQP enabled cluster](#starting-an-amqp-enabled-cluster) + - [Start worker(s)](#start-workers) + - [Start leader](#start-leader) + - [Starting an in-memory (single process) cluster](#starting-an-in-memory-single-process-cluster) + - [Input mode](#input-mode) + - [stdin](#stdin) + - [HTTP](#http) + + +## Project layout +``` +ops +├── Cargo.toml +└── src + └── lib.rs +worker +├── Cargo.toml +└── src + └── main.rs +leader +├── Cargo.toml +└── src + └── main.rs +``` +### Ops +Defines the proof operations that can be distributed to workers. + +### Worker +The worker process. Receives proof operations from the leader, and returns the result. + +### Leader +The leader process. Receives proof generation requests, and distributes them to workers. ## Usage -Pass JSON formatted prover input to stdin or over HTTP. See [data/block_121.json](data/block_121.json) for an example of the expected format. +Leader binary arguments and options are comprised of paladin configuration and input mode: +``` +cargo run --bin leader -- --help + +Usage: leader [OPTIONS] + +Options: + -m, --mode + The input mode. If `stdio`, the input is read from stdin. If `http`, the input is read from HTTP requests [default: std-io] [possible values: std-io, http] + -p, --port + The port to listen on when using the `http` mode [default: 8080] + -t, --task-bus-routing-key + Specifies the routing key for publishing task messages. In most cases, the default value should suffice [default: task] + -s, --serializer + Determines the serialization format to be used [default: cbor] [possible values: cbor] + -r, --runtime + Specifies the runtime environment to use [default: amqp] [possible values: amqp, in-memory] + --amqp-uri + Provides the URI for the AMQP broker, if the AMQP runtime is selected [env: AMQP_URI=amqp://localhost:5672] + -h, --help + Print help +``` + +### Paladin Runtime + +Paladin supports both an AMQP and in-memory runtime. The in-memory runtime will emulate a cluster in memory within a single process, and is useful for testing. The AMQP runtime is geared for a production environment. The AMQP runtime requires a running AMQP broker and spinning up worker processes. The AMQP uri can be specified with the `--amqp-uri` flag or be set with the `AMQP_URI` environment variable. + +#### Starting an AMQP enabled cluster + +##### Start worker(s) + +Start worker process(es). The default paladin runtime is AMQP, so no additional flags are required to enable it. + +```bash +RUST_LOG=debug cargo r --release --bin worker +``` + +##### Start leader + +Start the leader process with the desired [input mode](#input-mode). The default paladin runtime is AMQP, so no additional flags are required to enable it. + +```bash +RUST_LOG=debug cargo r --release --bin leader -- --mode http +``` + +#### Starting an in-memory (single process) cluster + +Paladin can emulate a cluster in memory within a single process. Useful for testing purposes. + +```bash +RUST_LOG=debug cargo r --release --bin leader -- --mode http --runtime in-memory +``` -Initializing plonky2 can take a while. -HTTP mode will allow you to run multiple proof jobs without re-initializing plonky2 between job invocations. Otherwise, every time the process is started, plonky2 will need to be re-initialized. +### Input mode +Pass JSON encoded prover input to stdin or over HTTP. See [`prover_input.rs`](/leader/src/prover_input.rs) for the input format. The examples below assume some prover input is stored in `./block_121.json`. -### stdin +#### stdin ```bash -cat ./data/block_121.json | RUST_LOG=debug cargo r --release +cat ./block_121.json | RUST_LOG=debug cargo r --release --bin leader ``` -### HTTP +#### HTTP Start the server ```bash -RUST_LOG=debug cargo r --release -- --mode http +RUST_LOG=debug cargo r --release --bin leader -- --mode http ``` -Wait for initialization. Once initialized, send a request: ```bash -curl -X POST -H "Content-Type: application/json" -d @./data/block_121.json http://localhost:8080/prove +curl -X POST -H "Content-Type: application/json" -d @./block_121.json http://localhost:8080/prove ``` \ No newline at end of file diff --git a/zero_bin/data/block_121.json b/zero_bin/data/block_121.json deleted file mode 100644 index f91ea1bcc..000000000 --- a/zero_bin/data/block_121.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "metadata": { - "parentHash": "0x405914e496bbbd71f0d8c6d77162f010152187ccc5d8661fb0d16f1f78b4c0a7", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "miner": "0xc6f86915245e154ff04ad95750306392c82efde8", - "stateRoot": "0xdb98b1bcd03585215dbb1e15321b307f1acd502123e20d002901e927eb1e7c0d", - "transactionsRoot": "0x66349cfbf1e3a6ca24b6d02481ea6a857e3b4ef896886b89b497803168eb8b6b", - "receiptsRoot": "0xf13eb20e97ae7f97e6f1209661cda58016215d6bbe7fbae912e88c5087c20667", - "logsBloom": "0x20000000000000000000000000800000000000000001000200000000000000000000000040000000000000000000000000003000000000000000001000000000001000000000000800000008000000000040000000000000000000000000000000000000020000000002000000100800200002004000000000000010000000000000000000000000000000000000040000000000000400000000000000000000000000000000000020000000010000000000000000000040000000000400000000101002000000000400000000000000000000000000000020000000000020002000000000000000000000000000000000000000000000000008100000080000", - "difficulty": "0x1", - "totalDifficulty": "0x1", - "size": "0x446", - "number": "0x79", - "gasLimit": "0x1c9c380", - "gasUsed": "0x3e928", - "timestamp": "0x651e825b", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f8b0c0f843b84024cbb44013a00b09a88dc08c95cc43e563a452a9223aa7bdf72e1084b5fcc0a904aae2f7061a2dd7ec7ab444b12839f64f46b058769fea44ce0e79a52798eb3807c28080f8658001a0527b2584444cf0f3f5c22df4f24e98d34da9ae7166f259a64b76717cb0fcb76aa0527b2584444cf0f3f5c22df4f24e98d34da9ae7166f259a64b76717cb0fcb76aa00000000000000000000000000000000000000000000000000000000000000000", - "mixHash": "0xadce6e5230abe012342a44e4e9b6d05997d6f015387ae0e59be924afc7ec70c1", - "nonce": "0x0000000000000000", - "hash": "0x3215285d3da9f5390af276f78561f23da49fc42e0c210847b81870d45c76fb54", - "transactions": [ - { - "nonce": "0x1021", - "gasPrice": "0x3ca49675", - "maxPriorityFeePerGas": "0x3ca49551", - "maxFeePerGas": "0x3ca498b3", - "gas": "0x1ff84", - "to": "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e", - "value": "0x0", - "input": "0x248b71fc000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000004", - "v": "0x0", - "r": "0x9870854a011f1e2d9e19d97747a1553f8790def21586886b434b1d682e8df5db", - "s": "0x35a8a125e1de786b621f99e4a40ebced58599bd66db42f2957c5787cae5e52c4", - "hash": "0xf9aab78a5b8fb3586ffba16dfda2c6221cfeffa3b090fe968650f7977c1a850b", - "from": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", - "blockHash": "0x3215285d3da9f5390af276f78561f23da49fc42e0c210847b81870d45c76fb54", - "blockNumber": "0x79", - "transactionIndex": "0x0", - "chainId": "0x7d1", - "type": "0x2" - }, - { - "nonce": "0x1022", - "gasPrice": "0x3ca33c3c", - "maxPriorityFeePerGas": "0x3ca33b18", - "maxFeePerGas": "0x3ca33e7a", - "gas": "0x1ff84", - "to": "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e", - "value": "0x0", - "input": "0x248b71fc000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000004", - "v": "0x0", - "r": "0xb77652968607b73b54caf5a1e9ecad604c06f12c9739b725d568011abb72a6a3", - "s": "0x622585790ea08cbc1b9386e1b180e83238ee3333263c75d849fa18d3f65bfcb1", - "hash": "0x92385687b7a0068beacd3fdc06fa5e84d973eedfa8d16913c146a05827e6be9f", - "from": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", - "blockHash": "0x3215285d3da9f5390af276f78561f23da49fc42e0c210847b81870d45c76fb54", - "blockNumber": "0x79", - "transactionIndex": "0x1", - "chainId": "0x7d1", - "type": "0x2" - } - ], - "uncles": [], - "baseFeePerGas": "0x124" - }, - "trace": { - "accountTrie": { - "092dd3cec26eeaa3d5cbb58fda6ad5d3038a280f23e8409eaef2147d7dd1c669": "f85180a031d1eb10fdf37ef90417d463e9e3d1dad5bab6a3e8b38ccc4eaa744250317457808080a03d30ddc70d916077f85f0821c304dbef76e595b4a1b2f149b87bee1ea39dd0a08080808080808080808080", - "35f869aed035cff0227bb6634af02dcf74b27393a2598894e00a862d5419c083": "f901b1a0f8c14d364267234dce85ddd7c58e15611d8b145448659fe025b0c7f9ece62d338080a04b4d7bb0b1f18bb7feac4596c9b8bcca0d4e1a57f5d2a93511172c822d460c00a0511436e82a7f32620c43b42c29d7896f469642fdcc1401663d04b44d444468e2a0e16fbc424e9f795c3895a477916db9b85777aafe91a64ca5b62f33f20e459830a086698225dec11e23a58f3e000245581f67842bec7da80ed5338cf783613990e4a0e5b001f6499ffcb038ac7e3384b3e8e268ad66b34c569753a7ec96a325666804a0364969fa64ed1edef177b8a87bbe20e26615582bf935df361abf64c0b7e2b589a0a8721acbe838c6537413119c5986baeed9252ce4cc888ae536037ce23c03a573a0092dd3cec26eeaa3d5cbb58fda6ad5d3038a280f23e8409eaef2147d7dd1c669a0edb7252c46e0cd0c366b8a6133e11caa531e0045f5e49c613dc88971ed19ae2aa0b89705489ca6a9e5e342a919a71c0306d39a8e138fcc3fa97adf2f9c13c0f6a380a03c249771d4d8ec7faffee6a9363bb9ec4541b86468f6345e549a99d3b0ed662ba07d52c7804c3da36c9c91aecd5410fdf7c81fa77d548d722c36a74fc4bd22739580", - "3d30ddc70d916077f85f0821c304dbef76e595b4a1b2f149b87bee1ea39dd0a0": "f85180a046490d5d18dbbbc0659037c4aa08844669ee0edd65234966c248b4f6547d138480808080808080808080a0b352e4c72d853473be5eac69cf10adfdc61a3747ec26a4b424f0a29292fc1d3780808080", - "412ab9b2d76b1c92377724ce0af56a403e73b536165cccba2e7075f4c9f62a2d": "f873a020a96499cb97ce4ad00da64466a7e05c44631052075767b72ab492533785fb4eb850f84e808ad3c21c5fdef72337f0fca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "46490d5d18dbbbc0659037c4aa08844669ee0edd65234966c248b4f6547d1384": "f8769f3eec2b84f0ba344fd4b4d2f022469febe7a772c4789acfc119eb558ab1da3db854f8528210218c033b2e3c649ca90fa48771f2a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "9df0685a238a59acbc495a3ecd6dedf9ced7c4313877ab2957897ef684348f99": "f869a020417f50fc699ebb817e23468e114836fb4578b6281ced73df8cbbfefb427243b846f8440180a01d6bbbb263e54f0f47dd5777eef1413e0b9c66611dd3fcf20efe043e44ec10c1a05deadf02dd8344275283fee394945c5e15787054e0eef21f50c960fd91323297", - "c86e63f0026de73a58da150280832d273f079383e2bd0d8f5e3c522657cf14cd": "f873a02080c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312ab850f84e808ad3c21bd8644e401dbf3fa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "e16fbc424e9f795c3895a477916db9b85777aafe91a64ca5b62f33f20e459830": "f851808080a0c86e63f0026de73a58da150280832d273f079383e2bd0d8f5e3c522657cf14cd80a05c9df0e1f025a1aaf721bd81429fd72ee03f9d803127203461a6aab1dacb2d098080808080808080808080", - "edb7252c46e0cd0c366b8a6133e11caa531e0045f5e49c613dc88971ed19ae2a": "f8718080808080a0412ab9b2d76b1c92377724ce0af56a403e73b536165cccba2e7075f4c9f62a2d8080a0d7c9bf3c020f4e9f196b7fa7e3d6921e8cddc4b8ae15587dd97f57beb343feb2808080808080a09df0685a238a59acbc495a3ecd6dedf9ced7c4313877ab2957897ef684348f9980" - }, - "storageTrie": { - "0e57bbe9bec24e1e516455ee894052ea224e4ae9abd8811ba4808fdde77c82a8": "f7a03ed6b174b60e64730a011130c9f953524c9b8b0209c3e867b353a7b046cd82559594deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "1d6bbbb263e54f0f47dd5777eef1413e0b9c66611dd3fcf20efe043e44ec10c1": "f90171a070fb015586e0a368b512032cfbd5fceda086a67bf6be30dd6bf82bccf4bae3cfa08e6f7b615d5dc6c52ebeb7a8cce3ffdfdc317748aa1f3d53a6d275e2cea447a880a05db0bc99b931e2f9e00ea24a60ed6f1c516a7b79d460953a809474286a9300d4a0bcb94c1f011fe547216d53e5d41f555ee8975c65ac930bb3c90d08a171faa9768080a03c057c0580bdfbb2cc6cf737053aa40e30f453a229e1119d22ff5c53f2252bf9a0e8b984619133ebc0f5404ee0e44de060352e18e085ed514f6750dc74e0daa9ff80a067c40ea83df3e9b196f83a9fc87ca8b2e2a5d60566773d067c41553aa5bf8d76a00e57bbe9bec24e1e516455ee894052ea224e4ae9abd8811ba4808fdde77c82a880a093a828ccb30e10ab34cdea0172558edac8157114b2835406b5688b9ead26d506a0bc1ea64f9f073abe598d717cb99d991319e00529f0774f87ad1edb3c2aeeba1fa0b31bceaf1564875cd3753188c6d491c0457329fbabc4bf1cd0f71dc8dd49fc9080", - "3488f0cb2ebe2fbb01f16fa1cc60cdd0c3a2e6cb65d335a459e0bb6468cd0ffa": "f851808080a0425ef1e6e961d2683e8f2577244b80422e7075c353366d7c430dfc27baa8183f8080808080a06778e23bfda09232af2b334565e68e4f6e1f7d7ffab3d7041a2ba1e8ac48b9b180808080808080", - "3c057c0580bdfbb2cc6cf737053aa40e30f453a229e1119d22ff5c53f2252bf9": "f7a039f133c7c61f4bd0d986fb30e6010fd6cfd571bdf11f16bb6f7d4a2702f44b009594deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "425ef1e6e961d2683e8f2577244b80422e7075c353366d7c430dfc27baa8183f": "e19f35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b11", - "5db0bc99b931e2f9e00ea24a60ed6f1c516a7b79d460953a809474286a9300d4": "f851808080808080a0fc9373511cbd22a6567d32e872d823111ab57bdcdd8bbc5b402df94174b1cba68080808080808080a0635f3543c5cb41fd454c2a67c9c110c0b4e120800d1b726b6041004bb51d6a5280", - "635f3543c5cb41fd454c2a67c9c110c0b4e120800d1b726b6041004bb51d6a52": "f851808080808080a09e13a84af1df53bb92e90fc76cbf56745cb6c71b6dde67c0c24e78507c5a7c8d8080a02661ccc381b0ebe98b07ca5f1058cf14dae77953fff05be55bb59e11b7f1571780808080808080", - "67c40ea83df3e9b196f83a9fc87ca8b2e2a5d60566773d067c41553aa5bf8d76": "f851808080a0e5f805662f65d24defa0d20e67807723b8f55090bb0dd3fa38ba9d489c458aec80808080808080a090421947a15980b99d6d0978c01011764d3200156b83942a5cf57c92c947a0088080808080", - "70fb015586e0a368b512032cfbd5fceda086a67bf6be30dd6bf82bccf4bae3cf": "f85180808080a0f833e01f279ec7f9b3ea9a88d559551bd5e2acb373e50abea678a2fa2481e74e808080808080a006ea1cfe6cc7232238541a1be734911cff7f21e1dcfe5d6d7219b62b8974dec18080808080", - "93a828ccb30e10ab34cdea0172558edac8157114b2835406b5688b9ead26d506": "f7a0319823ef1abef2d5a22cd02af62596bf1f9661224438df0b084726fe28c7d0ac9594deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "b31bceaf1564875cd3753188c6d491c0457329fbabc4bf1cd0f71dc8dd49fc90": "f7a030df3dcda05b4fbd9c655cde3d5ceb211e019e72ec816e127a59e7195f2cd7f5959485da99c8a7c2c95964c8efd687e95e632fc533d6", - "e5f805662f65d24defa0d20e67807723b8f55090bb0dd3fa38ba9d489c458aec": "e2a020274d838c103e9f9bc29f202d8ca1c20b69ed320596d739da4d0a930f8ab17a0f", - "e8b984619133ebc0f5404ee0e44de060352e18e085ed514f6750dc74e0daa9ff": "f85180808080808080808080a03488f0cb2ebe2fbb01f16fa1cc60cdd0c3a2e6cb65d335a459e0bb6468cd0ffa80a0ee2ce179d55660c94f3718928bf9ceab145fe91fa24a55552f7a15fe8400fa1b80808080" - }, - "parentStateRoot": "0x35f869aed035cff0227bb6634af02dcf74b27393a2598894e00a862d5419c083", - "transactionTraces": [ - { - "txn": "0x02f8b48207d1821021843ca49551843ca498b38301ff8494ec59ea1acb9fc9f630b2dce73790ed8be0ac036e80b844248b71fc000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000004c080a09870854a011f1e2d9e19d97747a1553f8790def21586886b434b1d682e8df5dba035a8a125e1de786b621f99e4a40ebced58599bd66db42f2957c5787cae5e52c4", - "delta": { - "0x0000000000000000000000000000000000000000": { - "address": "0x0000000000000000000000000000000000000000", - "read": true - }, - "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6": { - "address": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", - "nonce": 4130, - "read": true - }, - "0xC6F86915245e154ff04aD95750306392C82eFdE8": { - "address": "0xC6F86915245e154ff04aD95750306392C82eFdE8", - "read": true - }, - "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e": { - "address": "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x1cb7ce0668e72b96f704af9e1445a9dc6f6ac599eec355bfcfe4d3befbb001be": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "0x50a82f9cbcdfaca82fe46b4a494d325ee6dc33d1fa55b218ab142e6cc2c8a58b": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "0x9998fe8c12a1a1395171fc2449145bb1f0c273bfc80ab4ea62eb7a9cb439450c": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "0xa29f2962b8badecbf4d3036e28fcd7dcf22db126f130193790f7698ee4d3dd84": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": "0x0000000000000000000000000000000000000000000000000000000000000013" - }, - "storage_read": { - "0x0000000000000000000000000000000000000000000000000000000000000004": {}, - "0x1cb7ce0668e72b96f704af9e1445a9dc6f6ac599eec355bfcfe4d3befbb001be": {}, - "0x50a82f9cbcdfaca82fe46b4a494d325ee6dc33d1fa55b218ab142e6cc2c8a58b": {}, - "0x9998fe8c12a1a1395171fc2449145bb1f0c273bfc80ab4ea62eb7a9cb439450c": {}, - "0xa29f2962b8badecbf4d3036e28fcd7dcf22db126f130193790f7698ee4d3dd84": {}, - "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": {} - }, - "code_read": "YIBgQFI0gBVhABBXYACA/VtQYAQ2EGEAqVdgADVg4ByAY0KELg4RYQBxV4BjQoQuDhRhAWJXgGNjUiEeFGEBfleAY3CggjEUYQGuV4Bjoiy0ZRRhAd5XgGO4jU/eFGEB+leAY+mF6cUUYQIWV2EAqVZbgGMB/8mnFGEArleAYwgYEvwUYQDeV4BjCV6nsxRhAQ5XgGMjuHLdFGEBKleAYySLcfwUYQFGV1tgAID9W2EAyGAEgDYDgQGQYQDDkZBhEj9WW2ECRlZbYEBRYQDVkZBhEodWW2BAUYCRA5DzW2EA+GAEgDYDgQGQYQDzkZBhEthWW2EDGFZbYEBRYQEFkZBhE0ZWW2BAUYCRA5DzW2EBKGAEgDYDgQGQYQEjkZBhE41WW2ED9VZbAFthAURgBIA2A4EBkGEBP5GQYRPNVlthBd1WWwBbYQFgYASANgOBAZBhAVuRkGETjVZbYQjJVlsAW2EBfGAEgDYDgQGQYQF3kZBhE81WW2EI11ZbAFthAZhgBIA2A4EBkGEBk5GQYRLYVlthCg9WW2BAUWEBpZGQYRNGVltgQFGAkQOQ81thAchgBIA2A4EBkGEBw5GQYRQgVlthCrpWW2BAUWEB1ZGQYRRcVltgQFGAkQOQ81thAfhgBIA2A4EBkGEB85GQYRSjVlthC3FWWwBbYQIUYASANgOBAZBhAg+RkGEVSFZbYQxuVlsAW2ECMGAEgDYDgQGQYQIrkZBhFdBWW2ENrFZbYEBRYQI9kZBhEodWW2BAUYCRA5DzW2AAf4CsWM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe/////////////////////////////////////8ZFoJ7/////////////////////////////////////xkWFIBhAxFXUH8B/8mnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHv/////////////////////////////////////GRaCe/////////////////////////////////////8ZFhRbkFCRkFBWW2AAgHP//////////////////////////xZgAICEgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8WA2EDuldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEDsZBhFm1WW2BAUYCRA5D9W2ACYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xaQUJGQUFZbYACAYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xaQUIBz//////////////////////////8WM3P//////////////////////////xYUgGEE7FdQYANgAIJz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYAAzc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEYP8WW2EFK1dgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEFIpBhFtlWW2BAUYCRA5D9W4JgAmAAhIFSYCABkIFSYCABYAAgYABhAQAKgVSBc///////////////////////////AhkWkINz//////////////////////////8WAheQVVCBg3P//////////////////////////xaCc///////////////////////////Fn+MW+Hl6+x9W9FPcUJ9HoTz3QMUwPeyKR5bIArIx8O5JWBAUWBAUYCRA5CkUFBQVltgAICCgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8Wg3P//////////////////////////xYUYQZ9V2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQZ0kGEXRVZbYEBRgJEDkP1bYABz//////////////////////////8WgnP//////////////////////////xYDYQbsV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQbjkGEXsVZbYEBRgJEDkP1bYQb3gzODYQ3bVlthBzZXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhBy2QYRbZVltgQFGAkQOQ/VtgAYBgAIVz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACCglRhB4WRkGEYAFZbklBQgZBVUGABgGAAhHP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBgAIKCVGEH25GQYRg0VluSUFCBkFVQgWAAgIOBUmAgAZCBUmAgAWAAIGAAYQEACoFUgXP//////////////////////////wIZFpCDc///////////////////////////FgIXkFVQYAJgAIKBUmAgAZCBUmAgAWAAIGAAYQEACoFUkHP//////////////////////////wIZFpBVgIJz//////////////////////////8WhHP//////////////////////////xZ/3fJSrRviyJtpwrBo/DeNqpUrp/FjxKEWKPVaTfUjs+9gQFFgQFGAkQOQpFBQUFZbYQjTgoJhDw9WW1BQVlthCOKDg4NhBd1WW2AAgnP//////////////////////////xY7FIBhCctXUGMVC3oCYOAbe/////////////////////////////////////8ZFoJz//////////////////////////8WYxULegIzhoVgQFGEY/////8WYOAbgVJgBAFhCWeTkpGQYRifVltgIGBAUYCDA4FgAIda8RWAFWEJhlc9YACAPj1gAP1bUFBQUGBAUT1gHxlgH4IBFoIBgGBAUlCBAZBhCaqRkGEY/lZbe/////////////////////////////////////8ZFhRbYQoKV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQoBkGEZd1ZbYEBRgJEDkP1bUFBQVltgAIBgAIOBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEc///////////////////////////FpBQYABz//////////////////////////8WgXP//////////////////////////xYDYQq1V2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQqskGEWbVZbYEBRgJEDkP1bkZBQVltgAIBz//////////////////////////8WgnP//////////////////////////xYDYQsqV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQshkGEZ41ZbYEBRgJEDkP1bYAFgAINz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgVJBQkZBQVluAYANgADNz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAYQEACoFUgWD/AhkWkIMVFQIXkFVQgXP//////////////////////////xYzc///////////////////////////Fn8XMH6rOathB+iJmEWtPVm9llPyAPIgkgSJyitZN2lsMYNgQFFhDGKRkGESh1ZbYEBRgJEDkKNQUFZbYQx5hYWFYQXdVltgAIRz//////////////////////////8WOxSAYQ1mV1BjFQt6AmDgG3v/////////////////////////////////////GRaEc///////////////////////////FmMVC3oCM4iHh4dgQFGGY/////8WYOAbgVJgBAFhDQKVlJOSkZBhGlBWW2AgYEBRgIMDgWAAh1rxFYAVYQ0hVz1gAIA+PWAA/VtQUFBQYEBRPWAfGWAfggEWggGAYEBSUIEBkGENRZGQYRj+Vlt7/////////////////////////////////////xkWFFthDaVXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhDZyQYRl3VltgQFGAkQOQ/VtQUFBQUFZbYANgIFKBYABSYEBgACBgIFKAYABSYEBgACBgAJFQkVCQVJBhAQAKkARg/xaBVltgAINz//////////////////////////8Wg3P//////////////////////////xYUgGEOnVdQYANgAIVz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEYP8WW4BhDwZXUGACYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8Wg3P//////////////////////////xYUW5BQk5JQUFBWW2AAYARUkFBgAHP//////////////////////////xaDc///////////////////////////FgNhD4VXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhD3yQYRrqVltgQFGAkQOQ/VtgAHP//////////////////////////xZgAICDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8WFGEQJldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEQHZBhG1ZWW2BAUYCRA5D9W38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZIIRFWEQiVdgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEQgJBhG+hWW2BAUYCRA5D9W4Fv/////////////////////xZgAWAAhXP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBgAIKCVGEQ6pGQYRg0VluSUFCBkFVQYACBkFBgAFuDgRAVYRHPV4GFc///////////////////////////FmAAc///////////////////////////Fn/d8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz72BAUWBAUYCRA5CkhGAAgISBUmAgAZCBUmAgAWAAIGAAYQEACoFUgXP//////////////////////////wIZFpCDc///////////////////////////FgIXkFVQgYBhEbmQYRwIVluSUFCAgGERx5BhHAhWW5FQUGEQ+VZbUIBgBIGQVVBQUFBQVltgAID9W2AAgP1bYAB//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCFpBQkZBQVlthEhyBYRHnVluBFGESJ1dgAID9W1BWW2AAgTWQUGESOYFhEhNWW5KRUFBWW2AAYCCChAMSFWESVVdhElRhEd1WW1tgAGESY4SChQFhEipWW5FQUJKRUFBWW2AAgRUVkFCRkFBWW2ESgYFhEmxWW4JSUFBWW2AAYCCCAZBQYRKcYACDAYRhEnhWW5KRUFBWW2AAgZBQkZBQVlthErWBYRKiVluBFGESwFdgAID9W1BWW2AAgTWQUGES0oFhEqxWW5KRUFBWW2AAYCCChAMSFWES7ldhEu1hEd1WW1tgAGES/ISChQFhEsNWW5FQUJKRUFBWW2AAc///////////////////////////ghaQUJGQUFZbYABhEzCCYRMFVluQUJGQUFZbYRNAgWETJVZbglJQUFZbYABgIIIBkFBhE1tgAIMBhGETN1ZbkpFQUFZbYRNqgWETJVZbgRRhE3VXYACA/VtQVltgAIE1kFBhE4eBYRNhVluSkVBQVltgAIBgQIOFAxIVYROkV2ETo2ER3VZbW2AAYROyhYKGAWETeFZbklBQYCBhE8OFgoYBYRLDVluRUFCSUJKQUFZbYACAYABgYISGAxIVYRPmV2ET5WER3VZbW2AAYRP0hoKHAWETeFZbk1BQYCBhFAWGgocBYRN4VluSUFBgQGEUFoaChwFhEsNWW5FQUJJQklCSVltgAGAggoQDEhVhFDZXYRQ1YRHdVltbYABhFESEgoUBYRN4VluRUFCSkVBQVlthFFaBYRKiVluCUlBQVltgAGAgggGQUGEUcWAAgwGEYRRNVluSkVBQVlthFICBYRJsVluBFGEUi1dgAID9W1BWW2AAgTWQUGEUnYFhFHdWW5KRUFBWW2AAgGBAg4UDEhVhFLpXYRS5YRHdVltbYABhFMiFgoYBYRN4VluSUFBgIGEU2YWChgFhFI5WW5FQUJJQkpBQVltgAID9W2AAgP1bYACA/VtgAICDYB+EARJhFQhXYRUHYRTjVltbgjWQUGf//////////4ERFWEVJVdhFSRhFOhWW1tgIIMBkVCDYAGCAoMBERVhFUFXYRVAYRTtVltbklCSkFBWW2AAgGAAgGAAYICGiAMSFWEVZFdhFWNhEd1WW1tgAGEVcoiCiQFhE3hWW5VQUGAgYRWDiIKJAWETeFZblFBQYEBhFZSIgokBYRLDVluTUFBgYIYBNWf//////////4ERFWEVtVdhFbRhEeJWW1thFcGIgokBYRTyVluSUJJQUJKVUJKVkJNQVltgAIBgQIOFAxIVYRXnV2EV5mER3VZbW2AAYRX1hYKGAWETeFZbklBQYCBhFgaFgoYBYRN4VluRUFCSUJKQUFZbYACCglJgIIIBkFCSkVBQVlt/dG9rZW4gZG9lc24ndCBleGlzdAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRZXYBODYRYQVluRUGEWYoJhFiFWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEWhoFhFkpWW5BQkZBQVlt/bm90IGF1dGhvcml6ZWQAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRbDYA6DYRYQVluRUGEWzoJhFo1WW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEW8oFhFrZWW5BQkZBQVlt/ZnJvbSAhPSBvd25lcgAAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRcvYA2DYRYQVluRUGEXOoJhFvlWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEXXoFhFyJWW5BQkZBQVlt/dHJhbnNmZXIgdG8gemVybyBhZGRyZXNzAAAAAAAAAABgAIIBUlBWW2AAYRebYBiDYRYQVluRUGEXpoJhF2VWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEXyoFhF45WW5BQkZBQVlt/Tkh7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAFJgEWAEUmAkYAD9W2AAYRgLgmESolZbkVBhGBaDYRKiVluSUIKCA5BQgYERFWEYLldhGC1hF9FWW1uSkVBQVltgAGEYP4JhEqJWW5FQYRhKg2ESolZbklCCggGQUICCERVhGGJXYRhhYRfRVltbkpFQUFZbYACCglJgIIIBkFCSkVBQVltQVltgAGEYiWAAg2EYaFZbkVBhGJSCYRh5VltgAIIBkFCRkFBWW2AAYICCAZBQYRi0YACDAYZhEzdWW2EYwWAggwGFYRM3VlthGM5gQIMBhGEUTVZbgYEDYGCDAVJhGN+BYRh8VluQUJSTUFBQUFZbYACBUZBQYRj4gWESE1ZbkpFQUFZbYABgIIKEAxIVYRkUV2EZE2ER3VZbW2AAYRkihIKFAWEY6VZbkVBQkpFQUFZbf3Vuc2FmZSByZWNpcGllbnQAAAAAAAAAAAAAAAAAAAAAYACCAVJQVltgAGEZYWAQg2EWEFZbkVBhGWyCYRkrVltgIIIBkFCRkFBWW2AAYCCCAZBQgYEDYACDAVJhGZCBYRlUVluQUJGQUFZbf293bmVyID0gemVybyBhZGRyZXNzAAAAAAAAAAAAAAAAYACCAVJQVltgAGEZzWAUg2EWEFZbkVBhGdiCYRmXVltgIIIBkFCRkFBWW2AAYCCCAZBQgYEDYACDAVJhGfyBYRnAVluQUJGQUFZbgoGDN2AAg4MBUlBQUFZbYABgHxlgH4MBFpBQkZBQVltgAGEaL4OFYRhoVluTUGEaPIOFhGEaA1ZbYRpFg2EaElZbhAGQUJOSUFBQVltgAGCAggGQUGEaZWAAgwGIYRM3VlthGnJgIIMBh2ETN1ZbYRp/YECDAYZhFE1WW4GBA2BggwFSYRqSgYSGYRojVluQUJaVUFBQUFBQVlt/bWludCB0byB6ZXJvIGFkZHJlc3MAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRrUYBSDYRYQVluRUGEa34JhGp5WW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEbA4FhGsdWW5BQkZBQVlt/YWxyZWFkeSBtaW50ZWQAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRtAYA6DYRYQVluRUGEbS4JhGwpWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEbb4FhGzNWW5BQkZBQVlt/RVJDNzIxQTogcXVhbnRpdHkgdG8gbWludCB0b28gaGlgAIIBUn9naAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAgggFSUFZbYABhG9JgIoNhFhBWW5FQYRvdgmEbdlZbYECCAZBQkZBQVltgAGAgggGQUIGBA2AAgwFSYRwBgWEbxVZbkFCRkFBWW2AAYRwTgmESolZbkVB///////////////////////////////////////////+CA2EcRVdhHERhF9FWW1tgAYIBkFCRkFBW/qJkaXBmc1giEiB0ShnjEsZGBJjOoPQklISOU39GbAYmnRiOIVC0F6mikmRzb2xjQwAIEQAz", - "touched": true, - "read": true - } - }, - "receiptRoot": "0x6356499c40375bd0f85ee7d7a9e1b7ed87cb9b271e45af8cfc56a8d8d3bef39a", - "receipt": "0x02f90383018301ff84b9010020000000000000000000000000800000000000000001000200000000000000000000000040000000000000000000000000002000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000002000000100800000002004000000000000010000000000000000000000000000000000000040000000000000400000000000000000000000000000000000020000000000000000000000000000040000000000400000000001002000000000400000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000100000000000f90278f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001180f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001280f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001380f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001480", - "txnRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "hash": "0xf9aab78a5b8fb3586ffba16dfda2c6221cfeffa3b090fe968650f7977c1a850b", - "gasUsed": 130948, - "bloom": "0x20000000000000000000000000800000000000000001000200000000000000000000000040000000000000000000000000002000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000002000000100800000002004000000000000010000000000000000000000000000000000000040000000000000400000000000000000000000000000000000020000000000000000000000000000040000000000400000000001002000000000400000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000100000000000" - }, - { - "txn": "0x02f8b48207d1821022843ca33b18843ca33e7a8301ff8494ec59ea1acb9fc9f630b2dce73790ed8be0ac036e80b844248b71fc000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000000000000000000000000000000000000000000004c080a0b77652968607b73b54caf5a1e9ecad604c06f12c9739b725d568011abb72a6a3a0622585790ea08cbc1b9386e1b180e83238ee3333263c75d849fa18d3f65bfcb1", - "delta": { - "0x0000000000000000000000000000000000000000": { - "address": "0x0000000000000000000000000000000000000000", - "read": true - }, - "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6": { - "address": "0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6", - "nonce": 4131, - "read": true - }, - "0xC6F86915245e154ff04aD95750306392C82eFdE8": { - "address": "0xC6F86915245e154ff04aD95750306392C82eFdE8", - "read": true - }, - "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e": { - "address": "0xEc59Ea1ACB9fc9F630B2DCe73790eD8Be0ac036e", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x1da244b7f8b81d82e17fde46fbf307da20557945243b38ef4c87c9487b59901b": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "0x52774d722ab93275a0199da6072cca5400bf7f03bf064dd4a2b1af238c418d49": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": "0x0000000000000000000000000000000000000000000000000000000000000017", - "0xb44b86596a635358e7aa60b17d32860c3f1efe2d3e53fb82c0bb23213b9c4be3": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", - "0xdc275f13e83bcad5305f77e8f2f06c8d9840ee8b7d606ee958f86f59784b2de3": "0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef" - }, - "storage_read": { - "0x0000000000000000000000000000000000000000000000000000000000000004": {}, - "0x1da244b7f8b81d82e17fde46fbf307da20557945243b38ef4c87c9487b59901b": {}, - "0x52774d722ab93275a0199da6072cca5400bf7f03bf064dd4a2b1af238c418d49": {}, - "0xabd7b398c2237712843e3e780dcd40dfb99446b30666f04c025da4efa5ce5177": {}, - "0xb44b86596a635358e7aa60b17d32860c3f1efe2d3e53fb82c0bb23213b9c4be3": {}, - "0xdc275f13e83bcad5305f77e8f2f06c8d9840ee8b7d606ee958f86f59784b2de3": {} - }, - "code_read": "YIBgQFI0gBVhABBXYACA/VtQYAQ2EGEAqVdgADVg4ByAY0KELg4RYQBxV4BjQoQuDhRhAWJXgGNjUiEeFGEBfleAY3CggjEUYQGuV4Bjoiy0ZRRhAd5XgGO4jU/eFGEB+leAY+mF6cUUYQIWV2EAqVZbgGMB/8mnFGEArleAYwgYEvwUYQDeV4BjCV6nsxRhAQ5XgGMjuHLdFGEBKleAYySLcfwUYQFGV1tgAID9W2EAyGAEgDYDgQGQYQDDkZBhEj9WW2ECRlZbYEBRYQDVkZBhEodWW2BAUYCRA5DzW2EA+GAEgDYDgQGQYQDzkZBhEthWW2EDGFZbYEBRYQEFkZBhE0ZWW2BAUYCRA5DzW2EBKGAEgDYDgQGQYQEjkZBhE41WW2ED9VZbAFthAURgBIA2A4EBkGEBP5GQYRPNVlthBd1WWwBbYQFgYASANgOBAZBhAVuRkGETjVZbYQjJVlsAW2EBfGAEgDYDgQGQYQF3kZBhE81WW2EI11ZbAFthAZhgBIA2A4EBkGEBk5GQYRLYVlthCg9WW2BAUWEBpZGQYRNGVltgQFGAkQOQ81thAchgBIA2A4EBkGEBw5GQYRQgVlthCrpWW2BAUWEB1ZGQYRRcVltgQFGAkQOQ81thAfhgBIA2A4EBkGEB85GQYRSjVlthC3FWWwBbYQIUYASANgOBAZBhAg+RkGEVSFZbYQxuVlsAW2ECMGAEgDYDgQGQYQIrkZBhFdBWW2ENrFZbYEBRYQI9kZBhEodWW2BAUYCRA5DzW2AAf4CsWM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe/////////////////////////////////////8ZFoJ7/////////////////////////////////////xkWFIBhAxFXUH8B/8mnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHv/////////////////////////////////////GRaCe/////////////////////////////////////8ZFhRbkFCRkFBWW2AAgHP//////////////////////////xZgAICEgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8WA2EDuldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEDsZBhFm1WW2BAUYCRA5D9W2ACYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xaQUJGQUFZbYACAYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xaQUIBz//////////////////////////8WM3P//////////////////////////xYUgGEE7FdQYANgAIJz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYAAzc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEYP8WW2EFK1dgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEFIpBhFtlWW2BAUYCRA5D9W4JgAmAAhIFSYCABkIFSYCABYAAgYABhAQAKgVSBc///////////////////////////AhkWkINz//////////////////////////8WAheQVVCBg3P//////////////////////////xaCc///////////////////////////Fn+MW+Hl6+x9W9FPcUJ9HoTz3QMUwPeyKR5bIArIx8O5JWBAUWBAUYCRA5CkUFBQVltgAICCgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8Wg3P//////////////////////////xYUYQZ9V2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQZ0kGEXRVZbYEBRgJEDkP1bYABz//////////////////////////8WgnP//////////////////////////xYDYQbsV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQbjkGEXsVZbYEBRgJEDkP1bYQb3gzODYQ3bVlthBzZXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhBy2QYRbZVltgQFGAkQOQ/VtgAYBgAIVz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACCglRhB4WRkGEYAFZbklBQgZBVUGABgGAAhHP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBgAIKCVGEH25GQYRg0VluSUFCBkFVQgWAAgIOBUmAgAZCBUmAgAWAAIGAAYQEACoFUgXP//////////////////////////wIZFpCDc///////////////////////////FgIXkFVQYAJgAIKBUmAgAZCBUmAgAWAAIGAAYQEACoFUkHP//////////////////////////wIZFpBVgIJz//////////////////////////8WhHP//////////////////////////xZ/3fJSrRviyJtpwrBo/DeNqpUrp/FjxKEWKPVaTfUjs+9gQFFgQFGAkQOQpFBQUFZbYQjTgoJhDw9WW1BQVlthCOKDg4NhBd1WW2AAgnP//////////////////////////xY7FIBhCctXUGMVC3oCYOAbe/////////////////////////////////////8ZFoJz//////////////////////////8WYxULegIzhoVgQFGEY/////8WYOAbgVJgBAFhCWeTkpGQYRifVltgIGBAUYCDA4FgAIda8RWAFWEJhlc9YACAPj1gAP1bUFBQUGBAUT1gHxlgH4IBFoIBgGBAUlCBAZBhCaqRkGEY/lZbe/////////////////////////////////////8ZFhRbYQoKV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQoBkGEZd1ZbYEBRgJEDkP1bUFBQVltgAIBgAIOBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEc///////////////////////////FpBQYABz//////////////////////////8WgXP//////////////////////////xYDYQq1V2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQqskGEWbVZbYEBRgJEDkP1bkZBQVltgAIBz//////////////////////////8WgnP//////////////////////////xYDYQsqV2BAUX8Iw3mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIFSYAQBYQshkGEZ41ZbYEBRgJEDkP1bYAFgAINz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgVJBQkZBQVluAYANgADNz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAYQEACoFUgWD/AhkWkIMVFQIXkFVQgXP//////////////////////////xYzc///////////////////////////Fn8XMH6rOathB+iJmEWtPVm9llPyAPIgkgSJyitZN2lsMYNgQFFhDGKRkGESh1ZbYEBRgJEDkKNQUFZbYQx5hYWFYQXdVltgAIRz//////////////////////////8WOxSAYQ1mV1BjFQt6AmDgG3v/////////////////////////////////////GRaEc///////////////////////////FmMVC3oCM4iHh4dgQFGGY/////8WYOAbgVJgBAFhDQKVlJOSkZBhGlBWW2AgYEBRgIMDgWAAh1rxFYAVYQ0hVz1gAIA+PWAA/VtQUFBQYEBRPWAfGWAfggEWggGAYEBSUIEBkGENRZGQYRj+Vlt7/////////////////////////////////////xkWFFthDaVXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhDZyQYRl3VltgQFGAkQOQ/VtQUFBQUFZbYANgIFKBYABSYEBgACBgIFKAYABSYEBgACBgAJFQkVCQVJBhAQAKkARg/xaBVltgAINz//////////////////////////8Wg3P//////////////////////////xYUgGEOnVdQYANgAIVz//////////////////////////8Wc///////////////////////////FoFSYCABkIFSYCABYAAgYACEc///////////////////////////FnP//////////////////////////xaBUmAgAZCBUmAgAWAAIGAAkFSQYQEACpAEYP8WW4BhDwZXUGACYACDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8Wg3P//////////////////////////xYUW5BQk5JQUFBWW2AAYARUkFBgAHP//////////////////////////xaDc///////////////////////////FgNhD4VXYEBRfwjDeaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgVJgBAFhD3yQYRrqVltgQFGAkQOQ/VtgAHP//////////////////////////xZgAICDgVJgIAGQgVJgIAFgACBgAJBUkGEBAAqQBHP//////////////////////////xZz//////////////////////////8WFGEQJldgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEQHZBhG1ZWW2BAUYCRA5D9W38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZIIRFWEQiVdgQFF/CMN5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBUmAEAWEQgJBhG+hWW2BAUYCRA5D9W4Fv/////////////////////xZgAWAAhXP//////////////////////////xZz//////////////////////////8WgVJgIAGQgVJgIAFgACBgAIKCVGEQ6pGQYRg0VluSUFCBkFVQYACBkFBgAFuDgRAVYRHPV4GFc///////////////////////////FmAAc///////////////////////////Fn/d8lKtG+LIm2nCsGj8N42qlSun8WPEoRYo9VpN9SOz72BAUWBAUYCRA5CkhGAAgISBUmAgAZCBUmAgAWAAIGAAYQEACoFUgXP//////////////////////////wIZFpCDc///////////////////////////FgIXkFVQgYBhEbmQYRwIVluSUFCAgGERx5BhHAhWW5FQUGEQ+VZbUIBgBIGQVVBQUFBQVltgAID9W2AAgP1bYAB//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCFpBQkZBQVlthEhyBYRHnVluBFGESJ1dgAID9W1BWW2AAgTWQUGESOYFhEhNWW5KRUFBWW2AAYCCChAMSFWESVVdhElRhEd1WW1tgAGESY4SChQFhEipWW5FQUJKRUFBWW2AAgRUVkFCRkFBWW2ESgYFhEmxWW4JSUFBWW2AAYCCCAZBQYRKcYACDAYRhEnhWW5KRUFBWW2AAgZBQkZBQVlthErWBYRKiVluBFGESwFdgAID9W1BWW2AAgTWQUGES0oFhEqxWW5KRUFBWW2AAYCCChAMSFWES7ldhEu1hEd1WW1tgAGES/ISChQFhEsNWW5FQUJKRUFBWW2AAc///////////////////////////ghaQUJGQUFZbYABhEzCCYRMFVluQUJGQUFZbYRNAgWETJVZbglJQUFZbYABgIIIBkFBhE1tgAIMBhGETN1ZbkpFQUFZbYRNqgWETJVZbgRRhE3VXYACA/VtQVltgAIE1kFBhE4eBYRNhVluSkVBQVltgAIBgQIOFAxIVYROkV2ETo2ER3VZbW2AAYROyhYKGAWETeFZbklBQYCBhE8OFgoYBYRLDVluRUFCSUJKQUFZbYACAYABgYISGAxIVYRPmV2ET5WER3VZbW2AAYRP0hoKHAWETeFZbk1BQYCBhFAWGgocBYRN4VluSUFBgQGEUFoaChwFhEsNWW5FQUJJQklCSVltgAGAggoQDEhVhFDZXYRQ1YRHdVltbYABhFESEgoUBYRN4VluRUFCSkVBQVlthFFaBYRKiVluCUlBQVltgAGAgggGQUGEUcWAAgwGEYRRNVluSkVBQVlthFICBYRJsVluBFGEUi1dgAID9W1BWW2AAgTWQUGEUnYFhFHdWW5KRUFBWW2AAgGBAg4UDEhVhFLpXYRS5YRHdVltbYABhFMiFgoYBYRN4VluSUFBgIGEU2YWChgFhFI5WW5FQUJJQkpBQVltgAID9W2AAgP1bYACA/VtgAICDYB+EARJhFQhXYRUHYRTjVltbgjWQUGf//////////4ERFWEVJVdhFSRhFOhWW1tgIIMBkVCDYAGCAoMBERVhFUFXYRVAYRTtVltbklCSkFBWW2AAgGAAgGAAYICGiAMSFWEVZFdhFWNhEd1WW1tgAGEVcoiCiQFhE3hWW5VQUGAgYRWDiIKJAWETeFZblFBQYEBhFZSIgokBYRLDVluTUFBgYIYBNWf//////////4ERFWEVtVdhFbRhEeJWW1thFcGIgokBYRTyVluSUJJQUJKVUJKVkJNQVltgAIBgQIOFAxIVYRXnV2EV5mER3VZbW2AAYRX1hYKGAWETeFZbklBQYCBhFgaFgoYBYRN4VluRUFCSUJKQUFZbYACCglJgIIIBkFCSkVBQVlt/dG9rZW4gZG9lc24ndCBleGlzdAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRZXYBODYRYQVluRUGEWYoJhFiFWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEWhoFhFkpWW5BQkZBQVlt/bm90IGF1dGhvcml6ZWQAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRbDYA6DYRYQVluRUGEWzoJhFo1WW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEW8oFhFrZWW5BQkZBQVlt/ZnJvbSAhPSBvd25lcgAAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRcvYA2DYRYQVluRUGEXOoJhFvlWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEXXoFhFyJWW5BQkZBQVlt/dHJhbnNmZXIgdG8gemVybyBhZGRyZXNzAAAAAAAAAABgAIIBUlBWW2AAYRebYBiDYRYQVluRUGEXpoJhF2VWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEXyoFhF45WW5BQkZBQVlt/Tkh7cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAFJgEWAEUmAkYAD9W2AAYRgLgmESolZbkVBhGBaDYRKiVluSUIKCA5BQgYERFWEYLldhGC1hF9FWW1uSkVBQVltgAGEYP4JhEqJWW5FQYRhKg2ESolZbklCCggGQUICCERVhGGJXYRhhYRfRVltbkpFQUFZbYACCglJgIIIBkFCSkVBQVltQVltgAGEYiWAAg2EYaFZbkVBhGJSCYRh5VltgAIIBkFCRkFBWW2AAYICCAZBQYRi0YACDAYZhEzdWW2EYwWAggwGFYRM3VlthGM5gQIMBhGEUTVZbgYEDYGCDAVJhGN+BYRh8VluQUJSTUFBQUFZbYACBUZBQYRj4gWESE1ZbkpFQUFZbYABgIIKEAxIVYRkUV2EZE2ER3VZbW2AAYRkihIKFAWEY6VZbkVBQkpFQUFZbf3Vuc2FmZSByZWNpcGllbnQAAAAAAAAAAAAAAAAAAAAAYACCAVJQVltgAGEZYWAQg2EWEFZbkVBhGWyCYRkrVltgIIIBkFCRkFBWW2AAYCCCAZBQgYEDYACDAVJhGZCBYRlUVluQUJGQUFZbf293bmVyID0gemVybyBhZGRyZXNzAAAAAAAAAAAAAAAAYACCAVJQVltgAGEZzWAUg2EWEFZbkVBhGdiCYRmXVltgIIIBkFCRkFBWW2AAYCCCAZBQgYEDYACDAVJhGfyBYRnAVluQUJGQUFZbgoGDN2AAg4MBUlBQUFZbYABgHxlgH4MBFpBQkZBQVltgAGEaL4OFYRhoVluTUGEaPIOFhGEaA1ZbYRpFg2EaElZbhAGQUJOSUFBQVltgAGCAggGQUGEaZWAAgwGIYRM3VlthGnJgIIMBh2ETN1ZbYRp/YECDAYZhFE1WW4GBA2BggwFSYRqSgYSGYRojVluQUJaVUFBQUFBQVlt/bWludCB0byB6ZXJvIGFkZHJlc3MAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRrUYBSDYRYQVluRUGEa34JhGp5WW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEbA4FhGsdWW5BQkZBQVlt/YWxyZWFkeSBtaW50ZWQAAAAAAAAAAAAAAAAAAAAAAABgAIIBUlBWW2AAYRtAYA6DYRYQVluRUGEbS4JhGwpWW2AgggGQUJGQUFZbYABgIIIBkFCBgQNgAIMBUmEbb4FhGzNWW5BQkZBQVlt/RVJDNzIxQTogcXVhbnRpdHkgdG8gbWludCB0b28gaGlgAIIBUn9naAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAgggFSUFZbYABhG9JgIoNhFhBWW5FQYRvdgmEbdlZbYECCAZBQkZBQVltgAGAgggGQUIGBA2AAgwFSYRwBgWEbxVZbkFCRkFBWW2AAYRwTgmESolZbkVB///////////////////////////////////////////+CA2EcRVdhHERhF9FWW1tgAYIBkFCRkFBW/qJkaXBmc1giEiB0ShnjEsZGBJjOoPQklISOU39GbAYmnRiOIVC0F6mikmRzb2xjQwAIEQAz", - "touched": true, - "read": true - } - }, - "receiptRoot": "0xf13eb20e97ae7f97e6f1209661cda58016215d6bbe7fbae912e88c5087c20667", - "receipt": "0x02f90383018303e928b9010000000000000000000000000000000000000000000001000200000000000000000000000000000000000000000000000000001000000000000000001000000000001000000000000800000008000000000040000000000000000000000000000000000000020000000002000000100800200002000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000100002000000000000000000000000000000000000000020000000000020002000000000000000000000000000000000000000000000000008100000080000f90278f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001580f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001680f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001780f89c94ec59ea1acb9fc9f630b2dce73790ed8be0ac036ef884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeefa0000000000000000000000000000000000000000000000000000000000000001880", - "txnRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "hash": "0x92385687b7a0068beacd3fdc06fa5e84d973eedfa8d16913c146a05827e6be9f", - "gasUsed": 125348, - "bloom": "0x00000000000000000000000000000000000000000001000200000000000000000000000000000000000000000000000000001000000000000000001000000000001000000000000800000008000000000040000000000000000000000000000000000000020000000002000000100800200002000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000100002000000000000000000000000000000000000000020000000000020002000000000000000000000000000000000000000000000000008100000080000" - } - ] - } -} diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml new file mode 100644 index 000000000..a703db62f --- /dev/null +++ b/zero_bin/leader/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "leader" +version = "0.1.0" +edition = "2021" + +[dependencies] +paladin-core = { workspace = true } +clap = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +anyhow = { workspace = true } +serde = { workspace = true } +dotenvy = { workspace = true } +tokio = { workspace = true } +plonky_block_proof_gen = { workspace = true } +serde_json = "1.0.107" +ethereum-types = "0.14.1" +axum = "0.6.20" +ops = { path = "../ops" } diff --git a/zero_bin/src/cli.rs b/zero_bin/leader/src/cli.rs similarity index 59% rename from zero_bin/src/cli.rs rename to zero_bin/leader/src/cli.rs index cf871b726..f50cd0e21 100644 --- a/zero_bin/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -1,11 +1,17 @@ use clap::{Parser, ValueEnum}; +use paladin::config::Config; #[derive(Parser)] pub(crate) struct Cli { + /// The input mode. If `stdio`, the input is read from stdin. If `http`, the + /// input is read from HTTP requests. #[arg(short, long, value_enum, default_value_t = Mode::StdIo)] pub(crate) mode: Mode, + /// The port to listen on when using the `http` mode. #[arg(short, long, default_value_t = 8080)] pub(crate) port: u16, + #[command(flatten)] + pub paladin_options: Config, } #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum, Default)] diff --git a/zero_bin/src/http.rs b/zero_bin/leader/src/http.rs similarity index 67% rename from zero_bin/src/http.rs rename to zero_bin/leader/src/http.rs index e7bae547e..961b3f3c1 100644 --- a/zero_bin/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -2,22 +2,22 @@ use std::{net::SocketAddr, sync::Arc}; use anyhow::Result; use axum::{http::StatusCode, routing::post, Json, Router}; -use plonky_block_proof_gen::prover_state::ProverState; +use paladin::runtime::Runtime; use tracing::{debug, error, info}; use crate::prover_input::ProverInput; /// The main function for the HTTP mode. -pub(crate) async fn http_main(p_state: ProverState, port: u16) -> Result<()> { +pub(crate) async fn http_main(runtime: Runtime, port: u16) -> Result<()> { let addr = SocketAddr::from(([0, 0, 0, 0], port)); debug!("listening on {}", addr); - let p_state = Arc::new(p_state); + let runtime = Arc::new(runtime); let app = Router::new().route( "/prove", post({ - let p_state = p_state.clone(); - move |body| prove(body, p_state) + let runtime = runtime.clone(); + move |body| prove(body, runtime) }), ); @@ -26,10 +26,10 @@ pub(crate) async fn http_main(p_state: ProverState, port: u16) -> Result<()> { .await?) } -async fn prove(Json(payload): Json, p_state: Arc) -> StatusCode { +async fn prove(Json(payload): Json, runtime: Arc) -> StatusCode { debug!("Received payload: {:#?}", payload); - match payload.prove(p_state.as_ref()) { + match payload.prove(&runtime).await { Ok(b_proof) => { info!("Successfully proved {b_proof:#?}"); StatusCode::OK diff --git a/zero_bin/src/init.rs b/zero_bin/leader/src/init.rs similarity index 93% rename from zero_bin/src/init.rs rename to zero_bin/leader/src/init.rs index 02ae73a93..28c00d482 100644 --- a/zero_bin/src/init.rs +++ b/zero_bin/leader/src/init.rs @@ -1,5 +1,5 @@ use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; -pub(crate) fn init() { +pub(crate) fn tracing() { tracing_subscriber::Registry::default() .with( tracing_subscriber::fmt::layer() diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs new file mode 100644 index 000000000..51923e57b --- /dev/null +++ b/zero_bin/leader/src/main.rs @@ -0,0 +1,32 @@ +use anyhow::Result; +use clap::Parser; +use cli::Mode; +use dotenvy::dotenv; +use ops::Ops; +use paladin::runtime::Runtime; + +mod cli; +mod http; +mod init; +mod prover_input; +mod stdio; + +#[tokio::main] +async fn main() -> Result<()> { + dotenv().ok(); + init::tracing(); + + let args = cli::Cli::parse(); + let runtime = Runtime::from_config::(&args.paladin_options).await?; + + match args.mode { + Mode::StdIo => { + stdio::stdio_main(runtime).await?; + } + Mode::Http => { + http::http_main(runtime, args.port).await?; + } + } + + Ok(()) +} diff --git a/zero_bin/leader/src/prover_input.rs b/zero_bin/leader/src/prover_input.rs new file mode 100644 index 000000000..9a71f133e --- /dev/null +++ b/zero_bin/leader/src/prover_input.rs @@ -0,0 +1,46 @@ +use anyhow::{bail, Result}; +use ops::{AggProof, BlockProof, BlockProofInput, ProofInput, TxProof}; +use paladin::{ + directive::{Directive, IndexedStream, Literal}, + runtime::Runtime, +}; +use plonky_block_proof_gen::proof_types::{ + AggregatableProof, GeneratedBlockProof, OtherBlockData, TxnProofGenIR, +}; +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +pub(crate) struct ProverInput { + txs: Vec, + other_data: OtherBlockData, +} + +impl ProverInput { + pub(crate) async fn prove(self, runtime: &Runtime) -> Result { + let other_data = self.other_data; + let txs_zipped = self.txs.into_iter().map(move |tx| ProofInput { + data: tx, + other: other_data.clone(), + }); + let agg_proof = IndexedStream::from(txs_zipped) + .map(TxProof) + .fold(AggProof) + .run(runtime) + .await?; + + if let AggregatableProof::Agg(p) = agg_proof.data { + let block_proof = Literal(BlockProofInput { + data: p, + other: agg_proof.other, + prev: None, + }) + .map(BlockProof) + .run(runtime) + .await?; + + Ok(block_proof.0) + } else { + bail!("AggProof is is not GeneratedAggProof") + } + } +} diff --git a/zero_bin/src/stdio.rs b/zero_bin/leader/src/stdio.rs similarity index 68% rename from zero_bin/src/stdio.rs rename to zero_bin/leader/src/stdio.rs index 0c2ced5a2..ca841e777 100644 --- a/zero_bin/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -1,18 +1,18 @@ use std::io::Read; use anyhow::Result; -use plonky_block_proof_gen::prover_state::ProverState; +use paladin::runtime::Runtime; use tracing::info; use crate::prover_input::ProverInput; /// The main function for the stdio mode. -pub(crate) fn stdio_main(p_state: ProverState) -> Result<()> { +pub(crate) async fn stdio_main(runtime: Runtime) -> Result<()> { let mut buffer = String::new(); std::io::stdin().read_to_string(&mut buffer)?; let input: ProverInput = serde_json::from_str(&buffer)?; - let proof = input.prove(&p_state)?; + let proof = input.prove(&runtime).await?; info!("Successfully proved {:#?}", proof); Ok(()) diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml new file mode 100644 index 000000000..622bc145c --- /dev/null +++ b/zero_bin/ops/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "ops" +version = "0.1.0" +edition = "2021" + +[dependencies] +paladin-core = { workspace = true } +tokio = { workspace = true } +anyhow = { workspace = true } +serde = { workspace = true } +plonky_block_proof_gen = { workspace = true } +plonky2_evm = { git = "https://github.com/mir-protocol/plonky2.git", rev = "762e6f07b834df04be8cd290f07465a28c392c6d" } +async-trait = "0.1.73" +futures = "0.3.28" +once_cell = "1.18.0" diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs new file mode 100644 index 000000000..5eee1b2da --- /dev/null +++ b/zero_bin/ops/src/lib.rs @@ -0,0 +1,96 @@ +use anyhow::Result; +use once_cell::sync::Lazy; +use paladin::{ + operation::{Monoid, Operation}, + opkind_derive::OpKind, +}; +use plonky_block_proof_gen::{ + proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, + proof_types::{ + AggregatableProof, GeneratedAggProof, GeneratedBlockProof, OtherBlockData, TxnProofGenIR, + }, + prover_state::{ProverState, ProverStateBuilder}, +}; +use serde::{Deserialize, Serialize}; + +static P_STATE: Lazy = Lazy::new(|| ProverStateBuilder::default().build()); + +#[derive(Debug, Clone, Copy, Deserialize, Serialize)] +pub struct TxProof; + +#[derive(Debug, Deserialize, Serialize)] +pub struct ProofInput { + pub data: T, + pub other: OtherBlockData, +} + +impl Operation for TxProof { + type Input = ProofInput; + type Output = ProofInput; + type Kind = Ops; + + fn execute(&self, input: Self::Input) -> Result { + let other_data = input.other; + let result = generate_txn_proof(&P_STATE, input.data, other_data.clone())?; + + Ok(ProofInput { + data: result.into(), + other: other_data, + }) + } +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize)] +pub struct AggProof; + +impl Monoid for AggProof { + type Elem = ProofInput; + type Kind = Ops; + + fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { + let other_data = a.other; + let result = generate_agg_proof(&P_STATE, &a.data, &b.data, other_data.clone())?; + + Ok(ProofInput { + data: result.into(), + other: other_data, + }) + } + + fn empty(&self) -> Self::Elem { + // Expect that empty blocks are padded. + unimplemented!("empty agg proof") + } +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize, Default)] +pub struct BlockProof; + +#[derive(Debug, Deserialize, Serialize)] +pub struct BlockProofInput { + pub data: GeneratedAggProof, + pub other: OtherBlockData, + pub prev: Option, +} + +impl Operation for BlockProof { + type Input = BlockProofInput; + type Output = GeneratedBlockProof; + type Kind = Ops; + + fn execute(&self, input: Self::Input) -> Result { + Ok(generate_block_proof( + &P_STATE, + input.prev.as_ref(), + &input.data, + input.other, + )?) + } +} + +#[derive(OpKind, Debug, Clone, Copy, Deserialize, Serialize)] +pub enum Ops { + TxProof(TxProof), + AggProof(AggProof), + BlockProof(BlockProof), +} diff --git a/zero_bin/src/main.rs b/zero_bin/src/main.rs deleted file mode 100644 index 2faf94dc1..000000000 --- a/zero_bin/src/main.rs +++ /dev/null @@ -1,31 +0,0 @@ -#![feature(iter_array_chunks)] - -use anyhow::Result; -use clap::Parser; -use cli::Mode; -use plonky_block_proof_gen::prover_state::ProverStateBuilder; - -mod cli; -mod http; -mod init; -mod prover_input; -mod stdio; - -#[tokio::main] -async fn main() -> Result<()> { - init::init(); - - let cli = cli::Cli::parse(); - let p_state = ProverStateBuilder::default().build(); - - match cli.mode { - Mode::StdIo => { - stdio::stdio_main(p_state)?; - } - Mode::Http => { - http::http_main(p_state, cli.port).await?; - } - } - - Ok(()) -} diff --git a/zero_bin/src/prover_input.rs b/zero_bin/src/prover_input.rs deleted file mode 100644 index 355f46d0d..000000000 --- a/zero_bin/src/prover_input.rs +++ /dev/null @@ -1,103 +0,0 @@ -use anyhow::Result; -use ethereum_types::{Address, Bloom, U256, H256}; -use plonky2_evm::proof::BlockMetadata; -use plonky_block_proof_gen::{ - proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, - proof_types::{BlockLevelData, GeneratedBlockProof, OtherBlockData}, - prover_state::ProverState, -}; -use plonky_edge_block_trace_parser::edge_payloads::EdgeBlockTrace; -use serde::Deserialize; -use tracing::debug; - -const GENESIS_STATE_ROOT: H256 = H256::zero(); - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct EdgeBlockMetadata { - pub(crate) miner: Address, - pub(crate) logs_bloom: Bloom, - pub(crate) difficulty: U256, - pub(crate) mix_hash: H256, - pub(crate) number: U256, - pub(crate) gas_limit: U256, - pub(crate) gas_used: U256, - pub(crate) timestamp: U256, - pub(crate) base_fee_per_gas: U256, -} - -const MATIC_CHAIN_ID: usize = 2001; - -impl From for BlockMetadata { - fn from(v: EdgeBlockMetadata) -> Self { - let mut block_bloom = [U256::zero(); 8]; - - // Note that bloom can be empty. - for (i, v) in v - .logs_bloom - .as_bytes() - .iter() - .array_chunks::<32>() - .enumerate() - { - block_bloom[i] = U256::from_big_endian(&v.iter().map(|&b| *b).collect::>()[..]); - } - - Self { - block_beneficiary: v.miner, - block_timestamp: v.timestamp, - block_number: v.number, - block_difficulty: v.difficulty, - block_random: v.mix_hash, - block_gaslimit: v.gas_limit, - block_chain_id: MATIC_CHAIN_ID.into(), - block_base_fee: v.base_fee_per_gas, - block_gas_used: v.gas_used, - block_bloom, - } - } -} - -#[derive(Debug, Deserialize)] -pub(crate) struct ProverInput { - pub(crate) trace: EdgeBlockTrace, - pub(crate) metadata: EdgeBlockMetadata, -} - -impl ProverInput { - pub(crate) fn prove(self, p_state: &ProverState) -> Result { - let number = self.metadata.number; - - let b_data = BlockLevelData { - b_meta: self.metadata.into(), - b_hashes: Default::default(), - }; - - let other_data = OtherBlockData { - b_data, - genesis_state_trie_root: GENESIS_STATE_ROOT, - }; - - debug!("Proving block #{number}: {other_data:#?}"); - - let txs = self.trace.into_txn_proof_gen_payloads(number.as_u64())?; - - let mut txn_proofs = txs - .into_iter() - .map(|tx| generate_txn_proof(p_state, tx, other_data.clone())); - - // We should have at least two txs in a block, given dummy padding in - // `plonky_edge_block_trace_parser`. - let (fst, snd) = ( - txn_proofs.next().expect("Expected at least two txns")?, - txn_proofs.next().expect("Expected at least two txns")?, - ); - - let agg_proof = txn_proofs.try_fold( - generate_agg_proof(p_state, &fst.into(), &snd.into(), other_data.clone())?, - |agg, tx| generate_agg_proof(p_state, &agg.into(), &tx?.into(), other_data.clone()), - )?; - - Ok(generate_block_proof(p_state, None, &agg_proof, other_data)?) - } -} diff --git a/zero_bin/worker/Cargo.toml b/zero_bin/worker/Cargo.toml new file mode 100644 index 000000000..735c0ff9a --- /dev/null +++ b/zero_bin/worker/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "worker" +version = "0.1.0" +edition = "2021" + +[dependencies] +paladin-core = { workspace = true } +anyhow = { workspace = true } +dotenvy = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +clap = { workspace = true } +tokio = { workspace = true } +ops = { path = "../ops" } diff --git a/zero_bin/worker/src/init.rs b/zero_bin/worker/src/init.rs new file mode 100644 index 000000000..28c00d482 --- /dev/null +++ b/zero_bin/worker/src/init.rs @@ -0,0 +1,11 @@ +use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; +pub(crate) fn tracing() { + tracing_subscriber::Registry::default() + .with( + tracing_subscriber::fmt::layer() + .pretty() + .with_span_events(FmtSpan::CLOSE) + .with_filter(EnvFilter::from_default_env()), + ) + .init(); +} diff --git a/zero_bin/worker/src/main.rs b/zero_bin/worker/src/main.rs new file mode 100644 index 000000000..b69b468f2 --- /dev/null +++ b/zero_bin/worker/src/main.rs @@ -0,0 +1,25 @@ +use anyhow::Result; +use clap::Parser; +use dotenvy::dotenv; +use ops::Ops; +use paladin::{config::Config, runtime::WorkerRuntime}; + +mod init; + +#[derive(Parser, Debug)] +pub struct Cli { + #[command(flatten)] + pub options: Config, +} + +#[tokio::main] +async fn main() -> Result<()> { + dotenv().ok(); + init::tracing(); + let args = Cli::parse(); + + let runtime: WorkerRuntime = WorkerRuntime::from_config(&args.options).await?; + runtime.main_loop().await?; + + Ok(()) +} From d5a66252bdb8c440b0ba42d296e261d1eb1ce41c Mon Sep 17 00:00:00 2001 From: cpu Date: Tue, 24 Oct 2023 06:26:42 -0700 Subject: [PATCH 007/184] Add dockerfiles --- zero_bin/README.md | 7 ++++++- zero_bin/leader.Dockerfile | 30 ++++++++++++++++++++++++++++++ zero_bin/worker.Dockerfile | 30 ++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 zero_bin/leader.Dockerfile create mode 100644 zero_bin/worker.Dockerfile diff --git a/zero_bin/README.md b/zero_bin/README.md index e22cbadf3..56b0a754c 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -16,6 +16,7 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [Input mode](#input-mode) - [stdin](#stdin) - [HTTP](#http) + - [Docker](#docker) ## Project layout @@ -116,4 +117,8 @@ RUST_LOG=debug cargo r --release --bin leader -- --mode http Once initialized, send a request: ```bash curl -X POST -H "Content-Type: application/json" -d @./block_121.json http://localhost:8080/prove -``` \ No newline at end of file +``` + +## Docker + +Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. \ No newline at end of file diff --git a/zero_bin/leader.Dockerfile b/zero_bin/leader.Dockerfile new file mode 100644 index 000000000..ddfc61dca --- /dev/null +++ b/zero_bin/leader.Dockerfile @@ -0,0 +1,30 @@ +FROM rustlang/rust:nightly-bullseye-slim as builder + +# Install jemalloc +RUN apt-get update && apt-get install -y libjemalloc2 libjemalloc-dev make + +RUN \ + mkdir -p ops/src && touch ops/src/lib.rs && \ + mkdir -p leader/src && echo "fn main() {println!(\"YO!\");}" > leader/src/main.rs + +COPY Cargo.toml . +RUN sed -i "2s/.*/members = [\"ops\", \"leader\"]/" Cargo.toml +COPY Cargo.lock . + +COPY ops/Cargo.toml ./ops/Cargo.toml +COPY leader/Cargo.toml ./leader/Cargo.toml + +RUN cargo build --release --bin leader + +COPY ops ./ops +COPY leader ./leader +RUN \ + touch ops/src/lib.rs && \ + touch leader/src/main.rs + +RUN cargo build --release --bin leader + +FROM debian:bullseye-slim +RUN apt-get update && apt-get install -y ca-certificates libjemalloc2 +COPY --from=builder ./target/release/leader /usr/local/bin/leader +CMD ["leader"] diff --git a/zero_bin/worker.Dockerfile b/zero_bin/worker.Dockerfile new file mode 100644 index 000000000..86c3dc2e2 --- /dev/null +++ b/zero_bin/worker.Dockerfile @@ -0,0 +1,30 @@ +FROM rustlang/rust:nightly-bullseye-slim as builder + +# Install jemalloc +RUN apt-get update && apt-get install -y libjemalloc2 libjemalloc-dev make + +RUN \ + mkdir -p ops/src && touch ops/src/lib.rs && \ + mkdir -p worker/src && echo "fn main() {println!(\"YO!\");}" > worker/src/main.rs + +COPY Cargo.toml . +RUN sed -i "2s/.*/members = [\"ops\", \"worker\"]/" Cargo.toml +COPY Cargo.lock . + +COPY ops/Cargo.toml ./ops/Cargo.toml +COPY worker/Cargo.toml ./worker/Cargo.toml + +RUN cargo build --release --bin worker + +COPY ops ./ops +COPY worker ./worker +RUN \ + touch ops/src/lib.rs && \ + touch worker/src/main.rs + +RUN cargo build --release --bin worker + +FROM debian:bullseye-slim +RUN apt-get update && apt-get install -y ca-certificates libjemalloc2 +COPY --from=builder ./target/release/worker /usr/local/bin/worker +CMD ["worker"] From f1c6919309d17f1fb1ccea1eae50f46784648ea7 Mon Sep 17 00:00:00 2001 From: cpu Date: Tue, 24 Oct 2023 07:01:27 -0700 Subject: [PATCH 008/184] Remove unused dependencies --- zero_bin/Cargo.lock | 2 -- zero_bin/Cargo.toml | 4 ---- zero_bin/leader/Cargo.toml | 1 - zero_bin/ops/Cargo.toml | 1 - 4 files changed, 8 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index f3fe2b564..a40757920 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1300,7 +1300,6 @@ dependencies = [ "axum", "clap", "dotenvy", - "ethereum-types", "ops", "paladin-core", "plonky_block_proof_gen", @@ -1546,7 +1545,6 @@ dependencies = [ "futures", "once_cell", "paladin-core", - "plonky2_evm", "plonky_block_proof_gen", "serde", "tokio", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 669ef6d2a..aaf9f5a1f 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -12,7 +12,3 @@ clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" plonky_block_proof_gen = { git = "https://github.com/mir-protocol/plonky-block-proof-gen.git", rev = "73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc" } - -[patch.crates-io] -# TODO: Remove `eth_trie_utils` patch once version `0.7.0` is released... -eth_trie_utils = { git = "https://github.com/mir-protocol/eth_trie_utils.git", rev = "e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5" } diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index a703db62f..2a5c7cfb2 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -14,6 +14,5 @@ dotenvy = { workspace = true } tokio = { workspace = true } plonky_block_proof_gen = { workspace = true } serde_json = "1.0.107" -ethereum-types = "0.14.1" axum = "0.6.20" ops = { path = "../ops" } diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 622bc145c..7eac7cb56 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -9,7 +9,6 @@ tokio = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } plonky_block_proof_gen = { workspace = true } -plonky2_evm = { git = "https://github.com/mir-protocol/plonky2.git", rev = "762e6f07b834df04be8cd290f07465a28c392c6d" } async-trait = "0.1.73" futures = "0.3.28" once_cell = "1.18.0" From dd914e47f00da8f29aef678ab88ed6488b9ae288 Mon Sep 17 00:00:00 2001 From: cpu Date: Wed, 25 Oct 2023 14:34:06 -0700 Subject: [PATCH 009/184] Integrate proof_protocol_decoder --- zero_bin/Cargo.lock | 33 ++++++++++++---- zero_bin/Cargo.toml | 3 +- zero_bin/leader/Cargo.toml | 1 + zero_bin/leader/src/prover_input.rs | 35 ++++++++--------- zero_bin/ops/Cargo.toml | 1 + zero_bin/ops/src/lib.rs | 58 +++++++++++------------------ 6 files changed, 67 insertions(+), 64 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index a40757920..adb7757a0 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -727,7 +727,7 @@ dependencies = [ [[package]] name = "eth_trie_utils" version = "0.6.0" -source = "git+https://github.com/mir-protocol/eth_trie_utils.git?rev=e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5#e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5" +source = "git+https://github.com/0xPolygonZero/eth_trie_utils.git?rev=e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5#e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5" dependencies = [ "bytes", "enum-as-inner", @@ -1303,6 +1303,7 @@ dependencies = [ "ops", "paladin-core", "plonky_block_proof_gen", + "proof_protocol_decoder", "serde", "serde_json", "tokio", @@ -1546,6 +1547,7 @@ dependencies = [ "once_cell", "paladin-core", "plonky_block_proof_gen", + "proof_protocol_decoder", "serde", "tokio", ] @@ -1778,7 +1780,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" dependencies = [ "ahash", "anyhow", @@ -1802,7 +1804,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" dependencies = [ "anyhow", "bytes", @@ -1836,7 +1838,7 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" dependencies = [ "anyhow", "itertools", @@ -1851,7 +1853,7 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" dependencies = [ "rayon", ] @@ -1859,18 +1861,19 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git?rev=762e6f07b834df04be8cd290f07465a28c392c6d#762e6f07b834df04be8cd290f07465a28c392c6d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/mir-protocol/plonky-block-proof-gen.git?rev=73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc#73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=f2f7aebd8143cb8b8ca24de27dd721c20e7985e3#f2f7aebd8143cb8b8ca24de27dd721c20e7985e3" dependencies = [ "ethereum-types", "log", "paste", "plonky2", "plonky2_evm", + "proof_protocol_decoder", "serde", ] @@ -1938,6 +1941,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proof_protocol_decoder" +version = "0.1.0" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=2080f41b60fa5d4664f47f5527f70359a6471b6b#2080f41b60fa5d4664f47f5527f70359a6471b6b" +dependencies = [ + "eth_trie_utils", + "ethereum-types", + "hex", + "keccak-hash 0.10.0", + "plonky2_evm", + "rlp", + "rlp-derive", + "serde", + "thiserror", +] + [[package]] name = "quote" version = "1.0.33" diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index aaf9f5a1f..ee00911cf 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,4 +11,5 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/mir-protocol/plonky-block-proof-gen.git", rev = "73c3bcbaf3bfe913641c5b6817bc3ba5aa9859bc" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "f2f7aebd8143cb8b8ca24de27dd721c20e7985e3" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "2080f41b60fa5d4664f47f5527f70359a6471b6b" } diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 2a5c7cfb2..fc78f070a 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -13,6 +13,7 @@ serde = { workspace = true } dotenvy = { workspace = true } tokio = { workspace = true } plonky_block_proof_gen = { workspace = true } +proof_protocol_decoder = { workspace = true } serde_json = "1.0.107" axum = "0.6.20" ops = { path = "../ops" } diff --git a/zero_bin/leader/src/prover_input.rs b/zero_bin/leader/src/prover_input.rs index 9a71f133e..1faef5468 100644 --- a/zero_bin/leader/src/prover_input.rs +++ b/zero_bin/leader/src/prover_input.rs @@ -1,12 +1,11 @@ use anyhow::{bail, Result}; -use ops::{AggProof, BlockProof, BlockProofInput, ProofInput, TxProof}; +use ops::{AggProof, BlockProof, TxProof}; use paladin::{ directive::{Directive, IndexedStream, Literal}, runtime::Runtime, }; -use plonky_block_proof_gen::proof_types::{ - AggregatableProof, GeneratedBlockProof, OtherBlockData, TxnProofGenIR, -}; +use plonky_block_proof_gen::proof_types::{AggregatableProof, GeneratedBlockProof}; +use proof_protocol_decoder::types::{OtherBlockData, TxnProofGenIR}; use serde::Deserialize; #[derive(Debug, Deserialize)] @@ -18,26 +17,24 @@ pub(crate) struct ProverInput { impl ProverInput { pub(crate) async fn prove(self, runtime: &Runtime) -> Result { let other_data = self.other_data; - let txs_zipped = self.txs.into_iter().map(move |tx| ProofInput { - data: tx, - other: other_data.clone(), - }); - let agg_proof = IndexedStream::from(txs_zipped) - .map(TxProof) - .fold(AggProof) - .run(runtime) - .await?; - if let AggregatableProof::Agg(p) = agg_proof.data { - let block_proof = Literal(BlockProofInput { - data: p, - other: agg_proof.other, - prev: None, + let agg_proof = IndexedStream::from(self.txs) + .map(TxProof) + .fold(AggProof { + other: other_data.clone(), }) - .map(BlockProof) .run(runtime) .await?; + if let AggregatableProof::Agg(proof) = agg_proof { + let block_proof = Literal(proof) + .map(BlockProof { + prev: None, + other: other_data, + }) + .run(runtime) + .await?; + Ok(block_proof.0) } else { bail!("AggProof is is not GeneratedAggProof") diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 7eac7cb56..7562577d9 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -9,6 +9,7 @@ tokio = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } plonky_block_proof_gen = { workspace = true } +proof_protocol_decoder = { workspace = true } async-trait = "0.1.73" futures = "0.3.28" once_cell = "1.18.0" diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 5eee1b2da..caa9ba9c7 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -6,11 +6,10 @@ use paladin::{ }; use plonky_block_proof_gen::{ proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, - proof_types::{ - AggregatableProof, GeneratedAggProof, GeneratedBlockProof, OtherBlockData, TxnProofGenIR, - }, + proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, prover_state::{ProverState, ProverStateBuilder}, }; +use proof_protocol_decoder::types::{OtherBlockData, TxnProofGenIR}; use serde::{Deserialize, Serialize}; static P_STATE: Lazy = Lazy::new(|| ProverStateBuilder::default().build()); @@ -18,43 +17,31 @@ static P_STATE: Lazy = Lazy::new(|| ProverStateBuilder::default().b #[derive(Debug, Clone, Copy, Deserialize, Serialize)] pub struct TxProof; -#[derive(Debug, Deserialize, Serialize)] -pub struct ProofInput { - pub data: T, - pub other: OtherBlockData, -} - impl Operation for TxProof { - type Input = ProofInput; - type Output = ProofInput; + type Input = TxnProofGenIR; + type Output = AggregatableProof; type Kind = Ops; fn execute(&self, input: Self::Input) -> Result { - let other_data = input.other; - let result = generate_txn_proof(&P_STATE, input.data, other_data.clone())?; + let result = generate_txn_proof(&P_STATE, input)?; - Ok(ProofInput { - data: result.into(), - other: other_data, - }) + Ok(result.into()) } } -#[derive(Debug, Clone, Copy, Deserialize, Serialize)] -pub struct AggProof; +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct AggProof { + pub other: OtherBlockData, +} impl Monoid for AggProof { - type Elem = ProofInput; + type Elem = AggregatableProof; type Kind = Ops; fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { - let other_data = a.other; - let result = generate_agg_proof(&P_STATE, &a.data, &b.data, other_data.clone())?; + let result = generate_agg_proof(&P_STATE, &a, &b, self.other.clone())?; - Ok(ProofInput { - data: result.into(), - other: other_data, - }) + Ok(result.into()) } fn empty(&self) -> Self::Elem { @@ -63,32 +50,29 @@ impl Monoid for AggProof { } } -#[derive(Debug, Clone, Copy, Deserialize, Serialize, Default)] -pub struct BlockProof; - -#[derive(Debug, Deserialize, Serialize)] -pub struct BlockProofInput { - pub data: GeneratedAggProof, +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct BlockProof { pub other: OtherBlockData, pub prev: Option, } impl Operation for BlockProof { - type Input = BlockProofInput; + type Input = GeneratedAggProof; type Output = GeneratedBlockProof; type Kind = Ops; fn execute(&self, input: Self::Input) -> Result { Ok(generate_block_proof( &P_STATE, - input.prev.as_ref(), - &input.data, - input.other, + self.prev.as_ref(), + &input, + self.other.clone(), )?) } } -#[derive(OpKind, Debug, Clone, Copy, Deserialize, Serialize)] +#[derive(OpKind, Debug, Clone, Deserialize, Serialize)] +#[allow(clippy::large_enum_variant)] pub enum Ops { TxProof(TxProof), AggProof(AggProof), From 19d7dbb00586736896a8438a47fe6689593dec66 Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 27 Oct 2023 13:38:26 -0700 Subject: [PATCH 010/184] Update `ProverInput` to expect `BlockTrace` --- zero_bin/Cargo.lock | 141 ++++++++++++---------------- zero_bin/Cargo.toml | 4 +- zero_bin/leader/src/prover_input.rs | 18 +++- 3 files changed, 79 insertions(+), 84 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index adb7757a0..d45585ee3 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7d5a2cecb58716e47d67d5703a249964b14c7be1ec3cad3affc295b2d1c35d" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "const-random", @@ -492,9 +492,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.6" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" dependencies = [ "clap_builder", "clap_derive", @@ -502,9 +502,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.6" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" dependencies = [ "anstream", "anstyle", @@ -514,9 +514,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", @@ -526,9 +526,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "colorchoice" @@ -830,7 +830,7 @@ dependencies = [ "futures-core", "futures-sink", "pin-project", - "spin 0.9.8", + "spin", ] [[package]] @@ -856,9 +856,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -871,9 +871,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -881,15 +881,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -898,9 +898,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-lite" @@ -919,9 +919,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", @@ -930,21 +930,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -1679,9 +1679,9 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ "memchr", "thiserror", @@ -1690,9 +1690,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35513f630d46400a977c4cb58f78e1bfbe01434316e60c37d27b9ad6139c66d8" +checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" dependencies = [ "pest", "pest_generator", @@ -1700,9 +1700,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9fc1b9e7057baba189b5c626e2d6f40681ae5b6eb064dc7c7834101ec8123a" +checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" dependencies = [ "pest", "pest_meta", @@ -1713,9 +1713,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df74e9e7ec4053ceb980e7c0c8bd3594e977fde1af91daba9c928e8e8c6708d" +checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" dependencies = [ "once_cell", "pest", @@ -1866,7 +1866,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=f2f7aebd8143cb8b8ca24de27dd721c20e7985e3#f2f7aebd8143cb8b8ca24de27dd721c20e7985e3" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=935f6265fc3797acd6d81a73511e29107167721a#935f6265fc3797acd6d81a73511e29107167721a" dependencies = [ "ethereum-types", "log", @@ -1944,7 +1944,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=2080f41b60fa5d4664f47f5527f70359a6471b6b#2080f41b60fa5d4664f47f5527f70359a6471b6b" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=cff12f6d90785a5ae984eb767e1ad83c147fc705#cff12f6d90785a5ae984eb767e1ad83c147fc705" dependencies = [ "eth_trie_utils", "ethereum-types", @@ -2097,17 +2097,16 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "ring" -version = "0.16.20" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" dependencies = [ "cc", + "getrandom", "libc", - "once_cell", - "spin 0.5.2", + "spin", "untrusted", - "web-sys", - "winapi", + "windows-sys", ] [[package]] @@ -2172,9 +2171,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "log", "ring", @@ -2217,9 +2216,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ "ring", "untrusted", @@ -2254,9 +2253,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", @@ -2287,18 +2286,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", @@ -2413,12 +2412,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -2623,9 +2616,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -2804,9 +2797,9 @@ dependencies = [ [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" @@ -2922,16 +2915,6 @@ 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 = "winapi" version = "0.3.9" @@ -3069,18 +3052,18 @@ checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" [[package]] name = "zerocopy" -version = "0.7.11" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c19fae0c8a9efc6a8281f2e623db8af1db9e57852e04cde3e754dd2dc29340f" +checksum = "81ba595b9f2772fbee2312de30eeb80ec773b4cb2f1e8098db024afadda6c06f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.11" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc56589e9ddd1f1c28d4b4b5c773ce232910a6bb67a70133d61c9e347585efe9" +checksum = "772666c41fb6dceaf520b564b962d738a8e1a83b41bd48945f50837aed78bb1d" dependencies = [ "proc-macro2", "quote", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index ee00911cf..b4312056e 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,5 +11,5 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "f2f7aebd8143cb8b8ca24de27dd721c20e7985e3" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "2080f41b60fa5d4664f47f5527f70359a6471b6b" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "935f6265fc3797acd6d81a73511e29107167721a" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "cff12f6d90785a5ae984eb767e1ad83c147fc705" } diff --git a/zero_bin/leader/src/prover_input.rs b/zero_bin/leader/src/prover_input.rs index 1faef5468..00b34b8a5 100644 --- a/zero_bin/leader/src/prover_input.rs +++ b/zero_bin/leader/src/prover_input.rs @@ -5,20 +5,32 @@ use paladin::{ runtime::Runtime, }; use plonky_block_proof_gen::proof_types::{AggregatableProof, GeneratedBlockProof}; -use proof_protocol_decoder::types::{OtherBlockData, TxnProofGenIR}; +use proof_protocol_decoder::{ + processed_block_trace::ProcessingMeta, + trace_protocol::BlockTrace, + types::{CodeHash, OtherBlockData}, +}; use serde::Deserialize; #[derive(Debug, Deserialize)] pub(crate) struct ProverInput { - txs: Vec, + block_trace: BlockTrace, other_data: OtherBlockData, } +fn resolve_code_hash_fn(_: &CodeHash) -> Vec { + todo!() +} + impl ProverInput { pub(crate) async fn prove(self, runtime: &Runtime) -> Result { let other_data = self.other_data; + let txs = self.block_trace.into_txn_proof_gen_ir( + &ProcessingMeta::new(resolve_code_hash_fn), + other_data.clone(), + )?; - let agg_proof = IndexedStream::from(self.txs) + let agg_proof = IndexedStream::from(txs) .map(TxProof) .fold(AggProof { other: other_data.clone(), From 5ba2b252c38991096db6316004aa50fb552524a7 Mon Sep 17 00:00:00 2001 From: cpu Date: Sun, 29 Oct 2023 14:29:21 -0700 Subject: [PATCH 011/184] bump paladin --- zero_bin/Cargo.lock | 10 ++++------ zero_bin/Cargo.toml | 2 +- zero_bin/ops/Cargo.toml | 2 -- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index d45585ee3..299dc0522 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1542,8 +1542,6 @@ name = "ops" version = "0.1.0" dependencies = [ "anyhow", - "async-trait", - "futures", "once_cell", "paladin-core", "plonky_block_proof_gen", @@ -1577,9 +1575,9 @@ dependencies = [ [[package]] name = "paladin-core" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9d7358ef9004e0ab1f2e4721b84f6aa8cf57fd46b2efa7732b5fd54b15e5d8" +checksum = "c550efa420239735fae6a45dd1f0e58829c8547c0464370f9e048e91e9a442b7" dependencies = [ "anyhow", "async-trait", @@ -1602,9 +1600,9 @@ dependencies = [ [[package]] name = "paladin-opkind-derive" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52db5917dc6613839e99f55194fa6049b919906aad4a558076864fb6d524315b" +checksum = "c5e25b58dbb19317d61c5f812c78908b14eed74c20ca60c12bbd50a1d7f297f5" dependencies = [ "quote", "syn 2.0.38", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index b4312056e..bdac8e27e 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "ops"] resolver = "2" [workspace.dependencies] -paladin-core = "0.1.2" +paladin-core = "0.1.3" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 7562577d9..3c0a6a2b2 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -10,6 +10,4 @@ anyhow = { workspace = true } serde = { workspace = true } plonky_block_proof_gen = { workspace = true } proof_protocol_decoder = { workspace = true } -async-trait = "0.1.73" -futures = "0.3.28" once_cell = "1.18.0" From 6c5853395be7aee7c6f50c3f2ce7770055fa5e9a Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 3 Nov 2023 14:25:31 -0700 Subject: [PATCH 012/184] Add jerigon run mode --- zero_bin/Cargo.lock | 493 +++++++++++++++++++++++++++- zero_bin/Cargo.toml | 4 +- zero_bin/README.md | 18 +- zero_bin/leader/Cargo.toml | 5 + zero_bin/leader/src/cli.rs | 15 +- zero_bin/leader/src/config.rs | 1 + zero_bin/leader/src/main.rs | 9 + zero_bin/leader/src/prover_input.rs | 4 +- zero_bin/leader/src/rpc.rs | 193 +++++++++++ zero_bin/leader/src/stdio.rs | 4 +- 10 files changed, 726 insertions(+), 20 deletions(-) create mode 100644 zero_bin/leader/src/config.rs create mode 100644 zero_bin/leader/src/rpc.rs diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 299dc0522..7b9c2da33 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -93,6 +93,21 @@ dependencies = [ "url", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.4" @@ -453,6 +468,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets", +] + [[package]] name = "ciborium" version = "0.2.1" @@ -645,6 +673,51 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.38", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", + "serde", +] + [[package]] name = "des" version = "0.8.1" @@ -683,6 +756,15 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[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 = "enum-as-inner" version = "0.5.1" @@ -695,6 +777,29 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[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.38", +] + [[package]] name = "env_logger" version = "0.10.0" @@ -730,7 +835,7 @@ version = "0.6.0" source = "git+https://github.com/0xPolygonZero/eth_trie_utils.git?rev=e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5#e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5" dependencies = [ "bytes", - "enum-as-inner", + "enum-as-inner 0.5.1", "ethereum-types", "hex", "keccak-hash 0.10.0", @@ -839,6 +944,21 @@ 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" @@ -987,12 +1107,37 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +[[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 = "half" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.2" @@ -1088,6 +1233,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", + "h2", "http", "http-body", "httparse", @@ -1101,6 +1247,48 @@ dependencies = [ "want", ] +[[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 = "iana-time-zone" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[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" @@ -1149,6 +1337,17 @@ dependencies = [ "syn 1.0.109", ] +[[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", + "serde", +] + [[package]] name = "indexmap" version = "2.0.2" @@ -1156,7 +1355,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.2", + "serde", ] [[package]] @@ -1189,6 +1389,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "is-terminal" version = "0.4.9" @@ -1196,7 +1402,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", - "rustix 0.38.20", + "rustix 0.38.21", "windows-sys", ] @@ -1300,12 +1506,17 @@ dependencies = [ "axum", "clap", "dotenvy", + "ethereum-types", "ops", "paladin-core", + "plonky2_evm", "plonky_block_proof_gen", "proof_protocol_decoder", + "reqwest", "serde", "serde_json", + "serde_path_to_error", + "thiserror", "tokio", "tracing", "tracing-subscriber", @@ -1408,6 +1619,24 @@ dependencies = [ "windows-sys", ] +[[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 = "nom" version = "7.1.3" @@ -1531,12 +1760,50 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "openssl" +version = "0.10.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" +dependencies = [ + "bitflags 2.4.1", + "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.38", +] + [[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.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "ops" version = "0.1.0" @@ -1775,6 +2042,12 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + [[package]] name = "plonky2" version = "0.1.4" @@ -1783,7 +2056,7 @@ dependencies = [ "ahash", "anyhow", "getrandom", - "hashbrown", + "hashbrown 0.14.2", "itertools", "keccak-hash 0.8.0", "log", @@ -1809,7 +2082,7 @@ dependencies = [ "env_logger", "eth_trie_utils", "ethereum-types", - "hashbrown", + "hashbrown 0.14.2", "hex-literal", "itertools", "jemallocator", @@ -1864,7 +2137,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=935f6265fc3797acd6d81a73511e29107167721a#935f6265fc3797acd6d81a73511e29107167721a" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=687ebf6e0cf7f56993fd3eae5abb5f182441374f#687ebf6e0cf7f56993fd3eae5abb5f182441374f" dependencies = [ "ethereum-types", "log", @@ -1891,6 +2164,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1942,16 +2221,22 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=cff12f6d90785a5ae984eb767e1ad83c147fc705#cff12f6d90785a5ae984eb767e1ad83c147fc705" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=145dffc9b85c3d816aa71975e1218c95fcaa1817#145dffc9b85c3d816aa71975e1218c95fcaa1817" dependencies = [ + "ciborium", + "ciborium-io", + "enum-as-inner 0.6.0", + "enumn", "eth_trie_utils", "ethereum-types", "hex", "keccak-hash 0.10.0", + "log", "plonky2_evm", "rlp", "rlp-derive", "serde", + "serde_with", "thiserror", ] @@ -2093,6 +2378,44 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "reqwest" +version = "0.11.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "ring" version = "0.17.5" @@ -2156,9 +2479,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.20" +version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ "bitflags 2.4.1", "errno", @@ -2335,6 +2658,35 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.0.2", + "serde", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "sha1" version = "0.10.6" @@ -2465,6 +2817,27 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -2483,6 +2856,19 @@ dependencies = [ "rustls-pemfile", ] +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +dependencies = [ + "cfg-if", + "fastrand 2.0.1", + "redox_syscall", + "rustix 0.38.21", + "windows-sys", +] + [[package]] name = "termcolor" version = "1.3.0" @@ -2522,6 +2908,35 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "itoa", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -2587,6 +3002,16 @@ dependencies = [ "syn 2.0.38", ] +[[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-reactor-trait" version = "1.1.0" @@ -2623,6 +3048,7 @@ dependencies = [ "futures-sink", "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -2637,7 +3063,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.0.2", "toml_datetime", "winnow", ] @@ -2832,6 +3258,12 @@ 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" @@ -2884,6 +3316,18 @@ dependencies = [ "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" @@ -2913,6 +3357,16 @@ 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 = "winapi" version = "0.3.9" @@ -2944,6 +3398,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -3019,6 +3482,16 @@ 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 = "worker" version = "0.1.0" diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index bdac8e27e..082b25854 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,5 +11,5 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "935f6265fc3797acd6d81a73511e29107167721a" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "cff12f6d90785a5ae984eb767e1ad83c147fc705" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "687ebf6e0cf7f56993fd3eae5abb5f182441374f" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "145dffc9b85c3d816aa71975e1218c95fcaa1817" } diff --git a/zero_bin/README.md b/zero_bin/README.md index 56b0a754c..1f0432d37 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -16,6 +16,7 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [Input mode](#input-mode) - [stdin](#stdin) - [HTTP](#http) + - [Jerigon](#jerigon) - [Docker](#docker) @@ -53,9 +54,13 @@ Usage: leader [OPTIONS] Options: -m, --mode - The input mode. If `stdio`, the input is read from stdin. If `http`, the input is read from HTTP requests [default: std-io] [possible values: std-io, http] + The input mode. If `std-io`, the input is read from stdin. If `http`, the input is read from HTTP requests. If `jerigon`, the input is read from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` RPC methods from Jerigon [default: std-io] [possible values: std-io, http, jerigon] -p, --port The port to listen on when using the `http` mode [default: 8080] + --rpc-url + The RPC URL to use when using the `jerigon` mode + -b, --block-number + The block number to use when using the `jerigon` mode -t, --task-bus-routing-key Specifies the routing key for publishing task messages. In most cases, the default value should suffice [default: task] -s, --serializer @@ -99,7 +104,11 @@ RUST_LOG=debug cargo r --release --bin leader -- --mode http --runtime in-memory ``` ### Input mode -Pass JSON encoded prover input to stdin or over HTTP. See [`prover_input.rs`](/leader/src/prover_input.rs) for the input format. The examples below assume some prover input is stored in `./block_121.json`. +Pass JSON encoded prover input to stdin or over HTTP, or point the leader to a Jerigon RPC endpoint to retrieve the prover input from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` RPC methods. + +See [`prover_input.rs`](/leader/src/prover_input.rs) for the input format. + +The `std-io` and `http` examples below assume some prover input is stored in `./block_121.json`. #### stdin @@ -119,6 +128,11 @@ Once initialized, send a request: curl -X POST -H "Content-Type: application/json" -d @./block_121.json http://localhost:8080/prove ``` +#### Jerigon + +```bash +RUST_LOG=debug cargo r --release --bin leader -- --mode jerigon --runtime in-memory --rpc-url --block-number 16 +``` ## Docker Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. \ No newline at end of file diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index fc78f070a..04059b248 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -17,3 +17,8 @@ proof_protocol_decoder = { workspace = true } serde_json = "1.0.107" axum = "0.6.20" ops = { path = "../ops" } +serde_path_to_error = "0.1.14" +reqwest = { version = "0.11.22", features = ["json"] } +thiserror = "1.0.50" +ethereum-types = "0.14.1" +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index f50cd0e21..64f201258 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -3,15 +3,23 @@ use paladin::config::Config; #[derive(Parser)] pub(crate) struct Cli { - /// The input mode. If `stdio`, the input is read from stdin. If `http`, the - /// input is read from HTTP requests. + /// The input mode. If `std-io`, the input is read from stdin. If `http`, + /// the input is read from HTTP requests. If `jerigon`, the input is + /// read from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` + /// RPC methods from Jerigon. #[arg(short, long, value_enum, default_value_t = Mode::StdIo)] pub(crate) mode: Mode, /// The port to listen on when using the `http` mode. #[arg(short, long, default_value_t = 8080)] pub(crate) port: u16, + /// The RPC URL to use when using the `jerigon` mode. + #[arg(long, required_if_eq("mode", "jerigon"))] + pub(crate) rpc_url: Option, + /// The block number to use when using the `jerigon` mode. + #[arg(short, long, required_if_eq("mode", "jerigon"))] + pub(crate) block_number: Option, #[command(flatten)] - pub paladin_options: Config, + pub(crate) paladin_options: Config, } #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum, Default)] @@ -19,4 +27,5 @@ pub(crate) enum Mode { #[default] StdIo, Http, + Jerigon, } diff --git a/zero_bin/leader/src/config.rs b/zero_bin/leader/src/config.rs new file mode 100644 index 000000000..ca3369495 --- /dev/null +++ b/zero_bin/leader/src/config.rs @@ -0,0 +1 @@ +pub const MATIC_CHAIN_ID: u64 = 137; diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 51923e57b..96278eb1d 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -6,9 +6,11 @@ use ops::Ops; use paladin::runtime::Runtime; mod cli; +mod config; mod http; mod init; mod prover_input; +mod rpc; mod stdio; #[tokio::main] @@ -26,6 +28,13 @@ async fn main() -> Result<()> { Mode::Http => { http::http_main(runtime, args.port).await?; } + Mode::Jerigon => { + let rpc_url = args.rpc_url.expect("rpc-url is required in jerigon mode"); + let block_number = args + .block_number + .expect("block-number is required in jerigon mode"); + rpc::rpc_main(runtime, &rpc_url, block_number).await?; + } } Ok(()) diff --git a/zero_bin/leader/src/prover_input.rs b/zero_bin/leader/src/prover_input.rs index 00b34b8a5..01e5034e1 100644 --- a/zero_bin/leader/src/prover_input.rs +++ b/zero_bin/leader/src/prover_input.rs @@ -14,8 +14,8 @@ use serde::Deserialize; #[derive(Debug, Deserialize)] pub(crate) struct ProverInput { - block_trace: BlockTrace, - other_data: OtherBlockData, + pub(crate) block_trace: BlockTrace, + pub(crate) other_data: OtherBlockData, } fn resolve_code_hash_fn(_: &CodeHash) -> Vec { diff --git a/zero_bin/leader/src/rpc.rs b/zero_bin/leader/src/rpc.rs new file mode 100644 index 000000000..04318fead --- /dev/null +++ b/zero_bin/leader/src/rpc.rs @@ -0,0 +1,193 @@ +use anyhow::Result; +use ethereum_types::{Address, Bloom, H256, U256}; +use paladin::runtime::Runtime; +use plonky2_evm::proof::{BlockHashes, BlockMetadata}; +use proof_protocol_decoder::{ + trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, + types::{BlockLevelData, OtherBlockData}, +}; +use reqwest::IntoUrl; +use serde::Deserialize; +use thiserror::Error; +use tokio::try_join; +use tracing::{debug, info}; + +use crate::{config::MATIC_CHAIN_ID, prover_input::ProverInput}; + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "snake_case")] +#[allow(clippy::large_enum_variant)] +enum JerigonResultItem { + Result(TxnInfo), + BlockWitness(BlockTraceTriePreImages), +} + +/// The response from the `debug_traceBlockByNumber` RPC method. +#[derive(Deserialize, Debug)] +struct JerigonTraceResponse { + result: Vec, +} + +#[derive(Error, Debug)] +enum JerigonTraceError { + #[error("expected BlockTraceTriePreImages in block_witness key")] + BlockTraceTriePreImagesNotFound, +} + +impl TryFrom for BlockTrace { + type Error = JerigonTraceError; + + fn try_from(value: JerigonTraceResponse) -> Result { + let mut txn_info = Vec::new(); + let mut trie_pre_images = None; + + for item in value.result { + match item { + JerigonResultItem::Result(info) => { + txn_info.push(info); + } + JerigonResultItem::BlockWitness(pre_images) => { + trie_pre_images = Some(pre_images); + } + } + } + + let trie_pre_images = + trie_pre_images.ok_or(JerigonTraceError::BlockTraceTriePreImagesNotFound)?; + + Ok(Self { + txn_info, + trie_pre_images, + }) + } +} + +impl JerigonTraceResponse { + /// Fetches the block trace for the given block number. + async fn fetch(rpc_url: U, block_number: u64) -> Result { + let client = reqwest::Client::new(); + let block_number_hex = format!("0x{:x}", block_number); + info!("Fetching block trace for block {}", block_number_hex); + + let result: JerigonTraceResponse = client + .post(rpc_url) + .json(&serde_json::json!({ + "jsonrpc": "2.0", + "method": "debug_traceBlockByNumber", + "params": [&block_number_hex, {"tracer": "zeroTracer"}], + "id": 1, + })) + .send() + .await? + .json() + .await?; + + Ok(result) + } +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct EthGetBlockByNumberResult { + base_fee_per_gas: U256, + difficulty: U256, + gas_limit: U256, + gas_used: U256, + hash: H256, + logs_bloom: Bloom, + miner: Address, + mix_hash: H256, + number: U256, + timestamp: U256, +} + +/// The response from the `eth_getBlockByNumber` RPC method. +#[derive(Deserialize, Debug)] +struct EthGetBlockByNumberResponse { + result: EthGetBlockByNumberResult, +} + +impl From for OtherBlockData { + fn from(value: EthGetBlockByNumberResponse) -> Self { + let mut bloom = [U256::zero(); 8]; + + for (i, word) in value + .result + .logs_bloom + .as_fixed_bytes() + .chunks_exact(32) + .enumerate() + { + bloom[i] = U256::from_big_endian(word); + } + + let block_metadata = BlockMetadata { + block_beneficiary: value.result.miner, + block_timestamp: value.result.timestamp, + block_number: value.result.number, + block_difficulty: value.result.difficulty, + block_random: value.result.mix_hash, + block_gaslimit: value.result.gas_limit, + block_chain_id: MATIC_CHAIN_ID.into(), + block_base_fee: value.result.base_fee_per_gas, + block_gas_used: value.result.gas_used, + block_bloom: bloom, + }; + + Self { + b_data: BlockLevelData { + b_meta: block_metadata, + b_hashes: BlockHashes { + prev_hashes: Default::default(), + cur_hash: value.result.hash, + }, + }, + genesis_state_trie_root: Default::default(), + } + } +} + +impl EthGetBlockByNumberResponse { + /// Fetches the block metadata for the given block number. + async fn fetch(rpc_url: U, block_number: u64) -> Result { + let client = reqwest::Client::new(); + let block_number_hex = format!("0x{:x}", block_number); + info!("Fetching block metadata for block {}", block_number_hex); + + let result: EthGetBlockByNumberResponse = client + .post(rpc_url) + .json(&serde_json::json!({ + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": [&block_number_hex, false], + "id": 1, + })) + .send() + .await? + .json() + .await?; + + Ok(result) + } +} + +/// The main function for the jerigon mode. +pub(crate) async fn rpc_main(runtime: Runtime, rpc_url: &str, block_number: u64) -> Result<()> { + let (trace_result, block_result) = try_join!( + JerigonTraceResponse::fetch(rpc_url, block_number), + EthGetBlockByNumberResponse::fetch(rpc_url, block_number) + )?; + + debug!("Got block result: {:?}", block_result); + debug!("Got trace result: {:?}", trace_result); + + let prover_input = ProverInput { + block_trace: trace_result.try_into()?, + other_data: block_result.into(), + }; + + let proof = prover_input.prove(&runtime).await?; + info!("Successfully proved {:#?}", proof); + + Ok(()) +} diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index ca841e777..395eca3d7 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -11,7 +11,9 @@ pub(crate) async fn stdio_main(runtime: Runtime) -> Result<()> { let mut buffer = String::new(); std::io::stdin().read_to_string(&mut buffer)?; - let input: ProverInput = serde_json::from_str(&buffer)?; + let des = &mut serde_json::Deserializer::from_str(&buffer); + let input: ProverInput = serde_path_to_error::deserialize(des)?; + let proof = input.prove(&runtime).await?; info!("Successfully proved {:#?}", proof); From a0636d4bc46a6f4fc910233cd0b73668c331ae21 Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 3 Nov 2023 16:03:24 -0700 Subject: [PATCH 013/184] bump protocol deps --- zero_bin/Cargo.lock | 4 ++-- zero_bin/Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 7b9c2da33..8874885d2 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2137,7 +2137,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=687ebf6e0cf7f56993fd3eae5abb5f182441374f#687ebf6e0cf7f56993fd3eae5abb5f182441374f" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=8bd668c3f521627eb4d8587bf1c90bfff5fac855#8bd668c3f521627eb4d8587bf1c90bfff5fac855" dependencies = [ "ethereum-types", "log", @@ -2221,7 +2221,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=145dffc9b85c3d816aa71975e1218c95fcaa1817#145dffc9b85c3d816aa71975e1218c95fcaa1817" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=d28e3afa4a7852e68c3cc9e5ee509cc32a5be6c7#d28e3afa4a7852e68c3cc9e5ee509cc32a5be6c7" dependencies = [ "ciborium", "ciborium-io", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 082b25854..a56742d1e 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,5 +11,5 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "687ebf6e0cf7f56993fd3eae5abb5f182441374f" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "145dffc9b85c3d816aa71975e1218c95fcaa1817" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "8bd668c3f521627eb4d8587bf1c90bfff5fac855" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "d28e3afa4a7852e68c3cc9e5ee509cc32a5be6c7" } From 3e5a48574cbe442addf90acad39b253ba72d3a11 Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 3 Nov 2023 17:42:32 -0700 Subject: [PATCH 014/184] Avoid running CI twice on PR --- zero_bin/.github/workflows/ci.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml index 5acedee79..8b51baa53 100644 --- a/zero_bin/.github/workflows/ci.yml +++ b/zero_bin/.github/workflows/ci.yml @@ -1,4 +1,9 @@ -on: [push, pull_request] +on: + push: + branches: + - main + pull_request: + name: ci jobs: From 51547713c6161727d042f49d407fd068ee3dbaff Mon Sep 17 00:00:00 2001 From: cpu Date: Mon, 6 Nov 2023 13:20:02 -0800 Subject: [PATCH 015/184] Write proof output to directory in `http` mode --- zero_bin/README.md | 31 +++++++------------- zero_bin/leader/src/cli.rs | 16 +++++++---- zero_bin/leader/src/http.rs | 57 ++++++++++++++++++++++++++++++++----- zero_bin/leader/src/main.rs | 18 ++++++++++-- 4 files changed, 87 insertions(+), 35 deletions(-) diff --git a/zero_bin/README.md b/zero_bin/README.md index 1f0432d37..9094198b6 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -53,24 +53,13 @@ cargo run --bin leader -- --help Usage: leader [OPTIONS] Options: - -m, --mode - The input mode. If `std-io`, the input is read from stdin. If `http`, the input is read from HTTP requests. If `jerigon`, the input is read from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` RPC methods from Jerigon [default: std-io] [possible values: std-io, http, jerigon] - -p, --port - The port to listen on when using the `http` mode [default: 8080] - --rpc-url - The RPC URL to use when using the `jerigon` mode - -b, --block-number - The block number to use when using the `jerigon` mode - -t, --task-bus-routing-key - Specifies the routing key for publishing task messages. In most cases, the default value should suffice [default: task] - -s, --serializer - Determines the serialization format to be used [default: cbor] [possible values: cbor] - -r, --runtime - Specifies the runtime environment to use [default: amqp] [possible values: amqp, in-memory] - --amqp-uri - Provides the URI for the AMQP broker, if the AMQP runtime is selected [env: AMQP_URI=amqp://localhost:5672] - -h, --help - Print help + -m, --mode The input mode. If `std-io`, the input is read from stdin. If `http`, the input is read from HTTP requests. If `jerigon`, the input is read from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` RPC methods from Jerigon [default: std-io] [possible values: std-io, http, jerigon] + -p, --port The port to listen on when using the `http` mode [default: 8080] + -o, --output-dir The directory to which output should be written (`http` mode only) + --rpc-url The RPC URL to use when using the `jerigon` mode + -b, --block-number The block number to use when using the `jerigon` mode + -r, --runtime Specifies the paladin runtime to use [default: amqp] [possible values: amqp, in-memory] + -h, --help Print help ``` ### Paladin Runtime @@ -92,7 +81,7 @@ RUST_LOG=debug cargo r --release --bin worker Start the leader process with the desired [input mode](#input-mode). The default paladin runtime is AMQP, so no additional flags are required to enable it. ```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode http +RUST_LOG=debug cargo r --release --bin leader -- --mode http --output-dir ./output ``` #### Starting an in-memory (single process) cluster @@ -100,7 +89,7 @@ RUST_LOG=debug cargo r --release --bin leader -- --mode http Paladin can emulate a cluster in memory within a single process. Useful for testing purposes. ```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode http --runtime in-memory +RUST_LOG=debug cargo r --release --bin leader -- --mode http --runtime in-memory --output-dir ./output ``` ### Input mode @@ -120,7 +109,7 @@ cat ./block_121.json | RUST_LOG=debug cargo r --release --bin leader Start the server ```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode http +RUST_LOG=debug cargo r --release --bin leader -- --mode http --output-dir ./output ``` Once initialized, send a request: diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 64f201258..d9a376b2a 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -1,5 +1,7 @@ -use clap::{Parser, ValueEnum}; -use paladin::config::Config; +use std::path::PathBuf; + +use clap::{Parser, ValueEnum, ValueHint}; +use paladin::config::Runtime; #[derive(Parser)] pub(crate) struct Cli { @@ -12,14 +14,18 @@ pub(crate) struct Cli { /// The port to listen on when using the `http` mode. #[arg(short, long, default_value_t = 8080)] pub(crate) port: u16, + /// The directory to which output should be written (`http` mode only). + #[arg(short, long, required_if_eq("mode", "http"), value_hint = ValueHint::DirPath)] + pub(crate) output_dir: Option, /// The RPC URL to use when using the `jerigon` mode. - #[arg(long, required_if_eq("mode", "jerigon"))] + #[arg(long, required_if_eq("mode", "jerigon"), value_hint = ValueHint::Url)] pub(crate) rpc_url: Option, /// The block number to use when using the `jerigon` mode. #[arg(short, long, required_if_eq("mode", "jerigon"))] pub(crate) block_number: Option, - #[command(flatten)] - pub(crate) paladin_options: Config, + /// Specifies the paladin runtime to use. + #[arg(long, short, value_enum, default_value_t = Runtime::Amqp)] + pub(crate) runtime: Runtime, } #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum, Default)] diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index 961b3f3c1..c70337556 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -1,14 +1,17 @@ -use std::{net::SocketAddr, sync::Arc}; +use std::{net::SocketAddr, path::PathBuf, sync::Arc}; -use anyhow::Result; +use anyhow::{bail, Result}; use axum::{http::StatusCode, routing::post, Json, Router}; +use ethereum_types::U256; use paladin::runtime::Runtime; +use plonky_block_proof_gen::proof_types::GeneratedBlockProof; +use serde_json::to_writer; use tracing::{debug, error, info}; use crate::prover_input::ProverInput; /// The main function for the HTTP mode. -pub(crate) async fn http_main(runtime: Runtime, port: u16) -> Result<()> { +pub(crate) async fn http_main(runtime: Runtime, port: u16, output_dir: PathBuf) -> Result<()> { let addr = SocketAddr::from(([0, 0, 0, 0], port)); debug!("listening on {}", addr); @@ -17,7 +20,7 @@ pub(crate) async fn http_main(runtime: Runtime, port: u16) -> Result<()> { "/prove", post({ let runtime = runtime.clone(); - move |body| prove(body, runtime) + move |body| prove(body, runtime, output_dir.clone()) }), ); @@ -26,13 +29,53 @@ pub(crate) async fn http_main(runtime: Runtime, port: u16) -> Result<()> { .await?) } -async fn prove(Json(payload): Json, runtime: Arc) -> StatusCode { +/// Writes the generated block proof to a file. +/// +/// Returns the fully qualified file name. +fn write_to_file( + output_dir: PathBuf, + block_number: U256, + generated_block_proof: &GeneratedBlockProof, +) -> Result { + let file_name = format!("proof-{}.json", block_number); + let fully_qualified_file_name = output_dir.join(file_name); + let file = std::fs::File::create(fully_qualified_file_name.clone()); + + match file { + Ok(file) => { + to_writer(file, &generated_block_proof.intern)?; + Ok(fully_qualified_file_name) + } + Err(e) => { + bail!("Error while writing to file: {e:#?}"); + } + } +} + +async fn prove( + Json(payload): Json, + runtime: Arc, + output_dir: PathBuf, +) -> StatusCode { debug!("Received payload: {:#?}", payload); + let block_number = payload.other_data.b_data.b_meta.block_number; + info!("Proving block {block_number}"); + match payload.prove(&runtime).await { Ok(b_proof) => { - info!("Successfully proved {b_proof:#?}"); - StatusCode::OK + info!("Successfully proved block {block_number}"); + + match write_to_file(output_dir, block_number, &b_proof) { + Ok(file) => { + info!("Successfully wrote proof to {}", file.display()); + StatusCode::OK + } + Err(e) => { + error!("{e}"); + StatusCode::INTERNAL_SERVER_ERROR + } + } } Err(e) => { error!("Error while proving: {e:#?}"); diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 96278eb1d..8c8bb499a 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -19,14 +19,28 @@ async fn main() -> Result<()> { init::tracing(); let args = cli::Cli::parse(); - let runtime = Runtime::from_config::(&args.paladin_options).await?; + let runtime = Runtime::from_config::(&paladin::config::Config { + runtime: args.runtime, + ..Default::default() + }) + .await?; match args.mode { Mode::StdIo => { stdio::stdio_main(runtime).await?; } Mode::Http => { - http::http_main(runtime, args.port).await?; + let output_dir = args + .output_dir + .expect("output-dir is required in http mode"); + + // check if output_dir exists, is a directory, and is writable + let output_dir_metadata = std::fs::metadata(&output_dir)?; + if !output_dir.is_dir() || output_dir_metadata.permissions().readonly() { + panic!("output-dir is not a writable directory"); + } + + http::http_main(runtime, args.port, output_dir).await?; } Mode::Jerigon => { let rpc_url = args.rpc_url.expect("rpc-url is required in jerigon mode"); From 3d2779db514acad1107a089d6a0bb9dd76f8cc07 Mon Sep 17 00:00:00 2001 From: cpu Date: Mon, 6 Nov 2023 14:08:15 -0800 Subject: [PATCH 016/184] Pin nightly version to avoid regression --- zero_bin/rust-toolchain.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/rust-toolchain.toml b/zero_bin/rust-toolchain.toml index 5d56faf9a..f2c9ba010 100644 --- a/zero_bin/rust-toolchain.toml +++ b/zero_bin/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "nightly" +channel = "nightly-2023-11-03" From 25416eabc6e0b8885749699c13270bda928e8804 Mon Sep 17 00:00:00 2001 From: cpu Date: Mon, 6 Nov 2023 14:11:33 -0800 Subject: [PATCH 017/184] Pin CI workflow to working nightly version --- zero_bin/.github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml index 8b51baa53..80bdb316d 100644 --- a/zero_bin/.github/workflows/ci.yml +++ b/zero_bin/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: - name: Install toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly + toolchain: nightly-2023-11-03 profile: minimal override: true components: rustfmt, clippy From 98bae3d381c6d1a7493f49bc26469e42004f31f2 Mon Sep 17 00:00:00 2001 From: cpu Date: Mon, 6 Nov 2023 15:11:25 -0800 Subject: [PATCH 018/184] Write proof results to stdout for jerigon and stdio modes --- zero_bin/README.md | 4 ++-- zero_bin/leader/src/http.rs | 27 +++++++++++---------------- zero_bin/leader/src/prover_input.rs | 10 ++++++++++ zero_bin/leader/src/rpc.rs | 4 +++- zero_bin/leader/src/stdio.rs | 7 +++---- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/zero_bin/README.md b/zero_bin/README.md index 9094198b6..e0ae6538e 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -102,7 +102,7 @@ The `std-io` and `http` examples below assume some prover input is stored in `./ #### stdin ```bash -cat ./block_121.json | RUST_LOG=debug cargo r --release --bin leader +cat ./block_121.json | RUST_LOG=debug cargo r --release --bin leader > ./output/block_121.json ``` #### HTTP @@ -120,7 +120,7 @@ curl -X POST -H "Content-Type: application/json" -d @./block_121.json http://loc #### Jerigon ```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode jerigon --runtime in-memory --rpc-url --block-number 16 +RUST_LOG=debug cargo r --release --bin leader -- --mode jerigon --runtime in-memory --rpc-url --block-number 16 > ./output/block_16.json ``` ## Docker diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index c70337556..bafbece63 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -59,26 +59,21 @@ async fn prove( ) -> StatusCode { debug!("Received payload: {:#?}", payload); - let block_number = payload.other_data.b_data.b_meta.block_number; - info!("Proving block {block_number}"); + let block_number = payload.get_block_number(); match payload.prove(&runtime).await { - Ok(b_proof) => { - info!("Successfully proved block {block_number}"); - - match write_to_file(output_dir, block_number, &b_proof) { - Ok(file) => { - info!("Successfully wrote proof to {}", file.display()); - StatusCode::OK - } - Err(e) => { - error!("{e}"); - StatusCode::INTERNAL_SERVER_ERROR - } + Ok(b_proof) => match write_to_file(output_dir, block_number, &b_proof) { + Ok(file) => { + info!("Successfully wrote proof to {}", file.display()); + StatusCode::OK } - } + Err(e) => { + error!("{e}"); + StatusCode::INTERNAL_SERVER_ERROR + } + }, Err(e) => { - error!("Error while proving: {e:#?}"); + error!("Error while proving block {block_number}: {e:#?}"); StatusCode::INTERNAL_SERVER_ERROR } } diff --git a/zero_bin/leader/src/prover_input.rs b/zero_bin/leader/src/prover_input.rs index 01e5034e1..87bf53927 100644 --- a/zero_bin/leader/src/prover_input.rs +++ b/zero_bin/leader/src/prover_input.rs @@ -1,4 +1,5 @@ use anyhow::{bail, Result}; +use ethereum_types::U256; use ops::{AggProof, BlockProof, TxProof}; use paladin::{ directive::{Directive, IndexedStream, Literal}, @@ -11,6 +12,7 @@ use proof_protocol_decoder::{ types::{CodeHash, OtherBlockData}, }; use serde::Deserialize; +use tracing::info; #[derive(Debug, Deserialize)] pub(crate) struct ProverInput { @@ -23,7 +25,14 @@ fn resolve_code_hash_fn(_: &CodeHash) -> Vec { } impl ProverInput { + pub(crate) fn get_block_number(&self) -> U256 { + self.other_data.b_data.b_meta.block_number + } + pub(crate) async fn prove(self, runtime: &Runtime) -> Result { + let block_number = self.get_block_number(); + info!("Proving block {block_number}"); + let other_data = self.other_data; let txs = self.block_trace.into_txn_proof_gen_ir( &ProcessingMeta::new(resolve_code_hash_fn), @@ -47,6 +56,7 @@ impl ProverInput { .run(runtime) .await?; + info!("Successfully proved block {block_number}"); Ok(block_proof.0) } else { bail!("AggProof is is not GeneratedAggProof") diff --git a/zero_bin/leader/src/rpc.rs b/zero_bin/leader/src/rpc.rs index 04318fead..668833943 100644 --- a/zero_bin/leader/src/rpc.rs +++ b/zero_bin/leader/src/rpc.rs @@ -1,3 +1,5 @@ +use std::io::Write; + use anyhow::Result; use ethereum_types::{Address, Bloom, H256, U256}; use paladin::runtime::Runtime; @@ -187,7 +189,7 @@ pub(crate) async fn rpc_main(runtime: Runtime, rpc_url: &str, block_number: u64) }; let proof = prover_input.prove(&runtime).await?; - info!("Successfully proved {:#?}", proof); + std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; Ok(()) } diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index 395eca3d7..1f7613625 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -1,8 +1,7 @@ -use std::io::Read; +use std::io::{Read, Write}; use anyhow::Result; use paladin::runtime::Runtime; -use tracing::info; use crate::prover_input::ProverInput; @@ -13,9 +12,9 @@ pub(crate) async fn stdio_main(runtime: Runtime) -> Result<()> { let des = &mut serde_json::Deserializer::from_str(&buffer); let input: ProverInput = serde_path_to_error::deserialize(des)?; - let proof = input.prove(&runtime).await?; - info!("Successfully proved {:#?}", proof); + + std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; Ok(()) } From e659366fd79937409e038e66ed26554a7cd32c39 Mon Sep 17 00:00:00 2001 From: cpu Date: Mon, 6 Nov 2023 16:18:21 -0800 Subject: [PATCH 019/184] Add verifier binary --- zero_bin/Cargo.lock | 16 +++++++++++++++- zero_bin/Cargo.toml | 6 ++++-- zero_bin/README.md | 27 +++++++++++++++++++++++---- zero_bin/leader/Cargo.toml | 7 ++++--- zero_bin/verifier/Cargo.toml | 14 ++++++++++++++ zero_bin/verifier/src/cli.rs | 10 ++++++++++ zero_bin/verifier/src/init.rs | 11 +++++++++++ zero_bin/verifier/src/main.rs | 24 ++++++++++++++++++++++++ 8 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 zero_bin/verifier/Cargo.toml create mode 100644 zero_bin/verifier/src/cli.rs create mode 100644 zero_bin/verifier/src/init.rs create mode 100644 zero_bin/verifier/src/main.rs diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 8874885d2..9aca75f2f 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2137,7 +2137,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=8bd668c3f521627eb4d8587bf1c90bfff5fac855#8bd668c3f521627eb4d8587bf1c90bfff5fac855" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=bb114bb8a3ba88cdd3c2e3bb65171b6a8e812a5b#bb114bb8a3ba88cdd3c2e3bb65171b6a8e812a5b" dependencies = [ "ethereum-types", "log", @@ -3264,6 +3264,20 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "verifier" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "plonky_block_proof_gen", + "serde", + "serde_json", + "serde_path_to_error", + "tracing", + "tracing-subscriber", +] + [[package]] name = "version_check" version = "0.9.4" diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index a56742d1e..4e28f87a3 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["leader", "worker", "ops"] +members = ["leader", "worker", "ops", "verifier"] resolver = "2" [workspace.dependencies] @@ -11,5 +11,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "8bd668c3f521627eb4d8587bf1c90bfff5fac855" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "bb114bb8a3ba88cdd3c2e3bb65171b6a8e812a5b" } proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "d28e3afa4a7852e68c3cc9e5ee509cc32a5be6c7" } +serde_path_to_error = "0.1.14" +serde_json = "1.0.107" diff --git a/zero_bin/README.md b/zero_bin/README.md index e0ae6538e..b7fc8d0bc 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -18,6 +18,7 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [HTTP](#http) - [Jerigon](#jerigon) - [Docker](#docker) + - [Verifier](#verifier) ## Project layout @@ -48,7 +49,7 @@ The leader process. Receives proof generation requests, and distributes them to Leader binary arguments and options are comprised of paladin configuration and input mode: ``` -cargo run --bin leader -- --help +cargo r --bin leader -- --help Usage: leader [OPTIONS] @@ -102,7 +103,7 @@ The `std-io` and `http` examples below assume some prover input is stored in `./ #### stdin ```bash -cat ./block_121.json | RUST_LOG=debug cargo r --release --bin leader > ./output/block_121.json +cat ./block_121.json | RUST_LOG=debug cargo r --release --bin leader > ./output/proof_121.json ``` #### HTTP @@ -120,8 +121,26 @@ curl -X POST -H "Content-Type: application/json" -d @./block_121.json http://loc #### Jerigon ```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode jerigon --runtime in-memory --rpc-url --block-number 16 > ./output/block_16.json +RUST_LOG=debug cargo r --release --bin leader -- --mode jerigon --runtime in-memory --rpc-url --block-number 16 > ./output/proof_16.json ``` ## Docker -Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. \ No newline at end of file +Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. + +## Verifier + +A verifier binary is provided to verify the correctness of the generated proof. The verifier expects output in the format generated by the leader. The verifier binary arguments are as follows: +``` +cargo r --bin verifier -- --help + +Usage: verifier --file-path + +Options: + -f, --file-path The file containing the proof to verify + -h, --help Print help +``` + +Example: +```bash +cargo r --bin verifier -- -f ./output/proof_16.json +``` \ No newline at end of file diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 04059b248..7a88b66b5 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -14,11 +14,12 @@ dotenvy = { workspace = true } tokio = { workspace = true } plonky_block_proof_gen = { workspace = true } proof_protocol_decoder = { workspace = true } -serde_json = "1.0.107" +serde_json = { workspace = true } +serde_path_to_error = { workspace = true } axum = "0.6.20" -ops = { path = "../ops" } -serde_path_to_error = "0.1.14" reqwest = { version = "0.11.22", features = ["json"] } thiserror = "1.0.50" ethereum-types = "0.14.1" plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } + +ops = { path = "../ops" } diff --git a/zero_bin/verifier/Cargo.toml b/zero_bin/verifier/Cargo.toml new file mode 100644 index 000000000..e0c6d45e6 --- /dev/null +++ b/zero_bin/verifier/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "verifier" +version = "0.1.0" +edition = "2021" + +[dependencies] +clap = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +anyhow = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +serde_path_to_error = { workspace = true } +plonky_block_proof_gen = { workspace = true } diff --git a/zero_bin/verifier/src/cli.rs b/zero_bin/verifier/src/cli.rs new file mode 100644 index 000000000..479c8325c --- /dev/null +++ b/zero_bin/verifier/src/cli.rs @@ -0,0 +1,10 @@ +use std::path::PathBuf; + +use clap::{Parser, ValueHint}; + +#[derive(Parser)] +pub(crate) struct Cli { + /// The file containing the proof to verify + #[arg(short, long, value_hint = ValueHint::FilePath)] + pub(crate) file_path: PathBuf, +} diff --git a/zero_bin/verifier/src/init.rs b/zero_bin/verifier/src/init.rs new file mode 100644 index 000000000..28c00d482 --- /dev/null +++ b/zero_bin/verifier/src/init.rs @@ -0,0 +1,11 @@ +use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; +pub(crate) fn tracing() { + tracing_subscriber::Registry::default() + .with( + tracing_subscriber::fmt::layer() + .pretty() + .with_span_events(FmtSpan::CLOSE) + .with_filter(EnvFilter::from_default_env()), + ) + .init(); +} diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs new file mode 100644 index 000000000..3cdf444a2 --- /dev/null +++ b/zero_bin/verifier/src/main.rs @@ -0,0 +1,24 @@ +use std::fs::File; + +use anyhow::Result; +use clap::Parser; +use plonky_block_proof_gen::{prover_state::ProverStateBuilder, types::PlonkyProofIntern}; +use serde_json::Deserializer; + +mod cli; +mod init; + +fn main() -> Result<()> { + init::tracing(); + + let args = cli::Cli::parse(); + let file = File::open(args.file_path)?; + let des = &mut Deserializer::from_reader(&file); + let input: PlonkyProofIntern = serde_path_to_error::deserialize(des)?; + + let prover = ProverStateBuilder::default().build(); + + prover.state.verify_block(&input)?; + + Ok(()) +} From 015db1d496b65a6f93d9a2216de284599e67cee8 Mon Sep 17 00:00:00 2001 From: cpu Date: Tue, 7 Nov 2023 10:12:08 -0800 Subject: [PATCH 020/184] Improve error logging in rpc module --- zero_bin/leader/src/rpc.rs | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/zero_bin/leader/src/rpc.rs b/zero_bin/leader/src/rpc.rs index 668833943..d6b420abf 100644 --- a/zero_bin/leader/src/rpc.rs +++ b/zero_bin/leader/src/rpc.rs @@ -1,6 +1,6 @@ use std::io::Write; -use anyhow::Result; +use anyhow::{Context, Result}; use ethereum_types::{Address, Bloom, H256, U256}; use paladin::runtime::Runtime; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; @@ -8,7 +8,7 @@ use proof_protocol_decoder::{ trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, types::{BlockLevelData, OtherBlockData}, }; -use reqwest::IntoUrl; +use reqwest::{IntoUrl, Response}; use serde::Deserialize; use thiserror::Error; use tokio::try_join; @@ -71,7 +71,7 @@ impl JerigonTraceResponse { let block_number_hex = format!("0x{:x}", block_number); info!("Fetching block trace for block {}", block_number_hex); - let result: JerigonTraceResponse = client + let response: Response = client .post(rpc_url) .json(&serde_json::json!({ "jsonrpc": "2.0", @@ -80,11 +80,15 @@ impl JerigonTraceResponse { "id": 1, })) .send() - .await? - .json() - .await?; + .await + .context("fetching debug_traceBlockByNumber")?; - Ok(result) + let bytes = response.bytes().await?; + let des = &mut serde_json::Deserializer::from_slice(&bytes); + let parsed: JerigonTraceResponse = serde_path_to_error::deserialize(des) + .context("deserializing debug_traceBlockByNumber")?; + + Ok(parsed) } } @@ -156,7 +160,7 @@ impl EthGetBlockByNumberResponse { let block_number_hex = format!("0x{:x}", block_number); info!("Fetching block metadata for block {}", block_number_hex); - let result: EthGetBlockByNumberResponse = client + let response: Response = client .post(rpc_url) .json(&serde_json::json!({ "jsonrpc": "2.0", @@ -165,11 +169,15 @@ impl EthGetBlockByNumberResponse { "id": 1, })) .send() - .await? - .json() - .await?; + .await + .context("fetching eth_getBlockByNumber")?; + + let bytes = response.bytes().await?; + let des = &mut serde_json::Deserializer::from_slice(&bytes); + let parsed: EthGetBlockByNumberResponse = + serde_path_to_error::deserialize(des).context("deserializing eth_getBlockByNumber")?; - Ok(result) + Ok(parsed) } } From 5cf87a247125f1affa0a9cf89cc9fb758534fad2 Mon Sep 17 00:00:00 2001 From: cpu Date: Tue, 7 Nov 2023 11:50:19 -0800 Subject: [PATCH 021/184] Add RPC command --- zero_bin/Cargo.lock | 44 ++++++++++++++++--- zero_bin/Cargo.toml | 7 +-- zero_bin/README.md | 34 +++++++++++--- zero_bin/common/Cargo.toml | 14 ++++++ zero_bin/common/src/lib.rs | 4 ++ .../{leader => common}/src/prover_input.rs | 15 +++---- zero_bin/leader/Cargo.toml | 9 ++-- zero_bin/leader/src/config.rs | 1 - zero_bin/leader/src/http.rs | 3 +- zero_bin/leader/src/jerigon.rs | 14 ++++++ zero_bin/leader/src/main.rs | 6 +-- zero_bin/leader/src/stdio.rs | 3 +- zero_bin/rpc/Cargo.toml | 20 +++++++++ zero_bin/rpc/src/cli.rs | 20 +++++++++ zero_bin/rpc/src/init.rs | 11 +++++ zero_bin/rpc/src/lib.rs | 2 + zero_bin/rpc/src/main.rs | 27 ++++++++++++ zero_bin/{leader => rpc}/src/rpc.rs | 19 +++----- 18 files changed, 202 insertions(+), 51 deletions(-) create mode 100644 zero_bin/common/Cargo.toml create mode 100644 zero_bin/common/src/lib.rs rename zero_bin/{leader => common}/src/prover_input.rs (83%) delete mode 100644 zero_bin/leader/src/config.rs create mode 100644 zero_bin/leader/src/jerigon.rs create mode 100644 zero_bin/rpc/Cargo.toml create mode 100644 zero_bin/rpc/src/cli.rs create mode 100644 zero_bin/rpc/src/init.rs create mode 100644 zero_bin/rpc/src/lib.rs create mode 100644 zero_bin/rpc/src/main.rs rename zero_bin/{leader => rpc}/src/rpc.rs (93%) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 9aca75f2f..f6a081207 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -564,6 +564,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "common" +version = "0.1.0" +dependencies = [ + "anyhow", + "ethereum-types", + "ops", + "paladin-core", + "plonky_block_proof_gen", + "proof_protocol_decoder", + "serde", + "tracing", +] + [[package]] name = "concurrent-queue" version = "2.3.0" @@ -1505,18 +1519,16 @@ dependencies = [ "anyhow", "axum", "clap", + "common", "dotenvy", "ethereum-types", "ops", "paladin-core", - "plonky2_evm", "plonky_block_proof_gen", - "proof_protocol_decoder", - "reqwest", + "rpc", "serde", "serde_json", "serde_path_to_error", - "thiserror", "tokio", "tracing", "tracing-subscriber", @@ -2137,7 +2149,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=bb114bb8a3ba88cdd3c2e3bb65171b6a8e812a5b#bb114bb8a3ba88cdd3c2e3bb65171b6a8e812a5b" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=dc5bd25f52ab612532df636eacbe9f98d5a052f6#dc5bd25f52ab612532df636eacbe9f98d5a052f6" dependencies = [ "ethereum-types", "log", @@ -2221,7 +2233,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=d28e3afa4a7852e68c3cc9e5ee509cc32a5be6c7#d28e3afa4a7852e68c3cc9e5ee509cc32a5be6c7" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=8a27e8cf860fe71c84e1d052dad4ecfe78bc75dd#8a27e8cf860fe71c84e1d052dad4ecfe78bc75dd" dependencies = [ "ciborium", "ciborium-io", @@ -2451,6 +2463,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rpc" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "common", + "ethereum-types", + "plonky2_evm", + "proof_protocol_decoder", + "reqwest", + "serde", + "serde_json", + "serde_path_to_error", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "rustc-demangle" version = "0.1.23" diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 4e28f87a3..ea75625ed 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["leader", "worker", "ops", "verifier"] +members = ["leader", "worker", "common", "ops", "verifier", "rpc"] resolver = "2" [workspace.dependencies] @@ -11,7 +11,8 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "bb114bb8a3ba88cdd3c2e3bb65171b6a8e812a5b" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "d28e3afa4a7852e68c3cc9e5ee509cc32a5be6c7" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "dc5bd25f52ab612532df636eacbe9f98d5a052f6" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "8a27e8cf860fe71c84e1d052dad4ecfe78bc75dd" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" +ethereum-types = "0.14.1" diff --git a/zero_bin/README.md b/zero_bin/README.md index b7fc8d0bc..c1383fa21 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -17,8 +17,9 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [stdin](#stdin) - [HTTP](#http) - [Jerigon](#jerigon) - - [Docker](#docker) - [Verifier](#verifier) + - [RPC](#rpc) + - [Docker](#docker) ## Project layout @@ -123,9 +124,7 @@ curl -X POST -H "Content-Type: application/json" -d @./block_121.json http://loc ```bash RUST_LOG=debug cargo r --release --bin leader -- --mode jerigon --runtime in-memory --rpc-url --block-number 16 > ./output/proof_16.json ``` -## Docker -Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. ## Verifier @@ -142,5 +141,30 @@ Options: Example: ```bash -cargo r --bin verifier -- -f ./output/proof_16.json -``` \ No newline at end of file +cargo r --release --bin verifier -- -f ./output/proof_16.json +``` + +## RPC + +An rpc binary is provided to generate the block trace format expected by the leader. +``` +cargo r --bin rpc -- --help + +Usage: rpc + +Commands: + fetch Fetch and generate prover input from the RPC endpoint + help Print this message or the help of the given subcommand(s) + +Options: + -h, --help Print help +``` + +Example: +```bash +cargo r --release --bin rpc fetch --rpc-url --block-number 16 > ./output/block-16.json +``` + +## Docker + +Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. \ No newline at end of file diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml new file mode 100644 index 000000000..a649ab639 --- /dev/null +++ b/zero_bin/common/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "common" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { workspace = true } +plonky_block_proof_gen = { workspace = true } +proof_protocol_decoder = { workspace = true } +tracing = { workspace = true } +paladin-core = { workspace = true } +ethereum-types = { workspace = true } +anyhow = { workspace = true } +ops = { path = "../ops" } diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs new file mode 100644 index 000000000..d2d5ddd58 --- /dev/null +++ b/zero_bin/common/src/lib.rs @@ -0,0 +1,4 @@ +pub const MATIC_CHAIN_ID: u64 = 137; + +mod prover_input; +pub use prover_input::ProverInput; diff --git a/zero_bin/leader/src/prover_input.rs b/zero_bin/common/src/prover_input.rs similarity index 83% rename from zero_bin/leader/src/prover_input.rs rename to zero_bin/common/src/prover_input.rs index 87bf53927..ec9e70454 100644 --- a/zero_bin/leader/src/prover_input.rs +++ b/zero_bin/common/src/prover_input.rs @@ -11,25 +11,24 @@ use proof_protocol_decoder::{ trace_protocol::BlockTrace, types::{CodeHash, OtherBlockData}, }; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use tracing::info; -#[derive(Debug, Deserialize)] -pub(crate) struct ProverInput { - pub(crate) block_trace: BlockTrace, - pub(crate) other_data: OtherBlockData, +#[derive(Debug, Deserialize, Serialize)] +pub struct ProverInput { + pub block_trace: BlockTrace, + pub other_data: OtherBlockData, } - fn resolve_code_hash_fn(_: &CodeHash) -> Vec { todo!() } impl ProverInput { - pub(crate) fn get_block_number(&self) -> U256 { + pub fn get_block_number(&self) -> U256 { self.other_data.b_data.b_meta.block_number } - pub(crate) async fn prove(self, runtime: &Runtime) -> Result { + pub async fn prove(self, runtime: &Runtime) -> Result { let block_number = self.get_block_number(); info!("Proving block {block_number}"); diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 7a88b66b5..0ea13a0df 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -13,13 +13,10 @@ serde = { workspace = true } dotenvy = { workspace = true } tokio = { workspace = true } plonky_block_proof_gen = { workspace = true } -proof_protocol_decoder = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } +ethereum-types = { workspace = true } axum = "0.6.20" -reqwest = { version = "0.11.22", features = ["json"] } -thiserror = "1.0.50" -ethereum-types = "0.14.1" -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } - ops = { path = "../ops" } +common = { path = "../common" } +rpc = { path = "../rpc" } diff --git a/zero_bin/leader/src/config.rs b/zero_bin/leader/src/config.rs deleted file mode 100644 index ca3369495..000000000 --- a/zero_bin/leader/src/config.rs +++ /dev/null @@ -1 +0,0 @@ -pub const MATIC_CHAIN_ID: u64 = 137; diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index bafbece63..222a673bc 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -2,14 +2,13 @@ use std::{net::SocketAddr, path::PathBuf, sync::Arc}; use anyhow::{bail, Result}; use axum::{http::StatusCode, routing::post, Json, Router}; +use common::ProverInput; use ethereum_types::U256; use paladin::runtime::Runtime; use plonky_block_proof_gen::proof_types::GeneratedBlockProof; use serde_json::to_writer; use tracing::{debug, error, info}; -use crate::prover_input::ProverInput; - /// The main function for the HTTP mode. pub(crate) async fn http_main(runtime: Runtime, port: u16, output_dir: PathBuf) -> Result<()> { let addr = SocketAddr::from(([0, 0, 0, 0], port)); diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs new file mode 100644 index 000000000..6ec03b15a --- /dev/null +++ b/zero_bin/leader/src/jerigon.rs @@ -0,0 +1,14 @@ +use std::io::Write; + +use anyhow::Result; +use paladin::runtime::Runtime; + +/// The main function for the jerigon mode. +pub(crate) async fn jerigon_main(runtime: Runtime, rpc_url: &str, block_number: u64) -> Result<()> { + let prover_input = rpc::fetch_prover_input(rpc_url, block_number).await?; + + let proof = prover_input.prove(&runtime).await?; + std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; + + Ok(()) +} diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 8c8bb499a..571fb2add 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -6,11 +6,9 @@ use ops::Ops; use paladin::runtime::Runtime; mod cli; -mod config; mod http; mod init; -mod prover_input; -mod rpc; +mod jerigon; mod stdio; #[tokio::main] @@ -47,7 +45,7 @@ async fn main() -> Result<()> { let block_number = args .block_number .expect("block-number is required in jerigon mode"); - rpc::rpc_main(runtime, &rpc_url, block_number).await?; + jerigon::jerigon_main(runtime, &rpc_url, block_number).await?; } } diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index 1f7613625..14da357bf 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -1,10 +1,9 @@ use std::io::{Read, Write}; use anyhow::Result; +use common::ProverInput; use paladin::runtime::Runtime; -use crate::prover_input::ProverInput; - /// The main function for the stdio mode. pub(crate) async fn stdio_main(runtime: Runtime) -> Result<()> { let mut buffer = String::new(); diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml new file mode 100644 index 000000000..416bd7f60 --- /dev/null +++ b/zero_bin/rpc/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "rpc" +version = "0.1.0" +edition = "2021" + +[dependencies] +tokio = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +anyhow = { workspace = true } +serde = { workspace = true } +proof_protocol_decoder = { workspace = true } +serde_json = { workspace = true } +serde_path_to_error = { workspace = true } +clap = { workspace = true } +ethereum-types = { workspace = true } +reqwest = { version = "0.11.22", features = ["json"] } +thiserror = "1.0.50" +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } +common = { path = "../common" } diff --git a/zero_bin/rpc/src/cli.rs b/zero_bin/rpc/src/cli.rs new file mode 100644 index 000000000..7d4915974 --- /dev/null +++ b/zero_bin/rpc/src/cli.rs @@ -0,0 +1,20 @@ +use clap::{Parser, Subcommand, ValueHint}; + +#[derive(Parser)] +pub(crate) struct Cli { + #[command(subcommand)] + pub(crate) command: Commands, +} + +#[derive(Subcommand)] +pub(crate) enum Commands { + /// Fetch and generate prover input from the RPC endpoint + Fetch { + /// The RPC URL + #[arg(short, long, value_hint = ValueHint::Url)] + rpc_url: String, + /// The block number + #[arg(short, long)] + block_number: u64, + }, +} diff --git a/zero_bin/rpc/src/init.rs b/zero_bin/rpc/src/init.rs new file mode 100644 index 000000000..28c00d482 --- /dev/null +++ b/zero_bin/rpc/src/init.rs @@ -0,0 +1,11 @@ +use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; +pub(crate) fn tracing() { + tracing_subscriber::Registry::default() + .with( + tracing_subscriber::fmt::layer() + .pretty() + .with_span_events(FmtSpan::CLOSE) + .with_filter(EnvFilter::from_default_env()), + ) + .init(); +} diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs new file mode 100644 index 000000000..62e5388e8 --- /dev/null +++ b/zero_bin/rpc/src/lib.rs @@ -0,0 +1,2 @@ +mod rpc; +pub use rpc::fetch_prover_input; diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs new file mode 100644 index 000000000..ccb9a22e9 --- /dev/null +++ b/zero_bin/rpc/src/main.rs @@ -0,0 +1,27 @@ +use std::io::Write; + +use anyhow::Result; +use clap::Parser; +use cli::Commands; +use rpc::fetch_prover_input; + +mod cli; +mod init; +mod rpc; + +#[tokio::main] +async fn main() -> Result<()> { + init::tracing(); + let args = cli::Cli::parse(); + + match args.command { + Commands::Fetch { + rpc_url, + block_number, + } => { + let prover_input = fetch_prover_input(&rpc_url, block_number).await?; + std::io::stdout().write_all(&serde_json::to_vec(&prover_input)?)?; + } + } + Ok(()) +} diff --git a/zero_bin/leader/src/rpc.rs b/zero_bin/rpc/src/rpc.rs similarity index 93% rename from zero_bin/leader/src/rpc.rs rename to zero_bin/rpc/src/rpc.rs index d6b420abf..37235480f 100644 --- a/zero_bin/leader/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,8 +1,7 @@ -use std::io::Write; - use anyhow::{Context, Result}; +use common::ProverInput; +use common::MATIC_CHAIN_ID; use ethereum_types::{Address, Bloom, H256, U256}; -use paladin::runtime::Runtime; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; use proof_protocol_decoder::{ trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, @@ -14,8 +13,6 @@ use thiserror::Error; use tokio::try_join; use tracing::{debug, info}; -use crate::{config::MATIC_CHAIN_ID, prover_input::ProverInput}; - #[derive(Deserialize, Debug)] #[serde(rename_all = "snake_case")] #[allow(clippy::large_enum_variant)] @@ -181,8 +178,7 @@ impl EthGetBlockByNumberResponse { } } -/// The main function for the jerigon mode. -pub(crate) async fn rpc_main(runtime: Runtime, rpc_url: &str, block_number: u64) -> Result<()> { +pub async fn fetch_prover_input(rpc_url: &str, block_number: u64) -> Result { let (trace_result, block_result) = try_join!( JerigonTraceResponse::fetch(rpc_url, block_number), EthGetBlockByNumberResponse::fetch(rpc_url, block_number) @@ -191,13 +187,8 @@ pub(crate) async fn rpc_main(runtime: Runtime, rpc_url: &str, block_number: u64) debug!("Got block result: {:?}", block_result); debug!("Got trace result: {:?}", trace_result); - let prover_input = ProverInput { + Ok(ProverInput { block_trace: trace_result.try_into()?, other_data: block_result.into(), - }; - - let proof = prover_input.prove(&runtime).await?; - std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; - - Ok(()) + }) } From 4bfd9a5d067a43eae13c6f4e65eccbe1bd422cd3 Mon Sep 17 00:00:00 2001 From: cpu Date: Tue, 7 Nov 2023 12:03:17 -0800 Subject: [PATCH 022/184] bump protocol deps (fixes de/serialization of contract writes) --- zero_bin/Cargo.lock | 4 ++-- zero_bin/Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index f6a081207..9a4a338b5 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2149,7 +2149,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=dc5bd25f52ab612532df636eacbe9f98d5a052f6#dc5bd25f52ab612532df636eacbe9f98d5a052f6" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=43988ed3e3645f0cfa4554289268c8fa4ecdbd2a#43988ed3e3645f0cfa4554289268c8fa4ecdbd2a" dependencies = [ "ethereum-types", "log", @@ -2233,7 +2233,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=8a27e8cf860fe71c84e1d052dad4ecfe78bc75dd#8a27e8cf860fe71c84e1d052dad4ecfe78bc75dd" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=1d1f5ccfde137400b5fe97184667b371ac5e8b12#1d1f5ccfde137400b5fe97184667b371ac5e8b12" dependencies = [ "ciborium", "ciborium-io", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index ea75625ed..e0f061917 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,8 +11,8 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "dc5bd25f52ab612532df636eacbe9f98d5a052f6" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "8a27e8cf860fe71c84e1d052dad4ecfe78bc75dd" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "43988ed3e3645f0cfa4554289268c8fa4ecdbd2a" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "1d1f5ccfde137400b5fe97184667b371ac5e8b12" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" From 584222daffc10d6fb263b9278076d58c9f67df2e Mon Sep 17 00:00:00 2001 From: BGluth Date: Thu, 9 Nov 2023 01:43:49 -0700 Subject: [PATCH 023/184] Now includes dummy previous block hashes --- zero_bin/rpc/src/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 37235480f..b135ae4f4 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -141,7 +141,7 @@ impl From for OtherBlockData { b_data: BlockLevelData { b_meta: block_metadata, b_hashes: BlockHashes { - prev_hashes: Default::default(), + prev_hashes: vec![H256::default(); 256], cur_hash: value.result.hash, }, }, From 2b916924bd2d9decc0052a96442d212e4c6bd8ce Mon Sep 17 00:00:00 2001 From: cpu Date: Thu, 9 Nov 2023 07:55:32 -0800 Subject: [PATCH 024/184] Move toolchain back to standard nightly --- zero_bin/.github/workflows/ci.yml | 2 +- zero_bin/rust-toolchain.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml index 80bdb316d..8b51baa53 100644 --- a/zero_bin/.github/workflows/ci.yml +++ b/zero_bin/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: - name: Install toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2023-11-03 + toolchain: nightly profile: minimal override: true components: rustfmt, clippy diff --git a/zero_bin/rust-toolchain.toml b/zero_bin/rust-toolchain.toml index f2c9ba010..5d56faf9a 100644 --- a/zero_bin/rust-toolchain.toml +++ b/zero_bin/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "nightly-2023-11-03" +channel = "nightly" From 3d2da5430e7b6521e169a3274179bc329d452dc5 Mon Sep 17 00:00:00 2001 From: cpu Date: Thu, 9 Nov 2023 08:15:54 -0800 Subject: [PATCH 025/184] Update leader.Dockerfile --- zero_bin/Cargo.lock | 143 ++++++++----------------------------- zero_bin/leader.Dockerfile | 10 ++- zero_bin/rpc/Cargo.toml | 5 +- 3 files changed, 41 insertions(+), 117 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 9a4a338b5..b98c4524b 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -958,21 +958,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.0" @@ -1262,16 +1247,17 @@ dependencies = [ ] [[package]] -name = "hyper-tls" -version = "0.5.0" +name = "hyper-rustls" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ - "bytes", + "futures-util", + "http", "hyper", - "native-tls", + "rustls", "tokio", - "tokio-native-tls", + "tokio-rustls", ] [[package]] @@ -1631,24 +1617,6 @@ dependencies = [ "windows-sys", ] -[[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 = "nom" version = "7.1.3" @@ -1772,50 +1740,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "openssl" -version = "0.10.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" -dependencies = [ - "bitflags 2.4.1", - "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.38", -] - [[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.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "ops" version = "0.1.0" @@ -2054,12 +1984,6 @@ dependencies = [ "futures-io", ] -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - [[package]] name = "plonky2" version = "0.1.4" @@ -2405,26 +2329,28 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-tls", + "hyper-rustls", "ipnet", "js-sys", "log", "mime", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", + "rustls", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "system-configuration", "tokio", - "tokio-native-tls", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", "winreg", ] @@ -2888,19 +2814,6 @@ dependencies = [ "rustls-pemfile", ] -[[package]] -name = "tempfile" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" -dependencies = [ - "cfg-if", - "fastrand 2.0.1", - "redox_syscall", - "rustix 0.38.21", - "windows-sys", -] - [[package]] name = "termcolor" version = "1.3.0" @@ -3034,16 +2947,6 @@ dependencies = [ "syn 2.0.38", ] -[[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-reactor-trait" version = "1.1.0" @@ -3058,6 +2961,16 @@ dependencies = [ "tokio-stream", ] +[[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-stream" version = "0.1.14" @@ -3290,12 +3203,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 = "verifier" version = "0.1.0" @@ -3413,6 +3320,12 @@ dependencies = [ "wasm-bindgen", ] +[[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" diff --git a/zero_bin/leader.Dockerfile b/zero_bin/leader.Dockerfile index ddfc61dca..dfe75b13d 100644 --- a/zero_bin/leader.Dockerfile +++ b/zero_bin/leader.Dockerfile @@ -5,21 +5,29 @@ RUN apt-get update && apt-get install -y libjemalloc2 libjemalloc-dev make RUN \ mkdir -p ops/src && touch ops/src/lib.rs && \ + mkdir -p common/src && touch common/src/lib.rs && \ + mkdir -p rpc/src && touch rpc/src/lib.rs && \ mkdir -p leader/src && echo "fn main() {println!(\"YO!\");}" > leader/src/main.rs COPY Cargo.toml . -RUN sed -i "2s/.*/members = [\"ops\", \"leader\"]/" Cargo.toml +RUN sed -i "2s/.*/members = [\"ops\", \"leader\", \"common\", \"rpc\"]/" Cargo.toml COPY Cargo.lock . COPY ops/Cargo.toml ./ops/Cargo.toml +COPY common/Cargo.toml ./common/Cargo.toml +COPY rpc/Cargo.toml ./rpc/Cargo.toml COPY leader/Cargo.toml ./leader/Cargo.toml RUN cargo build --release --bin leader COPY ops ./ops +COPY common ./common +COPY rpc ./rpc COPY leader ./leader RUN \ touch ops/src/lib.rs && \ + touch common/src/lib.rs && \ + touch rpc/src/lib.rs && \ touch leader/src/main.rs RUN cargo build --release --bin leader diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 416bd7f60..8c80e6bc3 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -14,7 +14,10 @@ serde_json = { workspace = true } serde_path_to_error = { workspace = true } clap = { workspace = true } ethereum-types = { workspace = true } -reqwest = { version = "0.11.22", features = ["json"] } +reqwest = { version = "0.11.22", default-features = false, features = [ + "json", + "rustls-tls", +] } thiserror = "1.0.50" plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } common = { path = "../common" } From c96ddd86bc56d1923051041ce1bebfd0de6d726f Mon Sep 17 00:00:00 2001 From: cpu Date: Thu, 9 Nov 2023 11:25:26 -0800 Subject: [PATCH 026/184] bump protocol deps --- zero_bin/Cargo.lock | 4 ++-- zero_bin/Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index b98c4524b..5f082968a 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2073,7 +2073,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=43988ed3e3645f0cfa4554289268c8fa4ecdbd2a#43988ed3e3645f0cfa4554289268c8fa4ecdbd2a" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=e8aa1e7aab9859985f77af5f0a9844108e096bfe#e8aa1e7aab9859985f77af5f0a9844108e096bfe" dependencies = [ "ethereum-types", "log", @@ -2157,7 +2157,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=1d1f5ccfde137400b5fe97184667b371ac5e8b12#1d1f5ccfde137400b5fe97184667b371ac5e8b12" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=25c51abfccd66171053fe7094000a3ebe78aa14b#25c51abfccd66171053fe7094000a3ebe78aa14b" dependencies = [ "ciborium", "ciborium-io", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index e0f061917..745e75977 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,8 +11,8 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "43988ed3e3645f0cfa4554289268c8fa4ecdbd2a" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "1d1f5ccfde137400b5fe97184667b371ac5e8b12" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "e8aa1e7aab9859985f77af5f0a9844108e096bfe" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "25c51abfccd66171053fe7094000a3ebe78aa14b" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" From 47d181892f6f7873a9c464436e980423ca5c3485 Mon Sep 17 00:00:00 2001 From: BGluth Date: Thu, 9 Nov 2023 13:07:28 -0700 Subject: [PATCH 027/184] Dep bump --- zero_bin/Cargo.lock | 4 ++-- zero_bin/Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 5f082968a..6aefeddf3 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2073,7 +2073,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=e8aa1e7aab9859985f77af5f0a9844108e096bfe#e8aa1e7aab9859985f77af5f0a9844108e096bfe" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=94ba5b3a1bfc74a6d3bd80da5fa7b9cd1d2690a6#94ba5b3a1bfc74a6d3bd80da5fa7b9cd1d2690a6" dependencies = [ "ethereum-types", "log", @@ -2157,7 +2157,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=25c51abfccd66171053fe7094000a3ebe78aa14b#25c51abfccd66171053fe7094000a3ebe78aa14b" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=15ae1a1e5b8e60a056a36926746cb563507073c2#15ae1a1e5b8e60a056a36926746cb563507073c2" dependencies = [ "ciborium", "ciborium-io", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 745e75977..b8f298c91 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,8 +11,8 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "e8aa1e7aab9859985f77af5f0a9844108e096bfe" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "25c51abfccd66171053fe7094000a3ebe78aa14b" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "94ba5b3a1bfc74a6d3bd80da5fa7b9cd1d2690a6" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "15ae1a1e5b8e60a056a36926746cb563507073c2" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" From acc9215a92f96fff420c5ca96d3a2d344f97e9d4 Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 10 Nov 2023 12:07:14 -0800 Subject: [PATCH 028/184] Add support for paladin num-workers flag --- zero_bin/Cargo.lock | 4 ++-- zero_bin/Cargo.toml | 2 +- zero_bin/README.md | 1 + zero_bin/leader/src/cli.rs | 4 ++++ zero_bin/leader/src/main.rs | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 6aefeddf3..9dca515bb 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1784,9 +1784,9 @@ dependencies = [ [[package]] name = "paladin-core" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c550efa420239735fae6a45dd1f0e58829c8547c0464370f9e048e91e9a442b7" +checksum = "0c2cc7c471aacf0da9f8bcef66bd238c951bd3d520c0930fd44ef1ba70848727" dependencies = [ "anyhow", "async-trait", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index b8f298c91..a5cb17ce4 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "common", "ops", "verifier", "rpc"] resolver = "2" [workspace.dependencies] -paladin-core = "0.1.3" +paladin-core = "0.1.4" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" diff --git a/zero_bin/README.md b/zero_bin/README.md index c1383fa21..ca0d0e7f2 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -61,6 +61,7 @@ Options: --rpc-url The RPC URL to use when using the `jerigon` mode -b, --block-number The block number to use when using the `jerigon` mode -r, --runtime Specifies the paladin runtime to use [default: amqp] [possible values: amqp, in-memory] + -n, --num-workers Specifies the number of worker threads to spawn (in memory runtime only) -h, --help Print help ``` diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index d9a376b2a..ea90edcd6 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -26,6 +26,10 @@ pub(crate) struct Cli { /// Specifies the paladin runtime to use. #[arg(long, short, value_enum, default_value_t = Runtime::Amqp)] pub(crate) runtime: Runtime, + /// Specifies the number of worker threads to spawn (in memory runtime + /// only). + #[arg(long, short)] + pub num_workers: Option, } #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum, Default)] diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 571fb2add..a1d349274 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -19,6 +19,7 @@ async fn main() -> Result<()> { let args = cli::Cli::parse(); let runtime = Runtime::from_config::(&paladin::config::Config { runtime: args.runtime, + num_workers: args.num_workers, ..Default::default() }) .await?; From 39c0339f0e9476ff5ce7d63f81788477176fb9dc Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 10 Nov 2023 13:06:30 -0800 Subject: [PATCH 029/184] Retrieve chain_id from RPC node --- zero_bin/common/src/lib.rs | 2 - zero_bin/rpc/src/rpc.rs | 157 +++++++++++++++++++++++++------------ 2 files changed, 108 insertions(+), 51 deletions(-) diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs index d2d5ddd58..d6041b3f0 100644 --- a/zero_bin/common/src/lib.rs +++ b/zero_bin/common/src/lib.rs @@ -1,4 +1,2 @@ -pub const MATIC_CHAIN_ID: u64 = 137; - mod prover_input; pub use prover_input::ProverInput; diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index b135ae4f4..fec716540 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,13 +1,12 @@ use anyhow::{Context, Result}; use common::ProverInput; -use common::MATIC_CHAIN_ID; use ethereum_types::{Address, Bloom, H256, U256}; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; use proof_protocol_decoder::{ trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, types::{BlockLevelData, OtherBlockData}, }; -use reqwest::{IntoUrl, Response}; +use reqwest::IntoUrl; use serde::Deserialize; use thiserror::Error; use tokio::try_join; @@ -68,7 +67,7 @@ impl JerigonTraceResponse { let block_number_hex = format!("0x{:x}", block_number); info!("Fetching block trace for block {}", block_number_hex); - let response: Response = client + let response = client .post(rpc_url) .json(&serde_json::json!({ "jsonrpc": "2.0", @@ -82,7 +81,7 @@ impl JerigonTraceResponse { let bytes = response.bytes().await?; let des = &mut serde_json::Deserializer::from_slice(&bytes); - let parsed: JerigonTraceResponse = serde_path_to_error::deserialize(des) + let parsed = serde_path_to_error::deserialize(des) .context("deserializing debug_traceBlockByNumber")?; Ok(parsed) @@ -110,11 +109,98 @@ struct EthGetBlockByNumberResponse { result: EthGetBlockByNumberResult, } -impl From for OtherBlockData { - fn from(value: EthGetBlockByNumberResponse) -> Self { +impl EthGetBlockByNumberResponse { + /// Fetches the block metadata for the given block number. + async fn fetch(rpc_url: U, block_number: u64) -> Result { + let client = reqwest::Client::new(); + let block_number_hex = format!("0x{:x}", block_number); + info!("Fetching block metadata for block {}", block_number_hex); + + let response = client + .post(rpc_url) + .json(&serde_json::json!({ + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": [&block_number_hex, false], + "id": 1, + })) + .send() + .await + .context("fetching eth_getBlockByNumber")?; + + let bytes = response.bytes().await?; + let des = &mut serde_json::Deserializer::from_slice(&bytes); + let parsed = + serde_path_to_error::deserialize(des).context("deserializing eth_getBlockByNumber")?; + + Ok(parsed) + } +} + +/// The response from the `eth_chainId` RPC method. +#[derive(Deserialize, Debug)] +struct EthChainIdResponse { + result: U256, +} + +impl EthChainIdResponse { + /// Fetches the chain id. + async fn fetch(rpc_url: U) -> Result { + let client = reqwest::Client::new(); + info!("Fetching chain id"); + + let response = client + .post(rpc_url) + .json(&serde_json::json!({ + "jsonrpc": "2.0", + "method": "eth_chainId", + "params": [], + "id": 1, + })) + .send() + .await + .context("fetching eth_chainId")?; + + let bytes = response.bytes().await?; + let des = &mut serde_json::Deserializer::from_slice(&bytes); + let parsed = serde_path_to_error::deserialize(des).context("deserializing eth_chainId")?; + + Ok(parsed) + } +} + +/// Product of the `eth_getBlockByNumber` and `eth_chainId` RPC methods. +/// +/// Contains the necessary data to construct the `OtherBlockData` struct. +struct RpcBlockMetadata { + block_by_number: EthGetBlockByNumberResponse, + chain_id: EthChainIdResponse, +} + +impl RpcBlockMetadata { + async fn fetch(rpc_url: &str, block_number: u64) -> Result { + let (block_result, chain_id_result) = try_join!( + EthGetBlockByNumberResponse::fetch(rpc_url, block_number), + EthChainIdResponse::fetch(rpc_url) + )?; + + Ok(Self { + block_by_number: block_result, + chain_id: chain_id_result, + }) + } +} + +impl From for OtherBlockData { + fn from( + RpcBlockMetadata { + block_by_number, + chain_id, + }: RpcBlockMetadata, + ) -> Self { let mut bloom = [U256::zero(); 8]; - for (i, word) in value + for (i, word) in block_by_number .result .logs_bloom .as_fixed_bytes() @@ -125,15 +211,15 @@ impl From for OtherBlockData { } let block_metadata = BlockMetadata { - block_beneficiary: value.result.miner, - block_timestamp: value.result.timestamp, - block_number: value.result.number, - block_difficulty: value.result.difficulty, - block_random: value.result.mix_hash, - block_gaslimit: value.result.gas_limit, - block_chain_id: MATIC_CHAIN_ID.into(), - block_base_fee: value.result.base_fee_per_gas, - block_gas_used: value.result.gas_used, + block_beneficiary: block_by_number.result.miner, + block_timestamp: block_by_number.result.timestamp, + block_number: block_by_number.result.number, + block_difficulty: block_by_number.result.difficulty, + block_random: block_by_number.result.mix_hash, + block_gaslimit: block_by_number.result.gas_limit, + block_chain_id: chain_id.result, + block_base_fee: block_by_number.result.base_fee_per_gas, + block_gas_used: block_by_number.result.gas_used, block_bloom: bloom, }; @@ -142,7 +228,7 @@ impl From for OtherBlockData { b_meta: block_metadata, b_hashes: BlockHashes { prev_hashes: vec![H256::default(); 256], - cur_hash: value.result.hash, + cur_hash: block_by_number.result.hash, }, }, genesis_state_trie_root: Default::default(), @@ -150,45 +236,18 @@ impl From for OtherBlockData { } } -impl EthGetBlockByNumberResponse { - /// Fetches the block metadata for the given block number. - async fn fetch(rpc_url: U, block_number: u64) -> Result { - let client = reqwest::Client::new(); - let block_number_hex = format!("0x{:x}", block_number); - info!("Fetching block metadata for block {}", block_number_hex); - - let response: Response = client - .post(rpc_url) - .json(&serde_json::json!({ - "jsonrpc": "2.0", - "method": "eth_getBlockByNumber", - "params": [&block_number_hex, false], - "id": 1, - })) - .send() - .await - .context("fetching eth_getBlockByNumber")?; - - let bytes = response.bytes().await?; - let des = &mut serde_json::Deserializer::from_slice(&bytes); - let parsed: EthGetBlockByNumberResponse = - serde_path_to_error::deserialize(des).context("deserializing eth_getBlockByNumber")?; - - Ok(parsed) - } -} - pub async fn fetch_prover_input(rpc_url: &str, block_number: u64) -> Result { - let (trace_result, block_result) = try_join!( + let (trace_result, rpc_block_metadata) = try_join!( JerigonTraceResponse::fetch(rpc_url, block_number), - EthGetBlockByNumberResponse::fetch(rpc_url, block_number) + RpcBlockMetadata::fetch(rpc_url, block_number), )?; - debug!("Got block result: {:?}", block_result); + debug!("Got block result: {:?}", rpc_block_metadata.block_by_number); debug!("Got trace result: {:?}", trace_result); + debug!("Got chain_id: {:?}", rpc_block_metadata.chain_id); Ok(ProverInput { block_trace: trace_result.try_into()?, - other_data: block_result.into(), + other_data: rpc_block_metadata.into(), }) } From 50d0e73ec4b4f917529855080bebfdd2b097a7bb Mon Sep 17 00:00:00 2001 From: cpu Date: Wed, 15 Nov 2023 18:51:25 -0800 Subject: [PATCH 030/184] Upgrade to paladin 0.2.0. Use fatal error strategy --- zero_bin/Cargo.lock | 32 ++++++++++++++++++++++++-------- zero_bin/Cargo.toml | 2 +- zero_bin/leader/src/jerigon.rs | 4 +++- zero_bin/leader/src/stdio.rs | 4 +++- zero_bin/ops/src/lib.rs | 18 ++++++++---------- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 9dca515bb..dd895a8e1 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -341,6 +341,20 @@ dependencies = [ "tower-service", ] +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "futures-core", + "getrandom", + "instant", + "pin-project-lite", + "rand", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -1784,12 +1798,13 @@ dependencies = [ [[package]] name = "paladin-core" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2cc7c471aacf0da9f8bcef66bd238c951bd3d520c0930fd44ef1ba70848727" +checksum = "289d5e42ec7ba298dbc988f1e7389ed19845a5f1c50fe91ec53b2c7b6b421776" dependencies = [ "anyhow", "async-trait", + "backoff", "ciborium", "clap", "dotenvy", @@ -1798,6 +1813,7 @@ dependencies = [ "paladin-opkind-derive", "pin-project", "serde", + "thiserror", "tokio", "tokio-executor-trait", "tokio-reactor-trait", @@ -1809,9 +1825,9 @@ dependencies = [ [[package]] name = "paladin-opkind-derive" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e25b58dbb19317d61c5f812c78908b14eed74c20ca60c12bbd50a1d7f297f5" +checksum = "692da812cdc5744f747fc983c136f4c9acfeb69e2e538e47229a1582b10cb786" dependencies = [ "quote", "syn 2.0.38", @@ -2908,9 +2924,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -2938,9 +2954,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index a5cb17ce4..426c7dfd6 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "common", "ops", "verifier", "rpc"] resolver = "2" [workspace.dependencies] -paladin-core = "0.1.4" +paladin-core = "0.2.0" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 6ec03b15a..2fae3dcaa 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -7,7 +7,9 @@ use paladin::runtime::Runtime; pub(crate) async fn jerigon_main(runtime: Runtime, rpc_url: &str, block_number: u64) -> Result<()> { let prover_input = rpc::fetch_prover_input(rpc_url, block_number).await?; - let proof = prover_input.prove(&runtime).await?; + let proof = prover_input.prove(&runtime).await; + runtime.close().await?; + let proof = proof?; std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; Ok(()) diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index 14da357bf..6c44c2b4a 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -11,7 +11,9 @@ pub(crate) async fn stdio_main(runtime: Runtime) -> Result<()> { let des = &mut serde_json::Deserializer::from_str(&buffer); let input: ProverInput = serde_path_to_error::deserialize(des)?; - let proof = input.prove(&runtime).await?; + let proof = input.prove(&runtime).await; + runtime.close().await?; + let proof = proof?; std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index caa9ba9c7..0485370d2 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,7 +1,6 @@ -use anyhow::Result; use once_cell::sync::Lazy; use paladin::{ - operation::{Monoid, Operation}, + operation::{FatalError, Monoid, Operation, Result}, opkind_derive::OpKind, }; use plonky_block_proof_gen::{ @@ -23,7 +22,7 @@ impl Operation for TxProof { type Kind = Ops; fn execute(&self, input: Self::Input) -> Result { - let result = generate_txn_proof(&P_STATE, input)?; + let result = generate_txn_proof(&P_STATE, input).map_err(FatalError::from)?; Ok(result.into()) } @@ -39,7 +38,8 @@ impl Monoid for AggProof { type Kind = Ops; fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { - let result = generate_agg_proof(&P_STATE, &a, &b, self.other.clone())?; + let result = + generate_agg_proof(&P_STATE, &a, &b, self.other.clone()).map_err(FatalError::from)?; Ok(result.into()) } @@ -62,12 +62,10 @@ impl Operation for BlockProof { type Kind = Ops; fn execute(&self, input: Self::Input) -> Result { - Ok(generate_block_proof( - &P_STATE, - self.prev.as_ref(), - &input, - self.other.clone(), - )?) + Ok( + generate_block_proof(&P_STATE, self.prev.as_ref(), &input, self.other.clone()) + .map_err(FatalError::from)?, + ) } } From 280cd818132c5a2f7b7dc530f8e4c6f2aaed388c Mon Sep 17 00:00:00 2001 From: cpu Date: Thu, 16 Nov 2023 17:15:53 -0800 Subject: [PATCH 031/184] Populate `prev_hashes` in rpc module --- zero_bin/Cargo.lock | 1 + zero_bin/rpc/Cargo.toml | 1 + zero_bin/rpc/src/rpc.rs | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index dd895a8e1..2105397d9 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2413,6 +2413,7 @@ dependencies = [ "clap", "common", "ethereum-types", + "futures", "plonky2_evm", "proof_protocol_decoder", "reqwest", diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 8c80e6bc3..72a715f7d 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -19,5 +19,6 @@ reqwest = { version = "0.11.22", default-features = false, features = [ "rustls-tls", ] } thiserror = "1.0.50" +futures = "0.3.29" plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } common = { path = "../common" } diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index fec716540..38fa86383 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,6 +1,7 @@ use anyhow::{Context, Result}; use common::ProverInput; use ethereum_types::{Address, Bloom, H256, U256}; +use futures::{stream::FuturesOrdered, TryStreamExt}; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; use proof_protocol_decoder::{ trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, @@ -100,6 +101,7 @@ struct EthGetBlockByNumberResult { miner: Address, mix_hash: H256, number: U256, + parent_hash: H256, timestamp: U256, } @@ -135,6 +137,30 @@ impl EthGetBlockByNumberResponse { Ok(parsed) } + + async fn fetch_previous_block_hashes( + rpc_url: U, + block_number: u64, + ) -> Result> { + // Every block response includes the _parent_ hash along with its hash, so we + // can just fetch half the blocks to acquire all hashes for the range. + let start = block_number.saturating_sub(256); + let futs: FuturesOrdered<_> = (start..block_number) + .rev() + .step_by(2) + .map(|block_number| Self::fetch(rpc_url, block_number)) + .collect(); + + let responses = futs.try_collect::>().await?; + let mut hashes = vec![]; + for response in responses { + hashes.push(response.result.hash); + hashes.push(response.result.parent_hash); + } + hashes.resize(256, H256::default()); + + Ok(hashes) + } } /// The response from the `eth_chainId` RPC method. @@ -175,18 +201,21 @@ impl EthChainIdResponse { struct RpcBlockMetadata { block_by_number: EthGetBlockByNumberResponse, chain_id: EthChainIdResponse, + prev_hashes: Vec, } impl RpcBlockMetadata { async fn fetch(rpc_url: &str, block_number: u64) -> Result { - let (block_result, chain_id_result) = try_join!( + let (block_result, chain_id_result, prev_hashes) = try_join!( EthGetBlockByNumberResponse::fetch(rpc_url, block_number), - EthChainIdResponse::fetch(rpc_url) + EthChainIdResponse::fetch(rpc_url), + EthGetBlockByNumberResponse::fetch_previous_block_hashes(rpc_url, block_number) )?; Ok(Self { block_by_number: block_result, chain_id: chain_id_result, + prev_hashes, }) } } @@ -196,6 +225,7 @@ impl From for OtherBlockData { RpcBlockMetadata { block_by_number, chain_id, + prev_hashes, }: RpcBlockMetadata, ) -> Self { let mut bloom = [U256::zero(); 8]; @@ -227,7 +257,7 @@ impl From for OtherBlockData { b_data: BlockLevelData { b_meta: block_metadata, b_hashes: BlockHashes { - prev_hashes: vec![H256::default(); 256], + prev_hashes, cur_hash: block_by_number.result.hash, }, }, From 9d07ee7cb8e9211487924e961e9584cc9ff9cc56 Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 17 Nov 2023 13:04:59 -0800 Subject: [PATCH 032/184] Add an option for passing in a previous proof to the prover --- zero_bin/README.md | 26 ++++++++++++++++++-------- zero_bin/common/src/prover_input.rs | 18 +++++++++++++++--- zero_bin/leader/src/cli.rs | 3 +++ zero_bin/leader/src/http.rs | 15 +++++++++++---- zero_bin/leader/src/jerigon.rs | 10 ++++++++-- zero_bin/leader/src/main.rs | 22 ++++++++++++++++++++-- zero_bin/leader/src/stdio.rs | 8 ++++++-- 7 files changed, 81 insertions(+), 21 deletions(-) diff --git a/zero_bin/README.md b/zero_bin/README.md index ca0d0e7f2..212ad7f25 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -55,14 +55,24 @@ cargo r --bin leader -- --help Usage: leader [OPTIONS] Options: - -m, --mode The input mode. If `std-io`, the input is read from stdin. If `http`, the input is read from HTTP requests. If `jerigon`, the input is read from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` RPC methods from Jerigon [default: std-io] [possible values: std-io, http, jerigon] - -p, --port The port to listen on when using the `http` mode [default: 8080] - -o, --output-dir The directory to which output should be written (`http` mode only) - --rpc-url The RPC URL to use when using the `jerigon` mode - -b, --block-number The block number to use when using the `jerigon` mode - -r, --runtime Specifies the paladin runtime to use [default: amqp] [possible values: amqp, in-memory] - -n, --num-workers Specifies the number of worker threads to spawn (in memory runtime only) - -h, --help Print help + -m, --mode + The input mode. If `std-io`, the input is read from stdin. If `http`, the input is read from HTTP requests. If `jerigon`, the input is read from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` RPC methods from Jerigon [default: std-io] [possible values: std-io, http, jerigon] + -p, --port + The port to listen on when using the `http` mode [default: 8080] + -o, --output-dir + The directory to which output should be written (`http` mode only) + --rpc-url + The RPC URL to use when using the `jerigon` mode + -b, --block-number + The block number to use when using the `jerigon` mode + -r, --runtime + Specifies the paladin runtime to use [default: amqp] [possible values: amqp, in-memory] + -n, --num-workers + Specifies the number of worker threads to spawn (in memory runtime only) + -p, --previous-proof + The previous proof output + -h, --help + Print help ``` ### Paladin Runtime diff --git a/zero_bin/common/src/prover_input.rs b/zero_bin/common/src/prover_input.rs index ec9e70454..092d7832a 100644 --- a/zero_bin/common/src/prover_input.rs +++ b/zero_bin/common/src/prover_input.rs @@ -5,7 +5,10 @@ use paladin::{ directive::{Directive, IndexedStream, Literal}, runtime::Runtime, }; -use plonky_block_proof_gen::proof_types::{AggregatableProof, GeneratedBlockProof}; +use plonky_block_proof_gen::{ + proof_types::{AggregatableProof, GeneratedBlockProof}, + types::PlonkyProofIntern, +}; use proof_protocol_decoder::{ processed_block_trace::ProcessingMeta, trace_protocol::BlockTrace, @@ -28,7 +31,11 @@ impl ProverInput { self.other_data.b_data.b_meta.block_number } - pub async fn prove(self, runtime: &Runtime) -> Result { + pub async fn prove( + self, + runtime: &Runtime, + previous: Option, + ) -> Result { let block_number = self.get_block_number(); info!("Proving block {block_number}"); @@ -47,9 +54,14 @@ impl ProverInput { .await?; if let AggregatableProof::Agg(proof) = agg_proof { + let prev = previous.map(|p| GeneratedBlockProof { + b_height: block_number.as_u64() - 1, + intern: p, + }); + let block_proof = Literal(proof) .map(BlockProof { - prev: None, + prev, other: other_data, }) .run(runtime) diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index ea90edcd6..746be463c 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -30,6 +30,9 @@ pub(crate) struct Cli { /// only). #[arg(long, short)] pub num_workers: Option, + /// The previous proof output. + #[arg(long, short)] + pub previous_proof: Option, } #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum, Default)] diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index 222a673bc..71815a1ab 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -5,7 +5,8 @@ use axum::{http::StatusCode, routing::post, Json, Router}; use common::ProverInput; use ethereum_types::U256; use paladin::runtime::Runtime; -use plonky_block_proof_gen::proof_types::GeneratedBlockProof; +use plonky_block_proof_gen::{proof_types::GeneratedBlockProof, types::PlonkyProofIntern}; +use serde::{Deserialize, Serialize}; use serde_json::to_writer; use tracing::{debug, error, info}; @@ -51,16 +52,22 @@ fn write_to_file( } } +#[derive(Serialize, Deserialize, Debug)] +struct HttpProverInput { + prover_input: ProverInput, + previous: Option, +} + async fn prove( - Json(payload): Json, + Json(payload): Json, runtime: Arc, output_dir: PathBuf, ) -> StatusCode { debug!("Received payload: {:#?}", payload); - let block_number = payload.get_block_number(); + let block_number = payload.prover_input.get_block_number(); - match payload.prove(&runtime).await { + match payload.prover_input.prove(&runtime, payload.previous).await { Ok(b_proof) => match write_to_file(output_dir, block_number, &b_proof) { Ok(file) => { info!("Successfully wrote proof to {}", file.display()); diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 2fae3dcaa..368c7314a 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -2,12 +2,18 @@ use std::io::Write; use anyhow::Result; use paladin::runtime::Runtime; +use plonky_block_proof_gen::types::PlonkyProofIntern; /// The main function for the jerigon mode. -pub(crate) async fn jerigon_main(runtime: Runtime, rpc_url: &str, block_number: u64) -> Result<()> { +pub(crate) async fn jerigon_main( + runtime: Runtime, + rpc_url: &str, + block_number: u64, + previous: Option, +) -> Result<()> { let prover_input = rpc::fetch_prover_input(rpc_url, block_number).await?; - let proof = prover_input.prove(&runtime).await; + let proof = prover_input.prove(&runtime, previous).await; runtime.close().await?; let proof = proof?; std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index a1d349274..ee9eee84b 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -1,9 +1,12 @@ +use std::{fs::File, path::PathBuf}; + use anyhow::Result; use clap::Parser; use cli::Mode; use dotenvy::dotenv; use ops::Ops; use paladin::runtime::Runtime; +use plonky_block_proof_gen::types::PlonkyProofIntern; mod cli; mod http; @@ -11,6 +14,18 @@ mod init; mod jerigon; mod stdio; +fn get_previous_proof(path: Option) -> Result> { + if path.is_none() { + return Ok(None); + } + + let path = path.unwrap(); + let file = File::open(path)?; + let des = &mut serde_json::Deserializer::from_reader(&file); + let proof: PlonkyProofIntern = serde_path_to_error::deserialize(des)?; + Ok(Some(proof)) +} + #[tokio::main] async fn main() -> Result<()> { dotenv().ok(); @@ -26,7 +41,8 @@ async fn main() -> Result<()> { match args.mode { Mode::StdIo => { - stdio::stdio_main(runtime).await?; + let previous_proof = get_previous_proof(args.previous_proof)?; + stdio::stdio_main(runtime, previous_proof).await?; } Mode::Http => { let output_dir = args @@ -46,7 +62,9 @@ async fn main() -> Result<()> { let block_number = args .block_number .expect("block-number is required in jerigon mode"); - jerigon::jerigon_main(runtime, &rpc_url, block_number).await?; + let previous_proof = get_previous_proof(args.previous_proof)?; + + jerigon::jerigon_main(runtime, &rpc_url, block_number, previous_proof).await?; } } diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index 6c44c2b4a..28d10b4f0 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -3,15 +3,19 @@ use std::io::{Read, Write}; use anyhow::Result; use common::ProverInput; use paladin::runtime::Runtime; +use plonky_block_proof_gen::types::PlonkyProofIntern; /// The main function for the stdio mode. -pub(crate) async fn stdio_main(runtime: Runtime) -> Result<()> { +pub(crate) async fn stdio_main( + runtime: Runtime, + previous: Option, +) -> Result<()> { let mut buffer = String::new(); std::io::stdin().read_to_string(&mut buffer)?; let des = &mut serde_json::Deserializer::from_str(&buffer); let input: ProverInput = serde_path_to_error::deserialize(des)?; - let proof = input.prove(&runtime).await; + let proof = input.prove(&runtime, previous).await; runtime.close().await?; let proof = proof?; From dfbca3013927fcbe21d63bc25ac7f73a71bfb401 Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 17 Nov 2023 15:18:26 -0800 Subject: [PATCH 033/184] Write prover state to disk --- zero_bin/.gitignore | 1 + zero_bin/Cargo.lock | 2 + zero_bin/Cargo.toml | 2 + zero_bin/common/Cargo.toml | 2 + zero_bin/leader/Cargo.toml | 2 + zero_bin/ops/Cargo.toml | 3 ++ zero_bin/ops/src/lib.rs | 22 +++++++++- zero_bin/ops/src/prover_state.rs | 69 ++++++++++++++++++++++++++++++++ zero_bin/rpc/Cargo.toml | 4 +- zero_bin/worker/Cargo.toml | 2 + 10 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 zero_bin/ops/src/prover_state.rs diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index ea8c4bf7f..fe2e25b74 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -1 +1,2 @@ /target +prover_state \ No newline at end of file diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 2105397d9..3942e5aea 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1767,10 +1767,12 @@ dependencies = [ "anyhow", "once_cell", "paladin-core", + "plonky2", "plonky_block_proof_gen", "proof_protocol_decoder", "serde", "tokio", + "tracing", ] [[package]] diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 426c7dfd6..54a55c029 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -13,6 +13,8 @@ tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "94ba5b3a1bfc74a6d3bd80da5fa7b9cd1d2690a6" } proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "15ae1a1e5b8e60a056a36926746cb563507073c2" } +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } +plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index a649ab639..3a1cd9c2c 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -11,4 +11,6 @@ tracing = { workspace = true } paladin-core = { workspace = true } ethereum-types = { workspace = true } anyhow = { workspace = true } + +# Local dependencies ops = { path = "../ops" } diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 0ea13a0df..7fb3dce5a 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -17,6 +17,8 @@ serde_json = { workspace = true } serde_path_to_error = { workspace = true } ethereum-types = { workspace = true } axum = "0.6.20" + +# Local dependencies ops = { path = "../ops" } common = { path = "../common" } rpc = { path = "../rpc" } diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 3c0a6a2b2..10741a21d 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -10,4 +10,7 @@ anyhow = { workspace = true } serde = { workspace = true } plonky_block_proof_gen = { workspace = true } proof_protocol_decoder = { workspace = true } +plonky2 = { workspace = true } +tracing = { workspace = true } + once_cell = "1.18.0" diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 0485370d2..4e4f6dd7d 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -9,9 +9,29 @@ use plonky_block_proof_gen::{ prover_state::{ProverState, ProverStateBuilder}, }; use proof_protocol_decoder::types::{OtherBlockData, TxnProofGenIR}; +use prover_state::from_disk; use serde::{Deserialize, Serialize}; +use tracing::debug; -static P_STATE: Lazy = Lazy::new(|| ProverStateBuilder::default().build()); +mod prover_state; + +static P_STATE: Lazy = Lazy::new(|| { + debug!("Attempting to load prover state from disk"); + + match from_disk() { + Some(state) => { + debug!("Successfully loaded prover state from disk!"); + state + } + None => { + debug!("Prover state not found on disk. Generating new state"); + let state = ProverStateBuilder::default().build(); + debug!("Saving prover state to disk"); + prover_state::to_disk(&state); + state + } + } +}); #[derive(Debug, Clone, Copy, Deserialize, Serialize)] pub struct TxProof; diff --git a/zero_bin/ops/src/prover_state.rs b/zero_bin/ops/src/prover_state.rs new file mode 100644 index 000000000..e962009d4 --- /dev/null +++ b/zero_bin/ops/src/prover_state.rs @@ -0,0 +1,69 @@ +use std::{ + fs::{self, OpenOptions}, + io::Write, +}; + +use plonky2::{ + plonk::config::PoseidonGoldilocksConfig, + util::serialization::{DefaultGateSerializer, DefaultGeneratorSerializer}, +}; +use plonky_block_proof_gen::{prover_state::ProverState, types::AllRecursiveCircuits}; +use tracing::warn; +type Config = PoseidonGoldilocksConfig; + +const SIZE: usize = 2; +const PATH: &str = "./prover_state"; + +pub fn get_serializers() -> ( + DefaultGateSerializer, + DefaultGeneratorSerializer, +) { + let gate_serializer = DefaultGateSerializer; + let witness_serializer: DefaultGeneratorSerializer = DefaultGeneratorSerializer { + _phantom: Default::default(), + }; + + (gate_serializer, witness_serializer) +} + +pub(crate) fn from_disk() -> Option { + let bytes = fs::read(PATH).ok()?; + let (gate_serializer, witness_serializer) = get_serializers(); + let state = AllRecursiveCircuits::from_bytes(&bytes, &gate_serializer, &witness_serializer); + + match state { + Ok(state) => Some(ProverState { state }), + Err(e) => { + warn!("failed to deserialize prover state, {e:?}"); + None + } + } +} + +pub(crate) fn to_disk(state: &ProverState) { + let file = OpenOptions::new().write(true).create(true).open(PATH); + + let mut file = match file { + Ok(file) => file, + Err(e) => { + warn!("failed to create prover state file, {e:?}"); + return; + } + }; + + let (gate_serializer, witness_serializer) = get_serializers(); + + let bytes = state.state.to_bytes(&gate_serializer, &witness_serializer); + + let bytes = match bytes { + Ok(bytes) => bytes, + Err(e) => { + warn!("failed to create prover state file, {e:?}"); + return; + } + }; + + if let Err(e) = file.write_all(&bytes) { + warn!("failed to write prover state file, {e:?}"); + } +} diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 72a715f7d..ee13516c2 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -14,11 +14,13 @@ serde_json = { workspace = true } serde_path_to_error = { workspace = true } clap = { workspace = true } ethereum-types = { workspace = true } +plonky2_evm = { workspace = true } reqwest = { version = "0.11.22", default-features = false, features = [ "json", "rustls-tls", ] } thiserror = "1.0.50" futures = "0.3.29" -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } + +# Local dependencies common = { path = "../common" } diff --git a/zero_bin/worker/Cargo.toml b/zero_bin/worker/Cargo.toml index 735c0ff9a..96e1a81dc 100644 --- a/zero_bin/worker/Cargo.toml +++ b/zero_bin/worker/Cargo.toml @@ -11,4 +11,6 @@ tracing = { workspace = true } tracing-subscriber = { workspace = true } clap = { workspace = true } tokio = { workspace = true } + +# Local dependencies ops = { path = "../ops" } From 3751ebae24deec94a9c07ab37d5032544c95d592 Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 17 Nov 2023 15:29:19 -0800 Subject: [PATCH 034/184] Use `Config` type --- zero_bin/ops/src/prover_state.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/zero_bin/ops/src/prover_state.rs b/zero_bin/ops/src/prover_state.rs index e962009d4..471d07955 100644 --- a/zero_bin/ops/src/prover_state.rs +++ b/zero_bin/ops/src/prover_state.rs @@ -9,15 +9,12 @@ use plonky2::{ }; use plonky_block_proof_gen::{prover_state::ProverState, types::AllRecursiveCircuits}; use tracing::warn; -type Config = PoseidonGoldilocksConfig; +type Config = PoseidonGoldilocksConfig; const SIZE: usize = 2; const PATH: &str = "./prover_state"; -pub fn get_serializers() -> ( - DefaultGateSerializer, - DefaultGeneratorSerializer, -) { +pub fn get_serializers() -> (DefaultGateSerializer, DefaultGeneratorSerializer) { let gate_serializer = DefaultGateSerializer; let witness_serializer: DefaultGeneratorSerializer = DefaultGeneratorSerializer { _phantom: Default::default(), From d6d0ee74213a551c1376f0450182204b925e8e2d Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 21 Nov 2023 08:45:58 -0700 Subject: [PATCH 035/184] Fixed two prog args using same short char --- zero_bin/leader/src/cli.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 746be463c..80f65f34b 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -31,7 +31,7 @@ pub(crate) struct Cli { #[arg(long, short)] pub num_workers: Option, /// The previous proof output. - #[arg(long, short)] + #[arg(long, short = 'f')] pub previous_proof: Option, } From 5d5e547b150641b4d77737572f3989152ab49546 Mon Sep 17 00:00:00 2001 From: cpu Date: Wed, 22 Nov 2023 21:42:12 -0800 Subject: [PATCH 036/184] Bump to paladin 0.3.2 --- zero_bin/Cargo.lock | 142 ++++++++++++++++++++++++++++++++++++++++++-- zero_bin/Cargo.toml | 2 +- 2 files changed, 139 insertions(+), 5 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 3942e5aea..bf753ab98 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -280,6 +280,15 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "atomic-polyfill" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" +dependencies = [ + "critical-section", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -572,6 +581,12 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + [[package]] name = "colorchoice" version = "1.0.0" @@ -652,6 +667,36 @@ dependencies = [ "libc", ] +[[package]] +name = "critical-section" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + +[[package]] +name = "crossbeam" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +dependencies = [ + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[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" @@ -676,6 +721,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.16" @@ -736,6 +791,19 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.2", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "deranged" version = "0.3.9" @@ -784,6 +852,12 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + [[package]] name = "encoding_rs" version = "0.8.33" @@ -1145,6 +1219,15 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1163,6 +1246,20 @@ dependencies = [ "serde", ] +[[package]] +name = "heapless" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.4.1" @@ -1800,20 +1897,24 @@ dependencies = [ [[package]] name = "paladin-core" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "289d5e42ec7ba298dbc988f1e7389ed19845a5f1c50fe91ec53b2c7b6b421776" +checksum = "5c11bf6aa73a2dfc6a35370bbbec4a30214cea4780a6b4e4e143eb2b13dbc133" dependencies = [ "anyhow", "async-trait", "backoff", + "bytes", "ciborium", "clap", + "crossbeam", + "dashmap", "dotenvy", "futures", "lapin", "paladin-opkind-derive", "pin-project", + "postcard", "serde", "thiserror", "tokio", @@ -1827,9 +1928,9 @@ dependencies = [ [[package]] name = "paladin-opkind-derive" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692da812cdc5744f747fc983c136f4c9acfeb69e2e538e47229a1582b10cb786" +checksum = "b48313f3ae58c76aecb1cd100d6a5a412dd9b559cc22807a9b5df831f1f7ee2a" dependencies = [ "quote", "syn 2.0.38", @@ -2118,6 +2219,18 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "postcard" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" +dependencies = [ + "cobs", + "embedded-io", + "heapless", + "serde", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2440,6 +2553,15 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.37.26" @@ -2582,6 +2704,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" + [[package]] name = "serde" version = "1.0.190" @@ -2748,6 +2876,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 54a55c029..7960dd4a8 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "common", "ops", "verifier", "rpc"] resolver = "2" [workspace.dependencies] -paladin-core = "0.2.0" +paladin-core = "0.3.2" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" From 8c996c4080b2b3e21e51b970579660d105583260 Mon Sep 17 00:00:00 2001 From: cpu Date: Thu, 23 Nov 2023 07:42:45 -0800 Subject: [PATCH 037/184] Overhaul leader CLI such that flags are grouped by subcommand --- zero_bin/README.md | 175 ++++++++++++++++++++++++------------ zero_bin/leader/src/cli.rs | 82 ++++++++++------- zero_bin/leader/src/main.rs | 33 ++++--- zero_bin/rpc/src/cli.rs | 2 +- 4 files changed, 182 insertions(+), 110 deletions(-) diff --git a/zero_bin/README.md b/zero_bin/README.md index 212ad7f25..18fccd0e8 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -7,18 +7,19 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [Ops](#ops) - [Worker](#worker) - [Leader](#leader) - - [Usage](#usage) + - [RPC](#rpc) + - [Verifier](#verifier) + - [Leader Usage](#leader-usage) + - [stdio](#stdio) + - [Jerigon](#jerigon) + - [HTTP](#http) - [Paladin Runtime](#paladin-runtime) - [Starting an AMQP enabled cluster](#starting-an-amqp-enabled-cluster) - [Start worker(s)](#start-workers) - [Start leader](#start-leader) - [Starting an in-memory (single process) cluster](#starting-an-in-memory-single-process-cluster) - - [Input mode](#input-mode) - - [stdin](#stdin) - - [HTTP](#http) - - [Jerigon](#jerigon) - - [Verifier](#verifier) - - [RPC](#rpc) + - [Verifier Usage](#verifier-usage) + - [RPC Usage](#rpc-usage) - [Docker](#docker) @@ -34,6 +35,14 @@ worker └── main.rs leader ├── Cargo.toml +└── src + └── main.rs +rpc +├── Cargo.toml +└── src + └── main.rs +verifier +├── Cargo.toml └── src └── main.rs ``` @@ -46,98 +55,150 @@ The worker process. Receives proof operations from the leader, and returns the r ### Leader The leader process. Receives proof generation requests, and distributes them to workers. -## Usage +### RPC + +A binary to generate the block trace format expected by the leader. + +### Verifier -Leader binary arguments and options are comprised of paladin configuration and input mode: +A binary to verify the correctness of the generated proof. + +## Leader Usage + +The leader has various subcommands for different io modes. The leader binary arguments are as follows: ``` -cargo r --bin leader -- --help +cargo r --release --bin leader -- --help -Usage: leader [OPTIONS] +Usage: leader [OPTIONS] + +Commands: + stdio Reads input from stdin and writes output to stdout + jerigon Reads input from a Jerigon node and writes output to stdout + http Reads input from HTTP and writes output to a directory + help Print this message or the help of the given subcommand(s) Options: - -m, --mode - The input mode. If `std-io`, the input is read from stdin. If `http`, the input is read from HTTP requests. If `jerigon`, the input is read from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` RPC methods from Jerigon [default: std-io] [possible values: std-io, http, jerigon] - -p, --port - The port to listen on when using the `http` mode [default: 8080] - -o, --output-dir - The directory to which output should be written (`http` mode only) - --rpc-url - The RPC URL to use when using the `jerigon` mode - -b, --block-number - The block number to use when using the `jerigon` mode - -r, --runtime - Specifies the paladin runtime to use [default: amqp] [possible values: amqp, in-memory] - -n, --num-workers - Specifies the number of worker threads to spawn (in memory runtime only) - -p, --previous-proof - The previous proof output - -h, --help - Print help + -n, --num-workers Specifies the number of worker threads to spawn (in memory runtime only) + -r, --runtime Specifies the paladin runtime mode [default: amqp] [possible values: amqp, in-memory] + --amqp-uri Specifies the URI for the AMQP broker (AMQP runtime only) + -h, --help Print help ``` -### Paladin Runtime +### stdio +The stdio command reads proof input from stdin and writes output to stdout. -Paladin supports both an AMQP and in-memory runtime. The in-memory runtime will emulate a cluster in memory within a single process, and is useful for testing. The AMQP runtime is geared for a production environment. The AMQP runtime requires a running AMQP broker and spinning up worker processes. The AMQP uri can be specified with the `--amqp-uri` flag or be set with the `AMQP_URI` environment variable. +``` +cargo r --release --bin leader stdio --help -#### Starting an AMQP enabled cluster +Reads input from stdin and writes output to stdout -##### Start worker(s) +Usage: leader stdio [OPTIONS] -Start worker process(es). The default paladin runtime is AMQP, so no additional flags are required to enable it. +Options: + -f, --previous-proof The previous proof output + -h, --help Print help +``` +Pull prover input from the rpc binary. ```bash -RUST_LOG=debug cargo r --release --bin worker +cargo r --release --bin rpc fetch --rpc-url -b 6 > ./input/block_6.json ``` -##### Start leader +Pipe the block input to the leader binary. +```bash +cat ./input/block_6.json | cargo r --release --bin leader -- -r in-memory stdio > ./output/proof_6.json +``` -Start the leader process with the desired [input mode](#input-mode). The default paladin runtime is AMQP, so no additional flags are required to enable it. +### Jerigon + +The Jerigon command reads proof input from a Jerigon node and writes output to stdout. -```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode http --output-dir ./output ``` +cargo r --release --bin leader jerigon --help -#### Starting an in-memory (single process) cluster +Reads input from a Jerigon node and writes output to stdout -Paladin can emulate a cluster in memory within a single process. Useful for testing purposes. +Usage: leader jerigon [OPTIONS] --rpc-url --block-number + +Options: + -u, --rpc-url + -b, --block-number The block number for which to generate a proof + -f, --previous-proof The previous proof output + -h, --help Print help +``` +Prove a block. ```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode http --runtime in-memory --output-dir ./output +cargo r --release --bin leader -- -r in-memory jerigon -u -b 16 > ./output/proof_16.json +``` + +### HTTP + +The HTTP command reads proof input from HTTP and writes output to a directory. ``` +cargo r --release --bin leader http --help -### Input mode -Pass JSON encoded prover input to stdin or over HTTP, or point the leader to a Jerigon RPC endpoint to retrieve the prover input from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` RPC methods. +Reads input from HTTP and writes output to a directory -See [`prover_input.rs`](/leader/src/prover_input.rs) for the input format. +Usage: leader http [OPTIONS] --output-dir -The `std-io` and `http` examples below assume some prover input is stored in `./block_121.json`. +Options: + -p, --port The port on which to listen [default: 8080] + -o, --output-dir The directory to which output should be written + -h, --help Print help +``` -#### stdin +Pull prover input from the rpc binary. +```bash +cargo r --release --bin rpc fetch -u -b 6 > ./input/block_6.json +``` +Start the server. ```bash -cat ./block_121.json | RUST_LOG=debug cargo r --release --bin leader > ./output/proof_121.json +RUST_LOG=debug cargo r --release --bin leader http --output-dir ./output ``` -#### HTTP +Note that HTTP mode requires a [slightly modified input format](./leader/src/http.rs#L56) from the rest of the commands. In particular, [the previous proof is expected to be part of the payload](./leader/src/http.rs#L58). This is due to the fact that the HTTP mode may handle multiple requests concurrently, and thus the previous proof cannot reasonably be given by a command line argument like the other modes. + + +Using `jq` we can merge the previous proof and the block input into a single JSON object. -Start the server ```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode http --output-dir ./output +jq -s '{prover_input: .[0], previous: .[1]}' ./input/block_6.json ./output/proof_5.json | curl -X POST -H "Content-Type: application/json" -d @- http://localhost:8080/prove + ``` -Once initialized, send a request: +### Paladin Runtime + +Paladin supports both an AMQP and in-memory runtime. The in-memory runtime will emulate a cluster in memory within a single process, and is useful for testing. The AMQP runtime is geared for a production environment. The AMQP runtime requires a running AMQP broker and spinning up worker processes. The AMQP uri can be specified with the `--amqp-uri` flag or be set with the `AMQP_URI` environment variable. + +#### Starting an AMQP enabled cluster + +##### Start worker(s) + +Start worker process(es). The default paladin runtime is AMQP, so no additional flags are required to enable it. + ```bash -curl -X POST -H "Content-Type: application/json" -d @./block_121.json http://localhost:8080/prove +RUST_LOG=debug cargo r --release --bin worker ``` -#### Jerigon +##### Start leader + +Start the leader process with the desired [command](#leader-usage). The default paladin runtime is AMQP, so no additional flags are required to enable it. ```bash -RUST_LOG=debug cargo r --release --bin leader -- --mode jerigon --runtime in-memory --rpc-url --block-number 16 > ./output/proof_16.json +RUST_LOG=debug cargo r --release --bin leader jerigon -u -b 16 > ./output/proof_16.json ``` +#### Starting an in-memory (single process) cluster + +Paladin can emulate a cluster in memory within a single process. Useful for testing purposes. + +```bash +cat ./input/block_6.json | cargo r --release --bin leader -- -r in-memory stdio > ./output/proof_6.json +``` -## Verifier +## Verifier Usage A verifier binary is provided to verify the correctness of the generated proof. The verifier expects output in the format generated by the leader. The verifier binary arguments are as follows: ``` @@ -155,7 +216,7 @@ Example: cargo r --release --bin verifier -- -f ./output/proof_16.json ``` -## RPC +## RPC Usage An rpc binary is provided to generate the block trace format expected by the leader. ``` diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 80f65f34b..e671600d1 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -1,44 +1,58 @@ use std::path::PathBuf; -use clap::{Parser, ValueEnum, ValueHint}; +use clap::{Args, Parser, Subcommand, ValueHint}; use paladin::config::Runtime; #[derive(Parser)] pub(crate) struct Cli { - /// The input mode. If `std-io`, the input is read from stdin. If `http`, - /// the input is read from HTTP requests. If `jerigon`, the input is - /// read from the `debug_traceBlockByNumber` and `eth_getBlockByNumber` - /// RPC methods from Jerigon. - #[arg(short, long, value_enum, default_value_t = Mode::StdIo)] - pub(crate) mode: Mode, - /// The port to listen on when using the `http` mode. - #[arg(short, long, default_value_t = 8080)] - pub(crate) port: u16, - /// The directory to which output should be written (`http` mode only). - #[arg(short, long, required_if_eq("mode", "http"), value_hint = ValueHint::DirPath)] - pub(crate) output_dir: Option, - /// The RPC URL to use when using the `jerigon` mode. - #[arg(long, required_if_eq("mode", "jerigon"), value_hint = ValueHint::Url)] - pub(crate) rpc_url: Option, - /// The block number to use when using the `jerigon` mode. - #[arg(short, long, required_if_eq("mode", "jerigon"))] - pub(crate) block_number: Option, - /// Specifies the paladin runtime to use. - #[arg(long, short, value_enum, default_value_t = Runtime::Amqp)] - pub(crate) runtime: Runtime, + #[command(subcommand)] + pub(crate) command: Command, + + #[clap(flatten)] + pub(crate) runtime: RuntimeGroup, +} + +#[derive(Subcommand)] +pub(crate) enum Command { + /// Reads input from stdin and writes output to stdout. + Stdio { + /// The previous proof output. + #[arg(long, short = 'f', value_hint = ValueHint::FilePath)] + previous_proof: Option, + }, + /// Reads input from a Jerigon node and writes output to stdout. + Jerigon { + // The Jerigon RPC URL. + #[arg(long, short = 'u', value_hint = ValueHint::Url)] + rpc_url: String, + /// The block number for which to generate a proof. + #[arg(short, long)] + block_number: u64, + /// The previous proof output. + #[arg(long, short = 'f', value_hint = ValueHint::FilePath)] + previous_proof: Option, + }, + /// Reads input from HTTP and writes output to a directory. + Http { + /// The port on which to listen. + #[arg(short, long, default_value_t = 8080)] + port: u16, + /// The directory to which output should be written. + #[arg(short, long, value_hint = ValueHint::DirPath)] + output_dir: PathBuf, + }, +} + +#[derive(Args)] +pub(crate) struct RuntimeGroup { /// Specifies the number of worker threads to spawn (in memory runtime /// only). #[arg(long, short)] - pub num_workers: Option, - /// The previous proof output. - #[arg(long, short = 'f')] - pub previous_proof: Option, -} - -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum, Default)] -pub(crate) enum Mode { - #[default] - StdIo, - Http, - Jerigon, + pub(crate) num_workers: Option, + /// Specifies the paladin runtime mode. + #[arg(long, short, value_enum, default_value_t = Runtime::Amqp)] + pub(crate) runtime: Runtime, + /// Specifies the URI for the AMQP broker (AMQP runtime only). + #[arg(long, env = "AMQP_URI", value_hint = ValueHint::Url, required_if_eq("runtime", "amqp"))] + pub amqp_uri: Option, } diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index ee9eee84b..ad398173d 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -2,7 +2,7 @@ use std::{fs::File, path::PathBuf}; use anyhow::Result; use clap::Parser; -use cli::Mode; +use cli::Command; use dotenvy::dotenv; use ops::Ops; use paladin::runtime::Runtime; @@ -33,36 +33,33 @@ async fn main() -> Result<()> { let args = cli::Cli::parse(); let runtime = Runtime::from_config::(&paladin::config::Config { - runtime: args.runtime, - num_workers: args.num_workers, + runtime: args.runtime.runtime, + num_workers: args.runtime.num_workers, + amqp_uri: args.runtime.amqp_uri, ..Default::default() }) .await?; - match args.mode { - Mode::StdIo => { - let previous_proof = get_previous_proof(args.previous_proof)?; + match args.command { + Command::Stdio { previous_proof } => { + let previous_proof = get_previous_proof(previous_proof)?; stdio::stdio_main(runtime, previous_proof).await?; } - Mode::Http => { - let output_dir = args - .output_dir - .expect("output-dir is required in http mode"); - + Command::Http { port, output_dir } => { // check if output_dir exists, is a directory, and is writable let output_dir_metadata = std::fs::metadata(&output_dir)?; if !output_dir.is_dir() || output_dir_metadata.permissions().readonly() { panic!("output-dir is not a writable directory"); } - http::http_main(runtime, args.port, output_dir).await?; + http::http_main(runtime, port, output_dir).await?; } - Mode::Jerigon => { - let rpc_url = args.rpc_url.expect("rpc-url is required in jerigon mode"); - let block_number = args - .block_number - .expect("block-number is required in jerigon mode"); - let previous_proof = get_previous_proof(args.previous_proof)?; + Command::Jerigon { + rpc_url, + block_number, + previous_proof, + } => { + let previous_proof = get_previous_proof(previous_proof)?; jerigon::jerigon_main(runtime, &rpc_url, block_number, previous_proof).await?; } diff --git a/zero_bin/rpc/src/cli.rs b/zero_bin/rpc/src/cli.rs index 7d4915974..c339e1940 100644 --- a/zero_bin/rpc/src/cli.rs +++ b/zero_bin/rpc/src/cli.rs @@ -11,7 +11,7 @@ pub(crate) enum Commands { /// Fetch and generate prover input from the RPC endpoint Fetch { /// The RPC URL - #[arg(short, long, value_hint = ValueHint::Url)] + #[arg(short = 'u', long, value_hint = ValueHint::Url)] rpc_url: String, /// The block number #[arg(short, long)] From d161bf17da682b2c30294c358f62200ada5c4b5d Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Fri, 24 Nov 2023 16:38:01 -0800 Subject: [PATCH 038/184] Enable specifying prover circuit sizes in .env and CLI (#3) --- zero_bin/.env | 7 + zero_bin/.github/workflows/ci.yml | 49 ++-- zero_bin/.gitignore | 2 +- zero_bin/Cargo.lock | 37 ++- zero_bin/Cargo.toml | 7 +- zero_bin/README.md | 87 ++++++- zero_bin/common/Cargo.toml | 14 +- zero_bin/common/src/lib.rs | 4 +- zero_bin/common/src/parsing.rs | 105 ++++++++ zero_bin/common/src/prover_state/circuit.rs | 225 ++++++++++++++++++ zero_bin/common/src/prover_state/cli.rs | 88 +++++++ zero_bin/common/src/prover_state/mod.rs | 95 ++++++++ .../src/prover_state/persistence.rs} | 37 ++- zero_bin/leader/Cargo.toml | 3 +- zero_bin/leader/src/cli.rs | 26 +- zero_bin/leader/src/http.rs | 2 +- zero_bin/leader/src/main.rs | 20 +- zero_bin/leader/src/stdio.rs | 2 +- zero_bin/ops/Cargo.toml | 6 +- zero_bin/ops/src/lib.rs | 36 +-- zero_bin/prover/Cargo.toml | 16 ++ .../src/prover_input.rs => prover/src/lib.rs} | 0 zero_bin/rpc/Cargo.toml | 4 +- zero_bin/rpc/src/rpc.rs | 2 +- zero_bin/worker/Cargo.toml | 1 + zero_bin/worker/src/main.rs | 18 +- 26 files changed, 763 insertions(+), 130 deletions(-) create mode 100644 zero_bin/common/src/parsing.rs create mode 100644 zero_bin/common/src/prover_state/circuit.rs create mode 100644 zero_bin/common/src/prover_state/cli.rs create mode 100644 zero_bin/common/src/prover_state/mod.rs rename zero_bin/{ops/src/prover_state.rs => common/src/prover_state/persistence.rs} (57%) create mode 100644 zero_bin/prover/Cargo.toml rename zero_bin/{common/src/prover_input.rs => prover/src/lib.rs} (100%) diff --git a/zero_bin/.env b/zero_bin/.env index 93484d3c2..0ee224f1b 100644 --- a/zero_bin/.env +++ b/zero_bin/.env @@ -1 +1,8 @@ AMQP_URI=amqp://localhost:5672 +ARITHMETIC_CIRCUIT_SIZE=16..22 +BYTE_PACKING_CIRCUIT_SIZE=10..22 +CPU_CIRCUIT_SIZE=15..22 +KECCAK_CIRCUIT_SIZE=14..22 +KECCAK_SPONGE_CIRCUIT_SIZE=9..22 +LOGIC_CIRCUIT_SIZE=12..22 +MEMORY_CIRCUIT_SIZE=18..22 diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml index 8b51baa53..e125e9422 100644 --- a/zero_bin/.github/workflows/ci.yml +++ b/zero_bin/.github/workflows/ci.yml @@ -1,11 +1,11 @@ +name: ci + on: push: branches: - main pull_request: -name: ci - jobs: check: runs-on: ubuntu-latest @@ -13,30 +13,37 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Install protoc - run: sudo apt-get install -y protobuf-compiler + - name: Remove Pre-installed Rust + run: | + rustup toolchain remove stable + rm -f /home/runner/.cargo/bin/rust-analyzer + rm -f /home/runner/.cargo/bin/rustfmt + rm -f /home/runner/.cargo/bin/cargo-fmt + + - name: Install Rust Nightly + run: | + rustup update nightly + rustup default nightly + rustup component add rustfmt --toolchain nightly + rustup component add clippy --toolchain nightly - - name: Install toolchain - uses: actions-rs/toolchain@v1 + - name: Get Rust Version + run: rustc --version > rust-version.txt + + - name: Cache Cargo Registry and Build Outputs + uses: actions/cache@v2 with: - toolchain: nightly - profile: minimal - override: true - components: rustfmt, clippy + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-rust-${{ hashFiles('rust-version.txt', '**/Cargo.lock') }} - name: Run cargo clippy - uses: actions-rs/cargo@v1 - with: - command: clippy - args: -- -D warnings + run: cargo +nightly clippy -- -D warnings - name: Run cargo fmt --check - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check + run: cargo +nightly fmt --all -- --check - name: Run cargo test - uses: actions-rs/cargo@v1 - with: - command: test + run: cargo test diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index fe2e25b74..8800d570e 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -1,2 +1,2 @@ /target -prover_state \ No newline at end of file +/prover_state* \ No newline at end of file diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index bf753ab98..ed693e9ec 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -597,13 +597,11 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" name = "common" version = "0.1.0" dependencies = [ - "anyhow", - "ethereum-types", - "ops", - "paladin-core", + "clap", + "plonky2", + "plonky2_evm", "plonky_block_proof_gen", - "proof_protocol_decoder", - "serde", + "thiserror", "tracing", ] @@ -1622,6 +1620,7 @@ dependencies = [ "ops", "paladin-core", "plonky_block_proof_gen", + "prover", "rpc", "serde", "serde_json", @@ -1861,15 +1860,11 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" name = "ops" version = "0.1.0" dependencies = [ - "anyhow", - "once_cell", + "common", "paladin-core", - "plonky2", "plonky_block_proof_gen", "proof_protocol_decoder", "serde", - "tokio", - "tracing", ] [[package]] @@ -1897,9 +1892,9 @@ dependencies = [ [[package]] name = "paladin-core" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c11bf6aa73a2dfc6a35370bbbec4a30214cea4780a6b4e4e143eb2b13dbc133" +checksum = "6e3bc44b22dbbfef99900837ae9d335e0bb411f5a981511b8ab64e5615b0b4ae" dependencies = [ "anyhow", "async-trait", @@ -2307,6 +2302,20 @@ dependencies = [ "thiserror", ] +[[package]] +name = "prover" +version = "0.1.0" +dependencies = [ + "anyhow", + "ethereum-types", + "ops", + "paladin-core", + "plonky_block_proof_gen", + "proof_protocol_decoder", + "serde", + "tracing", +] + [[package]] name = "quote" version = "1.0.33" @@ -2531,6 +2540,7 @@ dependencies = [ "futures", "plonky2_evm", "proof_protocol_decoder", + "prover", "reqwest", "serde", "serde_json", @@ -3610,6 +3620,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", + "common", "dotenvy", "ops", "paladin-core", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 7960dd4a8..4c39c1c92 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -1,14 +1,14 @@ [workspace] -members = ["leader", "worker", "common", "ops", "verifier", "rpc"] +members = ["leader", "worker", "common", "ops", "verifier", "rpc", "prover"] resolver = "2" [workspace.dependencies] -paladin-core = "0.3.2" +paladin-core = "0.3.3" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } -clap = { version = "4.4.6", features = ["derive"] } +clap = { version = "4.4.6", features = ["derive", "env"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "94ba5b3a1bfc74a6d3bd80da5fa7b9cd1d2690a6" } @@ -18,3 +18,4 @@ plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" +thiserror = "1.0.50" diff --git a/zero_bin/README.md b/zero_bin/README.md index 18fccd0e8..ace369a24 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -78,12 +78,85 @@ Commands: help Print this message or the help of the given subcommand(s) Options: - -n, --num-workers Specifies the number of worker threads to spawn (in memory runtime only) - -r, --runtime Specifies the paladin runtime mode [default: amqp] [possible values: amqp, in-memory] - --amqp-uri Specifies the URI for the AMQP broker (AMQP runtime only) - -h, --help Print help + -h, --help + Print help (see a summary with '-h') + +Paladin options: + -t, --task-bus-routing-key + Specifies the routing key for publishing task messages. In most cases, the default value should suffice + + [default: task] + + -s, --serializer + Determines the serialization format to be used + + [default: postcard] + [possible values: postcard, cbor] + + -r, --runtime + Specifies the runtime environment to use + + [default: amqp] + [possible values: amqp, in-memory] + + -n, --num-workers + Specifies the number of worker threads to spawn (in memory runtime only) + + --amqp-uri + Provides the URI for the AMQP broker, if the AMQP runtime is selected + + [env: AMQP_URI=amqp://localhost:5672] + +Table circuit sizes: + --persistence + [default: disk] + + Possible values: + - none: Do not persist the processed circuits + - disk: Persist the processed circuits to disk + + --arithmetic + The min/max size for the arithmetic table circuit. + + [env: ARITHMETIC_CIRCUIT_SIZE=16..22] + + --byte-packing + The min/max size for the byte packing table circuit. + + [env: BYTE_PACKING_CIRCUIT_SIZE=10..22] + + --cpu + The min/max size for the cpu table circuit. + + [env: CPU_CIRCUIT_SIZE=15..22] + + --keccak + The min/max size for the keccak table circuit. + + [env: KECCAK_CIRCUIT_SIZE=14..22] + + --keccak-sponge + The min/max size for the keccak sponge table circuit. + + [env: KECCAK_SPONGE_CIRCUIT_SIZE=9..22] + + --logic + The min/max size for the logic table circuit. + + [env: LOGIC_CIRCUIT_SIZE=12..22] + + --memory + The min/max size for the memory table circuit. + + [env: MEMORY_CIRCUIT_SIZE=18..22] ``` +Note that both paladin and plonky2 table circuit sizes are configurable via command line arguments and environment variables. The command line arguments take precedence over the environment variables. + +**TABLE CIRCUIT SIZES ARE _ONLY_ RELEVANT FOR THE LEADER WHEN RUNNING IN `in-memory` MODE**. + +If you want to configure the table circuit sizes when running in a distributed environment, you must configure the table circuit sizes on the worker processes (the command line arguments are the same). + ### stdio The stdio command reads proof input from stdin and writes output to stdout. @@ -165,7 +238,6 @@ Using `jq` we can merge the previous proof and the block input into a single JSO ```bash jq -s '{prover_input: .[0], previous: .[1]}' ./input/block_6.json ./output/proof_5.json | curl -X POST -H "Content-Type: application/json" -d @- http://localhost:8080/prove - ``` ### Paladin Runtime @@ -174,6 +246,11 @@ Paladin supports both an AMQP and in-memory runtime. The in-memory runtime will #### Starting an AMQP enabled cluster +Start rabbitmq +```bash +docker run --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management +``` + ##### Start worker(s) Start worker process(es). The default paladin runtime is AMQP, so no additional flags are required to enable it. diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 3a1cd9c2c..95fd654e2 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -4,13 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] -serde = { workspace = true } -plonky_block_proof_gen = { workspace = true } -proof_protocol_decoder = { workspace = true } +thiserror = { workspace = true } tracing = { workspace = true } -paladin-core = { workspace = true } -ethereum-types = { workspace = true } -anyhow = { workspace = true } - -# Local dependencies -ops = { path = "../ops" } +plonky_block_proof_gen = { workspace = true } +plonky2 = { workspace = true } +plonky2_evm = { workspace = true } +clap = { workspace = true } diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs index d6041b3f0..234099cf5 100644 --- a/zero_bin/common/src/lib.rs +++ b/zero_bin/common/src/lib.rs @@ -1,2 +1,2 @@ -mod prover_input; -pub use prover_input::ProverInput; +pub mod parsing; +pub mod prover_state; diff --git a/zero_bin/common/src/parsing.rs b/zero_bin/common/src/parsing.rs new file mode 100644 index 000000000..911d35e39 --- /dev/null +++ b/zero_bin/common/src/parsing.rs @@ -0,0 +1,105 @@ +//! Parsing utilities. +use std::{fmt::Display, ops::Range, str::FromStr}; + +use thiserror::Error; + +#[derive(Error, Debug, PartialEq)] +pub enum RangeParseError +where + T: FromStr + Display, + T::Err: Display, +{ + #[error("empty input")] + EmptyInput, + #[error("failed to parse right hand side of range: {0}")] + RhsParseError(T::Err), + #[error("failed to parse left hand side of range: {0}. ")] + LhsParseError(T::Err), + #[error("missing left hand size of range. expecting `start..end`")] + LhsMissing, + #[error("missing right hand side of range. expecting `start..end`")] + RhsMissing, +} + +/// Parse a range from a string. +/// +/// A valid range is of the form `lhs..rhs`, where `lhs` and `rhs` are numbers. +/// +/// # Example +/// +/// ```rust +/// # use common::parsing::parse_range; +/// assert_eq!(parse_range::("0..10"), Ok(0..10)); +/// ``` +pub fn parse_range(s: &str) -> Result, RangeParseError> +where + T: Display + FromStr, + T::Err: Display, +{ + let mut pairs = s.split(".."); + match (pairs.next(), pairs.next()) { + // Empty input, "" + (Some(""), None) => Err(RangeParseError::EmptyInput), + // RHS missing, e.g., "10.." or "10" + (Some(_), None | Some("")) => Err(RangeParseError::RhsMissing), + // LHS missing, e.g., "..10" + (Some(""), _) => Err(RangeParseError::LhsMissing), + (Some(lhs), Some(rhs)) => { + let lhs = lhs.parse().map_err(RangeParseError::LhsParseError)?; + let rhs = rhs.parse().map_err(RangeParseError::RhsParseError)?; + Ok(lhs..rhs) + } + // (None, _) is not possible, because split always returns at least one element. + _ => unreachable!(), + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn it_parses_ranges() { + assert_eq!(parse_range::("0..10"), Ok(0..10)); + } + + #[test] + fn it_handles_missing_lhs() { + assert_eq!( + parse_range::("..10").unwrap_err(), + RangeParseError::LhsMissing + ); + } + + #[test] + fn it_handles_missing_rhs() { + assert_eq!( + parse_range::("10..").unwrap_err(), + RangeParseError::RhsMissing + ); + } + + #[test] + fn it_handles_empty_input() { + assert_eq!( + parse_range::("").unwrap_err(), + RangeParseError::EmptyInput + ); + } + + #[test] + fn it_handles_rhs_parse_error() { + assert_eq!( + parse_range::("10..f").unwrap_err(), + RangeParseError::RhsParseError("f".parse::().unwrap_err()) + ); + } + + #[test] + fn it_handles_lhs_parse_error() { + assert_eq!( + parse_range::("hello..10").unwrap_err(), + RangeParseError::LhsParseError("hello".parse::().unwrap_err()) + ); + } +} diff --git a/zero_bin/common/src/prover_state/circuit.rs b/zero_bin/common/src/prover_state/circuit.rs new file mode 100644 index 000000000..b0d35c116 --- /dev/null +++ b/zero_bin/common/src/prover_state/circuit.rs @@ -0,0 +1,225 @@ +//! [`AllRecursiveCircuits`] dynamic circuit configuration. +use std::{ + fmt::Display, + ops::{Deref, Range}, + str::FromStr, +}; + +use plonky2_evm::{all_stark::AllStark, config::StarkConfig}; +use plonky_block_proof_gen::types::AllRecursiveCircuits; + +use crate::parsing::{parse_range, RangeParseError}; + +/// Number of tables defined in plonky2. +const NUM_TABLES: usize = 7; + +/// New type wrapper for [`Range`] that implements [`FromStr`] and [`Display`]. +/// +/// Useful for using in clap arguments. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CircuitSize(pub Range); + +impl Deref for CircuitSize { + type Target = Range; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl Display for CircuitSize { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}..{}", self.start, self.end) + } +} + +impl From> for CircuitSize { + fn from(item: Range) -> Self { + Self(item) + } +} + +impl From for Range { + fn from(item: CircuitSize) -> Self { + item.0 + } +} + +impl FromStr for CircuitSize { + type Err = RangeParseError; + + fn from_str(s: &str) -> Result { + Ok(CircuitSize(parse_range(s)?)) + } +} + +/// All possible plonky2 table circuits. +#[repr(usize)] +#[derive(Debug, Clone, Copy)] +pub enum Circuit { + Arithmetic, + BytePacking, + Cpu, + Keccak, + KeccakSponge, + Logic, + Memory, +} + +impl Display for Circuit { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.as_str()) + } +} + +impl Circuit { + /// Get the default size for the circuit. + pub const fn default_size(&self) -> Range { + match self { + Circuit::Arithmetic => 16..22, + Circuit::BytePacking => 10..22, + Circuit::Cpu => 15..22, + Circuit::Keccak => 14..22, + Circuit::KeccakSponge => 9..22, + Circuit::Logic => 12..22, + Circuit::Memory => 18..22, + } + } + + /// Get the environment variable key for the circuit. + pub const fn as_env_key(&self) -> &'static str { + match self { + Circuit::Arithmetic => "ARITHMETIC_CIRCUIT_SIZE", + Circuit::BytePacking => "BYTE_PACKING_CIRCUIT_SIZE", + Circuit::Cpu => "CPU_CIRCUIT_SIZE", + Circuit::Keccak => "KECCAK_CIRCUIT_SIZE", + Circuit::KeccakSponge => "KECCAK_SPONGE_CIRCUIT_SIZE", + Circuit::Logic => "LOGIC_CIRCUIT_SIZE", + Circuit::Memory => "MEMORY_CIRCUIT_SIZE", + } + } + + /// Get the circuit name as a str literal. + pub const fn as_str(&self) -> &'static str { + match self { + Circuit::Arithmetic => "arithmetic", + Circuit::BytePacking => "byte packing", + Circuit::Cpu => "cpu", + Circuit::Keccak => "keccak", + Circuit::KeccakSponge => "keccak sponge", + Circuit::Logic => "logic", + Circuit::Memory => "memory", + } + } +} + +impl From for Circuit { + fn from(item: usize) -> Self { + match item { + 0 => Circuit::Arithmetic, + 1 => Circuit::BytePacking, + 2 => Circuit::Cpu, + 3 => Circuit::Keccak, + 4 => Circuit::KeccakSponge, + 5 => Circuit::Logic, + 6 => Circuit::Memory, + _ => unreachable!(), + } + } +} + +#[derive(Debug)] +pub struct CircuitConfig { + circuits: [Range; NUM_TABLES], +} + +impl Default for CircuitConfig { + fn default() -> Self { + Self { + circuits: [ + Circuit::Arithmetic.default_size(), + Circuit::BytePacking.default_size(), + Circuit::Cpu.default_size(), + Circuit::Keccak.default_size(), + Circuit::KeccakSponge.default_size(), + Circuit::Logic.default_size(), + Circuit::Memory.default_size(), + ], + } + } +} + +impl CircuitConfig { + /// Get all circuits specified in the config. + pub fn iter(&self) -> std::slice::Iter<'_, Range> { + self.circuits.iter() + } + + /// Get all circuits specified in the config with their [`Circuit`] index. + pub fn enumerate(&self) -> impl Iterator)> { + self.circuits + .iter() + .enumerate() + .map(|(index, range)| (index.into(), range)) + } + + /// Set the size of a the given [`Circuit`]. + pub fn set_circuit_size>>(&mut self, key: Circuit, size: T) { + self.circuits[key as usize] = size.into(); + } + + /// Get all circuits specified in the config. + pub fn as_degree_bits_ranges(&self) -> &[Range; NUM_TABLES] { + &self.circuits + } + + /// Get a unique string representation of the config. + pub fn get_configuration_digest(&self) -> String { + self.enumerate() + .map(|(circuit, range)| match circuit { + Circuit::Arithmetic => format!("a_{}-{}", range.start, range.end), + Circuit::BytePacking => format!("b_p_{}-{}", range.start, range.end), + Circuit::Cpu => format!("c_{}-{}", range.start, range.end), + Circuit::Keccak => format!("k_{}-{}", range.start, range.end), + Circuit::KeccakSponge => { + format!("k_s_{}-{}", range.start, range.end) + } + Circuit::Logic => format!("l_{}-{}", range.start, range.end), + Circuit::Memory => format!("m_{}-{}", range.start, range.end), + }) + .fold(String::new(), |mut acc, s| { + if !acc.is_empty() { + acc.push('_'); + } + acc.push_str(&s); + acc + }) + } + + /// Build the circuits from the current config. + pub fn as_all_recursive_circuits(&self) -> AllRecursiveCircuits { + AllRecursiveCircuits::new( + &AllStark::default(), + self.as_degree_bits_ranges(), + &StarkConfig::standard_fast_config(), + ) + } +} + +impl IntoIterator for CircuitConfig { + type Item = Range; + type IntoIter = std::array::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.circuits.into_iter() + } +} + +impl<'a> IntoIterator for &'a CircuitConfig { + type Item = &'a Range; + type IntoIter = std::slice::Iter<'a, Range>; + + fn into_iter(self) -> Self::IntoIter { + self.circuits.iter() + } +} diff --git a/zero_bin/common/src/prover_state/cli.rs b/zero_bin/common/src/prover_state/cli.rs new file mode 100644 index 000000000..51e067df6 --- /dev/null +++ b/zero_bin/common/src/prover_state/cli.rs @@ -0,0 +1,88 @@ +//! CLI arguments for constructing a [`CircuitConfig`], which can be used to +//! construct table circuits. +use clap::Args; + +use super::{ + circuit::{Circuit, CircuitConfig, CircuitSize}, + CircuitPersistence, ProverStateConfig, +}; + +/// The help heading for the circuit arguments. +/// +/// This groups the circuit arguments together in the help message. +const HEADING: &str = "Table circuit sizes"; +/// The clap value name for the circuit argument. +const VALUE_NAME: &str = "CIRCUIT_BIT_RANGE"; + +/// Get the description for the circuit argument. +/// +/// Displayed in the help message. +fn circuit_arg_desc(circuit_name: &str) -> String { + format!("The min/max size for the {circuit_name} table circuit.") +} + +/// Macro for generating the [`CliCircuitConfig`] struct. +macro_rules! gen_prover_state_config { + ($($name:ident: $circuit:expr),*) => { + #[derive(Args, Debug)] + pub struct CliProverStateConfig { + #[clap(long, help_heading = HEADING, default_value_t = CircuitPersistence::Disk)] + pub persistence: CircuitPersistence, + + $( + #[clap( + long, + value_name = VALUE_NAME, + help_heading = HEADING, + env = $circuit.as_env_key(), + help = circuit_arg_desc($circuit.as_str()), + )] + pub $name: Option, + )* + } + }; +} + +gen_prover_state_config!( + arithmetic: Circuit::Arithmetic, + byte_packing: Circuit::BytePacking, + cpu: Circuit::Cpu, + keccak: Circuit::Keccak, + keccak_sponge: Circuit::KeccakSponge, + logic: Circuit::Logic, + memory: Circuit::Memory +); + +impl CliProverStateConfig { + pub fn into_circuit_config(self) -> CircuitConfig { + let mut config = CircuitConfig::default(); + + [ + (Circuit::Arithmetic, self.arithmetic), + (Circuit::BytePacking, self.byte_packing), + (Circuit::Cpu, self.cpu), + (Circuit::Keccak, self.keccak), + (Circuit::KeccakSponge, self.keccak_sponge), + (Circuit::Logic, self.logic), + (Circuit::Memory, self.memory), + ] + .into_iter() + .filter_map(|(circuit, range)| range.map(|range| (circuit, range))) + .for_each(|(circuit, range)| config.set_circuit_size(circuit, range)); + + config + } + + pub fn into_prover_state_config(self) -> ProverStateConfig { + ProverStateConfig { + persistence: self.persistence, + circuit_config: self.into_circuit_config(), + } + } +} + +impl From for ProverStateConfig { + fn from(item: CliProverStateConfig) -> Self { + item.into_prover_state_config() + } +} diff --git a/zero_bin/common/src/prover_state/mod.rs b/zero_bin/common/src/prover_state/mod.rs new file mode 100644 index 000000000..3c4e24afc --- /dev/null +++ b/zero_bin/common/src/prover_state/mod.rs @@ -0,0 +1,95 @@ +//! Global prover state management and utilities. +//! +//! This module provides the following: +//! - [`Circuit`] and [`CircuitConfig`] which can be used to dynamically +//! construct [`AllRecursiveCircuits`] from the specified circuit sizes. +//! - Command line arguments for constructing a [`CircuitConfig`]. +//! - Provides default values for the circuit sizes. +//! - Allows the circuit sizes to be specified via environment variables. +//! - Persistence utilities for saving and loading [`AllRecursiveCircuits`]. +//! - Global prover state management via the [`P_STATE`] static and the +//! [`set_prover_state_from_config`] function. +use std::{fmt::Display, sync::OnceLock}; + +use clap::ValueEnum; +use plonky_block_proof_gen::prover_state::ProverState; +use tracing::info; + +pub mod circuit; +pub mod cli; +pub mod persistence; + +/// The global prover state. +/// +/// It is specified as a `OnceLock` for the following reasons: +/// - It is initialized once at start-up and never changed. +/// - It is accessible from multiple threads (particularly important when +/// running the leader in in-memory mode). +/// - This scheme works for both a cluster and a single machine. In particular, +/// whether imported from a worker node or a thread in the leader node +/// (in-memory mode), the prover state is initialized only once. +pub static P_STATE: OnceLock = OnceLock::new(); + +/// Specifies whether to persist the processed circuits. +#[derive(Debug, Clone, Copy, ValueEnum)] +pub enum CircuitPersistence { + /// Do not persist the processed circuits. + None, + /// Persist the processed circuits to disk. + Disk, +} + +impl Display for CircuitPersistence { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + CircuitPersistence::None => write!(f, "none"), + CircuitPersistence::Disk => write!(f, "disk"), + } + } +} + +/// Product of [`CircuitConfig`] and [`CircuitPersistence`]. +#[derive(Debug)] +pub struct ProverStateConfig { + pub circuit_config: circuit::CircuitConfig, + pub persistence: CircuitPersistence, +} + +/// Initializes the global prover state. +pub fn set_prover_state_from_config( + ProverStateConfig { + circuit_config, + persistence, + }: ProverStateConfig, +) -> Result<(), ProverState> { + info!("initializing prover state..."); + let state = match persistence { + CircuitPersistence::None => { + info!("generating circuits..."); + ProverState { + state: circuit_config.as_all_recursive_circuits(), + } + } + CircuitPersistence::Disk => { + info!("attempting to load preprocessed circuits from disk..."); + let disk_state = persistence::from_disk(&circuit_config); + match disk_state { + Some(circuits) => { + info!("successfully loaded preprocessed circuits from disk"); + ProverState { state: circuits } + } + None => { + info!("failed to load preprocessed circuits from disk. generating circuits..."); + let all_recursive_circuits = circuit_config.as_all_recursive_circuits(); + info!("saving preprocessed circuits to disk"); + persistence::to_disk(&all_recursive_circuits, &circuit_config); + ProverState { + state: all_recursive_circuits, + } + } + } + } + }; + + P_STATE.set(state) +} diff --git a/zero_bin/ops/src/prover_state.rs b/zero_bin/common/src/prover_state/persistence.rs similarity index 57% rename from zero_bin/ops/src/prover_state.rs rename to zero_bin/common/src/prover_state/persistence.rs index 471d07955..f472c814c 100644 --- a/zero_bin/ops/src/prover_state.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -7,14 +7,16 @@ use plonky2::{ plonk::config::PoseidonGoldilocksConfig, util::serialization::{DefaultGateSerializer, DefaultGeneratorSerializer}, }; -use plonky_block_proof_gen::{prover_state::ProverState, types::AllRecursiveCircuits}; -use tracing::warn; +use plonky_block_proof_gen::types::AllRecursiveCircuits; +use tracing::{info, warn}; + +use super::circuit::CircuitConfig; type Config = PoseidonGoldilocksConfig; const SIZE: usize = 2; -const PATH: &str = "./prover_state"; +const PROVER_STATE_FILE_PREFIX: &str = "./prover_state"; -pub fn get_serializers() -> (DefaultGateSerializer, DefaultGeneratorSerializer) { +fn get_serializers() -> (DefaultGateSerializer, DefaultGeneratorSerializer) { let gate_serializer = DefaultGateSerializer; let witness_serializer: DefaultGeneratorSerializer = DefaultGeneratorSerializer { _phantom: Default::default(), @@ -23,13 +25,25 @@ pub fn get_serializers() -> (DefaultGateSerializer, DefaultGeneratorSerializer Option { - let bytes = fs::read(PATH).ok()?; +#[inline] +fn disk_path(circuit_config: &CircuitConfig) -> String { + format!( + "{}_{}", + PROVER_STATE_FILE_PREFIX, + circuit_config.get_configuration_digest() + ) +} + +pub fn from_disk(circuit_config: &CircuitConfig) -> Option { + let path = disk_path(circuit_config); + let bytes = fs::read(&path).ok()?; + info!("found prover state at {path}"); let (gate_serializer, witness_serializer) = get_serializers(); + info!("deserializing prover state..."); let state = AllRecursiveCircuits::from_bytes(&bytes, &gate_serializer, &witness_serializer); match state { - Ok(state) => Some(ProverState { state }), + Ok(state) => Some(state), Err(e) => { warn!("failed to deserialize prover state, {e:?}"); None @@ -37,8 +51,11 @@ pub(crate) fn from_disk() -> Option { } } -pub(crate) fn to_disk(state: &ProverState) { - let file = OpenOptions::new().write(true).create(true).open(PATH); +pub fn to_disk(circuits: &AllRecursiveCircuits, circuit_config: &CircuitConfig) { + let file = OpenOptions::new() + .write(true) + .create(true) + .open(disk_path(circuit_config)); let mut file = match file { Ok(file) => file, @@ -50,7 +67,7 @@ pub(crate) fn to_disk(state: &ProverState) { let (gate_serializer, witness_serializer) = get_serializers(); - let bytes = state.state.to_bytes(&gate_serializer, &witness_serializer); + let bytes = circuits.to_bytes(&gate_serializer, &witness_serializer); let bytes = match bytes { Ok(bytes) => bytes, diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 7fb3dce5a..96d6330ff 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -20,5 +20,6 @@ axum = "0.6.20" # Local dependencies ops = { path = "../ops" } -common = { path = "../common" } +prover = { path = "../prover" } rpc = { path = "../rpc" } +common = { path = "../common" } diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index e671600d1..ee250719d 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -1,15 +1,21 @@ use std::path::PathBuf; -use clap::{Args, Parser, Subcommand, ValueHint}; -use paladin::config::Runtime; +use clap::{Parser, Subcommand, ValueHint}; +use common::prover_state::cli::CliProverStateConfig; +/// zero-bin leader config #[derive(Parser)] pub(crate) struct Cli { #[command(subcommand)] pub(crate) command: Command, #[clap(flatten)] - pub(crate) runtime: RuntimeGroup, + pub(crate) paladin: paladin::config::Config, + + // Note this is only relevant for the leader when running in in-memory + // mode. + #[clap(flatten)] + pub(crate) prover_state_config: CliProverStateConfig, } #[derive(Subcommand)] @@ -42,17 +48,3 @@ pub(crate) enum Command { output_dir: PathBuf, }, } - -#[derive(Args)] -pub(crate) struct RuntimeGroup { - /// Specifies the number of worker threads to spawn (in memory runtime - /// only). - #[arg(long, short)] - pub(crate) num_workers: Option, - /// Specifies the paladin runtime mode. - #[arg(long, short, value_enum, default_value_t = Runtime::Amqp)] - pub(crate) runtime: Runtime, - /// Specifies the URI for the AMQP broker (AMQP runtime only). - #[arg(long, env = "AMQP_URI", value_hint = ValueHint::Url, required_if_eq("runtime", "amqp"))] - pub amqp_uri: Option, -} diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index 71815a1ab..3a21e97fd 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -2,10 +2,10 @@ use std::{net::SocketAddr, path::PathBuf, sync::Arc}; use anyhow::{bail, Result}; use axum::{http::StatusCode, routing::post, Json, Router}; -use common::ProverInput; use ethereum_types::U256; use paladin::runtime::Runtime; use plonky_block_proof_gen::{proof_types::GeneratedBlockProof, types::PlonkyProofIntern}; +use prover::ProverInput; use serde::{Deserialize, Serialize}; use serde_json::to_writer; use tracing::{debug, error, info}; diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index ad398173d..bae3bd2c8 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -3,10 +3,12 @@ use std::{fs::File, path::PathBuf}; use anyhow::Result; use clap::Parser; use cli::Command; +use common::prover_state::set_prover_state_from_config; use dotenvy::dotenv; use ops::Ops; use paladin::runtime::Runtime; use plonky_block_proof_gen::types::PlonkyProofIntern; +use tracing::warn; mod cli; mod http; @@ -32,13 +34,17 @@ async fn main() -> Result<()> { init::tracing(); let args = cli::Cli::parse(); - let runtime = Runtime::from_config::(&paladin::config::Config { - runtime: args.runtime.runtime, - num_workers: args.runtime.num_workers, - amqp_uri: args.runtime.amqp_uri, - ..Default::default() - }) - .await?; + if let paladin::config::Runtime::InMemory = args.paladin.runtime { + // If running in emulation mode, we'll need to initialize the prover + // state here. + if set_prover_state_from_config(args.prover_state_config.into()).is_err() { + warn!( + "prover state already set. check the program logic to ensure it is only set once" + ); + } + } + + let runtime = Runtime::from_config::(&args.paladin).await?; match args.command { Command::Stdio { previous_proof } => { diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index 28d10b4f0..242fb531f 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -1,9 +1,9 @@ use std::io::{Read, Write}; use anyhow::Result; -use common::ProverInput; use paladin::runtime::Runtime; use plonky_block_proof_gen::types::PlonkyProofIntern; +use prover::ProverInput; /// The main function for the stdio mode. pub(crate) async fn stdio_main( diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 10741a21d..abfd38e3e 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -5,12 +5,8 @@ edition = "2021" [dependencies] paladin-core = { workspace = true } -tokio = { workspace = true } -anyhow = { workspace = true } serde = { workspace = true } plonky_block_proof_gen = { workspace = true } proof_protocol_decoder = { workspace = true } -plonky2 = { workspace = true } -tracing = { workspace = true } -once_cell = "1.18.0" +common = { path = "../common" } diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 4e4f6dd7d..85be6e7ac 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,4 +1,4 @@ -use once_cell::sync::Lazy; +use common::prover_state::P_STATE; use paladin::{ operation::{FatalError, Monoid, Operation, Result}, opkind_derive::OpKind, @@ -6,43 +6,25 @@ use paladin::{ use plonky_block_proof_gen::{ proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, - prover_state::{ProverState, ProverStateBuilder}, + prover_state::ProverState, }; use proof_protocol_decoder::types::{OtherBlockData, TxnProofGenIR}; -use prover_state::from_disk; use serde::{Deserialize, Serialize}; -use tracing::debug; - -mod prover_state; - -static P_STATE: Lazy = Lazy::new(|| { - debug!("Attempting to load prover state from disk"); - - match from_disk() { - Some(state) => { - debug!("Successfully loaded prover state from disk!"); - state - } - None => { - debug!("Prover state not found on disk. Generating new state"); - let state = ProverStateBuilder::default().build(); - debug!("Saving prover state to disk"); - prover_state::to_disk(&state); - state - } - } -}); #[derive(Debug, Clone, Copy, Deserialize, Serialize)] pub struct TxProof; +fn p_state() -> &'static ProverState { + P_STATE.get().expect("Prover state is not initialized") +} + impl Operation for TxProof { type Input = TxnProofGenIR; type Output = AggregatableProof; type Kind = Ops; fn execute(&self, input: Self::Input) -> Result { - let result = generate_txn_proof(&P_STATE, input).map_err(FatalError::from)?; + let result = generate_txn_proof(p_state(), input).map_err(FatalError::from)?; Ok(result.into()) } @@ -59,7 +41,7 @@ impl Monoid for AggProof { fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { let result = - generate_agg_proof(&P_STATE, &a, &b, self.other.clone()).map_err(FatalError::from)?; + generate_agg_proof(p_state(), &a, &b, self.other.clone()).map_err(FatalError::from)?; Ok(result.into()) } @@ -83,7 +65,7 @@ impl Operation for BlockProof { fn execute(&self, input: Self::Input) -> Result { Ok( - generate_block_proof(&P_STATE, self.prev.as_ref(), &input, self.other.clone()) + generate_block_proof(p_state(), self.prev.as_ref(), &input, self.other.clone()) .map_err(FatalError::from)?, ) } diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml new file mode 100644 index 000000000..9e8910c0c --- /dev/null +++ b/zero_bin/prover/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "prover" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { workspace = true } +plonky_block_proof_gen = { workspace = true } +proof_protocol_decoder = { workspace = true } +tracing = { workspace = true } +paladin-core = { workspace = true } +ethereum-types = { workspace = true } +anyhow = { workspace = true } + +# Local dependencies +ops = { path = "../ops" } diff --git a/zero_bin/common/src/prover_input.rs b/zero_bin/prover/src/lib.rs similarity index 100% rename from zero_bin/common/src/prover_input.rs rename to zero_bin/prover/src/lib.rs diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index ee13516c2..4cb728f4e 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -15,12 +15,14 @@ serde_path_to_error = { workspace = true } clap = { workspace = true } ethereum-types = { workspace = true } plonky2_evm = { workspace = true } +thiserror = { workspace = true } + reqwest = { version = "0.11.22", default-features = false, features = [ "json", "rustls-tls", ] } -thiserror = "1.0.50" futures = "0.3.29" # Local dependencies common = { path = "../common" } +prover = { path = "../prover" } diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 38fa86383..314f84153 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,5 +1,4 @@ use anyhow::{Context, Result}; -use common::ProverInput; use ethereum_types::{Address, Bloom, H256, U256}; use futures::{stream::FuturesOrdered, TryStreamExt}; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; @@ -7,6 +6,7 @@ use proof_protocol_decoder::{ trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, types::{BlockLevelData, OtherBlockData}, }; +use prover::ProverInput; use reqwest::IntoUrl; use serde::Deserialize; use thiserror::Error; diff --git a/zero_bin/worker/Cargo.toml b/zero_bin/worker/Cargo.toml index 96e1a81dc..3b8ebd6ba 100644 --- a/zero_bin/worker/Cargo.toml +++ b/zero_bin/worker/Cargo.toml @@ -14,3 +14,4 @@ tokio = { workspace = true } # Local dependencies ops = { path = "../ops" } +common = { path = "../common" } diff --git a/zero_bin/worker/src/main.rs b/zero_bin/worker/src/main.rs index b69b468f2..22d8425f7 100644 --- a/zero_bin/worker/src/main.rs +++ b/zero_bin/worker/src/main.rs @@ -1,15 +1,19 @@ use anyhow::Result; use clap::Parser; +use common::prover_state::{cli::CliProverStateConfig, set_prover_state_from_config}; use dotenvy::dotenv; use ops::Ops; -use paladin::{config::Config, runtime::WorkerRuntime}; +use paladin::runtime::WorkerRuntime; +use tracing::warn; mod init; #[derive(Parser, Debug)] -pub struct Cli { - #[command(flatten)] - pub options: Config, +struct Cli { + #[clap(flatten)] + paladin: paladin::config::Config, + #[clap(flatten)] + prover_state_config: CliProverStateConfig, } #[tokio::main] @@ -18,7 +22,11 @@ async fn main() -> Result<()> { init::tracing(); let args = Cli::parse(); - let runtime: WorkerRuntime = WorkerRuntime::from_config(&args.options).await?; + if set_prover_state_from_config(args.prover_state_config.into()).is_err() { + warn!("prover state already set. check the program logic to ensure it is only set once"); + } + + let runtime: WorkerRuntime = WorkerRuntime::from_config(&args.paladin).await?; runtime.main_loop().await?; Ok(()) From a358f557d6fc830f30d3ea82d25835fbab819c4c Mon Sep 17 00:00:00 2001 From: BGluth Date: Mon, 13 Nov 2023 16:43:36 -0700 Subject: [PATCH 039/184] DNM! Prints and fixes --- zero_bin/Cargo.lock | 6 ++++-- zero_bin/Cargo.toml | 4 ++-- zero_bin/rpc/Cargo.toml | 1 + zero_bin/rpc/src/rpc.rs | 5 ++++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index ed693e9ec..4955e98fd 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2187,7 +2187,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=94ba5b3a1bfc74a6d3bd80da5fa7b9cd1d2690a6#94ba5b3a1bfc74a6d3bd80da5fa7b9cd1d2690a6" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#f7f772f1ee256a551b20e32ca69d215488381e27" dependencies = [ "ethereum-types", "log", @@ -2283,8 +2283,9 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=15ae1a1e5b8e60a056a36926746cb563507073c2#15ae1a1e5b8e60a056a36926746cb563507073c2" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#76d99da587f9613afefa97d27346f588f3d7f1e5" dependencies = [ + "bytes", "ciborium", "ciborium-io", "enum-as-inner 0.6.0", @@ -2538,6 +2539,7 @@ dependencies = [ "common", "ethereum-types", "futures", + "hex", "plonky2_evm", "proof_protocol_decoder", "prover", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 4c39c1c92..f89cd76a7 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,8 +11,8 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive", "env"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "94ba5b3a1bfc74a6d3bd80da5fa7b9cd1d2690a6" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "15ae1a1e5b8e60a056a36926746cb563507073c2" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", branch = "proof_fixes" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", branch = "proof_fixes" } plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } serde_path_to_error = "0.1.14" diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 4cb728f4e..664d4838e 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -26,3 +26,4 @@ futures = "0.3.29" # Local dependencies common = { path = "../common" } prover = { path = "../prover" } +hex = "0.4.3" diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 314f84153..d8945b559 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result}; +use ethereum_types::H160; use ethereum_types::{Address, Bloom, H256, U256}; use futures::{stream::FuturesOrdered, TryStreamExt}; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; @@ -241,7 +242,9 @@ impl From for OtherBlockData { } let block_metadata = BlockMetadata { - block_beneficiary: block_by_number.result.miner, + block_beneficiary: H160::from_slice( + &hex::decode("67b1d87101671b127f5f8714789c7192f7ad340e").unwrap(), + ), block_timestamp: block_by_number.result.timestamp, block_number: block_by_number.result.number, block_difficulty: block_by_number.result.difficulty, From e7a97e5e11e0d32489bdf6a1f85332811750f370 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 15 Nov 2023 10:42:02 -0700 Subject: [PATCH 040/184] Bumped deps --- zero_bin/Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 4955e98fd..a08619220 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2101,7 +2101,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" dependencies = [ "ahash", "anyhow", @@ -2125,7 +2125,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" dependencies = [ "anyhow", "bytes", @@ -2159,7 +2159,7 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" dependencies = [ "anyhow", "itertools", @@ -2174,7 +2174,7 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" dependencies = [ "rayon", ] @@ -2182,12 +2182,12 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#f7f772f1ee256a551b20e32ca69d215488381e27" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#65d70a214119ed6040c86ff244f3407db547328b" dependencies = [ "ethereum-types", "log", @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#76d99da587f9613afefa97d27346f588f3d7f1e5" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#46353b3b470f1ac21363d870c0f6bb239d191e39" dependencies = [ "bytes", "ciborium", From b93b5149153ae9445fecfbad11c0464345b88d57 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 15 Nov 2023 11:33:12 -0700 Subject: [PATCH 041/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index a08619220..c54e5434d 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#46353b3b470f1ac21363d870c0f6bb239d191e39" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#96c27e8030a74ca20bf964ad685b1a0adcc069a8" dependencies = [ "bytes", "ciborium", From 5c35b45f0bac0c0e4b8ba30bf31b5ec9c89e8103 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 15 Nov 2023 12:12:26 -0700 Subject: [PATCH 042/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index c54e5434d..3c216b3fe 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#96c27e8030a74ca20bf964ad685b1a0adcc069a8" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#6ca88359ff11a8333a4e13102daabccca27f9023" dependencies = [ "bytes", "ciborium", From 61c81b75c3f55ed037d7586b1bf6b8e3d353aa9a Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 15 Nov 2023 13:22:55 -0700 Subject: [PATCH 043/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 3c216b3fe..c2e5a334e 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#6ca88359ff11a8333a4e13102daabccca27f9023" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#25b69bf93df51824887bd182094a53da224f7959" dependencies = [ "bytes", "ciborium", From a4d143ec90f6c0c7b55219aac6f54687248a7124 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 15 Nov 2023 14:02:23 -0700 Subject: [PATCH 044/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index c2e5a334e..2557bd407 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#25b69bf93df51824887bd182094a53da224f7959" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#b9b36e3153b09b0688f6242173dff427bb176c7c" dependencies = [ "bytes", "ciborium", From 8be06376931f131fe2542b86dcbac74090249849 Mon Sep 17 00:00:00 2001 From: BGluth Date: Fri, 17 Nov 2023 09:27:57 -0700 Subject: [PATCH 045/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 2557bd407..16c463ac6 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#b9b36e3153b09b0688f6242173dff427bb176c7c" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#c7b9e8914e4bc2dbfefc2110a2b0be6fd38587c8" dependencies = [ "bytes", "ciborium", From f0feb1fa63627e5ad4e785158b678b7fd1a37159 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 17 Nov 2023 12:00:36 -0500 Subject: [PATCH 046/184] Update Cargo.lock --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 16c463ac6..d68fee29e 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2187,7 +2187,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#65d70a214119ed6040c86ff244f3407db547328b" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#d0ed57bbfb7d6123d209af91cb510f000118a31e" dependencies = [ "ethereum-types", "log", From 7a28608a0d3f7cae60259084d99ca38b72290680 Mon Sep 17 00:00:00 2001 From: BGluth Date: Fri, 17 Nov 2023 15:53:48 -0700 Subject: [PATCH 047/184] Lock bump --- zero_bin/Cargo.lock | 7 ------- 1 file changed, 7 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index d68fee29e..603d5db93 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2101,7 +2101,6 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" dependencies = [ "ahash", "anyhow", @@ -2125,7 +2124,6 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" dependencies = [ "anyhow", "bytes", @@ -2159,7 +2157,6 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" dependencies = [ "anyhow", "itertools", @@ -2174,7 +2171,6 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" dependencies = [ "rayon", ] @@ -2182,12 +2178,10 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=0e63e66196fba06aa496a5249a0c9d997a549829#0e63e66196fba06aa496a5249a0c9d997a549829" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#d0ed57bbfb7d6123d209af91cb510f000118a31e" dependencies = [ "ethereum-types", "log", @@ -2283,7 +2277,6 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#c7b9e8914e4bc2dbfefc2110a2b0be6fd38587c8" dependencies = [ "bytes", "ciborium", From 2d0fe9d4c2ff0771b61b450c0fe648c90e93e316 Mon Sep 17 00:00:00 2001 From: BGluth Date: Mon, 20 Nov 2023 13:05:26 -0700 Subject: [PATCH 048/184] Two fixes - Fixed receipt tries being created incorrectly. - Added a temp hack to prevent the genesis block hash from being queried (better hack likely incoming) due to a bug in Erigon. --- zero_bin/rpc/src/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index d8945b559..19d5884e5 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -145,7 +145,7 @@ impl EthGetBlockByNumberResponse { ) -> Result> { // Every block response includes the _parent_ hash along with its hash, so we // can just fetch half the blocks to acquire all hashes for the range. - let start = block_number.saturating_sub(256); + let start = block_number.saturating_sub(256).max(1); let futs: FuturesOrdered<_> = (start..block_number) .rev() .step_by(2) From 3e13635daf1caf6250795e98956101b024b8c8e6 Mon Sep 17 00:00:00 2001 From: BGluth Date: Mon, 20 Nov 2023 14:31:19 -0700 Subject: [PATCH 049/184] Fixed a few bugs --- zero_bin/Cargo.lock | 119 +++++++++++++++++++++++++++++++++++----- zero_bin/rpc/src/rpc.rs | 5 +- 2 files changed, 107 insertions(+), 17 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 603d5db93..19b81882d 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -598,8 +598,8 @@ name = "common" version = "0.1.0" dependencies = [ "clap", - "plonky2", - "plonky2_evm", + "plonky2 0.1.4 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", "plonky_block_proof_gen", "thiserror", "tracing", @@ -2101,6 +2101,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" dependencies = [ "ahash", "anyhow", @@ -2110,9 +2111,9 @@ dependencies = [ "keccak-hash 0.8.0", "log", "num", - "plonky2_field", - "plonky2_maybe_rayon", - "plonky2_util", + "plonky2_field 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "plonky2_maybe_rayon 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", "rand", "rand_chacha", "serde", @@ -2121,9 +2122,68 @@ dependencies = [ "unroll", ] +[[package]] +name = "plonky2" +version = "0.1.4" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" +dependencies = [ + "ahash", + "anyhow", + "getrandom", + "hashbrown 0.14.2", + "itertools", + "keccak-hash 0.8.0", + "log", + "num", + "plonky2_field 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2_maybe_rayon 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "rand", + "rand_chacha", + "serde", + "serde_json", + "static_assertions", + "unroll", +] + +[[package]] +name = "plonky2_evm" +version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +dependencies = [ + "anyhow", + "bytes", + "env_logger", + "eth_trie_utils", + "ethereum-types", + "hashbrown 0.14.2", + "hex-literal", + "itertools", + "jemallocator", + "keccak-hash 0.10.0", + "log", + "num", + "num-bigint", + "once_cell", + "pest", + "pest_derive", + "plonky2 0.1.4 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "plonky2_maybe_rayon 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "rand", + "rand_chacha", + "rlp", + "rlp-derive", + "serde", + "serde_json", + "static_assertions", + "tiny-keccak", +] + [[package]] name = "plonky2_evm" version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" dependencies = [ "anyhow", "bytes", @@ -2141,9 +2201,9 @@ dependencies = [ "once_cell", "pest", "pest_derive", - "plonky2", - "plonky2_maybe_rayon", - "plonky2_util", + "plonky2 0.1.4 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2_maybe_rayon 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", "rand", "rand_chacha", "rlp", @@ -2157,20 +2217,45 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" dependencies = [ "anyhow", "itertools", "num", - "plonky2_util", + "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", "rand", "serde", "static_assertions", "unroll", ] +[[package]] +name = "plonky2_field" +version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" +dependencies = [ + "anyhow", + "itertools", + "num", + "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "rand", + "serde", + "static_assertions", + "unroll", +] + +[[package]] +name = "plonky2_maybe_rayon" +version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +dependencies = [ + "rayon", +] + [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" dependencies = [ "rayon", ] @@ -2178,16 +2263,23 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" + +[[package]] +name = "plonky2_util" +version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#e6cf7607053bc6c39ebb282baae5ea51ef2f4dbf" dependencies = [ "ethereum-types", "log", "paste", - "plonky2", - "plonky2_evm", + "plonky2 0.1.4 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", "proof_protocol_decoder", "serde", ] @@ -2277,6 +2369,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#2a6a657d2df8ef808773fa37ce9afba55397fb2b" dependencies = [ "bytes", "ciborium", @@ -2288,7 +2381,7 @@ dependencies = [ "hex", "keccak-hash 0.10.0", "log", - "plonky2_evm", + "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", "rlp", "rlp-derive", "serde", @@ -2533,7 +2626,7 @@ dependencies = [ "ethereum-types", "futures", "hex", - "plonky2_evm", + "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", "proof_protocol_decoder", "prover", "reqwest", diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 19d5884e5..d5ade7466 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,5 +1,4 @@ use anyhow::{Context, Result}; -use ethereum_types::H160; use ethereum_types::{Address, Bloom, H256, U256}; use futures::{stream::FuturesOrdered, TryStreamExt}; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; @@ -242,9 +241,7 @@ impl From for OtherBlockData { } let block_metadata = BlockMetadata { - block_beneficiary: H160::from_slice( - &hex::decode("67b1d87101671b127f5f8714789c7192f7ad340e").unwrap(), - ), + block_beneficiary: block_by_number.result.miner, block_timestamp: block_by_number.result.timestamp, block_number: block_by_number.result.number, block_difficulty: block_by_number.result.difficulty, From 3b1ce97aaa61894658bc85c92535fb4a2c35a731 Mon Sep 17 00:00:00 2001 From: BGluth Date: Mon, 20 Nov 2023 15:56:34 -0700 Subject: [PATCH 050/184] Revision fixes --- zero_bin/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index f89cd76a7..ad51a25ea 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -13,8 +13,8 @@ tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", branch = "proof_fixes" } proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", branch = "proof_fixes" } -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } -plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "49976ea2a98dcb6052bd6cf3a65f730e55727330" } +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "b9328815e666981d6485b0d8dc04160e93797993" } +plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "b9328815e666981d6485b0d8dc04160e93797993" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" From b33b3f77bb84bd3b61b24617e3584c9bcc1e2d05 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 23 Nov 2023 19:14:46 -0500 Subject: [PATCH 051/184] Bump lock --- zero_bin/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 19b81882d..9c8789ccd 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2273,7 +2273,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#e6cf7607053bc6c39ebb282baae5ea51ef2f4dbf" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#2c854789b9803f756763b77a4b6c23e6fe1f2f4a" dependencies = [ "ethereum-types", "log", @@ -2369,7 +2369,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#2a6a657d2df8ef808773fa37ce9afba55397fb2b" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#5644b74d4eb6d81a4026bdd1b35d36c11946c218" dependencies = [ "bytes", "ciborium", From 32eb6220b9e2844a2545b7728422e03a99f49d1a Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 24 Nov 2023 07:18:08 -0500 Subject: [PATCH 052/184] Fix genesis root --- zero_bin/rpc/Cargo.toml | 1 + zero_bin/rpc/src/rpc.rs | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 664d4838e..8ecaf1f49 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -8,6 +8,7 @@ tokio = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } anyhow = { workspace = true } +hex-literal = "0.4.1" serde = { workspace = true } proof_protocol_decoder = { workspace = true } serde_json = { workspace = true } diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index d5ade7466..5bea91967 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,6 +1,7 @@ use anyhow::{Context, Result}; use ethereum_types::{Address, Bloom, H256, U256}; use futures::{stream::FuturesOrdered, TryStreamExt}; +use hex_literal::hex; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; use proof_protocol_decoder::{ trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, @@ -261,7 +262,10 @@ impl From for OtherBlockData { cur_hash: block_by_number.result.hash, }, }, - genesis_state_trie_root: Default::default(), + // TODO: This is the empty state. Maybe fetch this from Jerigon side? + genesis_state_trie_root: H256(hex!( + "c12c57a1ecc38176fa8016fed174a23264e71d2166ea7e18cb954f0f3231e36a" + )), } } } From 984f2f03d6ba1351a4f3b23ea79d8860a9d8c0c4 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 24 Nov 2023 21:08:12 -0500 Subject: [PATCH 053/184] Fix block_hashes --- zero_bin/rpc/src/rpc.rs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 5bea91967..e45542d7b 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -143,22 +143,33 @@ impl EthGetBlockByNumberResponse { rpc_url: U, block_number: u64, ) -> Result> { + let mut hashes = vec![]; + // Every block response includes the _parent_ hash along with its hash, so we // can just fetch half the blocks to acquire all hashes for the range. let start = block_number.saturating_sub(256).max(1); - let futs: FuturesOrdered<_> = (start..block_number) - .rev() + let futs: FuturesOrdered<_> = (start..=block_number) .step_by(2) .map(|block_number| Self::fetch(rpc_url, block_number)) .collect(); let responses = futs.try_collect::>().await?; - let mut hashes = vec![]; - for response in responses { - hashes.push(response.result.hash); - hashes.push(response.result.parent_hash); + for response in responses.iter() { + if response.result.number == 1.into() { + // Ignore genesis + hashes.push(response.result.hash); + } else if response.result.number == block_number.into() { + // Ignore current hash + hashes.push(response.result.parent_hash); + } else { + hashes.push(response.result.parent_hash); + hashes.push(response.result.hash); + } } + + hashes.reverse(); hashes.resize(256, H256::default()); + hashes.reverse(); Ok(hashes) } From f228e48db0031f7f00a5344da23886ff41134088 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Sat, 25 Nov 2023 08:16:47 -0500 Subject: [PATCH 054/184] Remove comment --- zero_bin/rpc/src/rpc.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index e45542d7b..4436e5e88 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -273,7 +273,6 @@ impl From for OtherBlockData { cur_hash: block_by_number.result.hash, }, }, - // TODO: This is the empty state. Maybe fetch this from Jerigon side? genesis_state_trie_root: H256(hex!( "c12c57a1ecc38176fa8016fed174a23264e71d2166ea7e18cb954f0f3231e36a" )), From e12ae99d10ad3df9638dcc47584515bec410dc9e Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Mon, 27 Nov 2023 09:21:54 -0500 Subject: [PATCH 055/184] Fix fetching of previous block_hashes --- zero_bin/rpc/src/rpc.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 4436e5e88..63b5b82a1 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -143,6 +143,11 @@ impl EthGetBlockByNumberResponse { rpc_url: U, block_number: u64, ) -> Result> { + if block_number == 1 { + // As we ignore genesis block hash, we return an empty vector on block 1. + return Ok(vec![H256::default(); 256]); + } + let mut hashes = vec![]; // Every block response includes the _parent_ hash along with its hash, so we From e2adb6d1f75db2b1bc86cb035a5d35304d203aa7 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Mon, 27 Nov 2023 11:42:02 -0500 Subject: [PATCH 056/184] Fix --- zero_bin/rpc/src/rpc.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 63b5b82a1..261410fa5 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -143,11 +143,6 @@ impl EthGetBlockByNumberResponse { rpc_url: U, block_number: u64, ) -> Result> { - if block_number == 1 { - // As we ignore genesis block hash, we return an empty vector on block 1. - return Ok(vec![H256::default(); 256]); - } - let mut hashes = vec![]; // Every block response includes the _parent_ hash along with its hash, so we @@ -160,10 +155,7 @@ impl EthGetBlockByNumberResponse { let responses = futs.try_collect::>().await?; for response in responses.iter() { - if response.result.number == 1.into() { - // Ignore genesis - hashes.push(response.result.hash); - } else if response.result.number == block_number.into() { + if response.result.number == block_number.into() { // Ignore current hash hashes.push(response.result.parent_hash); } else { From b05a7a0edf2f522caabe75b33af24ca54a0cb82d Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Mon, 27 Nov 2023 11:44:54 -0500 Subject: [PATCH 057/184] Bump lock --- zero_bin/Cargo.lock | 10 +++------- zero_bin/Cargo.toml | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 9c8789ccd..8bb4c151e 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2125,7 +2125,6 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" dependencies = [ "ahash", "anyhow", @@ -2183,7 +2182,6 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" dependencies = [ "anyhow", "bytes", @@ -2232,7 +2230,6 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" dependencies = [ "anyhow", "itertools", @@ -2255,7 +2252,6 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" dependencies = [ "rayon", ] @@ -2268,12 +2264,11 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb605 [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993#b9328815e666981d6485b0d8dc04160e93797993" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#2c854789b9803f756763b77a4b6c23e6fe1f2f4a" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#e0e6be17deb9e3948b3524a35048a411aab4d5a7" dependencies = [ "ethereum-types", "log", @@ -2369,7 +2364,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#5644b74d4eb6d81a4026bdd1b35d36c11946c218" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#ce1c10978564e80e3afbd666ba086e7c20c5b996" dependencies = [ "bytes", "ciborium", @@ -2379,6 +2374,7 @@ dependencies = [ "eth_trie_utils", "ethereum-types", "hex", + "hex-literal", "keccak-hash 0.10.0", "log", "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index ad51a25ea..626d1929b 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -13,8 +13,8 @@ tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", branch = "proof_fixes" } proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", branch = "proof_fixes" } -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "b9328815e666981d6485b0d8dc04160e93797993" } -plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "b9328815e666981d6485b0d8dc04160e93797993" } +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "2039e18f29c83510e96fd985359c549344d6d601" } +plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "2039e18f29c83510e96fd985359c549344d6d601" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" From 5795e9164e837836a00b0728052d9d484345ba22 Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 28 Nov 2023 12:27:09 -0700 Subject: [PATCH 058/184] Now queries the genesis state root --- zero_bin/Cargo.lock | 118 +++++++--------------------------------- zero_bin/rpc/src/rpc.rs | 19 +++++-- 2 files changed, 32 insertions(+), 105 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 8bb4c151e..6616537d0 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -598,8 +598,8 @@ name = "common" version = "0.1.0" dependencies = [ "clap", - "plonky2 0.1.4 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", - "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "plonky2", + "plonky2_evm", "plonky_block_proof_gen", "thiserror", "tracing", @@ -2101,7 +2101,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" dependencies = [ "ahash", "anyhow", @@ -2111,32 +2111,9 @@ dependencies = [ "keccak-hash 0.8.0", "log", "num", - "plonky2_field 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", - "plonky2_maybe_rayon 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", - "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", - "rand", - "rand_chacha", - "serde", - "serde_json", - "static_assertions", - "unroll", -] - -[[package]] -name = "plonky2" -version = "0.1.4" -dependencies = [ - "ahash", - "anyhow", - "getrandom", - "hashbrown 0.14.2", - "itertools", - "keccak-hash 0.8.0", - "log", - "num", - "plonky2_field 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", - "plonky2_maybe_rayon 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", - "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2_field", + "plonky2_maybe_rayon", + "plonky2_util", "rand", "rand_chacha", "serde", @@ -2148,7 +2125,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" dependencies = [ "anyhow", "bytes", @@ -2166,42 +2143,9 @@ dependencies = [ "once_cell", "pest", "pest_derive", - "plonky2 0.1.4 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", - "plonky2_maybe_rayon 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", - "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", - "rand", - "rand_chacha", - "rlp", - "rlp-derive", - "serde", - "serde_json", - "static_assertions", - "tiny-keccak", -] - -[[package]] -name = "plonky2_evm" -version = "0.1.1" -dependencies = [ - "anyhow", - "bytes", - "env_logger", - "eth_trie_utils", - "ethereum-types", - "hashbrown 0.14.2", - "hex-literal", - "itertools", - "jemallocator", - "keccak-hash 0.10.0", - "log", - "num", - "num-bigint", - "once_cell", - "pest", - "pest_derive", - "plonky2 0.1.4 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", - "plonky2_maybe_rayon 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", - "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2", + "plonky2_maybe_rayon", + "plonky2_util", "rand", "rand_chacha", "rlp", @@ -2215,43 +2159,22 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" dependencies = [ "anyhow", "itertools", "num", - "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "plonky2_util", "rand", "serde", "static_assertions", "unroll", ] -[[package]] -name = "plonky2_field" -version = "0.1.1" -dependencies = [ - "anyhow", - "itertools", - "num", - "plonky2_util 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", - "rand", - "serde", - "static_assertions", - "unroll", -] - -[[package]] -name = "plonky2_maybe_rayon" -version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" -dependencies = [ - "rayon", -] - [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" dependencies = [ "rayon", ] @@ -2259,11 +2182,7 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330#49976ea2a98dcb6052bd6cf3a65f730e55727330" - -[[package]] -name = "plonky2_util" -version = "0.1.1" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" [[package]] name = "plonky_block_proof_gen" @@ -2273,8 +2192,8 @@ dependencies = [ "ethereum-types", "log", "paste", - "plonky2 0.1.4 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", - "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2", + "plonky2_evm", "proof_protocol_decoder", "serde", ] @@ -2377,7 +2296,7 @@ dependencies = [ "hex-literal", "keccak-hash 0.10.0", "log", - "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=b9328815e666981d6485b0d8dc04160e93797993)", + "plonky2_evm", "rlp", "rlp-derive", "serde", @@ -2622,7 +2541,8 @@ dependencies = [ "ethereum-types", "futures", "hex", - "plonky2_evm 0.1.1 (git+https://github.com/0xPolygonZero/plonky2.git?rev=49976ea2a98dcb6052bd6cf3a65f730e55727330)", + "hex-literal", + "plonky2_evm", "proof_protocol_decoder", "prover", "reqwest", diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 261410fa5..156563afe 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,7 +1,6 @@ use anyhow::{Context, Result}; use ethereum_types::{Address, Bloom, H256, U256}; use futures::{stream::FuturesOrdered, TryStreamExt}; -use hex_literal::hex; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; use proof_protocol_decoder::{ trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, @@ -103,6 +102,7 @@ struct EthGetBlockByNumberResult { mix_hash: H256, number: U256, parent_hash: H256, + state_root: H256, timestamp: U256, } @@ -170,6 +170,11 @@ impl EthGetBlockByNumberResponse { Ok(hashes) } + + async fn fetch_genesis_state_trie_root(rpc_url: U) -> Result { + let res = Self::fetch(rpc_url, 0).await?; + Ok(res.result.state_root) + } } /// The response from the `eth_chainId` RPC method. @@ -211,20 +216,23 @@ struct RpcBlockMetadata { block_by_number: EthGetBlockByNumberResponse, chain_id: EthChainIdResponse, prev_hashes: Vec, + genesis_state_trie_root: H256, } impl RpcBlockMetadata { async fn fetch(rpc_url: &str, block_number: u64) -> Result { - let (block_result, chain_id_result, prev_hashes) = try_join!( + let (block_result, chain_id_result, prev_hashes, genesis_state_trie_root) = try_join!( EthGetBlockByNumberResponse::fetch(rpc_url, block_number), EthChainIdResponse::fetch(rpc_url), - EthGetBlockByNumberResponse::fetch_previous_block_hashes(rpc_url, block_number) + EthGetBlockByNumberResponse::fetch_previous_block_hashes(rpc_url, block_number), + EthGetBlockByNumberResponse::fetch_genesis_state_trie_root(rpc_url) )?; Ok(Self { block_by_number: block_result, chain_id: chain_id_result, prev_hashes, + genesis_state_trie_root, }) } } @@ -235,6 +243,7 @@ impl From for OtherBlockData { block_by_number, chain_id, prev_hashes, + genesis_state_trie_root, }: RpcBlockMetadata, ) -> Self { let mut bloom = [U256::zero(); 8]; @@ -270,9 +279,7 @@ impl From for OtherBlockData { cur_hash: block_by_number.result.hash, }, }, - genesis_state_trie_root: H256(hex!( - "c12c57a1ecc38176fa8016fed174a23264e71d2166ea7e18cb954f0f3231e36a" - )), + genesis_state_trie_root, } } } From d92c46f99966be165442591c988bc406b17da804 Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 28 Nov 2023 14:09:50 -0700 Subject: [PATCH 059/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 6616537d0..a65ad55a2 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#ce1c10978564e80e3afbd666ba086e7c20c5b996" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#f23af20a674caf83a0136c1779619fe5dca63cc4" dependencies = [ "bytes", "ciborium", From 77a06efa36276aec69b4133e11b35a19d0adaa11 Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 28 Nov 2023 14:11:28 -0700 Subject: [PATCH 060/184] Added prog arg to specific specific path for proof output --- zero_bin/leader/src/cli.rs | 4 ++++ zero_bin/leader/src/jerigon.rs | 28 ++++++++++++++++++++++++---- zero_bin/leader/src/main.rs | 10 +++++++++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index ee250719d..e780e45fc 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -37,6 +37,10 @@ pub(crate) enum Command { /// The previous proof output. #[arg(long, short = 'f', value_hint = ValueHint::FilePath)] previous_proof: Option, + /// If provided, write the generated proof to this file instead of + /// stdout. + #[arg(long, short = 'p', value_hint = ValueHint::FilePath)] + proof_output_path: Option, }, /// Reads input from HTTP and writes output to a directory. Http { diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 368c7314a..35b77cb48 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -1,6 +1,10 @@ -use std::io::Write; +use std::{ + fs::{create_dir_all, File}, + io::Write, + path::PathBuf, +}; -use anyhow::Result; +use anyhow::{Context, Result}; use paladin::runtime::Runtime; use plonky_block_proof_gen::types::PlonkyProofIntern; @@ -10,13 +14,29 @@ pub(crate) async fn jerigon_main( rpc_url: &str, block_number: u64, previous: Option, + proof_output_path: Option, ) -> Result<()> { let prover_input = rpc::fetch_prover_input(rpc_url, block_number).await?; let proof = prover_input.prove(&runtime, previous).await; runtime.close().await?; - let proof = proof?; - std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; + + let proof = serde_json::to_vec(&proof?.intern)?; + + match proof_output_path { + Some(p) => { + if let Some(parent) = p.parent() { + create_dir_all(parent)?; + } + + let file_name = p + .file_name() + .with_context(|| format!("Unable to get a filename from {:?}", p))?; + let mut f = File::create(file_name)?; + f.write_all(&proof)?; + } + None => std::io::stdout().write_all(&proof)?, + } Ok(()) } diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index bae3bd2c8..1e5727bae 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -64,10 +64,18 @@ async fn main() -> Result<()> { rpc_url, block_number, previous_proof, + proof_output_path, } => { let previous_proof = get_previous_proof(previous_proof)?; - jerigon::jerigon_main(runtime, &rpc_url, block_number, previous_proof).await?; + jerigon::jerigon_main( + runtime, + &rpc_url, + block_number, + previous_proof, + proof_output_path, + ) + .await?; } } From de99262ea3f2f34374af86141cff5dbd6d3a5404 Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 28 Nov 2023 14:57:34 -0700 Subject: [PATCH 061/184] Fixed generated proofs using wrong path --- zero_bin/leader/src/jerigon.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 35b77cb48..555d8d487 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -4,7 +4,7 @@ use std::{ path::PathBuf, }; -use anyhow::{Context, Result}; +use anyhow::Result; use paladin::runtime::Runtime; use plonky_block_proof_gen::types::PlonkyProofIntern; @@ -14,7 +14,7 @@ pub(crate) async fn jerigon_main( rpc_url: &str, block_number: u64, previous: Option, - proof_output_path: Option, + proof_output_path_opt: Option, ) -> Result<()> { let prover_input = rpc::fetch_prover_input(rpc_url, block_number).await?; @@ -22,17 +22,17 @@ pub(crate) async fn jerigon_main( runtime.close().await?; let proof = serde_json::to_vec(&proof?.intern)?; + write_proof(proof, proof_output_path_opt) +} - match proof_output_path { +fn write_proof(proof: Vec, proof_output_path_opt: Option) -> Result<()> { + match proof_output_path_opt { Some(p) => { if let Some(parent) = p.parent() { create_dir_all(parent)?; } - let file_name = p - .file_name() - .with_context(|| format!("Unable to get a filename from {:?}", p))?; - let mut f = File::create(file_name)?; + let mut f = File::create(p)?; f.write_all(&proof)?; } None => std::io::stdout().write_all(&proof)?, From 5214c5285e4ae2e76acbdf97c8e12cf7a31ffe4a Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 28 Nov 2023 15:33:32 -0700 Subject: [PATCH 062/184] Added a simple script to generate a range of proofs --- zero_bin/.gitignore | 4 ++- zero_bin/tools/prove_blocks.sh | 54 ++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100755 zero_bin/tools/prove_blocks.sh diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index 8800d570e..abf249608 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -1,2 +1,4 @@ /target -/prover_state* \ No newline at end of file +/prover_state +*.zkproof +prover_state_* diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh new file mode 100755 index 000000000..c5a5f4591 --- /dev/null +++ b/zero_bin/tools/prove_blocks.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# Args: +# 1 --> Start block idx +# 2 --> End block index (inclusive) +# 3 --> Rpc endpoint:port (eg. http://35.246.1.96:8545) + +export RUST_BACKTRACE=1 +export RUST_LOG=plonky2=trace,plonky2_evm=trace + +ARTITHMETIC_CIRCUIT_SIZE="16..20" +BYTE_PACKING_CIRCUIT_SIZE="10..20" +CPU_CIRCUIT_SIZE="15..20" +KECCAK_CIRCUIT_SIZE="14..20" +KECCAK_SPONGE_CIRCUIT_SIZE="9..20" +LOGIC_CIRCUIT_SIZE="12..20" +MEMORY_CIRCUIT_SIZE="18..20" + +PROOF_OUTPUT_DIR="proofs" +ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. + +TOT_BLOCKS=$(($2-$1+1)) + +echo "Proving blocks ${1}..=${2}... (Total: ${TOT_BLOCKS})" +mkdir -p proofs/ + +for ((i=$1; i<=$2; i++)) +do + echo "Proving block ${i}..." + + OUT_PROOF_PATH="${PROOF_OUTPUT_DIR}/b${i}.zkproof" + OUT_LOG_PATH="${PROOF_OUTPUT_DIR}/b${i}.log" + + if [ $i -gt 1 ]; then + prev_proof_num=$((i-1)) + PREV_PROOF_EXTRA_ARG="-f ${PROOF_OUTPUT_DIR}/b${prev_proof_num}.zkproof" + fi + + cargo r --release --bin leader -- --runtime in-memory --arithmetic $ARTITHMETIC_CIRCUIT_SIZE --byte-packing $BYTE_PACKING_CIRCUIT_SIZE --cpu $CPU_CIRCUIT_SIZE --keccak $KECCAK_CIRCUIT_SIZE --keccak-sponge $KECCAK_SPONGE_CIRCUIT_SIZE --logic $LOGIC_CIRCUIT_SIZE --memory $MEMORY_CIRCUIT_SIZE jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 + + retVal=$? + if [ $retVal -ne 0 ]; then + # Some error occured. + echo "Block ${i} errored. See ${OUT_LOG_PATH} for more details." + exit $retVal + else + # Remove the log on success if we don't want to keep it. + if [ $ALWAYS_WRITE_LOGS ]; then + rm $OUT_LOG_PATH + fi + fi +done + +echo "Successfully generated ${TOT_BLOCKS} proofs!" From 61ba3f04b3c7c9e4aa3228af36aca9900cacd97d Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 28 Nov 2023 15:42:26 -0700 Subject: [PATCH 063/184] Lock bump --- zero_bin/Cargo.lock | 14 +++++++------- zero_bin/Cargo.toml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index a65ad55a2..14b274d0c 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2101,7 +2101,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" dependencies = [ "ahash", "anyhow", @@ -2125,7 +2125,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" dependencies = [ "anyhow", "bytes", @@ -2159,7 +2159,7 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" dependencies = [ "anyhow", "itertools", @@ -2174,7 +2174,7 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" dependencies = [ "rayon", ] @@ -2182,12 +2182,12 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2039e18f29c83510e96fd985359c549344d6d601#2039e18f29c83510e96fd985359c549344d6d601" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#e0e6be17deb9e3948b3524a35048a411aab4d5a7" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#07fc66c7615532de5dea0f2804b25181e0b1afcd" dependencies = [ "ethereum-types", "log", @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#f23af20a674caf83a0136c1779619fe5dca63cc4" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#855133a4a3dcef26c6eb9f08717fad016ab2f9a4" dependencies = [ "bytes", "ciborium", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 626d1929b..a66021b33 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -13,8 +13,8 @@ tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", branch = "proof_fixes" } proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", branch = "proof_fixes" } -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "2039e18f29c83510e96fd985359c549344d6d601" } -plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "2039e18f29c83510e96fd985359c549344d6d601" } +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" } +plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" From 9843c7be3b7eb403b67130993352b55122b68b8f Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Tue, 28 Nov 2023 18:46:03 -0500 Subject: [PATCH 064/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 14b274d0c..faad83371 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2187,7 +2187,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d8 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#07fc66c7615532de5dea0f2804b25181e0b1afcd" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#cb17bd32cc9600988e2baddd73b6aa59b9722939" dependencies = [ "ethereum-types", "log", From d96a363f9975fe1f1950320576141e5cd6165516 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 29 Nov 2023 10:15:29 -0500 Subject: [PATCH 065/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index faad83371..a9e197976 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#855133a4a3dcef26c6eb9f08717fad016ab2f9a4" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#396e9213d6d3c7724124cee5013b3ace4dfe07fe" dependencies = [ "bytes", "ciborium", From a3e2c688a39aa879177ed31d72b118a5e220fbdd Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 29 Nov 2023 10:08:15 -0700 Subject: [PATCH 066/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index a9e197976..c50b5b533 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#396e9213d6d3c7724124cee5013b3ace4dfe07fe" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#f856dba0e6e96e6be29fcf215ebcea8252be9a5c" dependencies = [ "bytes", "ciborium", From 8a2d872b6befd1fc6d13b7fcb63dd9ecf3053a7b Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 29 Nov 2023 14:07:33 -0700 Subject: [PATCH 067/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index c50b5b533..23087ed28 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#f856dba0e6e96e6be29fcf215ebcea8252be9a5c" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#f75c29a93c8302ffff08cb47a64fa600fdca4774" dependencies = [ "bytes", "ciborium", From 2636707a4e2a2ded72870f1c80aae632edb09026 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 29 Nov 2023 15:08:23 -0700 Subject: [PATCH 068/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 23087ed28..cd30bb784 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#f75c29a93c8302ffff08cb47a64fa600fdca4774" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#3242e9562633461c43cd2d234481c120d27163c4" dependencies = [ "bytes", "ciborium", From 19cd34ee2e4eac8747a552541c7b03b23e4bf350 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 29 Nov 2023 17:40:15 -0700 Subject: [PATCH 069/184] Lock bump --- zero_bin/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index cd30bb784..8889b527d 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#3242e9562633461c43cd2d234481c120d27163c4" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#b213eb2508dd2c7797af6298e975e32902a43775" dependencies = [ "bytes", "ciborium", From 6b19ab66751daacd73961f5213a3e9c63fd9dfdd Mon Sep 17 00:00:00 2001 From: BGluth Date: Thu, 30 Nov 2023 09:28:04 -0700 Subject: [PATCH 070/184] Release builds are now more optimized --- zero_bin/Cargo.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index a66021b33..0563e4261 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -19,3 +19,9 @@ serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" thiserror = "1.0.50" + +[profile.release] +opt-level = 3 +incremental = true +lto = "fat" +codegen-units = 1 From 128cf077c144284293ca822fe48bc6c3f060ef99 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 30 Nov 2023 13:18:43 -0500 Subject: [PATCH 071/184] Bump plonky2 --- zero_bin/Cargo.lock | 14 +++++++------- zero_bin/Cargo.toml | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 8889b527d..28e4a87a3 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2101,7 +2101,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" dependencies = [ "ahash", "anyhow", @@ -2125,7 +2125,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" dependencies = [ "anyhow", "bytes", @@ -2159,7 +2159,7 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" dependencies = [ "anyhow", "itertools", @@ -2174,7 +2174,7 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" dependencies = [ "rayon", ] @@ -2182,12 +2182,12 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=64cc1000e7dbe83d88ca9fa6811d41adfa7796c5#64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#cb17bd32cc9600988e2baddd73b6aa59b9722939" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#ded6167a527c4254d403378c7126836f66800ad1" dependencies = [ "ethereum-types", "log", @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#b213eb2508dd2c7797af6298e975e32902a43775" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#65326cfebc2dd4078eafdce2479d8f2484642b19" dependencies = [ "bytes", "ciborium", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 0563e4261..54d145a43 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -13,8 +13,8 @@ tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", branch = "proof_fixes" } proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", branch = "proof_fixes" } -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" } -plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "64cc1000e7dbe83d88ca9fa6811d41adfa7796c5" } +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "5572da30d7ab818594cf8659839fa832dfcf1d3d" } +plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "5572da30d7ab818594cf8659839fa832dfcf1d3d" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" From 0c8c0d818cc9912d94e8081e898b5db59a09ea18 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 30 Nov 2023 13:22:03 -0500 Subject: [PATCH 072/184] Update default ranges --- zero_bin/tools/prove_blocks.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index c5a5f4591..d0695bb90 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -10,11 +10,11 @@ export RUST_LOG=plonky2=trace,plonky2_evm=trace ARTITHMETIC_CIRCUIT_SIZE="16..20" BYTE_PACKING_CIRCUIT_SIZE="10..20" -CPU_CIRCUIT_SIZE="15..20" +CPU_CIRCUIT_SIZE="12..23" KECCAK_CIRCUIT_SIZE="14..20" -KECCAK_SPONGE_CIRCUIT_SIZE="9..20" -LOGIC_CIRCUIT_SIZE="12..20" -MEMORY_CIRCUIT_SIZE="18..20" +KECCAK_SPONGE_CIRCUIT_SIZE="9..15" +LOGIC_CIRCUIT_SIZE="12..16" +MEMORY_CIRCUIT_SIZE="17..25" PROOF_OUTPUT_DIR="proofs" ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. From 486ca5e39827d9e111125a042e2e29c6d4592d7e Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 30 Nov 2023 17:01:06 -0500 Subject: [PATCH 073/184] Update ranges --- zero_bin/.env | 14 +++++++------- zero_bin/common/src/prover_state/circuit.rs | 14 +++++++------- zero_bin/tools/prove_blocks.sh | 10 +++++----- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/zero_bin/.env b/zero_bin/.env index 0ee224f1b..1fc1ae611 100644 --- a/zero_bin/.env +++ b/zero_bin/.env @@ -1,8 +1,8 @@ AMQP_URI=amqp://localhost:5672 -ARITHMETIC_CIRCUIT_SIZE=16..22 -BYTE_PACKING_CIRCUIT_SIZE=10..22 -CPU_CIRCUIT_SIZE=15..22 -KECCAK_CIRCUIT_SIZE=14..22 -KECCAK_SPONGE_CIRCUIT_SIZE=9..22 -LOGIC_CIRCUIT_SIZE=12..22 -MEMORY_CIRCUIT_SIZE=18..22 +ARITHMETIC_CIRCUIT_SIZE=16..23 +BYTE_PACKING_CIRCUIT_SIZE=9..21 +CPU_CIRCUIT_SIZE=12..25 +KECCAK_CIRCUIT_SIZE=14..20 +KECCAK_SPONGE_CIRCUIT_SIZE=9..15 +LOGIC_CIRCUIT_SIZE=12..18 +MEMORY_CIRCUIT_SIZE=17..28 diff --git a/zero_bin/common/src/prover_state/circuit.rs b/zero_bin/common/src/prover_state/circuit.rs index b0d35c116..623846f92 100644 --- a/zero_bin/common/src/prover_state/circuit.rs +++ b/zero_bin/common/src/prover_state/circuit.rs @@ -76,13 +76,13 @@ impl Circuit { /// Get the default size for the circuit. pub const fn default_size(&self) -> Range { match self { - Circuit::Arithmetic => 16..22, - Circuit::BytePacking => 10..22, - Circuit::Cpu => 15..22, - Circuit::Keccak => 14..22, - Circuit::KeccakSponge => 9..22, - Circuit::Logic => 12..22, - Circuit::Memory => 18..22, + Circuit::Arithmetic => 16..23, + Circuit::BytePacking => 9..21, + Circuit::Cpu => 12..25, + Circuit::Keccak => 14..20, + Circuit::KeccakSponge => 9..15, + Circuit::Logic => 12..18, + Circuit::Memory => 17..28, } } diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index d0695bb90..3c6e0b974 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -8,13 +8,13 @@ export RUST_BACKTRACE=1 export RUST_LOG=plonky2=trace,plonky2_evm=trace -ARTITHMETIC_CIRCUIT_SIZE="16..20" -BYTE_PACKING_CIRCUIT_SIZE="10..20" -CPU_CIRCUIT_SIZE="12..23" +ARTITHMETIC_CIRCUIT_SIZE="16..23" +BYTE_PACKING_CIRCUIT_SIZE="9..21" +CPU_CIRCUIT_SIZE="12..25" KECCAK_CIRCUIT_SIZE="14..20" KECCAK_SPONGE_CIRCUIT_SIZE="9..15" -LOGIC_CIRCUIT_SIZE="12..16" -MEMORY_CIRCUIT_SIZE="17..25" +LOGIC_CIRCUIT_SIZE="12..18" +MEMORY_CIRCUIT_SIZE="17..28" PROOF_OUTPUT_DIR="proofs" ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. From c4886ca1da83131a8662403356133ddd29e6eae0 Mon Sep 17 00:00:00 2001 From: BGluth Date: Thu, 30 Nov 2023 15:09:54 -0700 Subject: [PATCH 074/184] Now uses revs for all of our deps --- zero_bin/Cargo.lock | 4 ++-- zero_bin/Cargo.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 28e4a87a3..fbddf9fcb 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2187,7 +2187,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab81859 [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?branch=proof_fixes#ded6167a527c4254d403378c7126836f66800ad1" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=62a6109da7982a2304baf6e74d324f241896153f#62a6109da7982a2304baf6e74d324f241896153f" dependencies = [ "ethereum-types", "log", @@ -2283,7 +2283,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?branch=proof_fixes#65326cfebc2dd4078eafdce2479d8f2484642b19" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=9aa3ac6e2887bf4517db66e3c5b98e7f806cd2f3#9aa3ac6e2887bf4517db66e3c5b98e7f806cd2f3" dependencies = [ "bytes", "ciborium", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 54d145a43..8a5e30326 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,8 +11,8 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive", "env"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", branch = "proof_fixes" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", branch = "proof_fixes" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "62a6109da7982a2304baf6e74d324f241896153f" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "9aa3ac6e2887bf4517db66e3c5b98e7f806cd2f3" } plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "5572da30d7ab818594cf8659839fa832dfcf1d3d" } plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "5572da30d7ab818594cf8659839fa832dfcf1d3d" } serde_path_to_error = "0.1.14" From 9e8f06c8fb23464c0afa83d61d9ac9b8f37bb74e Mon Sep 17 00:00:00 2001 From: BGluth Date: Thu, 30 Nov 2023 15:14:40 -0700 Subject: [PATCH 075/184] Cleaned up the `Cargo.toml` for `rpc` --- zero_bin/rpc/Cargo.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 8ecaf1f49..e682bd7f6 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -8,7 +8,6 @@ tokio = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } anyhow = { workspace = true } -hex-literal = "0.4.1" serde = { workspace = true } proof_protocol_decoder = { workspace = true } serde_json = { workspace = true } @@ -22,9 +21,11 @@ reqwest = { version = "0.11.22", default-features = false, features = [ "json", "rustls-tls", ] } -futures = "0.3.29" + # Local dependencies common = { path = "../common" } -prover = { path = "../prover" } +futures = "0.3.29" hex = "0.4.3" +hex-literal = "0.4.1" +prover = { path = "../prover" } From f7931a3cf1fd466a393d87e23226393081a7b44d Mon Sep 17 00:00:00 2001 From: BGluth Date: Thu, 30 Nov 2023 15:26:37 -0700 Subject: [PATCH 076/184] Requested changes for PR #5 --- zero_bin/leader/src/cli.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index e780e45fc..4d5c41d61 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -39,7 +39,7 @@ pub(crate) enum Command { previous_proof: Option, /// If provided, write the generated proof to this file instead of /// stdout. - #[arg(long, short = 'p', value_hint = ValueHint::FilePath)] + #[arg(long, short = 'o', value_hint = ValueHint::FilePath)] proof_output_path: Option, }, /// Reads input from HTTP and writes output to a directory. From 0eb6d4874c514f5ee92dbf07e219250fda311c47 Mon Sep 17 00:00:00 2001 From: BGluth Date: Thu, 30 Nov 2023 15:29:34 -0700 Subject: [PATCH 077/184] Requested changes for PR #5 (2) --- zero_bin/tools/prove_blocks.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index 3c6e0b974..fb2d69e1a 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -8,13 +8,13 @@ export RUST_BACKTRACE=1 export RUST_LOG=plonky2=trace,plonky2_evm=trace -ARTITHMETIC_CIRCUIT_SIZE="16..23" -BYTE_PACKING_CIRCUIT_SIZE="9..21" -CPU_CIRCUIT_SIZE="12..25" -KECCAK_CIRCUIT_SIZE="14..20" -KECCAK_SPONGE_CIRCUIT_SIZE="9..15" -LOGIC_CIRCUIT_SIZE="12..18" -MEMORY_CIRCUIT_SIZE="17..28" +export ARTITHMETIC_CIRCUIT_SIZE="16..23" +export BYTE_PACKING_CIRCUIT_SIZE="9..21" +export CPU_CIRCUIT_SIZE="12..25" +export KECCAK_CIRCUIT_SIZE="14..20" +export KECCAK_SPONGE_CIRCUIT_SIZE="9..15" +export LOGIC_CIRCUIT_SIZE="12..18" +export MEMORY_CIRCUIT_SIZE="17..28" PROOF_OUTPUT_DIR="proofs" ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. @@ -36,7 +36,7 @@ do PREV_PROOF_EXTRA_ARG="-f ${PROOF_OUTPUT_DIR}/b${prev_proof_num}.zkproof" fi - cargo r --release --bin leader -- --runtime in-memory --arithmetic $ARTITHMETIC_CIRCUIT_SIZE --byte-packing $BYTE_PACKING_CIRCUIT_SIZE --cpu $CPU_CIRCUIT_SIZE --keccak $KECCAK_CIRCUIT_SIZE --keccak-sponge $KECCAK_SPONGE_CIRCUIT_SIZE --logic $LOGIC_CIRCUIT_SIZE --memory $MEMORY_CIRCUIT_SIZE jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 + cargo r --release --bin leader -- --runtime in-memory jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 retVal=$? if [ $retVal -ne 0 ]; then From c437aa878bd4143a80473693cc2a2e2af0eab31a Mon Sep 17 00:00:00 2001 From: cpu Date: Thu, 30 Nov 2023 21:14:28 -0800 Subject: [PATCH 078/184] migrate to paladin 0.4.0 --- zero_bin/Cargo.lock | 37 +++++++++++++++++++++++++++++++------ zero_bin/Cargo.toml | 2 +- zero_bin/leader/src/main.rs | 4 ++-- zero_bin/ops/src/lib.rs | 25 ++++++++----------------- zero_bin/prover/src/lib.rs | 6 +++--- zero_bin/worker/src/main.rs | 4 ++-- 6 files changed, 47 insertions(+), 31 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index fbddf9fcb..26f667e7c 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -466,6 +466,9 @@ name = "bytes" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +dependencies = [ + "serde", +] [[package]] name = "cbc" @@ -1636,6 +1639,26 @@ version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +[[package]] +name = "linkme" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ed2ee9464ff9707af8e9ad834cffa4802f072caad90639c583dd3c62e6e608" +dependencies = [ + "linkme-impl", +] + +[[package]] +name = "linkme-impl" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125974b109d512fccbc6c0244e7580143e460895dfd6ea7f8bbb692fd94396" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -1892,9 +1915,9 @@ dependencies = [ [[package]] name = "paladin-core" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bc44b22dbbfef99900837ae9d335e0bb411f5a981511b8ab64e5615b0b4ae" +checksum = "222ff485444015ad605235a3ce14e91db67088b953c24a08fcf62724847ffbde" dependencies = [ "anyhow", "async-trait", @@ -1907,6 +1930,7 @@ dependencies = [ "dotenvy", "futures", "lapin", + "linkme", "paladin-opkind-derive", "pin-project", "postcard", @@ -1923,9 +1947,9 @@ dependencies = [ [[package]] name = "paladin-opkind-derive" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b48313f3ae58c76aecb1cd100d6a5a412dd9b559cc22807a9b5df831f1f7ee2a" +checksum = "51401ed2f91580e47caeb4f5b21fbbc8e59c1a3b1889246ec886e48dfbc9156d" dependencies = [ "quote", "syn 2.0.38", @@ -3356,12 +3380,13 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.5.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ "getrandom", "rand", + "serde", ] [[package]] diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 8a5e30326..89c604a93 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "common", "ops", "verifier", "rpc", "prover"] resolver = "2" [workspace.dependencies] -paladin-core = "0.3.3" +paladin-core = "0.4.0" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 1e5727bae..e6c001969 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -5,7 +5,7 @@ use clap::Parser; use cli::Command; use common::prover_state::set_prover_state_from_config; use dotenvy::dotenv; -use ops::Ops; +use ops::register; use paladin::runtime::Runtime; use plonky_block_proof_gen::types::PlonkyProofIntern; use tracing::warn; @@ -44,7 +44,7 @@ async fn main() -> Result<()> { } } - let runtime = Runtime::from_config::(&args.paladin).await?; + let runtime = Runtime::from_config(&args.paladin, register()).await?; match args.command { Command::Stdio { previous_proof } => { diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 85be6e7ac..bda106238 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,7 +1,7 @@ use common::prover_state::P_STATE; use paladin::{ operation::{FatalError, Monoid, Operation, Result}, - opkind_derive::OpKind, + registry, RemoteExecute, }; use plonky_block_proof_gen::{ proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, @@ -11,17 +11,18 @@ use plonky_block_proof_gen::{ use proof_protocol_decoder::types::{OtherBlockData, TxnProofGenIR}; use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Copy, Deserialize, Serialize)] -pub struct TxProof; - fn p_state() -> &'static ProverState { P_STATE.get().expect("Prover state is not initialized") } +registry!(); + +#[derive(Deserialize, Serialize, RemoteExecute)] +pub struct TxProof; + impl Operation for TxProof { type Input = TxnProofGenIR; type Output = AggregatableProof; - type Kind = Ops; fn execute(&self, input: Self::Input) -> Result { let result = generate_txn_proof(p_state(), input).map_err(FatalError::from)?; @@ -30,14 +31,13 @@ impl Operation for TxProof { } } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Deserialize, Serialize, RemoteExecute)] pub struct AggProof { pub other: OtherBlockData, } impl Monoid for AggProof { type Elem = AggregatableProof; - type Kind = Ops; fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { let result = @@ -52,7 +52,7 @@ impl Monoid for AggProof { } } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Deserialize, Serialize, RemoteExecute)] pub struct BlockProof { pub other: OtherBlockData, pub prev: Option, @@ -61,7 +61,6 @@ pub struct BlockProof { impl Operation for BlockProof { type Input = GeneratedAggProof; type Output = GeneratedBlockProof; - type Kind = Ops; fn execute(&self, input: Self::Input) -> Result { Ok( @@ -70,11 +69,3 @@ impl Operation for BlockProof { ) } } - -#[derive(OpKind, Debug, Clone, Deserialize, Serialize)] -#[allow(clippy::large_enum_variant)] -pub enum Ops { - TxProof(TxProof), - AggProof(AggProof), - BlockProof(BlockProof), -} diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 092d7832a..28a96d1af 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -46,8 +46,8 @@ impl ProverInput { )?; let agg_proof = IndexedStream::from(txs) - .map(TxProof) - .fold(AggProof { + .map(&TxProof) + .fold(&AggProof { other: other_data.clone(), }) .run(runtime) @@ -60,7 +60,7 @@ impl ProverInput { }); let block_proof = Literal(proof) - .map(BlockProof { + .map(&BlockProof { prev, other: other_data, }) diff --git a/zero_bin/worker/src/main.rs b/zero_bin/worker/src/main.rs index 22d8425f7..7048d5913 100644 --- a/zero_bin/worker/src/main.rs +++ b/zero_bin/worker/src/main.rs @@ -2,7 +2,7 @@ use anyhow::Result; use clap::Parser; use common::prover_state::{cli::CliProverStateConfig, set_prover_state_from_config}; use dotenvy::dotenv; -use ops::Ops; +use ops::register; use paladin::runtime::WorkerRuntime; use tracing::warn; @@ -26,7 +26,7 @@ async fn main() -> Result<()> { warn!("prover state already set. check the program logic to ensure it is only set once"); } - let runtime: WorkerRuntime = WorkerRuntime::from_config(&args.paladin).await?; + let runtime = WorkerRuntime::from_config(&args.paladin, register()).await?; runtime.main_loop().await?; Ok(()) From 32dba2f2facb0fb5bbf0098aa0fae2b5450c0225 Mon Sep 17 00:00:00 2001 From: cpu Date: Fri, 1 Dec 2023 06:13:23 -0800 Subject: [PATCH 079/184] Update dockerfiles --- zero_bin/leader.Dockerfile | 8 +++++++- zero_bin/worker.Dockerfile | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/zero_bin/leader.Dockerfile b/zero_bin/leader.Dockerfile index dfe75b13d..18b0a910d 100644 --- a/zero_bin/leader.Dockerfile +++ b/zero_bin/leader.Dockerfile @@ -7,27 +7,33 @@ RUN \ mkdir -p ops/src && touch ops/src/lib.rs && \ mkdir -p common/src && touch common/src/lib.rs && \ mkdir -p rpc/src && touch rpc/src/lib.rs && \ + mkdir -p prover/src && touch prover/src/lib.rs && \ mkdir -p leader/src && echo "fn main() {println!(\"YO!\");}" > leader/src/main.rs COPY Cargo.toml . -RUN sed -i "2s/.*/members = [\"ops\", \"leader\", \"common\", \"rpc\"]/" Cargo.toml +RUN sed -i "2s/.*/members = [\"ops\", \"leader\", \"common\", \"rpc\", \"prover\"]/" Cargo.toml COPY Cargo.lock . COPY ops/Cargo.toml ./ops/Cargo.toml COPY common/Cargo.toml ./common/Cargo.toml COPY rpc/Cargo.toml ./rpc/Cargo.toml +COPY prover/Cargo.toml ./prover/Cargo.toml COPY leader/Cargo.toml ./leader/Cargo.toml +COPY ./rust-toolchain.toml ./ + RUN cargo build --release --bin leader COPY ops ./ops COPY common ./common COPY rpc ./rpc +COPY prover ./prover COPY leader ./leader RUN \ touch ops/src/lib.rs && \ touch common/src/lib.rs && \ touch rpc/src/lib.rs && \ + touch prover/src/lib.rs && \ touch leader/src/main.rs RUN cargo build --release --bin leader diff --git a/zero_bin/worker.Dockerfile b/zero_bin/worker.Dockerfile index 86c3dc2e2..ecf7ae917 100644 --- a/zero_bin/worker.Dockerfile +++ b/zero_bin/worker.Dockerfile @@ -4,21 +4,27 @@ FROM rustlang/rust:nightly-bullseye-slim as builder RUN apt-get update && apt-get install -y libjemalloc2 libjemalloc-dev make RUN \ + mkdir -p common/src && touch common/src/lib.rs && \ mkdir -p ops/src && touch ops/src/lib.rs && \ mkdir -p worker/src && echo "fn main() {println!(\"YO!\");}" > worker/src/main.rs COPY Cargo.toml . -RUN sed -i "2s/.*/members = [\"ops\", \"worker\"]/" Cargo.toml +RUN sed -i "2s/.*/members = [\"common\", \"ops\", \"worker\"]/" Cargo.toml COPY Cargo.lock . +COPY common/Cargo.toml ./common/Cargo.toml COPY ops/Cargo.toml ./ops/Cargo.toml COPY worker/Cargo.toml ./worker/Cargo.toml +COPY ./rust-toolchain.toml ./ + RUN cargo build --release --bin worker +COPY common ./common COPY ops ./ops COPY worker ./worker RUN \ + touch common/src/lib.rs && \ touch ops/src/lib.rs && \ touch worker/src/main.rs From c9a4d29fcdcfae4f168fba25fa6a2f45d8dfda81 Mon Sep 17 00:00:00 2001 From: BGluth Date: Fri, 1 Dec 2023 13:13:12 -0700 Subject: [PATCH 080/184] Dep bump --- zero_bin/Cargo.lock | 14 +++++++------- zero_bin/Cargo.toml | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 26f667e7c..00ab36f1d 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2125,7 +2125,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" dependencies = [ "ahash", "anyhow", @@ -2149,7 +2149,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" dependencies = [ "anyhow", "bytes", @@ -2183,7 +2183,7 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" dependencies = [ "anyhow", "itertools", @@ -2198,7 +2198,7 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" dependencies = [ "rayon", ] @@ -2206,12 +2206,12 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=5572da30d7ab818594cf8659839fa832dfcf1d3d#5572da30d7ab818594cf8659839fa832dfcf1d3d" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=62a6109da7982a2304baf6e74d324f241896153f#62a6109da7982a2304baf6e74d324f241896153f" +source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=094d7ecdd61bfc729f934fa722da41916b71eec5#094d7ecdd61bfc729f934fa722da41916b71eec5" dependencies = [ "ethereum-types", "log", @@ -2307,7 +2307,7 @@ dependencies = [ [[package]] name = "proof_protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=9aa3ac6e2887bf4517db66e3c5b98e7f806cd2f3#9aa3ac6e2887bf4517db66e3c5b98e7f806cd2f3" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=982c215c36b6fd7acc82c5098939ff31875bcc47#982c215c36b6fd7acc82c5098939ff31875bcc47" dependencies = [ "bytes", "ciborium", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 89c604a93..23308b82c 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,10 +11,10 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive", "env"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "62a6109da7982a2304baf6e74d324f241896153f" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "9aa3ac6e2887bf4517db66e3c5b98e7f806cd2f3" } -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "5572da30d7ab818594cf8659839fa832dfcf1d3d" } -plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "5572da30d7ab818594cf8659839fa832dfcf1d3d" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "094d7ecdd61bfc729f934fa722da41916b71eec5" } +proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "982c215c36b6fd7acc82c5098939ff31875bcc47" } +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "32d009671a1af86312807ba2dc90e9bb4f4a94da" } +plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "32d009671a1af86312807ba2dc90e9bb4f4a94da" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" From 183b0bc3a578b01e90c62155fb9712545d3614e2 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 30 Nov 2023 20:08:44 -0500 Subject: [PATCH 081/184] Update block_hashes fetching --- zero_bin/rpc/src/rpc.rs | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 156563afe..d41b634c7 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -143,30 +143,43 @@ impl EthGetBlockByNumberResponse { rpc_url: U, block_number: u64, ) -> Result> { - let mut hashes = vec![]; + let mut hashes = vec![H256::default(); 256]; // Every block response includes the _parent_ hash along with its hash, so we // can just fetch half the blocks to acquire all hashes for the range. - let start = block_number.saturating_sub(256).max(1); + let start = block_number.saturating_sub(256); let futs: FuturesOrdered<_> = (start..=block_number) + .rev() .step_by(2) .map(|block_number| Self::fetch(rpc_url, block_number)) .collect(); let responses = futs.try_collect::>().await?; - for response in responses.iter() { - if response.result.number == block_number.into() { - // Ignore current hash - hashes.push(response.result.parent_hash); + + // Check first response, which may be the current block + let starting_offset = { + if responses[0].result.number == block_number.into() { + // Ignore hash of the current block. + hashes[255] = responses[0].result.parent_hash; + 254 } else { - hashes.push(response.result.parent_hash); - hashes.push(response.result.hash); + hashes[255] = responses[0].result.hash; + hashes[254] = responses[0].result.parent_hash; + 253 } - } + }; - hashes.reverse(); - hashes.resize(256, H256::default()); - hashes.reverse(); + // Iterate over the block responses, skipping the first (possibly current) + // block. + for (idx, response) in responses.iter().skip(1).enumerate() { + if response.result.number == 0.into() { + // Genesis has no parent block, we only write the genesis hash. + hashes[starting_offset - 2 * idx] = response.result.hash; + } + + hashes[starting_offset - 2 * idx] = response.result.hash; + hashes[starting_offset - 2 * idx - 1] = response.result.parent_hash; + } Ok(hashes) } From 2345dc8a5cda34328009dd88cd65da6faa66b58c Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 30 Nov 2023 20:09:20 -0500 Subject: [PATCH 082/184] Fix log wiping --- zero_bin/tools/prove_blocks.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index fb2d69e1a..7ec31a4ad 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -45,7 +45,7 @@ do exit $retVal else # Remove the log on success if we don't want to keep it. - if [ $ALWAYS_WRITE_LOGS ]; then + if [ $ALWAYS_WRITE_LOGS -ne 1 ]; then rm $OUT_LOG_PATH fi fi From 863fceba0cd62ae16536b608b921aa66a20bd78a Mon Sep 17 00:00:00 2001 From: cpu Date: Sat, 2 Dec 2023 18:43:49 -0800 Subject: [PATCH 083/184] paladin 0.4.1 --- zero_bin/Cargo.lock | 21 +++++++++++++++++---- zero_bin/Cargo.toml | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 00ab36f1d..5051afd9f 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -732,6 +732,18 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-skiplist" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883a5821d7d079fcf34ac55f27a833ee61678110f6b97637cc74513c0d0b42fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", + "scopeguard", +] + [[package]] name = "crossbeam-utils" version = "0.8.16" @@ -1915,9 +1927,9 @@ dependencies = [ [[package]] name = "paladin-core" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222ff485444015ad605235a3ce14e91db67088b953c24a08fcf62724847ffbde" +checksum = "c10eebceee2898070e490a57ada2bd3810c236a6d80aadccab4d70ef27c7aa34" dependencies = [ "anyhow", "async-trait", @@ -1926,6 +1938,7 @@ dependencies = [ "ciborium", "clap", "crossbeam", + "crossbeam-skiplist", "dashmap", "dotenvy", "futures", @@ -1947,9 +1960,9 @@ dependencies = [ [[package]] name = "paladin-opkind-derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51401ed2f91580e47caeb4f5b21fbbc8e59c1a3b1889246ec886e48dfbc9156d" +checksum = "af25dcb10b7c0ce99abee8694e2e79e4787d7f778b9339dc5a50ba6fc45e5cc9" dependencies = [ "quote", "syn 2.0.38", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 23308b82c..b8a9a9ccb 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "common", "ops", "verifier", "rpc", "prover"] resolver = "2" [workspace.dependencies] -paladin-core = "0.4.0" +paladin-core = "0.4.1" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" From 17c9bb9d39422e50a3537693f6d91f7c5b51b9a2 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Mon, 4 Dec 2023 21:00:22 -0800 Subject: [PATCH 084/184] Add licenses (#9) --- zero_bin/Cargo.toml | 8 ++ zero_bin/LICENSE-APACHE | 201 +++++++++++++++++++++++++++++++++++++ zero_bin/LICENSE-MIT | 21 ++++ zero_bin/README.md | 18 +++- zero_bin/common/Cargo.toml | 7 +- zero_bin/leader/Cargo.toml | 7 +- zero_bin/ops/Cargo.toml | 7 +- zero_bin/prover/Cargo.toml | 7 +- zero_bin/rpc/Cargo.toml | 7 +- zero_bin/worker/Cargo.toml | 7 +- 10 files changed, 283 insertions(+), 7 deletions(-) create mode 100644 zero_bin/LICENSE-APACHE create mode 100644 zero_bin/LICENSE-MIT diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index b8a9a9ccb..71d3c900c 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -20,6 +20,14 @@ serde_json = "1.0.107" ethereum-types = "0.14.1" thiserror = "1.0.50" +[workspace.package] +edition = "2021" +license = "MIT OR Apache-2.0" +repository = "https://github.com/0xPolygonZero/zero-bin" +authors = ["Polygon Zero "] +keywords = ["cryptography", "SNARK", "PLONK", "FRI", "plonky2"] +categories = ["cryptography::cryptocurrencies"] + [profile.release] opt-level = 3 incremental = true diff --git a/zero_bin/LICENSE-APACHE b/zero_bin/LICENSE-APACHE new file mode 100644 index 000000000..85d8ae519 --- /dev/null +++ b/zero_bin/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2023 Polygon Zero + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/zero_bin/LICENSE-MIT b/zero_bin/LICENSE-MIT new file mode 100644 index 000000000..f6c940ef3 --- /dev/null +++ b/zero_bin/LICENSE-MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2023 PT Services DMCC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zero_bin/README.md b/zero_bin/README.md index ace369a24..55e382a5e 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -21,6 +21,8 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [Verifier Usage](#verifier-usage) - [RPC Usage](#rpc-usage) - [Docker](#docker) + - [License](#license) + - [Contribution](#contribution) ## Project layout @@ -316,4 +318,18 @@ cargo r --release --bin rpc fetch --rpc-url --block-number 16 > ./outp ## Docker -Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. \ No newline at end of file +Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. + +## License + +Licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. \ No newline at end of file diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 95fd654e2..8e8c08842 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -1,7 +1,12 @@ [package] name = "common" version = "0.1.0" -edition = "2021" +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true [dependencies] thiserror = { workspace = true } diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 96d6330ff..449dfeb57 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -1,7 +1,12 @@ [package] name = "leader" version = "0.1.0" -edition = "2021" +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true [dependencies] paladin-core = { workspace = true } diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index abfd38e3e..c2b5e6dcc 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -1,7 +1,12 @@ [package] name = "ops" version = "0.1.0" -edition = "2021" +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true [dependencies] paladin-core = { workspace = true } diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 9e8910c0c..58ba09478 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -1,7 +1,12 @@ [package] name = "prover" version = "0.1.0" -edition = "2021" +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true [dependencies] serde = { workspace = true } diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index e682bd7f6..9537295a3 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -1,7 +1,12 @@ [package] name = "rpc" version = "0.1.0" -edition = "2021" +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true [dependencies] tokio = { workspace = true } diff --git a/zero_bin/worker/Cargo.toml b/zero_bin/worker/Cargo.toml index 3b8ebd6ba..9b08cec35 100644 --- a/zero_bin/worker/Cargo.toml +++ b/zero_bin/worker/Cargo.toml @@ -1,7 +1,12 @@ [package] name = "worker" version = "0.1.0" -edition = "2021" +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true [dependencies] paladin-core = { workspace = true } From 30f140ed3a06581ddd581711507e89e3827f0023 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Fri, 22 Dec 2023 07:16:26 -0800 Subject: [PATCH 085/184] Add support for providing checkpoint block --- zero_bin/Cargo.lock | 24 +++++++++---------- zero_bin/Cargo.toml | 8 +++---- zero_bin/README.md | 14 +++++++++--- zero_bin/leader/src/cli.rs | 3 +++ zero_bin/leader/src/jerigon.rs | 8 ++++++- zero_bin/leader/src/main.rs | 2 ++ zero_bin/ops/Cargo.toml | 2 +- zero_bin/ops/src/lib.rs | 14 ++++-------- zero_bin/prover/Cargo.toml | 2 +- zero_bin/prover/src/lib.rs | 11 +++------ zero_bin/rpc/Cargo.toml | 2 +- zero_bin/rpc/src/cli.rs | 3 +++ zero_bin/rpc/src/lib.rs | 2 +- zero_bin/rpc/src/main.rs | 10 ++++++-- zero_bin/rpc/src/rpc.rs | 42 ++++++++++++++++++++++++---------- 15 files changed, 92 insertions(+), 55 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 5051afd9f..2758b490f 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1898,7 +1898,7 @@ dependencies = [ "common", "paladin-core", "plonky_block_proof_gen", - "proof_protocol_decoder", + "protocol_decoder", "serde", ] @@ -2138,7 +2138,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" dependencies = [ "ahash", "anyhow", @@ -2162,7 +2162,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" dependencies = [ "anyhow", "bytes", @@ -2196,7 +2196,7 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" dependencies = [ "anyhow", "itertools", @@ -2211,7 +2211,7 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" dependencies = [ "rayon", ] @@ -2219,19 +2219,19 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=32d009671a1af86312807ba2dc90e9bb4f4a94da#32d009671a1af86312807ba2dc90e9bb4f4a94da" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/plonky-block-proof-gen.git?rev=094d7ecdd61bfc729f934fa722da41916b71eec5#094d7ecdd61bfc729f934fa722da41916b71eec5" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=71c52459f31e133635b2508634be234b0323e108#71c52459f31e133635b2508634be234b0323e108" dependencies = [ "ethereum-types", "log", "paste", "plonky2", "plonky2_evm", - "proof_protocol_decoder", + "protocol_decoder", "serde", ] @@ -2318,9 +2318,9 @@ dependencies = [ ] [[package]] -name = "proof_protocol_decoder" +name = "protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=982c215c36b6fd7acc82c5098939ff31875bcc47#982c215c36b6fd7acc82c5098939ff31875bcc47" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=71c52459f31e133635b2508634be234b0323e108#71c52459f31e133635b2508634be234b0323e108" dependencies = [ "bytes", "ciborium", @@ -2350,7 +2350,7 @@ dependencies = [ "ops", "paladin-core", "plonky_block_proof_gen", - "proof_protocol_decoder", + "protocol_decoder", "serde", "tracing", ] @@ -2580,7 +2580,7 @@ dependencies = [ "hex", "hex-literal", "plonky2_evm", - "proof_protocol_decoder", + "protocol_decoder", "prover", "reqwest", "serde", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 71d3c900c..3fca8f305 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,10 +11,10 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive", "env"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/plonky-block-proof-gen.git", rev = "094d7ecdd61bfc729f934fa722da41916b71eec5" } -proof_protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "982c215c36b6fd7acc82c5098939ff31875bcc47" } -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "32d009671a1af86312807ba2dc90e9bb4f4a94da" } -plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "32d009671a1af86312807ba2dc90e9bb4f4a94da" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "71c52459f31e133635b2508634be234b0323e108" } +protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "71c52459f31e133635b2508634be234b0323e108" } +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "f8f6b07a3905185af302d58fb6b97c55d12e57be" } +plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "f8f6b07a3905185af302d58fb6b97c55d12e57be" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" diff --git a/zero_bin/README.md b/zero_bin/README.md index 55e382a5e..a3bf95ea7 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -197,9 +197,17 @@ Usage: leader jerigon [OPTIONS] --rpc-url --block-number - -b, --block-number The block number for which to generate a proof - -f, --previous-proof The previous proof output - -h, --help Print help + + -b, --block-number + The block number for which to generate a proof + -c, --checkpoint-block-number + The checkpoint block number [default: 0] + -f, --previous-proof + The previous proof output + -o, --proof-output-path + If provided, write the generated proof to this file instead of stdout + -h, --help + Print help ``` Prove a block. diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 4d5c41d61..6ab9d8fb4 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -34,6 +34,9 @@ pub(crate) enum Command { /// The block number for which to generate a proof. #[arg(short, long)] block_number: u64, + /// The checkpoint block number. + #[arg(short, long, default_value_t = 0)] + checkpoint_block_number: u64, /// The previous proof output. #[arg(long, short = 'f', value_hint = ValueHint::FilePath)] previous_proof: Option, diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 555d8d487..6d7325d57 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -13,10 +13,16 @@ pub(crate) async fn jerigon_main( runtime: Runtime, rpc_url: &str, block_number: u64, + checkpoint_block_number: u64, previous: Option, proof_output_path_opt: Option, ) -> Result<()> { - let prover_input = rpc::fetch_prover_input(rpc_url, block_number).await?; + let prover_input = rpc::fetch_prover_input(rpc::FetchProverInputRequest { + rpc_url, + block_number, + checkpoint_block_number, + }) + .await?; let proof = prover_input.prove(&runtime, previous).await; runtime.close().await?; diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index e6c001969..e1e89a2b4 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -63,6 +63,7 @@ async fn main() -> Result<()> { Command::Jerigon { rpc_url, block_number, + checkpoint_block_number, previous_proof, proof_output_path, } => { @@ -72,6 +73,7 @@ async fn main() -> Result<()> { runtime, &rpc_url, block_number, + checkpoint_block_number, previous_proof, proof_output_path, ) diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index c2b5e6dcc..756986ca6 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -12,6 +12,6 @@ categories.workspace = true paladin-core = { workspace = true } serde = { workspace = true } plonky_block_proof_gen = { workspace = true } -proof_protocol_decoder = { workspace = true } +protocol_decoder = { workspace = true } common = { path = "../common" } diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index bda106238..e98a5365c 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -8,7 +8,7 @@ use plonky_block_proof_gen::{ proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, prover_state::ProverState, }; -use proof_protocol_decoder::types::{OtherBlockData, TxnProofGenIR}; +use protocol_decoder::types::TxnProofGenIR; use serde::{Deserialize, Serialize}; fn p_state() -> &'static ProverState { @@ -25,23 +25,20 @@ impl Operation for TxProof { type Output = AggregatableProof; fn execute(&self, input: Self::Input) -> Result { - let result = generate_txn_proof(p_state(), input).map_err(FatalError::from)?; + let result = generate_txn_proof(p_state(), input, None).map_err(FatalError::from)?; Ok(result.into()) } } #[derive(Deserialize, Serialize, RemoteExecute)] -pub struct AggProof { - pub other: OtherBlockData, -} +pub struct AggProof; impl Monoid for AggProof { type Elem = AggregatableProof; fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { - let result = - generate_agg_proof(p_state(), &a, &b, self.other.clone()).map_err(FatalError::from)?; + let result = generate_agg_proof(p_state(), &a, &b).map_err(FatalError::from)?; Ok(result.into()) } @@ -54,7 +51,6 @@ impl Monoid for AggProof { #[derive(Deserialize, Serialize, RemoteExecute)] pub struct BlockProof { - pub other: OtherBlockData, pub prev: Option, } @@ -64,7 +60,7 @@ impl Operation for BlockProof { fn execute(&self, input: Self::Input) -> Result { Ok( - generate_block_proof(p_state(), self.prev.as_ref(), &input, self.other.clone()) + generate_block_proof(p_state(), self.prev.as_ref(), &input) .map_err(FatalError::from)?, ) } diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 58ba09478..00cdff437 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -11,7 +11,7 @@ categories.workspace = true [dependencies] serde = { workspace = true } plonky_block_proof_gen = { workspace = true } -proof_protocol_decoder = { workspace = true } +protocol_decoder = { workspace = true } tracing = { workspace = true } paladin-core = { workspace = true } ethereum-types = { workspace = true } diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 28a96d1af..290461c73 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -9,7 +9,7 @@ use plonky_block_proof_gen::{ proof_types::{AggregatableProof, GeneratedBlockProof}, types::PlonkyProofIntern, }; -use proof_protocol_decoder::{ +use protocol_decoder::{ processed_block_trace::ProcessingMeta, trace_protocol::BlockTrace, types::{CodeHash, OtherBlockData}, @@ -47,9 +47,7 @@ impl ProverInput { let agg_proof = IndexedStream::from(txs) .map(&TxProof) - .fold(&AggProof { - other: other_data.clone(), - }) + .fold(&AggProof) .run(runtime) .await?; @@ -60,10 +58,7 @@ impl ProverInput { }); let block_proof = Literal(proof) - .map(&BlockProof { - prev, - other: other_data, - }) + .map(&BlockProof { prev }) .run(runtime) .await?; diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 9537295a3..74747580a 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -14,7 +14,7 @@ tracing = { workspace = true } tracing-subscriber = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } -proof_protocol_decoder = { workspace = true } +protocol_decoder = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } clap = { workspace = true } diff --git a/zero_bin/rpc/src/cli.rs b/zero_bin/rpc/src/cli.rs index c339e1940..5afe67c70 100644 --- a/zero_bin/rpc/src/cli.rs +++ b/zero_bin/rpc/src/cli.rs @@ -16,5 +16,8 @@ pub(crate) enum Commands { /// The block number #[arg(short, long)] block_number: u64, + /// The checkpoint block number + #[arg(short, long, default_value_t = 0)] + checkpoint_block_number: u64, }, } diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 62e5388e8..4e74ff49e 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -1,2 +1,2 @@ mod rpc; -pub use rpc::fetch_prover_input; +pub use rpc::{fetch_prover_input, FetchProverInputRequest}; diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs index ccb9a22e9..00bfc4c43 100644 --- a/zero_bin/rpc/src/main.rs +++ b/zero_bin/rpc/src/main.rs @@ -3,7 +3,7 @@ use std::io::Write; use anyhow::Result; use clap::Parser; use cli::Commands; -use rpc::fetch_prover_input; +use rpc::{fetch_prover_input, FetchProverInputRequest}; mod cli; mod init; @@ -18,8 +18,14 @@ async fn main() -> Result<()> { Commands::Fetch { rpc_url, block_number, + checkpoint_block_number, } => { - let prover_input = fetch_prover_input(&rpc_url, block_number).await?; + let prover_input = fetch_prover_input(FetchProverInputRequest { + rpc_url: &rpc_url, + block_number, + checkpoint_block_number, + }) + .await?; std::io::stdout().write_all(&serde_json::to_vec(&prover_input)?)?; } } diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index d41b634c7..8874e21e1 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -2,7 +2,7 @@ use anyhow::{Context, Result}; use ethereum_types::{Address, Bloom, H256, U256}; use futures::{stream::FuturesOrdered, TryStreamExt}; use plonky2_evm::proof::{BlockHashes, BlockMetadata}; -use proof_protocol_decoder::{ +use protocol_decoder::{ trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, types::{BlockLevelData, OtherBlockData}, }; @@ -184,8 +184,11 @@ impl EthGetBlockByNumberResponse { Ok(hashes) } - async fn fetch_genesis_state_trie_root(rpc_url: U) -> Result { - let res = Self::fetch(rpc_url, 0).await?; + async fn fetch_checkpoint_state_trie_root( + rpc_url: U, + block_number: u64, + ) -> Result { + let res = Self::fetch(rpc_url, block_number).await?; Ok(res.result.state_root) } } @@ -229,23 +232,26 @@ struct RpcBlockMetadata { block_by_number: EthGetBlockByNumberResponse, chain_id: EthChainIdResponse, prev_hashes: Vec, - genesis_state_trie_root: H256, + checkpoint_state_trie_root: H256, } impl RpcBlockMetadata { - async fn fetch(rpc_url: &str, block_number: u64) -> Result { - let (block_result, chain_id_result, prev_hashes, genesis_state_trie_root) = try_join!( + async fn fetch(rpc_url: &str, block_number: u64, checkpoint_block_number: u64) -> Result { + let (block_result, chain_id_result, prev_hashes, checkpoint_state_trie_root) = try_join!( EthGetBlockByNumberResponse::fetch(rpc_url, block_number), EthChainIdResponse::fetch(rpc_url), EthGetBlockByNumberResponse::fetch_previous_block_hashes(rpc_url, block_number), - EthGetBlockByNumberResponse::fetch_genesis_state_trie_root(rpc_url) + EthGetBlockByNumberResponse::fetch_checkpoint_state_trie_root( + rpc_url, + checkpoint_block_number + ) )?; Ok(Self { block_by_number: block_result, chain_id: chain_id_result, prev_hashes, - genesis_state_trie_root, + checkpoint_state_trie_root, }) } } @@ -256,7 +262,7 @@ impl From for OtherBlockData { block_by_number, chain_id, prev_hashes, - genesis_state_trie_root, + checkpoint_state_trie_root, }: RpcBlockMetadata, ) -> Self { let mut bloom = [U256::zero(); 8]; @@ -292,15 +298,27 @@ impl From for OtherBlockData { cur_hash: block_by_number.result.hash, }, }, - genesis_state_trie_root, + checkpoint_state_trie_root, } } } -pub async fn fetch_prover_input(rpc_url: &str, block_number: u64) -> Result { +pub struct FetchProverInputRequest<'a> { + pub rpc_url: &'a str, + pub block_number: u64, + pub checkpoint_block_number: u64, +} + +pub async fn fetch_prover_input( + FetchProverInputRequest { + rpc_url, + block_number, + checkpoint_block_number, + }: FetchProverInputRequest<'_>, +) -> Result { let (trace_result, rpc_block_metadata) = try_join!( JerigonTraceResponse::fetch(rpc_url, block_number), - RpcBlockMetadata::fetch(rpc_url, block_number), + RpcBlockMetadata::fetch(rpc_url, block_number, checkpoint_block_number), )?; debug!("Got block result: {:?}", rpc_block_metadata.block_by_number); From d0638433c0ecf74c6337504c6f6746270e86f52e Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Sat, 23 Dec 2023 08:04:29 -0800 Subject: [PATCH 086/184] Fix `fetch_previous_block_hashes` going out of bounds (#12) --- zero_bin/rpc/src/rpc.rs | 47 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 8874e21e1..d8e4606e9 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -143,42 +143,41 @@ impl EthGetBlockByNumberResponse { rpc_url: U, block_number: u64, ) -> Result> { - let mut hashes = vec![H256::default(); 256]; + if block_number == 0 { + return Ok(vec![H256::default(); 256]); + } + + let mut hashes = Vec::with_capacity(256); + + let padding_delta = block_number as i64 - 256; + if padding_delta < 0 { + let default = H256::default(); + for _ in 0..padding_delta.abs() { + hashes.push(default); + } + } // Every block response includes the _parent_ hash along with its hash, so we // can just fetch half the blocks to acquire all hashes for the range. let start = block_number.saturating_sub(256); - let futs: FuturesOrdered<_> = (start..=block_number) - .rev() + let mut futs: FuturesOrdered<_> = (start..=block_number) .step_by(2) .map(|block_number| Self::fetch(rpc_url, block_number)) .collect(); - let responses = futs.try_collect::>().await?; - - // Check first response, which may be the current block - let starting_offset = { - if responses[0].result.number == block_number.into() { - // Ignore hash of the current block. - hashes[255] = responses[0].result.parent_hash; - 254 - } else { - hashes[255] = responses[0].result.hash; - hashes[254] = responses[0].result.parent_hash; - 253 + while let Some(response) = futs.try_next().await? { + // Ignore hash of the current block. + if response.result.number == block_number.into() { + hashes.push(response.result.parent_hash); + continue; } - }; - // Iterate over the block responses, skipping the first (possibly current) - // block. - for (idx, response) in responses.iter().skip(1).enumerate() { - if response.result.number == 0.into() { - // Genesis has no parent block, we only write the genesis hash. - hashes[starting_offset - 2 * idx] = response.result.hash; + // Ignore the parent of the start block. + if response.result.number != start.into() { + hashes.push(response.result.parent_hash); } - hashes[starting_offset - 2 * idx] = response.result.hash; - hashes[starting_offset - 2 * idx - 1] = response.result.parent_hash; + hashes.push(response.result.hash); } Ok(hashes) From cf1dffd6f761879fc3a0f297efccd560fab431eb Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 19 Jan 2024 19:10:02 -0500 Subject: [PATCH 087/184] Allow verifier to load only necessary data --- zero_bin/Cargo.lock | 17 ++-- zero_bin/Cargo.toml | 8 +- zero_bin/common/src/prover_state/mod.rs | 45 ++++++++- .../common/src/prover_state/persistence.rs | 93 +++++++++++++------ zero_bin/verifier/Cargo.toml | 3 + zero_bin/verifier/src/cli.rs | 5 + zero_bin/verifier/src/main.rs | 7 +- 7 files changed, 135 insertions(+), 43 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 2758b490f..f3a9800e1 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -947,7 +947,7 @@ dependencies = [ [[package]] name = "eth_trie_utils" version = "0.6.0" -source = "git+https://github.com/0xPolygonZero/eth_trie_utils.git?rev=e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5#e9ec4ec2aa2ae976b7c699ef40c1ffc716d87ed5" +source = "git+https://github.com/0xPolygonZero/eth_trie_utils.git?rev=7fc3c3f54b3cec9c6fc5ffc5230910bd1cb77f76#7fc3c3f54b3cec9c6fc5ffc5230910bd1cb77f76" dependencies = [ "bytes", "enum-as-inner 0.5.1", @@ -2138,7 +2138,7 @@ dependencies = [ [[package]] name = "plonky2" version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" dependencies = [ "ahash", "anyhow", @@ -2162,7 +2162,7 @@ dependencies = [ [[package]] name = "plonky2_evm" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" dependencies = [ "anyhow", "bytes", @@ -2196,7 +2196,7 @@ dependencies = [ [[package]] name = "plonky2_field" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" dependencies = [ "anyhow", "itertools", @@ -2211,7 +2211,7 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" dependencies = [ "rayon", ] @@ -2219,12 +2219,12 @@ dependencies = [ [[package]] name = "plonky2_util" version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=f8f6b07a3905185af302d58fb6b97c55d12e57be#f8f6b07a3905185af302d58fb6b97c55d12e57be" +source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" [[package]] name = "plonky_block_proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=71c52459f31e133635b2508634be234b0323e108#71c52459f31e133635b2508634be234b0323e108" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=604e956f674dc1ea7d6c5e71c594b328e7b25399#604e956f674dc1ea7d6c5e71c594b328e7b25399" dependencies = [ "ethereum-types", "log", @@ -2320,7 +2320,7 @@ dependencies = [ [[package]] name = "protocol_decoder" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=71c52459f31e133635b2508634be234b0323e108#71c52459f31e133635b2508634be234b0323e108" +source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=604e956f674dc1ea7d6c5e71c594b328e7b25399#604e956f674dc1ea7d6c5e71c594b328e7b25399" dependencies = [ "bytes", "ciborium", @@ -3414,6 +3414,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", + "common", "plonky_block_proof_gen", "serde", "serde_json", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 3fca8f305..1d7b8ae4b 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,10 +11,10 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive", "env"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "71c52459f31e133635b2508634be234b0323e108" } -protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "71c52459f31e133635b2508634be234b0323e108" } -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "f8f6b07a3905185af302d58fb6b97c55d12e57be" } -plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "f8f6b07a3905185af302d58fb6b97c55d12e57be" } +plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "604e956f674dc1ea7d6c5e71c594b328e7b25399" } +protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "604e956f674dc1ea7d6c5e71c594b328e7b25399" } +plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "265d46a96ecfec49a32973f66f8aa811586c5d4a" } +plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "265d46a96ecfec49a32973f66f8aa811586c5d4a" } serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" diff --git a/zero_bin/common/src/prover_state/mod.rs b/zero_bin/common/src/prover_state/mod.rs index 3c4e24afc..c2ce372f0 100644 --- a/zero_bin/common/src/prover_state/mod.rs +++ b/zero_bin/common/src/prover_state/mod.rs @@ -12,7 +12,7 @@ use std::{fmt::Display, sync::OnceLock}; use clap::ValueEnum; -use plonky_block_proof_gen::prover_state::ProverState; +use plonky_block_proof_gen::{prover_state::ProverState, VerifierState}; use tracing::info; pub mod circuit; @@ -72,7 +72,7 @@ pub fn set_prover_state_from_config( } CircuitPersistence::Disk => { info!("attempting to load preprocessed circuits from disk..."); - let disk_state = persistence::from_disk(&circuit_config); + let disk_state = persistence::prover_from_disk(&circuit_config); match disk_state { Some(circuits) => { info!("successfully loaded preprocessed circuits from disk"); @@ -93,3 +93,44 @@ pub fn set_prover_state_from_config( P_STATE.set(state) } + +/// Loads a verifier state from disk or generate it. +pub fn get_verifier_state_from_config( + ProverStateConfig { + circuit_config, + persistence, + }: ProverStateConfig, +) -> VerifierState { + info!("initializing verifier state..."); + match persistence { + CircuitPersistence::None => { + info!("generating circuit..."); + let prover_state = circuit_config.as_all_recursive_circuits(); + VerifierState { + state: prover_state.final_verifier_data(), + } + } + CircuitPersistence::Disk => { + info!("attempting to load preprocessed verifier circuit from disk..."); + let disk_state = persistence::verifier_from_disk(&circuit_config); + match disk_state { + Some(state) => { + info!("successfully loaded preprocessed verifier circuit from disk"); + VerifierState { state } + } + None => { + info!( + "failed to load preprocessed verifier circuit from disk. generating it..." + ); + let prover_state = circuit_config.as_all_recursive_circuits(); + + info!("saving preprocessed verifier circuit to disk"); + let state = prover_state.final_verifier_data(); + persistence::verifier_to_disk(&state, &circuit_config); + + VerifierState { state } + } + } + } + } +} diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index f472c814c..78d6d9c00 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -7,7 +7,7 @@ use plonky2::{ plonk::config::PoseidonGoldilocksConfig, util::serialization::{DefaultGateSerializer, DefaultGeneratorSerializer}, }; -use plonky_block_proof_gen::types::AllRecursiveCircuits; +use plonky_block_proof_gen::types::{AllRecursiveCircuits, VerifierData}; use tracing::{info, warn}; use super::circuit::CircuitConfig; @@ -15,6 +15,7 @@ use super::circuit::CircuitConfig; type Config = PoseidonGoldilocksConfig; const SIZE: usize = 2; const PROVER_STATE_FILE_PREFIX: &str = "./prover_state"; +const VERIFIER_STATE_FILE_PREFIX: &str = "./verifier_state"; fn get_serializers() -> (DefaultGateSerializer, DefaultGeneratorSerializer) { let gate_serializer = DefaultGateSerializer; @@ -26,21 +27,19 @@ fn get_serializers() -> (DefaultGateSerializer, DefaultGeneratorSerializer String { - format!( - "{}_{}", - PROVER_STATE_FILE_PREFIX, - circuit_config.get_configuration_digest() - ) +fn disk_path(circuit_config: &CircuitConfig, prefix: &str) -> String { + format!("{}_{}", prefix, circuit_config.get_configuration_digest()) } -pub fn from_disk(circuit_config: &CircuitConfig) -> Option { - let path = disk_path(circuit_config); +/// Loads [`AllRecursiveCircuits`] from disk. +pub fn prover_from_disk(circuit_config: &CircuitConfig) -> Option { + let path = disk_path(circuit_config, PROVER_STATE_FILE_PREFIX); let bytes = fs::read(&path).ok()?; info!("found prover state at {path}"); let (gate_serializer, witness_serializer) = get_serializers(); info!("deserializing prover state..."); - let state = AllRecursiveCircuits::from_bytes(&bytes, &gate_serializer, &witness_serializer); + let state = + AllRecursiveCircuits::from_bytes(&bytes, false, &gate_serializer, &witness_serializer); match state { Ok(state) => Some(state), @@ -51,33 +50,75 @@ pub fn from_disk(circuit_config: &CircuitConfig) -> Option } } -pub fn to_disk(circuits: &AllRecursiveCircuits, circuit_config: &CircuitConfig) { - let file = OpenOptions::new() - .write(true) - .create(true) - .open(disk_path(circuit_config)); +/// Loads [`VerifierData`] from disk. +pub fn verifier_from_disk(circuit_config: &CircuitConfig) -> Option { + let path = disk_path(circuit_config, VERIFIER_STATE_FILE_PREFIX); + let bytes = fs::read(&path).ok()?; + info!("found verifier state at {path}"); + let (gate_serializer, _witness_serializer) = get_serializers(); + info!("deserializing verifier state..."); + let state = VerifierData::from_bytes(bytes, &gate_serializer); - let mut file = match file { - Ok(file) => file, + match state { + Ok(state) => Some(state), Err(e) => { - warn!("failed to create prover state file, {e:?}"); - return; + warn!("failed to deserialize verifier state, {e:?}"); + None } - }; + } +} +/// Writes the provided [`AllRecursiveCircuits`] to disk, along with the +/// associated [`VerifierData`], in two distinct files. +pub fn to_disk(circuits: &AllRecursiveCircuits, circuit_config: &CircuitConfig) { + prover_to_disk(circuits, circuit_config); + verifier_to_disk(&circuits.final_verifier_data(), circuit_config); +} + +/// Writes the provided [`AllRecursiveCircuits`] to disk. +fn prover_to_disk(circuits: &AllRecursiveCircuits, circuit_config: &CircuitConfig) { let (gate_serializer, witness_serializer) = get_serializers(); - let bytes = circuits.to_bytes(&gate_serializer, &witness_serializer); + // Write prover state to disk + if let Err(e) = circuits + .to_bytes(false, &gate_serializer, &witness_serializer) + .map(|bytes| { + write_bytes_to_file(&bytes, disk_path(circuit_config, PROVER_STATE_FILE_PREFIX)) + }) + { + warn!("failed to create prover state file, {e:?}"); + return; + }; +} + +/// Writes the provided [`VerifierData`] to disk. +pub fn verifier_to_disk(circuit: &VerifierData, circuit_config: &CircuitConfig) { + let (gate_serializer, _witness_serializer) = get_serializers(); - let bytes = match bytes { - Ok(bytes) => bytes, + // Write verifier state to disk + if let Err(e) = circuit.to_bytes(&gate_serializer).map(|bytes| { + write_bytes_to_file( + &bytes, + disk_path(circuit_config, VERIFIER_STATE_FILE_PREFIX), + ) + }) { + warn!("failed to create verifier state file, {e:?}"); + return; + }; +} + +fn write_bytes_to_file(bytes: &[u8], path: String) { + let file = OpenOptions::new().write(true).create(true).open(path); + + let mut file = match file { + Ok(file) => file, Err(e) => { - warn!("failed to create prover state file, {e:?}"); + warn!("failed to create circuits file, {e:?}"); return; } }; - if let Err(e) = file.write_all(&bytes) { - warn!("failed to write prover state file, {e:?}"); + if let Err(e) = file.write_all(bytes) { + warn!("failed to write circuits file, {e:?}"); } } diff --git a/zero_bin/verifier/Cargo.toml b/zero_bin/verifier/Cargo.toml index e0c6d45e6..f58036b4e 100644 --- a/zero_bin/verifier/Cargo.toml +++ b/zero_bin/verifier/Cargo.toml @@ -12,3 +12,6 @@ serde = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } plonky_block_proof_gen = { workspace = true } + +# Local dependencies +common = { path = "../common" } \ No newline at end of file diff --git a/zero_bin/verifier/src/cli.rs b/zero_bin/verifier/src/cli.rs index 479c8325c..62d9a2feb 100644 --- a/zero_bin/verifier/src/cli.rs +++ b/zero_bin/verifier/src/cli.rs @@ -1,10 +1,15 @@ use std::path::PathBuf; use clap::{Parser, ValueHint}; +use common::prover_state::cli::CliProverStateConfig; #[derive(Parser)] pub(crate) struct Cli { /// The file containing the proof to verify #[arg(short, long, value_hint = ValueHint::FilePath)] pub(crate) file_path: PathBuf, + /// The prover configuration used to generate the preprocessed circuits + /// and the verifier state. + #[clap(flatten)] + pub(crate) prover_state_config: CliProverStateConfig, } diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index 3cdf444a2..494ebdff8 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -2,7 +2,8 @@ use std::fs::File; use anyhow::Result; use clap::Parser; -use plonky_block_proof_gen::{prover_state::ProverStateBuilder, types::PlonkyProofIntern}; +use common::prover_state::get_verifier_state_from_config; +use plonky_block_proof_gen::types::PlonkyProofIntern; use serde_json::Deserializer; mod cli; @@ -16,9 +17,9 @@ fn main() -> Result<()> { let des = &mut Deserializer::from_reader(&file); let input: PlonkyProofIntern = serde_path_to_error::deserialize(des)?; - let prover = ProverStateBuilder::default().build(); + let verifier_state = get_verifier_state_from_config(args.prover_state_config.into()); - prover.state.verify_block(&input)?; + verifier_state.verify(&input)?; Ok(()) } From 9356bcc6851e5dfbe2ffb0f337282df4aa81b224 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Sun, 21 Jan 2024 16:58:32 -0500 Subject: [PATCH 088/184] Clippy --- zero_bin/common/src/prover_state/persistence.rs | 2 -- zero_bin/verifier/Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index 78d6d9c00..606e50841 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -87,7 +87,6 @@ fn prover_to_disk(circuits: &AllRecursiveCircuits, circuit_config: &CircuitConfi }) { warn!("failed to create prover state file, {e:?}"); - return; }; } @@ -103,7 +102,6 @@ pub fn verifier_to_disk(circuit: &VerifierData, circuit_config: &CircuitConfig) ) }) { warn!("failed to create verifier state file, {e:?}"); - return; }; } diff --git a/zero_bin/verifier/Cargo.toml b/zero_bin/verifier/Cargo.toml index f58036b4e..5baba23a4 100644 --- a/zero_bin/verifier/Cargo.toml +++ b/zero_bin/verifier/Cargo.toml @@ -14,4 +14,4 @@ serde_path_to_error = { workspace = true } plonky_block_proof_gen = { workspace = true } # Local dependencies -common = { path = "../common" } \ No newline at end of file +common = { path = "../common" } From 2f08b98bd7e584011322af0cf5812e9163468854 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Sun, 21 Jan 2024 17:22:44 -0500 Subject: [PATCH 089/184] Add verifier_state_* to .gitignore --- zero_bin/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index abf249608..4150ca773 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -2,3 +2,4 @@ /prover_state *.zkproof prover_state_* +verifier_state_* From e0d0f1151f9b45479eca0164412740b7bb3a3646 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Sun, 21 Jan 2024 17:21:10 -0500 Subject: [PATCH 090/184] Create output directory if non-existent --- zero_bin/leader/src/main.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index e1e89a2b4..a8cfb3b34 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -53,8 +53,11 @@ async fn main() -> Result<()> { } Command::Http { port, output_dir } => { // check if output_dir exists, is a directory, and is writable - let output_dir_metadata = std::fs::metadata(&output_dir)?; - if !output_dir.is_dir() || output_dir_metadata.permissions().readonly() { + let output_dir_metadata = std::fs::metadata(&output_dir); + if output_dir_metadata.is_err() { + // Create output directory + std::fs::create_dir(&output_dir)?; + } else if !output_dir.is_dir() || output_dir_metadata?.permissions().readonly() { panic!("output-dir is not a writable directory"); } From ab4daf607af35a0bfd194a8a0974f0372a5a84c6 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Sun, 21 Jan 2024 17:40:26 -0500 Subject: [PATCH 091/184] Add checkpoint height to script --- zero_bin/tools/prove_blocks.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index 7ec31a4ad..d84fc62be 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -4,6 +4,7 @@ # 1 --> Start block idx # 2 --> End block index (inclusive) # 3 --> Rpc endpoint:port (eg. http://35.246.1.96:8545) +# 4 --> Ignore previous proofs (boolean) export RUST_BACKTRACE=1 export RUST_LOG=plonky2=trace,plonky2_evm=trace @@ -20,6 +21,7 @@ PROOF_OUTPUT_DIR="proofs" ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. TOT_BLOCKS=$(($2-$1+1)) +IGNORE_PREVIOUS_PROOFS=$4 echo "Proving blocks ${1}..=${2}... (Total: ${TOT_BLOCKS})" mkdir -p proofs/ @@ -31,9 +33,15 @@ do OUT_PROOF_PATH="${PROOF_OUTPUT_DIR}/b${i}.zkproof" OUT_LOG_PATH="${PROOF_OUTPUT_DIR}/b${i}.log" - if [ $i -gt 1 ]; then + if [ $IGNORE_PREVIOUS_PROOFS ]; then + # Set checkpoing height to previous block number prev_proof_num=$((i-1)) - PREV_PROOF_EXTRA_ARG="-f ${PROOF_OUTPUT_DIR}/b${prev_proof_num}.zkproof" + PREV_PROOF_EXTRA_ARG="--checkpoint-block-number ${prev_proof_num}" + else + if [ $i -gt 1 ]; then + prev_proof_num=$((i-1)) + PREV_PROOF_EXTRA_ARG="-f ${PROOF_OUTPUT_DIR}/b${prev_proof_num}.zkproof" + fi fi cargo r --release --bin leader -- --runtime in-memory jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 From 03f1d8025bdbede3e82a863cd050bab28a69c7e4 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 22 Jan 2024 10:41:44 +0000 Subject: [PATCH 092/184] Small typo fix --- zero_bin/tools/prove_blocks.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index d84fc62be..da7ffc29c 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -34,7 +34,7 @@ do OUT_LOG_PATH="${PROOF_OUTPUT_DIR}/b${i}.log" if [ $IGNORE_PREVIOUS_PROOFS ]; then - # Set checkpoing height to previous block number + # Set checkpoint height to previous block number prev_proof_num=$((i-1)) PREV_PROOF_EXTRA_ARG="--checkpoint-block-number ${prev_proof_num}" else From 5e998e039d772e302580d612ca8e81f2c2a3ff53 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 21 Feb 2024 16:41:44 -0500 Subject: [PATCH 093/184] Update dependencies --- zero_bin/Cargo.lock | 279 ++++++++++-------- zero_bin/Cargo.toml | 8 +- zero_bin/common/Cargo.toml | 4 +- zero_bin/common/src/prover_state/circuit.rs | 4 +- zero_bin/common/src/prover_state/mod.rs | 2 +- .../common/src/prover_state/persistence.rs | 2 +- zero_bin/leader/Cargo.toml | 2 +- zero_bin/leader/src/http.rs | 2 +- zero_bin/leader/src/jerigon.rs | 2 +- zero_bin/leader/src/main.rs | 2 +- zero_bin/leader/src/stdio.rs | 2 +- zero_bin/ops/Cargo.toml | 4 +- zero_bin/ops/src/lib.rs | 4 +- zero_bin/prover/Cargo.toml | 4 +- zero_bin/prover/src/lib.rs | 6 +- zero_bin/rpc/Cargo.toml | 4 +- zero_bin/rpc/src/rpc.rs | 10 +- zero_bin/tools/prove_blocks.sh | 2 +- zero_bin/verifier/Cargo.toml | 2 +- zero_bin/verifier/src/main.rs | 2 +- 20 files changed, 186 insertions(+), 161 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index f3a9800e1..9550dd495 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "const-random", @@ -601,9 +601,9 @@ name = "common" version = "0.1.0" dependencies = [ "clap", + "evm_arithmetization", "plonky2", - "plonky2_evm", - "plonky_block_proof_gen", + "proof_gen", "thiserror", "tracing", ] @@ -619,9 +619,9 @@ dependencies = [ [[package]] name = "const-random" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11df32a13d7892ec42d51d3d175faba5211ffe13ed25d4fb348ac9e9ce835593" +checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" dependencies = [ "const-random-macro", ] @@ -811,7 +811,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core", @@ -880,18 +880,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "enum-as-inner" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "enum-as-inner" version = "0.6.0" @@ -944,25 +932,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "eth_trie_utils" -version = "0.6.0" -source = "git+https://github.com/0xPolygonZero/eth_trie_utils.git?rev=7fc3c3f54b3cec9c6fc5ffc5230910bd1cb77f76#7fc3c3f54b3cec9c6fc5ffc5230910bd1cb77f76" -dependencies = [ - "bytes", - "enum-as-inner 0.5.1", - "ethereum-types", - "hex", - "keccak-hash 0.10.0", - "log", - "num-traits", - "parking_lot", - "rlp", - "serde", - "thiserror", - "uint", -] - [[package]] name = "ethbloom" version = "0.13.0" @@ -996,6 +965,42 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "evm_arithmetization" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d80801ec98b39dde6182d34f76f11abe050302f36d8847bfcd4456ecd990c9b" +dependencies = [ + "anyhow", + "bytes", + "env_logger", + "ethereum-types", + "hashbrown 0.14.3", + "hex-literal", + "itertools", + "jemallocator", + "keccak-hash 0.10.0", + "log", + "mpt_trie", + "num", + "num-bigint", + "once_cell", + "pest", + "pest_derive", + "plonky2", + "plonky2_maybe_rayon", + "plonky2_util", + "rand", + "rand_chacha", + "rlp", + "rlp-derive", + "serde", + "serde_json", + "starky", + "static_assertions", + "tiny-keccak", +] + [[package]] name = "executor-trait" version = "2.1.0" @@ -1249,9 +1254,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", "allocator-api2", @@ -1479,7 +1484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "serde", ] @@ -1634,7 +1639,7 @@ dependencies = [ "ethereum-types", "ops", "paladin-core", - "plonky_block_proof_gen", + "proof_gen", "prover", "rpc", "serde", @@ -1762,6 +1767,27 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "mpt_trie" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cc408af26fe8f58787fb1be1a3bbfdd041bc36a15d4075fdadde07028469381" +dependencies = [ + "bytes", + "enum-as-inner", + "ethereum-types", + "hex", + "keccak-hash 0.10.0", + "log", + "num", + "num-traits", + "parking_lot", + "rlp", + "serde", + "thiserror", + "uint", +] + [[package]] name = "nom" version = "7.1.3" @@ -1897,9 +1923,9 @@ version = "0.1.0" dependencies = [ "common", "paladin-core", - "plonky_block_proof_gen", - "protocol_decoder", + "proof_gen", "serde", + "trace_decoder", ] [[package]] @@ -2137,13 +2163,14 @@ dependencies = [ [[package]] name = "plonky2" -version = "0.1.4" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b25deb9a4b9c2014c2f99cd36078f30e453d188d0ca8dd4c5ffd1d494b661ac1" dependencies = [ "ahash", "anyhow", "getrandom", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "itertools", "keccak-hash 0.8.0", "log", @@ -2154,49 +2181,16 @@ dependencies = [ "rand", "rand_chacha", "serde", - "serde_json", "static_assertions", "unroll", -] - -[[package]] -name = "plonky2_evm" -version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" -dependencies = [ - "anyhow", - "bytes", - "env_logger", - "eth_trie_utils", - "ethereum-types", - "hashbrown 0.14.2", - "hex-literal", - "itertools", - "jemallocator", - "keccak-hash 0.10.0", - "log", - "num", - "num-bigint", - "once_cell", - "pest", - "pest_derive", - "plonky2", - "plonky2_maybe_rayon", - "plonky2_util", - "rand", - "rand_chacha", - "rlp", - "rlp-derive", - "serde", - "serde_json", - "static_assertions", - "tiny-keccak", + "web-time", ] [[package]] name = "plonky2_field" -version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a741ba134485af571152aab5086457a470aa8893391186cf78dd389694440" dependencies = [ "anyhow", "itertools", @@ -2210,30 +2204,18 @@ dependencies = [ [[package]] name = "plonky2_maybe_rayon" -version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ff44a90aaca13e10e7ddf8fab815ba1b404c3f7c3ca82aaf11c46beabaa923" dependencies = [ "rayon", ] [[package]] name = "plonky2_util" -version = "0.1.1" -source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=265d46a96ecfec49a32973f66f8aa811586c5d4a#265d46a96ecfec49a32973f66f8aa811586c5d4a" - -[[package]] -name = "plonky_block_proof_gen" -version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=604e956f674dc1ea7d6c5e71c594b328e7b25399#604e956f674dc1ea7d6c5e71c594b328e7b25399" -dependencies = [ - "ethereum-types", - "log", - "paste", - "plonky2", - "plonky2_evm", - "protocol_decoder", - "serde", -] +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16136f5f3019c1e83035af76cccddd56d789a5e2933306270185c3f99f12259" [[package]] name = "polling" @@ -2318,27 +2300,18 @@ dependencies = [ ] [[package]] -name = "protocol_decoder" +name = "proof_gen" version = "0.1.0" -source = "git+https://github.com/0xPolygonZero/proof-protocol-decoder.git?rev=604e956f674dc1ea7d6c5e71c594b328e7b25399#604e956f674dc1ea7d6c5e71c594b328e7b25399" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24a304cfc3e741ebb7bc40258d0da52c0f2924b6817372d15f051e02673af3aa" dependencies = [ - "bytes", - "ciborium", - "ciborium-io", - "enum-as-inner 0.6.0", - "enumn", - "eth_trie_utils", "ethereum-types", - "hex", - "hex-literal", - "keccak-hash 0.10.0", + "evm_arithmetization", "log", - "plonky2_evm", - "rlp", - "rlp-derive", + "paste", + "plonky2", "serde", - "serde_with", - "thiserror", + "trace_decoder", ] [[package]] @@ -2349,9 +2322,9 @@ dependencies = [ "ethereum-types", "ops", "paladin-core", - "plonky_block_proof_gen", - "protocol_decoder", + "proof_gen", "serde", + "trace_decoder", "tracing", ] @@ -2576,11 +2549,10 @@ dependencies = [ "clap", "common", "ethereum-types", + "evm_arithmetization", "futures", "hex", "hex-literal", - "plonky2_evm", - "protocol_decoder", "prover", "reqwest", "serde", @@ -2588,6 +2560,7 @@ dependencies = [ "serde_path_to_error", "thiserror", "tokio", + "trace_decoder", "tracing", "tracing-subscriber", ] @@ -2933,6 +2906,23 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "starky" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2edb3b04ef3bb95f31805b9c88a9de39767089adadc1966ddc3c43348a11464a" +dependencies = [ + "ahash", + "anyhow", + "hashbrown 0.14.3", + "itertools", + "log", + "num-bigint", + "plonky2", + "plonky2_maybe_rayon", + "plonky2_util", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -3245,6 +3235,31 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +[[package]] +name = "trace_decoder" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5719c4c8f671ee782b78df96e7832207a2486a4fa137b20a3885beaf3a4ad724" +dependencies = [ + "bytes", + "ciborium", + "ciborium-io", + "enum-as-inner", + "enumn", + "ethereum-types", + "evm_arithmetization", + "hex", + "hex-literal", + "keccak-hash 0.10.0", + "log", + "mpt_trie", + "rlp", + "rlp-derive", + "serde", + "serde_with", + "thiserror", +] + [[package]] name = "tracing" version = "0.1.40" @@ -3415,7 +3430,7 @@ dependencies = [ "anyhow", "clap", "common", - "plonky_block_proof_gen", + "proof_gen", "serde", "serde_json", "serde_path_to_error", @@ -3526,6 +3541,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee269d72cc29bf77a2c4bc689cc750fb39f5cbd493d2205bbb3f5c7779cf7b0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-roots" version = "0.25.2" @@ -3689,18 +3714,18 @@ checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" [[package]] name = "zerocopy" -version = "0.7.15" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81ba595b9f2772fbee2312de30eeb80ec773b4cb2f1e8098db024afadda6c06f" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.15" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772666c41fb6dceaf520b564b962d738a8e1a83b41bd48945f50837aed78bb1d" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 1d7b8ae4b..a720a3288 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,10 +11,10 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive", "env"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -plonky_block_proof_gen = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "604e956f674dc1ea7d6c5e71c594b328e7b25399" } -protocol_decoder = { git = "https://github.com/0xPolygonZero/proof-protocol-decoder.git", rev = "604e956f674dc1ea7d6c5e71c594b328e7b25399" } -plonky2_evm = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "265d46a96ecfec49a32973f66f8aa811586c5d4a" } -plonky2 = { git = "https://github.com/0xPolygonZero/plonky2.git", rev = "265d46a96ecfec49a32973f66f8aa811586c5d4a" } +proof_gen = "0.1.0" +trace_decoder = "0.1.0" +evm_arithmetization = "0.1.0" +plonky2 = "0.2.0" serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 8e8c08842..909a0a276 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -11,7 +11,7 @@ categories.workspace = true [dependencies] thiserror = { workspace = true } tracing = { workspace = true } -plonky_block_proof_gen = { workspace = true } +proof_gen = { workspace = true } plonky2 = { workspace = true } -plonky2_evm = { workspace = true } +evm_arithmetization = { workspace = true } clap = { workspace = true } diff --git a/zero_bin/common/src/prover_state/circuit.rs b/zero_bin/common/src/prover_state/circuit.rs index 623846f92..a25396087 100644 --- a/zero_bin/common/src/prover_state/circuit.rs +++ b/zero_bin/common/src/prover_state/circuit.rs @@ -5,8 +5,8 @@ use std::{ str::FromStr, }; -use plonky2_evm::{all_stark::AllStark, config::StarkConfig}; -use plonky_block_proof_gen::types::AllRecursiveCircuits; +use evm_arithmetization::{all_stark::AllStark, config::StarkConfig}; +use proof_gen::types::AllRecursiveCircuits; use crate::parsing::{parse_range, RangeParseError}; diff --git a/zero_bin/common/src/prover_state/mod.rs b/zero_bin/common/src/prover_state/mod.rs index c2ce372f0..c9af6c2b1 100644 --- a/zero_bin/common/src/prover_state/mod.rs +++ b/zero_bin/common/src/prover_state/mod.rs @@ -12,7 +12,7 @@ use std::{fmt::Display, sync::OnceLock}; use clap::ValueEnum; -use plonky_block_proof_gen::{prover_state::ProverState, VerifierState}; +use proof_gen::{prover_state::ProverState, VerifierState}; use tracing::info; pub mod circuit; diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index 606e50841..c72327962 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -7,7 +7,7 @@ use plonky2::{ plonk::config::PoseidonGoldilocksConfig, util::serialization::{DefaultGateSerializer, DefaultGeneratorSerializer}, }; -use plonky_block_proof_gen::types::{AllRecursiveCircuits, VerifierData}; +use proof_gen::types::{AllRecursiveCircuits, VerifierData}; use tracing::{info, warn}; use super::circuit::CircuitConfig; diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 449dfeb57..84470fb95 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -17,7 +17,7 @@ anyhow = { workspace = true } serde = { workspace = true } dotenvy = { workspace = true } tokio = { workspace = true } -plonky_block_proof_gen = { workspace = true } +proof_gen = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } ethereum-types = { workspace = true } diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index 3a21e97fd..f6578db6f 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -4,7 +4,7 @@ use anyhow::{bail, Result}; use axum::{http::StatusCode, routing::post, Json, Router}; use ethereum_types::U256; use paladin::runtime::Runtime; -use plonky_block_proof_gen::{proof_types::GeneratedBlockProof, types::PlonkyProofIntern}; +use proof_gen::{proof_types::GeneratedBlockProof, types::PlonkyProofIntern}; use prover::ProverInput; use serde::{Deserialize, Serialize}; use serde_json::to_writer; diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 6d7325d57..899ea20ee 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -6,7 +6,7 @@ use std::{ use anyhow::Result; use paladin::runtime::Runtime; -use plonky_block_proof_gen::types::PlonkyProofIntern; +use proof_gen::types::PlonkyProofIntern; /// The main function for the jerigon mode. pub(crate) async fn jerigon_main( diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index a8cfb3b34..06590507b 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -7,7 +7,7 @@ use common::prover_state::set_prover_state_from_config; use dotenvy::dotenv; use ops::register; use paladin::runtime::Runtime; -use plonky_block_proof_gen::types::PlonkyProofIntern; +use proof_gen::types::PlonkyProofIntern; use tracing::warn; mod cli; diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index 242fb531f..e3b6ec5aa 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -2,7 +2,7 @@ use std::io::{Read, Write}; use anyhow::Result; use paladin::runtime::Runtime; -use plonky_block_proof_gen::types::PlonkyProofIntern; +use proof_gen::types::PlonkyProofIntern; use prover::ProverInput; /// The main function for the stdio mode. diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 756986ca6..f086bdb53 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -11,7 +11,7 @@ categories.workspace = true [dependencies] paladin-core = { workspace = true } serde = { workspace = true } -plonky_block_proof_gen = { workspace = true } -protocol_decoder = { workspace = true } +proof_gen = { workspace = true } +trace_decoder = { workspace = true } common = { path = "../common" } diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index e98a5365c..80fc2376f 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -3,13 +3,13 @@ use paladin::{ operation::{FatalError, Monoid, Operation, Result}, registry, RemoteExecute, }; -use plonky_block_proof_gen::{ +use proof_gen::{ proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, prover_state::ProverState, }; -use protocol_decoder::types::TxnProofGenIR; use serde::{Deserialize, Serialize}; +use trace_decoder::types::TxnProofGenIR; fn p_state() -> &'static ProverState { P_STATE.get().expect("Prover state is not initialized") diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 00cdff437..56b05b9c8 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -10,8 +10,8 @@ categories.workspace = true [dependencies] serde = { workspace = true } -plonky_block_proof_gen = { workspace = true } -protocol_decoder = { workspace = true } +proof_gen = { workspace = true } +trace_decoder = { workspace = true } tracing = { workspace = true } paladin-core = { workspace = true } ethereum-types = { workspace = true } diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 290461c73..bb607b0c9 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -5,16 +5,16 @@ use paladin::{ directive::{Directive, IndexedStream, Literal}, runtime::Runtime, }; -use plonky_block_proof_gen::{ +use proof_gen::{ proof_types::{AggregatableProof, GeneratedBlockProof}, types::PlonkyProofIntern, }; -use protocol_decoder::{ +use serde::{Deserialize, Serialize}; +use trace_decoder::{ processed_block_trace::ProcessingMeta, trace_protocol::BlockTrace, types::{CodeHash, OtherBlockData}, }; -use serde::{Deserialize, Serialize}; use tracing::info; #[derive(Debug, Deserialize, Serialize)] diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 74747580a..a64b1ae18 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -14,12 +14,12 @@ tracing = { workspace = true } tracing-subscriber = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } -protocol_decoder = { workspace = true } +trace_decoder = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } clap = { workspace = true } ethereum-types = { workspace = true } -plonky2_evm = { workspace = true } +evm_arithmetization = { workspace = true } thiserror = { workspace = true } reqwest = { version = "0.11.22", default-features = false, features = [ diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index d8e4606e9..209a22fc8 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -1,16 +1,16 @@ use anyhow::{Context, Result}; use ethereum_types::{Address, Bloom, H256, U256}; +use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; use futures::{stream::FuturesOrdered, TryStreamExt}; -use plonky2_evm::proof::{BlockHashes, BlockMetadata}; -use protocol_decoder::{ - trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, - types::{BlockLevelData, OtherBlockData}, -}; use prover::ProverInput; use reqwest::IntoUrl; use serde::Deserialize; use thiserror::Error; use tokio::try_join; +use trace_decoder::{ + trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, + types::{BlockLevelData, OtherBlockData}, +}; use tracing::{debug, info}; #[derive(Deserialize, Debug)] diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index da7ffc29c..57a00fd62 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -7,7 +7,7 @@ # 4 --> Ignore previous proofs (boolean) export RUST_BACKTRACE=1 -export RUST_LOG=plonky2=trace,plonky2_evm=trace +export RUST_LOG=plonky2=trace,evm_arithmetization=trace export ARTITHMETIC_CIRCUIT_SIZE="16..23" export BYTE_PACKING_CIRCUIT_SIZE="9..21" diff --git a/zero_bin/verifier/Cargo.toml b/zero_bin/verifier/Cargo.toml index 5baba23a4..482ec7831 100644 --- a/zero_bin/verifier/Cargo.toml +++ b/zero_bin/verifier/Cargo.toml @@ -11,7 +11,7 @@ anyhow = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } -plonky_block_proof_gen = { workspace = true } +proof_gen = { workspace = true } # Local dependencies common = { path = "../common" } diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index 494ebdff8..0ff99442f 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -3,7 +3,7 @@ use std::fs::File; use anyhow::Result; use clap::Parser; use common::prover_state::get_verifier_state_from_config; -use plonky_block_proof_gen::types::PlonkyProofIntern; +use proof_gen::types::PlonkyProofIntern; use serde_json::Deserializer; mod cli; From e6da9fad4254f50bb1c52854f8f7d493b132c804 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 21 Feb 2024 16:47:44 -0500 Subject: [PATCH 094/184] Pacify clippy --- zero_bin/common/src/prover_state/circuit.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/common/src/prover_state/circuit.rs b/zero_bin/common/src/prover_state/circuit.rs index a25396087..5813b6886 100644 --- a/zero_bin/common/src/prover_state/circuit.rs +++ b/zero_bin/common/src/prover_state/circuit.rs @@ -5,7 +5,7 @@ use std::{ str::FromStr, }; -use evm_arithmetization::{all_stark::AllStark, config::StarkConfig}; +use evm_arithmetization::{AllStark, StarkConfig}; use proof_gen::types::AllRecursiveCircuits; use crate::parsing::{parse_range, RangeParseError}; From d2cc50b2c455c4ff3300193b4cfb170669d0c1c9 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 21 Feb 2024 16:54:26 -0500 Subject: [PATCH 095/184] More clippy --- zero_bin/common/src/prover_state/persistence.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index c72327962..c55f15af1 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -106,7 +106,11 @@ pub fn verifier_to_disk(circuit: &VerifierData, circuit_config: &CircuitConfig) } fn write_bytes_to_file(bytes: &[u8], path: String) { - let file = OpenOptions::new().write(true).create(true).open(path); + let file = OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .open(path); let mut file = match file { Ok(file) => file, From 28356c086b3f74a46eb59c43a7227f5727fbeb28 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 21 Feb 2024 14:34:28 -0700 Subject: [PATCH 096/184] Logic to parse withdrawals from the full node --- zero_bin/rpc/src/rpc.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs index 209a22fc8..2abc255ec 100644 --- a/zero_bin/rpc/src/rpc.rs +++ b/zero_bin/rpc/src/rpc.rs @@ -104,6 +104,20 @@ struct EthGetBlockByNumberResult { parent_hash: H256, state_root: H256, timestamp: U256, + withdrawals: Vec, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct Withdrawal { + address: Address, + amount: U256, +} + +impl From for (Address, U256) { + fn from(v: Withdrawal) -> Self { + (v.address, v.amount) + } } /// The response from the `eth_getBlockByNumber` RPC method. @@ -289,6 +303,12 @@ impl From for OtherBlockData { block_bloom: bloom, }; + let withdrawals = block_by_number + .result + .withdrawals + .into_iter() + .map(|w| w.into()) + .collect(); Self { b_data: BlockLevelData { b_meta: block_metadata, @@ -296,6 +316,7 @@ impl From for OtherBlockData { prev_hashes, cur_hash: block_by_number.result.hash, }, + withdrawals, }, checkpoint_state_trie_root, } From 44d8060399bef2fb8513ef28bca4a72d696085b0 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Thu, 22 Feb 2024 16:12:59 -0800 Subject: [PATCH 097/184] Implement on-demand recursive circuit table loading (#21) * Implement on-demand recursive circuit table loading * Update common/src/prover_state/mod.rs Co-authored-by: Robin Salen <30937548+Nashtare@users.noreply.github.com> * Update common/src/prover_state/mod.rs Co-authored-by: Robin Salen <30937548+Nashtare@users.noreply.github.com> * Update common/src/prover_state/persistence.rs Co-authored-by: Robin Salen <30937548+Nashtare@users.noreply.github.com> * address PR feedback * Make table load strategy configurable from CLI --------- Co-authored-by: Robin Salen <30937548+Nashtare@users.noreply.github.com> --- zero_bin/Cargo.lock | 10 +- zero_bin/common/Cargo.toml | 2 + zero_bin/common/src/prover_state/circuit.rs | 47 ++- zero_bin/common/src/prover_state/cli.rs | 47 ++- zero_bin/common/src/prover_state/mod.rs | 355 ++++++++++++++---- .../common/src/prover_state/persistence.rs | 310 ++++++++++----- zero_bin/leader/src/main.rs | 14 +- zero_bin/ops/src/lib.rs | 17 +- zero_bin/verifier/src/main.rs | 8 +- zero_bin/worker/src/main.rs | 9 +- 10 files changed, 602 insertions(+), 217 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 9550dd495..f3560cc41 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -600,11 +600,13 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" name = "common" version = "0.1.0" dependencies = [ + "anyhow", "clap", "evm_arithmetization", "plonky2", "proof_gen", "thiserror", + "trace_decoder", "tracing", ] @@ -2736,18 +2738,18 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 909a0a276..8dc464d5e 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -15,3 +15,5 @@ proof_gen = { workspace = true } plonky2 = { workspace = true } evm_arithmetization = { workspace = true } clap = { workspace = true } +anyhow = { workspace = true } +trace_decoder = { workspace = true } diff --git a/zero_bin/common/src/prover_state/circuit.rs b/zero_bin/common/src/prover_state/circuit.rs index 5813b6886..6ab1a03a4 100644 --- a/zero_bin/common/src/prover_state/circuit.rs +++ b/zero_bin/common/src/prover_state/circuit.rs @@ -11,7 +11,9 @@ use proof_gen::types::AllRecursiveCircuits; use crate::parsing::{parse_range, RangeParseError}; /// Number of tables defined in plonky2. -const NUM_TABLES: usize = 7; +/// +/// TODO: This should be made public in the evm_arithmetization crate. +pub(crate) const NUM_TABLES: usize = 7; /// New type wrapper for [`Range`] that implements [`FromStr`] and [`Display`]. /// @@ -111,6 +113,19 @@ impl Circuit { Circuit::Memory => "memory", } } + + /// Get the circuit name as a short str literal. + pub const fn as_short_str(&self) -> &'static str { + match self { + Circuit::Arithmetic => "a", + Circuit::BytePacking => "bp", + Circuit::Cpu => "c", + Circuit::Keccak => "k", + Circuit::KeccakSponge => "ks", + Circuit::Logic => "l", + Circuit::Memory => "m", + } + } } impl From for Circuit { @@ -128,11 +143,27 @@ impl From for Circuit { } } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct CircuitConfig { circuits: [Range; NUM_TABLES], } +impl std::ops::Index for CircuitConfig { + type Output = Range; + + fn index(&self, index: usize) -> &Self::Output { + &self.circuits[index] + } +} + +impl std::ops::Index for CircuitConfig { + type Output = Range; + + fn index(&self, index: Circuit) -> &Self::Output { + &self.circuits[index as usize] + } +} + impl Default for CircuitConfig { fn default() -> Self { Self { @@ -176,16 +207,8 @@ impl CircuitConfig { /// Get a unique string representation of the config. pub fn get_configuration_digest(&self) -> String { self.enumerate() - .map(|(circuit, range)| match circuit { - Circuit::Arithmetic => format!("a_{}-{}", range.start, range.end), - Circuit::BytePacking => format!("b_p_{}-{}", range.start, range.end), - Circuit::Cpu => format!("c_{}-{}", range.start, range.end), - Circuit::Keccak => format!("k_{}-{}", range.start, range.end), - Circuit::KeccakSponge => { - format!("k_s_{}-{}", range.start, range.end) - } - Circuit::Logic => format!("l_{}-{}", range.start, range.end), - Circuit::Memory => format!("m_{}-{}", range.start, range.end), + .map(|(circuit, range)| { + format!("{}_{}-{}", circuit.as_short_str(), range.start, range.end) }) .fold(String::new(), |mut acc, s| { if !acc.is_empty() { diff --git a/zero_bin/common/src/prover_state/cli.rs b/zero_bin/common/src/prover_state/cli.rs index 51e067df6..5a78a1863 100644 --- a/zero_bin/common/src/prover_state/cli.rs +++ b/zero_bin/common/src/prover_state/cli.rs @@ -1,10 +1,12 @@ //! CLI arguments for constructing a [`CircuitConfig`], which can be used to //! construct table circuits. -use clap::Args; +use std::fmt::Display; + +use clap::{Args, ValueEnum}; use super::{ circuit::{Circuit, CircuitConfig, CircuitSize}, - CircuitPersistence, ProverStateConfig, + ProverStateManager, TableLoadStrategy, }; /// The help heading for the circuit arguments. @@ -21,6 +23,33 @@ fn circuit_arg_desc(circuit_name: &str) -> String { format!("The min/max size for the {circuit_name} table circuit.") } +/// Specifies whether to persist the processed circuits. +#[derive(Debug, Clone, Copy, ValueEnum)] +pub enum CircuitPersistence { + /// Do not persist the processed circuits. + None, + /// Persist the processed circuits to disk. + Disk, +} + +impl CircuitPersistence { + pub fn with_load_strategy(self, load_strategy: TableLoadStrategy) -> super::CircuitPersistence { + match self { + CircuitPersistence::None => super::CircuitPersistence::None, + CircuitPersistence::Disk => super::CircuitPersistence::Disk(load_strategy), + } + } +} + +impl Display for CircuitPersistence { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + CircuitPersistence::None => write!(f, "none"), + CircuitPersistence::Disk => write!(f, "disk"), + } + } +} + /// Macro for generating the [`CliCircuitConfig`] struct. macro_rules! gen_prover_state_config { ($($name:ident: $circuit:expr),*) => { @@ -28,6 +57,8 @@ macro_rules! gen_prover_state_config { pub struct CliProverStateConfig { #[clap(long, help_heading = HEADING, default_value_t = CircuitPersistence::Disk)] pub persistence: CircuitPersistence, + #[clap(long, help_heading = HEADING, default_value_t = TableLoadStrategy::OnDemand)] + pub load_strategy: TableLoadStrategy, $( #[clap( @@ -73,16 +104,16 @@ impl CliProverStateConfig { config } - pub fn into_prover_state_config(self) -> ProverStateConfig { - ProverStateConfig { - persistence: self.persistence, + pub fn into_prover_state_manager(self) -> ProverStateManager { + ProverStateManager { + persistence: self.persistence.with_load_strategy(self.load_strategy), circuit_config: self.into_circuit_config(), } } } -impl From for ProverStateConfig { - fn from(item: CliProverStateConfig) -> Self { - item.into_prover_state_config() +impl From for ProverStateManager { + fn from(config: CliProverStateConfig) -> Self { + config.into_prover_state_manager() } } diff --git a/zero_bin/common/src/prover_state/mod.rs b/zero_bin/common/src/prover_state/mod.rs index c9af6c2b1..090201f16 100644 --- a/zero_bin/common/src/prover_state/mod.rs +++ b/zero_bin/common/src/prover_state/mod.rs @@ -2,23 +2,48 @@ //! //! This module provides the following: //! - [`Circuit`] and [`CircuitConfig`] which can be used to dynamically -//! construct [`AllRecursiveCircuits`] from the specified circuit sizes. +//! construct [`evm_arithmetization::fixed_recursive_verifier::AllRecursiveCircuits`] +//! from the specified circuit sizes. //! - Command line arguments for constructing a [`CircuitConfig`]. //! - Provides default values for the circuit sizes. //! - Allows the circuit sizes to be specified via environment variables. -//! - Persistence utilities for saving and loading [`AllRecursiveCircuits`]. +//! - Persistence utilities for saving and loading +//! [`evm_arithmetization::fixed_recursive_verifier::AllRecursiveCircuits`]. //! - Global prover state management via the [`P_STATE`] static and the //! [`set_prover_state_from_config`] function. use std::{fmt::Display, sync::OnceLock}; use clap::ValueEnum; -use proof_gen::{prover_state::ProverState, VerifierState}; +use evm_arithmetization::{proof::AllProof, prover::prove, AllStark, StarkConfig}; +use plonky2::{ + field::goldilocks_field::GoldilocksField, plonk::config::PoseidonGoldilocksConfig, + util::timing::TimingTree, +}; +use proof_gen::{proof_types::GeneratedTxnProof, prover_state::ProverState, VerifierState}; +use trace_decoder::types::TxnProofGenIR; use tracing::info; +use self::circuit::{CircuitConfig, NUM_TABLES}; +use crate::prover_state::persistence::{ + BaseProverResource, DiskResource, MonolithicProverResource, RecursiveCircuitResource, + VerifierResource, +}; + pub mod circuit; pub mod cli; pub mod persistence; +pub(crate) type Config = PoseidonGoldilocksConfig; +pub(crate) type Field = GoldilocksField; +pub(crate) const SIZE: usize = 2; + +pub(crate) type RecursiveCircuitsForTableSize = + evm_arithmetization::fixed_recursive_verifier::RecursiveCircuitsForTableSize< + Field, + Config, + SIZE, + >; + /// The global prover state. /// /// It is specified as a `OnceLock` for the following reasons: @@ -28,107 +53,281 @@ pub mod persistence; /// - This scheme works for both a cluster and a single machine. In particular, /// whether imported from a worker node or a thread in the leader node /// (in-memory mode), the prover state is initialized only once. -pub static P_STATE: OnceLock = OnceLock::new(); +static P_STATE: OnceLock = OnceLock::new(); + +/// The global prover state manager. +/// +/// Unlike the prover state, the prover state manager houses configuration and +/// persistence information. This allows it to differentiate between the +/// different transaction proof generation strategies. As such, it is generally +/// only necessary when generating transaction proofs. +/// +/// It's specified as a `OnceLock` for the same reasons as the prover state. +static MANAGER: OnceLock = OnceLock::new(); + +pub fn p_state() -> &'static ProverState { + P_STATE.get().expect("Prover state is not initialized") +} + +pub fn p_manager() -> &'static ProverStateManager { + MANAGER + .get() + .expect("Prover state manager is not initialized") +} + +/// Specifies how to load the table circuits. +#[derive(Debug, Clone, Copy, Default, ValueEnum)] +pub enum TableLoadStrategy { + #[default] + /// Load the circuit tables as needed for shrinking STARK proofs. + /// + /// - Generate a STARK proof. + /// - Compute the degree bits. + /// - Load the necessary table circuits. + OnDemand, + /// Load all the table circuits into a monolithic bundle. + Monolithic, +} + +impl Display for TableLoadStrategy { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + TableLoadStrategy::OnDemand => write!(f, "on-demand"), + TableLoadStrategy::Monolithic => write!(f, "monolithic"), + } + } +} /// Specifies whether to persist the processed circuits. -#[derive(Debug, Clone, Copy, ValueEnum)] +#[derive(Debug, Clone, Copy)] pub enum CircuitPersistence { /// Do not persist the processed circuits. None, /// Persist the processed circuits to disk. - Disk, + Disk(TableLoadStrategy), } -impl Display for CircuitPersistence { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - CircuitPersistence::None => write!(f, "none"), - CircuitPersistence::Disk => write!(f, "disk"), - } +impl Default for CircuitPersistence { + fn default() -> Self { + CircuitPersistence::Disk(TableLoadStrategy::default()) } } /// Product of [`CircuitConfig`] and [`CircuitPersistence`]. -#[derive(Debug)] -pub struct ProverStateConfig { - pub circuit_config: circuit::CircuitConfig, +/// +/// Provides helper utilities for interacting with the prover state in +/// accordance with the specified configuration and persistence strategy. +#[derive(Default, Debug, Clone)] +pub struct ProverStateManager { + pub circuit_config: CircuitConfig, pub persistence: CircuitPersistence, } -/// Initializes the global prover state. -pub fn set_prover_state_from_config( - ProverStateConfig { - circuit_config, - persistence, - }: ProverStateConfig, -) -> Result<(), ProverState> { - info!("initializing prover state..."); - let state = match persistence { - CircuitPersistence::None => { - info!("generating circuits..."); - ProverState { - state: circuit_config.as_all_recursive_circuits(), +impl ProverStateManager { + pub fn with_load_strategy(self, load_strategy: TableLoadStrategy) -> Self { + match self.persistence { + CircuitPersistence::None => self, + CircuitPersistence::Disk(_) => Self { + circuit_config: self.circuit_config, + persistence: CircuitPersistence::Disk(load_strategy), + }, + } + } + + /// Load the table circuits necessary to shrink the STARK proof. + /// + /// [`AllProof`] provides the necessary degree bits for each circuit via the + /// [`AllProof::degree_bits`] method. + /// Using this information, for each circuit, a tuple is returned, + /// containing: + /// 1. The loaded table circuit at the specified size. + /// 2. An offset indicating the position of the specified size within the + /// configured range used when pre-generating the circuits. + fn load_table_circuits( + &self, + config: &StarkConfig, + all_proof: &AllProof, + ) -> anyhow::Result<[(RecursiveCircuitsForTableSize, u8); NUM_TABLES]> { + let degrees = all_proof.degree_bits(config); + + /// Given a recursive circuit index (e.g., Arithmetic / 0), return a + /// tuple containing the loaded table at the specified size and + /// its offset relative to the configured range used to pre-process the + /// circuits. + macro_rules! circuit { + ($circuit_index:expr) => { + ( + RecursiveCircuitResource::get(&( + $circuit_index.into(), + degrees[$circuit_index], + )) + .map_err(|e| { + let circuit: $crate::prover_state::circuit::Circuit = $circuit_index.into(); + let size = degrees[$circuit_index]; + anyhow::Error::from(e).context(format!( + "Attempting to load circuit: {circuit:?} at size: {size}" + )) + })?, + (degrees[$circuit_index] - self.circuit_config[$circuit_index].start) as u8, + ) + }; + } + + Ok([ + circuit!(0), + circuit!(1), + circuit!(2), + circuit!(3), + circuit!(4), + circuit!(5), + circuit!(6), + ]) + } + + /// Generate a transaction proof using the specified input, loading the + /// circuit tables as needed to shrink the individual STARK proofs, and + /// finally aggregating them to a final transaction proof. + fn txn_proof_on_demand(&self, input: TxnProofGenIR) -> anyhow::Result { + let config = StarkConfig::standard_fast_config(); + let all_stark = AllStark::default(); + let all_proof = prove(&all_stark, &config, input, &mut TimingTree::default(), None)?; + + let table_circuits = self.load_table_circuits(&config, &all_proof)?; + + let (intern, p_vals) = + p_state() + .state + .prove_root_after_initial_stark(all_proof, &table_circuits, None)?; + + Ok(GeneratedTxnProof { intern, p_vals }) + } + + /// Generate a transaction proof using the specified input on the monolithic + /// circuit. + fn txn_proof_monolithic(&self, input: TxnProofGenIR) -> anyhow::Result { + let (intern, p_vals) = p_state().state.prove_root( + &AllStark::default(), + &StarkConfig::standard_fast_config(), + input, + &mut TimingTree::default(), + None, + )?; + + Ok(GeneratedTxnProof { p_vals, intern }) + } + + /// Generate a transaction proof using the specified input. + /// + /// The specific implementation depends on the persistence strategy. + /// - If the persistence strategy is [`CircuitPersistence::None`] or + /// [`CircuitPersistence::Disk`] with [`TableLoadStrategy::Monolithic`], + /// the monolithic circuit is used. + /// - If the persistence strategy is [`CircuitPersistence::Disk`] with + /// [`TableLoadStrategy::OnDemand`], the table circuits are loaded as + /// needed. + pub fn generate_txn_proof(&self, input: TxnProofGenIR) -> anyhow::Result { + match self.persistence { + CircuitPersistence::None | CircuitPersistence::Disk(TableLoadStrategy::Monolithic) => { + info!("using monolithic circuit {:?}", self); + self.txn_proof_monolithic(input) + } + CircuitPersistence::Disk(TableLoadStrategy::OnDemand) => { + info!("using on demand circuit {:?}", self); + self.txn_proof_on_demand(input) } } - CircuitPersistence::Disk => { - info!("attempting to load preprocessed circuits from disk..."); - let disk_state = persistence::prover_from_disk(&circuit_config); - match disk_state { - Some(circuits) => { - info!("successfully loaded preprocessed circuits from disk"); - ProverState { state: circuits } + } + + /// Initialize global prover state from the configuration. + pub fn initialize(&self) -> anyhow::Result<()> { + info!("initializing prover state..."); + + let state = match self.persistence { + CircuitPersistence::None => { + info!("generating circuits..."); + ProverState { + state: self.circuit_config.as_all_recursive_circuits(), } - None => { - info!("failed to load preprocessed circuits from disk. generating circuits..."); - let all_recursive_circuits = circuit_config.as_all_recursive_circuits(); - info!("saving preprocessed circuits to disk"); - persistence::to_disk(&all_recursive_circuits, &circuit_config); - ProverState { - state: all_recursive_circuits, + } + CircuitPersistence::Disk(strategy) => { + info!("attempting to load preprocessed circuits from disk..."); + + let disk_state = match strategy { + TableLoadStrategy::OnDemand => BaseProverResource::get(&self.circuit_config), + TableLoadStrategy::Monolithic => { + MonolithicProverResource::get(&self.circuit_config) + } + }; + + match disk_state { + Ok(circuits) => { + info!("successfully loaded preprocessed circuits from disk"); + ProverState { state: circuits } + } + Err(_) => { + info!("failed to load preprocessed circuits from disk. generating circuits..."); + let all_recursive_circuits = + self.circuit_config.as_all_recursive_circuits(); + info!("saving preprocessed circuits to disk"); + persistence::persist_all_to_disk( + &all_recursive_circuits, + &self.circuit_config, + )?; + ProverState { + state: all_recursive_circuits, + } } } } - } - }; + }; - P_STATE.set(state) -} + P_STATE.set(state).map_err(|_| { + anyhow::Error::msg( + "prover state already set. check the program logic to ensure it is only set once", + ) + .context("setting prover state") + })?; + + MANAGER.set(self.clone()).map_err(|_| { + anyhow::Error::msg( + "prover state manager already set. check the program logic to ensure it is only set once", + ) + .context("setting prover state manager") + })?; -/// Loads a verifier state from disk or generate it. -pub fn get_verifier_state_from_config( - ProverStateConfig { - circuit_config, - persistence, - }: ProverStateConfig, -) -> VerifierState { - info!("initializing verifier state..."); - match persistence { - CircuitPersistence::None => { - info!("generating circuit..."); - let prover_state = circuit_config.as_all_recursive_circuits(); - VerifierState { - state: prover_state.final_verifier_data(), + Ok(()) + } + + /// Loads a verifier state from disk or generate it. + pub fn verifier(&self) -> anyhow::Result { + info!("initializing verifier state..."); + match self.persistence { + CircuitPersistence::None => { + info!("generating circuit..."); + let prover_state = self.circuit_config.as_all_recursive_circuits(); + Ok(VerifierState { + state: prover_state.final_verifier_data(), + }) } - } - CircuitPersistence::Disk => { - info!("attempting to load preprocessed verifier circuit from disk..."); - let disk_state = persistence::verifier_from_disk(&circuit_config); - match disk_state { - Some(state) => { - info!("successfully loaded preprocessed verifier circuit from disk"); - VerifierState { state } - } - None => { - info!( - "failed to load preprocessed verifier circuit from disk. generating it..." - ); - let prover_state = circuit_config.as_all_recursive_circuits(); + CircuitPersistence::Disk(_) => { + info!("attempting to load preprocessed verifier circuit from disk..."); + let disk_state = VerifierResource::get(&self.circuit_config); - info!("saving preprocessed verifier circuit to disk"); - let state = prover_state.final_verifier_data(); - persistence::verifier_to_disk(&state, &circuit_config); + match disk_state { + Ok(state) => { + info!("successfully loaded preprocessed verifier circuit from disk"); + Ok(VerifierState { state }) + } + Err(_) => { + info!("failed to load preprocessed verifier circuit from disk. generating it..."); + let prover_state = self.circuit_config.as_all_recursive_circuits(); + + info!("saving preprocessed verifier circuit to disk"); + let state = prover_state.final_verifier_data(); + VerifierResource::put(&self.circuit_config, &state)?; - VerifierState { state } + Ok(VerifierState { state }) + } } } } diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index c55f15af1..d807df3a9 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -1,126 +1,256 @@ use std::{ + fmt::{Debug, Display}, fs::{self, OpenOptions}, io::Write, + path::Path, }; -use plonky2::{ - plonk::config::PoseidonGoldilocksConfig, - util::serialization::{DefaultGateSerializer, DefaultGeneratorSerializer}, +use plonky2::util::serialization::{ + Buffer, DefaultGateSerializer, DefaultGeneratorSerializer, IoError, }; use proof_gen::types::{AllRecursiveCircuits, VerifierData}; -use tracing::{info, warn}; +use thiserror::Error; -use super::circuit::CircuitConfig; +use super::{ + circuit::{Circuit, CircuitConfig}, + Config, RecursiveCircuitsForTableSize, SIZE, +}; -type Config = PoseidonGoldilocksConfig; -const SIZE: usize = 2; const PROVER_STATE_FILE_PREFIX: &str = "./prover_state"; const VERIFIER_STATE_FILE_PREFIX: &str = "./verifier_state"; -fn get_serializers() -> (DefaultGateSerializer, DefaultGeneratorSerializer) { +fn get_serializers() -> ( + DefaultGateSerializer, + DefaultGeneratorSerializer, +) { let gate_serializer = DefaultGateSerializer; - let witness_serializer: DefaultGeneratorSerializer = DefaultGeneratorSerializer { - _phantom: Default::default(), - }; + let witness_serializer: DefaultGeneratorSerializer = + DefaultGeneratorSerializer::default(); (gate_serializer, witness_serializer) } -#[inline] -fn disk_path(circuit_config: &CircuitConfig, prefix: &str) -> String { - format!("{}_{}", prefix, circuit_config.get_configuration_digest()) +#[derive(Error, Debug)] +pub(crate) enum DiskResourceError { + #[error("Serialization error: {0}")] + Serialization(E), + #[error("IO error: {0}")] + IoError(#[from] std::io::Error), } -/// Loads [`AllRecursiveCircuits`] from disk. -pub fn prover_from_disk(circuit_config: &CircuitConfig) -> Option { - let path = disk_path(circuit_config, PROVER_STATE_FILE_PREFIX); - let bytes = fs::read(&path).ok()?; - info!("found prover state at {path}"); - let (gate_serializer, witness_serializer) = get_serializers(); - info!("deserializing prover state..."); - let state = - AllRecursiveCircuits::from_bytes(&bytes, false, &gate_serializer, &witness_serializer); - - match state { - Ok(state) => Some(state), - Err(e) => { - warn!("failed to deserialize prover state, {e:?}"); - None - } +/// A trait for generic resources that may be written to and read from disk, +/// each with their own serialization and deserialization logic. +pub(crate) trait DiskResource { + /// The type of error that may arise while serializing or deserializing the + /// resource. + type Error: Debug + Display; + /// The type of resource being serialized, deserialized, and written to + /// disk. + type Resource; + /// The input type / configuration used to generate a unique path to the + /// resource on disk. + type PathConstrutor; + + /// Returns the path to the resource on disk. + fn path(p: &Self::PathConstrutor) -> impl AsRef; + + /// Serializes the resource to bytes. + fn serialize(r: &Self::Resource) -> Result, DiskResourceError>; + + /// Deserializes the resource from bytes. + fn deserialize(bytes: &[u8]) -> Result>; + + /// Reads the resource from disk and deserializes it. + fn get(p: &Self::PathConstrutor) -> Result> { + Self::deserialize(&fs::read(Self::path(p))?) + } + + /// Writes the resource to disk after serializing it. + fn put( + p: &Self::PathConstrutor, + r: &Self::Resource, + ) -> Result<(), DiskResourceError> { + Ok(OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .open(Self::path(p))? + .write_all(&Self::serialize(r)?)?) } } -/// Loads [`VerifierData`] from disk. -pub fn verifier_from_disk(circuit_config: &CircuitConfig) -> Option { - let path = disk_path(circuit_config, VERIFIER_STATE_FILE_PREFIX); - let bytes = fs::read(&path).ok()?; - info!("found verifier state at {path}"); - let (gate_serializer, _witness_serializer) = get_serializers(); - info!("deserializing verifier state..."); - let state = VerifierData::from_bytes(bytes, &gate_serializer); - - match state { - Ok(state) => Some(state), - Err(e) => { - warn!("failed to deserialize verifier state, {e:?}"); - None - } +/// Pre-generated circuits containing just the three higher-level circuits. +/// These are sufficient for generating aggregation proofs and block +/// proofs, but not for transaction proofs. +#[derive(Debug, Default)] +pub(crate) struct BaseProverResource; + +impl DiskResource for BaseProverResource { + type Resource = AllRecursiveCircuits; + type Error = IoError; + type PathConstrutor = CircuitConfig; + + fn path(p: &Self::PathConstrutor) -> String { + format!( + "{}_base_{}", + PROVER_STATE_FILE_PREFIX, + p.get_configuration_digest() + ) + } + + fn serialize(r: &Self::Resource) -> Result, DiskResourceError> { + let (gate_serializer, witness_serializer) = get_serializers(); + + r + // Note we are using the `true` flag to write only the upper circuits. + // The individual circuit tables are written separately below. + .to_bytes(true, &gate_serializer, &witness_serializer) + .map_err(DiskResourceError::Serialization) + } + + fn deserialize(bytes: &[u8]) -> Result> { + let (gate_serializer, witness_serializer) = get_serializers(); + AllRecursiveCircuits::from_bytes(bytes, true, &gate_serializer, &witness_serializer) + .map_err(DiskResourceError::Serialization) } } -/// Writes the provided [`AllRecursiveCircuits`] to disk, along with the -/// associated [`VerifierData`], in two distinct files. -pub fn to_disk(circuits: &AllRecursiveCircuits, circuit_config: &CircuitConfig) { - prover_to_disk(circuits, circuit_config); - verifier_to_disk(&circuits.final_verifier_data(), circuit_config); +/// Pre-generated circuits containing all circuits. +#[derive(Debug, Default)] +pub(crate) struct MonolithicProverResource; + +impl DiskResource for MonolithicProverResource { + type Resource = AllRecursiveCircuits; + type Error = IoError; + type PathConstrutor = CircuitConfig; + + fn path(p: &Self::PathConstrutor) -> String { + format!( + "{}_monolithic_{}", + PROVER_STATE_FILE_PREFIX, + p.get_configuration_digest() + ) + } + + fn serialize(r: &Self::Resource) -> Result, DiskResourceError> { + let (gate_serializer, witness_serializer) = get_serializers(); + + r + // Note we are using the `false` flag to write all circuits. + .to_bytes(false, &gate_serializer, &witness_serializer) + .map_err(DiskResourceError::Serialization) + } + + fn deserialize(bytes: &[u8]) -> Result> { + let (gate_serializer, witness_serializer) = get_serializers(); + AllRecursiveCircuits::from_bytes(bytes, false, &gate_serializer, &witness_serializer) + .map_err(DiskResourceError::Serialization) + } } -/// Writes the provided [`AllRecursiveCircuits`] to disk. -fn prover_to_disk(circuits: &AllRecursiveCircuits, circuit_config: &CircuitConfig) { - let (gate_serializer, witness_serializer) = get_serializers(); - - // Write prover state to disk - if let Err(e) = circuits - .to_bytes(false, &gate_serializer, &witness_serializer) - .map(|bytes| { - write_bytes_to_file(&bytes, disk_path(circuit_config, PROVER_STATE_FILE_PREFIX)) - }) - { - warn!("failed to create prover state file, {e:?}"); - }; +/// An individual circuit table with a specific size. +#[derive(Debug, Default)] +pub(crate) struct RecursiveCircuitResource; + +impl DiskResource for RecursiveCircuitResource { + type Resource = RecursiveCircuitsForTableSize; + type Error = IoError; + type PathConstrutor = (Circuit, usize); + + fn path((circuit_type, size): &Self::PathConstrutor) -> String { + format!( + "{}_{}_{}", + PROVER_STATE_FILE_PREFIX, + circuit_type.as_short_str(), + size + ) + } + + fn serialize(r: &Self::Resource) -> Result, DiskResourceError> { + let (gate_serializer, witness_serializer) = get_serializers(); + let mut buf = Vec::new(); + + r.to_buffer(&mut buf, &gate_serializer, &witness_serializer) + .map_err(DiskResourceError::Serialization)?; + + Ok(buf) + } + + fn deserialize( + bytes: &[u8], + ) -> Result> { + let (gate_serializer, witness_serializer) = get_serializers(); + let mut buffer = Buffer::new(bytes); + RecursiveCircuitsForTableSize::from_buffer( + &mut buffer, + &gate_serializer, + &witness_serializer, + ) + .map_err(DiskResourceError::Serialization) + } } -/// Writes the provided [`VerifierData`] to disk. -pub fn verifier_to_disk(circuit: &VerifierData, circuit_config: &CircuitConfig) { - let (gate_serializer, _witness_serializer) = get_serializers(); +/// An individual circuit table with a specific size. +#[derive(Debug, Default)] +pub(crate) struct VerifierResource; + +impl DiskResource for VerifierResource { + type Resource = VerifierData; + type Error = IoError; + type PathConstrutor = CircuitConfig; - // Write verifier state to disk - if let Err(e) = circuit.to_bytes(&gate_serializer).map(|bytes| { - write_bytes_to_file( - &bytes, - disk_path(circuit_config, VERIFIER_STATE_FILE_PREFIX), + fn path(p: &Self::PathConstrutor) -> String { + format!( + "{}_{}", + VERIFIER_STATE_FILE_PREFIX, + p.get_configuration_digest() ) - }) { - warn!("failed to create verifier state file, {e:?}"); - }; + } + + fn serialize(r: &Self::Resource) -> Result, DiskResourceError> { + let (gate_serializer, _witness_serializer) = get_serializers(); + r.to_bytes(&gate_serializer) + .map_err(DiskResourceError::Serialization) + } + + fn deserialize(bytes: &[u8]) -> Result> { + let (gate_serializer, _) = get_serializers(); + VerifierData::from_bytes(bytes.to_vec(), &gate_serializer) + .map_err(DiskResourceError::Serialization) + } } -fn write_bytes_to_file(bytes: &[u8], path: String) { - let file = OpenOptions::new() - .write(true) - .create(true) - .truncate(true) - .open(path); - - let mut file = match file { - Ok(file) => file, - Err(e) => { - warn!("failed to create circuits file, {e:?}"); - return; - } - }; +/// Writes the provided [`AllRecursiveCircuits`] to disk with all +/// configurations, along with the associated [`VerifierData`]. +pub fn persist_all_to_disk( + circuits: &AllRecursiveCircuits, + circuit_config: &CircuitConfig, +) -> anyhow::Result<()> { + prover_to_disk(circuit_config, circuits)?; + VerifierResource::put(circuit_config, &circuits.final_verifier_data())?; - if let Err(e) = file.write_all(bytes) { - warn!("failed to write circuits file, {e:?}"); + Ok(()) +} + +/// Writes the provided [`AllRecursiveCircuits`] to disk. +/// +/// In particular, we cover both the monolothic and base prover states, as well +/// as the individual circuit tables. +fn prover_to_disk( + circuit_config: &CircuitConfig, + circuits: &AllRecursiveCircuits, +) -> Result<(), DiskResourceError> { + BaseProverResource::put(circuit_config, circuits)?; + MonolithicProverResource::put(circuit_config, circuits)?; + + // Write individual circuit tables to disk, by circuit type and size. This + // allows us to load only the necessary tables when needed. + for (circuit_type, tables) in circuits.by_table.iter().enumerate() { + let circuit_type: Circuit = circuit_type.into(); + for (size, table) in tables.by_stark_size.iter() { + RecursiveCircuitResource::put(&(circuit_type, *size), table)?; + } } + + Ok(()) } diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 06590507b..36d2f1e3b 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -3,12 +3,11 @@ use std::{fs::File, path::PathBuf}; use anyhow::Result; use clap::Parser; use cli::Command; -use common::prover_state::set_prover_state_from_config; +use common::prover_state::TableLoadStrategy; use dotenvy::dotenv; use ops::register; use paladin::runtime::Runtime; use proof_gen::types::PlonkyProofIntern; -use tracing::warn; mod cli; mod http; @@ -37,11 +36,12 @@ async fn main() -> Result<()> { if let paladin::config::Runtime::InMemory = args.paladin.runtime { // If running in emulation mode, we'll need to initialize the prover // state here. - if set_prover_state_from_config(args.prover_state_config.into()).is_err() { - warn!( - "prover state already set. check the program logic to ensure it is only set once" - ); - } + args.prover_state_config + .into_prover_state_manager() + // Use the monolithic load strategy for the prover state when running in + // emulation mode. + .with_load_strategy(TableLoadStrategy::Monolithic) + .initialize()?; } let runtime = Runtime::from_config(&args.paladin, register()).await?; diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 80fc2376f..b51cff5f7 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,20 +1,15 @@ -use common::prover_state::P_STATE; +use common::prover_state::{p_manager, p_state}; use paladin::{ - operation::{FatalError, Monoid, Operation, Result}, + operation::{FatalError, FatalStrategy, Monoid, Operation, Result}, registry, RemoteExecute, }; use proof_gen::{ - proof_gen::{generate_agg_proof, generate_block_proof, generate_txn_proof}, + proof_gen::{generate_agg_proof, generate_block_proof}, proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, - prover_state::ProverState, }; use serde::{Deserialize, Serialize}; use trace_decoder::types::TxnProofGenIR; -fn p_state() -> &'static ProverState { - P_STATE.get().expect("Prover state is not initialized") -} - registry!(); #[derive(Deserialize, Serialize, RemoteExecute)] @@ -25,9 +20,11 @@ impl Operation for TxProof { type Output = AggregatableProof; fn execute(&self, input: Self::Input) -> Result { - let result = generate_txn_proof(p_state(), input, None).map_err(FatalError::from)?; + let proof = p_manager() + .generate_txn_proof(input) + .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; - Ok(result.into()) + Ok(proof.into()) } } diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index 0ff99442f..60ba1d520 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -2,7 +2,6 @@ use std::fs::File; use anyhow::Result; use clap::Parser; -use common::prover_state::get_verifier_state_from_config; use proof_gen::types::PlonkyProofIntern; use serde_json::Deserializer; @@ -17,9 +16,12 @@ fn main() -> Result<()> { let des = &mut Deserializer::from_reader(&file); let input: PlonkyProofIntern = serde_path_to_error::deserialize(des)?; - let verifier_state = get_verifier_state_from_config(args.prover_state_config.into()); + let verifer = args + .prover_state_config + .into_prover_state_manager() + .verifier()?; - verifier_state.verify(&input)?; + verifer.verify(&input)?; Ok(()) } diff --git a/zero_bin/worker/src/main.rs b/zero_bin/worker/src/main.rs index 7048d5913..d24ee23ad 100644 --- a/zero_bin/worker/src/main.rs +++ b/zero_bin/worker/src/main.rs @@ -1,10 +1,9 @@ use anyhow::Result; use clap::Parser; -use common::prover_state::{cli::CliProverStateConfig, set_prover_state_from_config}; +use common::prover_state::cli::CliProverStateConfig; use dotenvy::dotenv; use ops::register; use paladin::runtime::WorkerRuntime; -use tracing::warn; mod init; @@ -22,9 +21,9 @@ async fn main() -> Result<()> { init::tracing(); let args = Cli::parse(); - if set_prover_state_from_config(args.prover_state_config.into()).is_err() { - warn!("prover state already set. check the program logic to ensure it is only set once"); - } + args.prover_state_config + .into_prover_state_manager() + .initialize()?; let runtime = WorkerRuntime::from_config(&args.paladin, register()).await?; runtime.main_loop().await?; From 3a1a81ddb2b25504773c0f4c53040cf9650d308b Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 27 Feb 2024 22:44:58 +0000 Subject: [PATCH 098/184] Create CODEOWNERS --- zero_bin/.github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 zero_bin/.github/CODEOWNERS diff --git a/zero_bin/.github/CODEOWNERS b/zero_bin/.github/CODEOWNERS new file mode 100644 index 000000000..deb924f18 --- /dev/null +++ b/zero_bin/.github/CODEOWNERS @@ -0,0 +1 @@ +* @cpubot @muursh From cc9b0436b9d3ee78caaaf854fa6891b7b1df6e24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 07:25:33 +0000 Subject: [PATCH 099/184] Bump h2 from 0.3.21 to 0.3.24 Bumps [h2](https://github.com/hyperium/h2) from 0.3.21 to 0.3.24. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/v0.3.24/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.21...v0.3.24) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- zero_bin/Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index f3560cc41..b83eae276 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1216,9 +1216,9 @@ checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "h2" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -1226,7 +1226,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.0.2", "slab", "tokio", "tokio-util", From 08112975c1f8e8bc15cc2607dfbe6f706bcfcafb Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 1 Mar 2024 09:38:50 +0900 Subject: [PATCH 100/184] Update deps --- zero_bin/Cargo.lock | 20 ++++++++++---------- zero_bin/Cargo.toml | 10 ++++++---- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index f3560cc41..f457cacb9 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -969,9 +969,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "evm_arithmetization" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d80801ec98b39dde6182d34f76f11abe050302f36d8847bfcd4456ecd990c9b" +checksum = "ef2af65f5b147f04c94df5df5e21ff9d1632fd357511e183d5e04de059d6fa93" dependencies = [ "anyhow", "bytes", @@ -1771,9 +1771,9 @@ dependencies = [ [[package]] name = "mpt_trie" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cc408af26fe8f58787fb1be1a3bbfdd041bc36a15d4075fdadde07028469381" +checksum = "bbf6d77f630021e46e127abfa047aebfba78bf207ed3dfd1c4f9e2370f9b60cd" dependencies = [ "bytes", "enum-as-inner", @@ -2303,9 +2303,9 @@ dependencies = [ [[package]] name = "proof_gen" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a304cfc3e741ebb7bc40258d0da52c0f2924b6817372d15f051e02673af3aa" +checksum = "657003bc7dcee8b7c487807b8c9e6bf8aef8413f80501948a948b40c885ab7e7" dependencies = [ "ethereum-types", "evm_arithmetization", @@ -2910,9 +2910,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "starky" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2edb3b04ef3bb95f31805b9c88a9de39767089adadc1966ddc3c43348a11464a" +checksum = "24e0a1eec739c7a67cb1c6f916c0b7bf2d281cf2edb35d3db5caa6989090133e" dependencies = [ "ahash", "anyhow", @@ -3239,9 +3239,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "trace_decoder" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5719c4c8f671ee782b78df96e7832207a2486a4fa137b20a3885beaf3a4ad724" +checksum = "f08487265f29176ad03c894b1c1cf8da5adf9d82fc151b3191eb7f55350b5c58" dependencies = [ "bytes", "ciborium", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index a720a3288..f8b93e5e9 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -11,15 +11,17 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4.4.6", features = ["derive", "env"] } tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" -proof_gen = "0.1.0" -trace_decoder = "0.1.0" -evm_arithmetization = "0.1.0" -plonky2 = "0.2.0" serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" thiserror = "1.0.50" +# zk-evm dependencies +plonky2 = "0.2.0" +evm_arithmetization = "0.1.1" +trace_decoder = "0.1.1" +proof_gen = "0.1.1" + [workspace.package] edition = "2021" license = "MIT OR Apache-2.0" From 7c42df1b9fc6b812d538116e7c87dfd7923999b5 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 1 Mar 2024 11:13:09 +0900 Subject: [PATCH 101/184] Add testing mode for debugging --- zero_bin/Cargo.lock | 1 + zero_bin/leader/Cargo.toml | 4 +++ zero_bin/ops/Cargo.toml | 5 ++++ zero_bin/ops/src/lib.rs | 40 ++++++++++++++++++++++++++---- zero_bin/prover/Cargo.toml | 4 +++ zero_bin/prover/src/lib.rs | 50 +++++++++++++++++++++++++++++--------- 6 files changed, 88 insertions(+), 16 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index f457cacb9..65c630e2c 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1924,6 +1924,7 @@ name = "ops" version = "0.1.0" dependencies = [ "common", + "evm_arithmetization", "paladin-core", "proof_gen", "serde", diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 84470fb95..b7c0f964b 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -28,3 +28,7 @@ ops = { path = "../ops" } prover = { path = "../prover" } rpc = { path = "../rpc" } common = { path = "../common" } + +[features] +default = [] +test_only = ["ops/test_only", "prover/test_only"] diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index f086bdb53..48235c647 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -11,7 +11,12 @@ categories.workspace = true [dependencies] paladin-core = { workspace = true } serde = { workspace = true } +evm_arithmetization = { workspace = true, optional = true} proof_gen = { workspace = true } trace_decoder = { workspace = true } common = { path = "../common" } + +[features] +default = [] +test_only = ["evm_arithmetization"] diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index b51cff5f7..be8358e5b 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,11 +1,13 @@ -use common::prover_state::{p_manager, p_state}; +use common::prover_state::p_state; use paladin::{ operation::{FatalError, FatalStrategy, Monoid, Operation, Result}, registry, RemoteExecute, }; +#[cfg(not(feature = "test_only"))] +use proof_gen::{proof_gen::generate_agg_proof, proof_types::AggregatableProof}; use proof_gen::{ - proof_gen::{generate_agg_proof, generate_block_proof}, - proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, + proof_gen::generate_block_proof, + proof_types::{GeneratedAggProof, GeneratedBlockProof}, }; use serde::{Deserialize, Serialize}; use trace_decoder::types::TxnProofGenIR; @@ -15,12 +17,13 @@ registry!(); #[derive(Deserialize, Serialize, RemoteExecute)] pub struct TxProof; +#[cfg(not(feature = "test_only"))] impl Operation for TxProof { type Input = TxnProofGenIR; - type Output = AggregatableProof; + type Output = proof_gen::proof_types::AggregatableProof; fn execute(&self, input: Self::Input) -> Result { - let proof = p_manager() + let proof = common::prover_state::p_manager() .generate_txn_proof(input) .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; @@ -28,9 +31,25 @@ impl Operation for TxProof { } } +#[cfg(feature = "test_only")] +impl Operation for TxProof { + type Input = TxnProofGenIR; + type Output = (); + + fn execute(&self, input: Self::Input) -> Result { + let _run = evm_arithmetization::prover::testing::simulate_execution::< + proof_gen::types::Field, + >(input) + .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; + + Ok(()) + } +} + #[derive(Deserialize, Serialize, RemoteExecute)] pub struct AggProof; +#[cfg(not(feature = "test_only"))] impl Monoid for AggProof { type Elem = AggregatableProof; @@ -46,6 +65,17 @@ impl Monoid for AggProof { } } +#[cfg(feature = "test_only")] +impl Monoid for AggProof { + type Elem = (); + + fn combine(&self, _a: Self::Elem, _b: Self::Elem) -> Result { + Ok(()) + } + + fn empty(&self) -> () {} +} + #[derive(Deserialize, Serialize, RemoteExecute)] pub struct BlockProof { pub prev: Option, diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 56b05b9c8..662634a1f 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -19,3 +19,7 @@ anyhow = { workspace = true } # Local dependencies ops = { path = "../ops" } + +[features] +default = ["test_only"] +test_only = ["ops/test_only"] \ No newline at end of file diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index bb607b0c9..24f11ebcf 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -1,14 +1,11 @@ -use anyhow::{bail, Result}; +use anyhow::Result; use ethereum_types::U256; -use ops::{AggProof, BlockProof, TxProof}; +use ops::{AggProof, TxProof}; use paladin::{ - directive::{Directive, IndexedStream, Literal}, + directive::{Directive, IndexedStream}, runtime::Runtime, }; -use proof_gen::{ - proof_types::{AggregatableProof, GeneratedBlockProof}, - types::PlonkyProofIntern, -}; +use proof_gen::{proof_types::GeneratedBlockProof, types::PlonkyProofIntern}; use serde::{Deserialize, Serialize}; use trace_decoder::{ processed_block_trace::ProcessingMeta, @@ -31,6 +28,7 @@ impl ProverInput { self.other_data.b_data.b_meta.block_number } + #[cfg(not(feature = "test_only"))] pub async fn prove( self, runtime: &Runtime, @@ -51,21 +49,51 @@ impl ProverInput { .run(runtime) .await?; - if let AggregatableProof::Agg(proof) = agg_proof { + if let proof_gen::proof_types::AggregatableProof::Agg(proof) = agg_proof { let prev = previous.map(|p| GeneratedBlockProof { b_height: block_number.as_u64() - 1, intern: p, }); - let block_proof = Literal(proof) - .map(&BlockProof { prev }) + let block_proof = paladin::Literal(proof) + .map(&ops::BlockProof { prev }) .run(runtime) .await?; info!("Successfully proved block {block_number}"); Ok(block_proof.0) } else { - bail!("AggProof is is not GeneratedAggProof") + anyhow::bail!("AggProof is is not GeneratedAggProof") } } + + #[cfg(feature = "test_only")] + pub async fn prove( + self, + runtime: &Runtime, + _previous: Option, + ) -> Result { + let block_number = self.get_block_number(); + info!("Testing witness generation for block {block_number}"); + + let other_data = self.other_data; + let txs = self.block_trace.into_txn_proof_gen_ir( + &ProcessingMeta::new(resolve_code_hash_fn), + other_data.clone(), + )?; + + let _res = IndexedStream::from(txs) + .map(&TxProof) + .fold(&AggProof) + .run(runtime) + .await?; + + info!("Successfully generated witness for block {block_number}"); + + // Dummy proof to match expected output type + return Ok(GeneratedBlockProof { + b_height: block_number.as_u64(), + intern: proof_gen::proof_gen::dummy_proof()?, + }); + } } From 64301377f21f5e3fe36a779d66b9f35a6e3fd7c0 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 1 Mar 2024 12:20:00 +0900 Subject: [PATCH 102/184] Add block debugging script --- zero_bin/tools/debug_block.sh | 37 ++++++++++++++++++++++++++++++++++ zero_bin/tools/prove_blocks.sh | 23 ++++++++++----------- 2 files changed, 48 insertions(+), 12 deletions(-) create mode 100755 zero_bin/tools/debug_block.sh diff --git a/zero_bin/tools/debug_block.sh b/zero_bin/tools/debug_block.sh new file mode 100755 index 000000000..51c8c392a --- /dev/null +++ b/zero_bin/tools/debug_block.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# Args: +# 1 --> Block idx +# 2 --> Rpc endpoint:port (eg. http://35.246.1.96:8545) + +export RUST_BACKTRACE=1 +export RUST_LOG=plonky2=info,evm_arithmetization=trace + +# Speciying smallest ranges, as we won't need them anyway. +export ARTITHMETIC_CIRCUIT_SIZE="16..17" +export BYTE_PACKING_CIRCUIT_SIZE="9..10" +export CPU_CIRCUIT_SIZE="12..13" +export KECCAK_CIRCUIT_SIZE="14..15" +export KECCAK_SPONGE_CIRCUIT_SIZE="9..10" +export LOGIC_CIRCUIT_SIZE="12..13" +export MEMORY_CIRCUIT_SIZE="17..18" + +OUTPUT_DIR="debug" +OUT_DUMMY_PROOF_PATH="${OUTPUT_DIR}/b${1}.zkproof" +OUT_LOG_PATH="${OUTPUT_DIR}/b${1}.log" + +echo "Testing block ${1}..." +mkdir -p $OUTPUT_DIR + +cargo r --release --features test_only --bin leader -- --runtime in-memory jerigon --rpc-url "$2" --block-number "$1" --proof-output-path $OUT_DUMMY_PROOF_PATH > $OUT_LOG_PATH 2>&1 +retVal=$? +if [ $retVal -ne 0 ]; then + # Some error occured. + echo "Witness generation for block ${1} errored. See ${OUT_LOG_PATH} for more details." +else + echo "Witness generation for block ${1} succeeded." + # Remove the log / dummy proof on success. + rm $OUT_DUMMY_PROOF_PATH + rm $OUT_LOG_PATH +fi + diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index 57a00fd62..2dc383ede 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -7,24 +7,24 @@ # 4 --> Ignore previous proofs (boolean) export RUST_BACKTRACE=1 -export RUST_LOG=plonky2=trace,evm_arithmetization=trace +export RUST_LOG=plonky2=info,evm_arithmetization=info -export ARTITHMETIC_CIRCUIT_SIZE="16..23" -export BYTE_PACKING_CIRCUIT_SIZE="9..21" -export CPU_CIRCUIT_SIZE="12..25" -export KECCAK_CIRCUIT_SIZE="14..20" -export KECCAK_SPONGE_CIRCUIT_SIZE="9..15" -export LOGIC_CIRCUIT_SIZE="12..18" -export MEMORY_CIRCUIT_SIZE="17..28" +export ARTITHMETIC_CIRCUIT_SIZE="16..17" +export BYTE_PACKING_CIRCUIT_SIZE="9..10" +export CPU_CIRCUIT_SIZE="12..13" +export KECCAK_CIRCUIT_SIZE="14..15" +export KECCAK_SPONGE_CIRCUIT_SIZE="9..10" +export LOGIC_CIRCUIT_SIZE="12..13" +export MEMORY_CIRCUIT_SIZE="17..18" PROOF_OUTPUT_DIR="proofs" -ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. +ALWAYS_WRITE_LOGS=1 # Change this to `1` if you always want logs to be written. TOT_BLOCKS=$(($2-$1+1)) IGNORE_PREVIOUS_PROOFS=$4 echo "Proving blocks ${1}..=${2}... (Total: ${TOT_BLOCKS})" -mkdir -p proofs/ +mkdir -p $PROOF_OUTPUT_DIR for ((i=$1; i<=$2; i++)) do @@ -44,13 +44,12 @@ do fi fi - cargo r --release --bin leader -- --runtime in-memory jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 + cargo r --release --features test_only --bin leader -- --runtime in-memory jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 retVal=$? if [ $retVal -ne 0 ]; then # Some error occured. echo "Block ${i} errored. See ${OUT_LOG_PATH} for more details." - exit $retVal else # Remove the log on success if we don't want to keep it. if [ $ALWAYS_WRITE_LOGS -ne 1 ]; then From 07d8d2746ffdcd4aa43786ef37672ed414ead6e9 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 1 Mar 2024 16:36:57 +0900 Subject: [PATCH 103/184] Clippy --- zero_bin/ops/src/lib.rs | 8 +++----- zero_bin/prover/src/lib.rs | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index be8358e5b..3b9e05b9f 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -37,10 +37,8 @@ impl Operation for TxProof { type Output = (); fn execute(&self, input: Self::Input) -> Result { - let _run = evm_arithmetization::prover::testing::simulate_execution::< - proof_gen::types::Field, - >(input) - .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; + evm_arithmetization::prover::testing::simulate_execution::(input) + .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; Ok(()) } @@ -73,7 +71,7 @@ impl Monoid for AggProof { Ok(()) } - fn empty(&self) -> () {} + fn empty(&self) {} } #[derive(Deserialize, Serialize, RemoteExecute)] diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 24f11ebcf..eccd656fe 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -82,7 +82,7 @@ impl ProverInput { other_data.clone(), )?; - let _res = IndexedStream::from(txs) + IndexedStream::from(txs) .map(&TxProof) .fold(&AggProof) .run(runtime) @@ -91,9 +91,9 @@ impl ProverInput { info!("Successfully generated witness for block {block_number}"); // Dummy proof to match expected output type - return Ok(GeneratedBlockProof { + Ok(GeneratedBlockProof { b_height: block_number.as_u64(), intern: proof_gen::proof_gen::dummy_proof()?, - }); + }) } } From b1020c54750542e8f6851ce8c01affb9e0bf23cf Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 1 Mar 2024 18:00:26 +0900 Subject: [PATCH 104/184] Revert changes on prove_blocks script --- zero_bin/tools/prove_blocks.sh | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index 2dc383ede..832284a30 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -7,18 +7,18 @@ # 4 --> Ignore previous proofs (boolean) export RUST_BACKTRACE=1 -export RUST_LOG=plonky2=info,evm_arithmetization=info +export RUST_LOG=plonky2=trace,evm_arithmetization=trace -export ARTITHMETIC_CIRCUIT_SIZE="16..17" -export BYTE_PACKING_CIRCUIT_SIZE="9..10" -export CPU_CIRCUIT_SIZE="12..13" -export KECCAK_CIRCUIT_SIZE="14..15" -export KECCAK_SPONGE_CIRCUIT_SIZE="9..10" -export LOGIC_CIRCUIT_SIZE="12..13" -export MEMORY_CIRCUIT_SIZE="17..18" +export ARTITHMETIC_CIRCUIT_SIZE="16..23" +export BYTE_PACKING_CIRCUIT_SIZE="9..21" +export CPU_CIRCUIT_SIZE="12..25" +export KECCAK_CIRCUIT_SIZE="14..20" +export KECCAK_SPONGE_CIRCUIT_SIZE="9..15" +export LOGIC_CIRCUIT_SIZE="12..18" +export MEMORY_CIRCUIT_SIZE="17..28" PROOF_OUTPUT_DIR="proofs" -ALWAYS_WRITE_LOGS=1 # Change this to `1` if you always want logs to be written. +ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. TOT_BLOCKS=$(($2-$1+1)) IGNORE_PREVIOUS_PROOFS=$4 @@ -44,12 +44,13 @@ do fi fi - cargo r --release --features test_only --bin leader -- --runtime in-memory jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 + cargo r --release --bin leader -- --runtime in-memory jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 retVal=$? if [ $retVal -ne 0 ]; then # Some error occured. echo "Block ${i} errored. See ${OUT_LOG_PATH} for more details." + exit $retVal else # Remove the log on success if we don't want to keep it. if [ $ALWAYS_WRITE_LOGS -ne 1 ]; then @@ -58,4 +59,4 @@ do fi done -echo "Successfully generated ${TOT_BLOCKS} proofs!" +echo "Successfully generated ${TOT_BLOCKS} proofs!" \ No newline at end of file From 8db68b93bddfbc5e05555c08bff1d142281196b9 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 1 Mar 2024 18:00:33 +0900 Subject: [PATCH 105/184] Address comments --- zero_bin/prover/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index eccd656fe..65e579bdf 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -74,7 +74,7 @@ impl ProverInput { _previous: Option, ) -> Result { let block_number = self.get_block_number(); - info!("Testing witness generation for block {block_number}"); + info!("Testing witness generation for block {block_number}."); let other_data = self.other_data; let txs = self.block_trace.into_txn_proof_gen_ir( @@ -88,9 +88,9 @@ impl ProverInput { .run(runtime) .await?; - info!("Successfully generated witness for block {block_number}"); + info!("Successfully generated witness for block {block_number}."); - // Dummy proof to match expected output type + // Dummy proof to match expected output type. Ok(GeneratedBlockProof { b_height: block_number.as_u64(), intern: proof_gen::proof_gen::dummy_proof()?, From f5120b2db3cc3629493e54c47e8d38646e55fb93 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Sat, 2 Mar 2024 07:36:46 +0900 Subject: [PATCH 106/184] Remove dummy agg proof layer for testing --- zero_bin/Cargo.lock | 1 + zero_bin/Cargo.toml | 1 + zero_bin/ops/src/lib.rs | 18 ++---------------- zero_bin/prover/Cargo.toml | 1 + zero_bin/prover/src/lib.rs | 8 +++++--- zero_bin/rpc/Cargo.toml | 6 +++--- 6 files changed, 13 insertions(+), 22 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 65c630e2c..1c2da354b 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2323,6 +2323,7 @@ version = "0.1.0" dependencies = [ "anyhow", "ethereum-types", + "futures", "ops", "paladin-core", "proof_gen", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index f8b93e5e9..b5527f107 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -15,6 +15,7 @@ serde_path_to_error = "0.1.14" serde_json = "1.0.107" ethereum-types = "0.14.1" thiserror = "1.0.50" +futures = "0.3.29" # zk-evm dependencies plonky2 = "0.2.0" diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 3b9e05b9f..c1b56e062 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -3,11 +3,9 @@ use paladin::{ operation::{FatalError, FatalStrategy, Monoid, Operation, Result}, registry, RemoteExecute, }; -#[cfg(not(feature = "test_only"))] -use proof_gen::{proof_gen::generate_agg_proof, proof_types::AggregatableProof}; use proof_gen::{ - proof_gen::generate_block_proof, - proof_types::{GeneratedAggProof, GeneratedBlockProof}, + proof_gen::{generate_agg_proof, generate_block_proof}, + proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, }; use serde::{Deserialize, Serialize}; use trace_decoder::types::TxnProofGenIR; @@ -47,7 +45,6 @@ impl Operation for TxProof { #[derive(Deserialize, Serialize, RemoteExecute)] pub struct AggProof; -#[cfg(not(feature = "test_only"))] impl Monoid for AggProof { type Elem = AggregatableProof; @@ -63,17 +60,6 @@ impl Monoid for AggProof { } } -#[cfg(feature = "test_only")] -impl Monoid for AggProof { - type Elem = (); - - fn combine(&self, _a: Self::Elem, _b: Self::Elem) -> Result { - Ok(()) - } - - fn empty(&self) {} -} - #[derive(Deserialize, Serialize, RemoteExecute)] pub struct BlockProof { pub prev: Option, diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 662634a1f..ca0cb86c2 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -16,6 +16,7 @@ tracing = { workspace = true } paladin-core = { workspace = true } ethereum-types = { workspace = true } anyhow = { workspace = true } +futures = { workspace = true } # Local dependencies ops = { path = "../ops" } diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 65e579bdf..0789423e0 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -1,6 +1,7 @@ use anyhow::Result; use ethereum_types::U256; -use ops::{AggProof, TxProof}; +use futures::stream::TryStreamExt; +use ops::TxProof; use paladin::{ directive::{Directive, IndexedStream}, runtime::Runtime, @@ -45,7 +46,7 @@ impl ProverInput { let agg_proof = IndexedStream::from(txs) .map(&TxProof) - .fold(&AggProof) + .fold(&ops::AggProof) .run(runtime) .await?; @@ -84,8 +85,9 @@ impl ProverInput { IndexedStream::from(txs) .map(&TxProof) - .fold(&AggProof) .run(runtime) + .await? + .try_collect::>() .await?; info!("Successfully generated witness for block {block_number}."); diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index a64b1ae18..999169f6b 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -21,7 +21,10 @@ clap = { workspace = true } ethereum-types = { workspace = true } evm_arithmetization = { workspace = true } thiserror = { workspace = true } +futures = { workspace = true } +hex = "0.4.3" +hex-literal = "0.4.1" reqwest = { version = "0.11.22", default-features = false, features = [ "json", "rustls-tls", @@ -30,7 +33,4 @@ reqwest = { version = "0.11.22", default-features = false, features = [ # Local dependencies common = { path = "../common" } -futures = "0.3.29" -hex = "0.4.3" -hex-literal = "0.4.1" prover = { path = "../prover" } From 6dca99d8f1e0c7b148737cf6482cfb9a600d187e Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 6 Mar 2024 10:36:36 +0900 Subject: [PATCH 107/184] Fix checkpoint block for debug script --- zero_bin/tools/debug_block.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/tools/debug_block.sh b/zero_bin/tools/debug_block.sh index 51c8c392a..49a03037b 100755 --- a/zero_bin/tools/debug_block.sh +++ b/zero_bin/tools/debug_block.sh @@ -23,7 +23,7 @@ OUT_LOG_PATH="${OUTPUT_DIR}/b${1}.log" echo "Testing block ${1}..." mkdir -p $OUTPUT_DIR -cargo r --release --features test_only --bin leader -- --runtime in-memory jerigon --rpc-url "$2" --block-number "$1" --proof-output-path $OUT_DUMMY_PROOF_PATH > $OUT_LOG_PATH 2>&1 +cargo r --release --features test_only --bin leader -- --runtime in-memory jerigon --rpc-url "$2" --block-number "$1" --checkpoint-block-number "$(($1-1))" --proof-output-path $OUT_DUMMY_PROOF_PATH > $OUT_LOG_PATH 2>&1 retVal=$? if [ $retVal -ne 0 ]; then # Some error occured. From 7ba15763f7c3e4e88c515f2a39099dd4859b4158 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 6 Mar 2024 15:16:42 +0900 Subject: [PATCH 108/184] Fix arithmetic circuit typos --- zero_bin/tools/debug_block.sh | 2 +- zero_bin/tools/prove_blocks.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/tools/debug_block.sh b/zero_bin/tools/debug_block.sh index 49a03037b..e9ff3679d 100755 --- a/zero_bin/tools/debug_block.sh +++ b/zero_bin/tools/debug_block.sh @@ -8,7 +8,7 @@ export RUST_BACKTRACE=1 export RUST_LOG=plonky2=info,evm_arithmetization=trace # Speciying smallest ranges, as we won't need them anyway. -export ARTITHMETIC_CIRCUIT_SIZE="16..17" +export ARITHMETIC_CIRCUIT_SIZE="16..17" export BYTE_PACKING_CIRCUIT_SIZE="9..10" export CPU_CIRCUIT_SIZE="12..13" export KECCAK_CIRCUIT_SIZE="14..15" diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index 832284a30..a6f4e4bbc 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -9,7 +9,7 @@ export RUST_BACKTRACE=1 export RUST_LOG=plonky2=trace,evm_arithmetization=trace -export ARTITHMETIC_CIRCUIT_SIZE="16..23" +export ARITHMETIC_CIRCUIT_SIZE="16..23" export BYTE_PACKING_CIRCUIT_SIZE="9..21" export CPU_CIRCUIT_SIZE="12..25" export KECCAK_CIRCUIT_SIZE="14..20" From 7a738a63bbb27806e95ed7d302663e3249170ef3 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 6 Mar 2024 17:07:45 +0900 Subject: [PATCH 109/184] Rework CI --- zero_bin/.github/workflows/ci.yml | 86 ++++++++++++++++++------------- 1 file changed, 51 insertions(+), 35 deletions(-) diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml index e125e9422..c4ffc8e17 100644 --- a/zero_bin/.github/workflows/ci.yml +++ b/zero_bin/.github/workflows/ci.yml @@ -1,49 +1,65 @@ -name: ci +name: Continuous Integration on: push: branches: - main pull_request: + branches: + - "**" + workflow_dispatch: + branches: + - "**" + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + CARGO_TERM_COLOR: always jobs: - check: + test: + name: Run tests runs-on: ubuntu-latest + timeout-minutes: 30 + if: "! contains(toJSON(github.event.commits.*.message), '[skip-ci]')" steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Remove Pre-installed Rust - run: | - rustup toolchain remove stable - rm -f /home/runner/.cargo/bin/rust-analyzer - rm -f /home/runner/.cargo/bin/rustfmt - rm -f /home/runner/.cargo/bin/cargo-fmt - - - name: Install Rust Nightly - run: | - rustup update nightly - rustup default nightly - rustup component add rustfmt --toolchain nightly - rustup component add clippy --toolchain nightly - - - name: Get Rust Version - run: rustc --version > rust-version.txt - - - name: Cache Cargo Registry and Build Outputs - uses: actions/cache@v2 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-rust-${{ hashFiles('rust-version.txt', '**/Cargo.lock') }} + - name: Checkout sources + uses: actions/checkout@v4 - - name: Run cargo clippy - run: cargo +nightly clippy -- -D warnings + - name: Install nightly toolchain + uses: dtolnay/rust-toolchain@nightly - - name: Run cargo fmt --check - run: cargo +nightly fmt --all -- --check + - name: Set up rust cache + uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true - - name: Run cargo test + - name: Test run: cargo test + + lints: + name: Formatting and Clippy + runs-on: ubuntu-latest + timeout-minutes: 10 + if: "! contains(toJSON(github.event.commits.*.message), '[skip-ci]')" + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Install nightly toolchain + uses: dtolnay/rust-toolchain@nightly + with: + components: rustfmt, clippy + + - name: Set up rust cache + uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + + - name: Run cargo fmt + run: cargo fmt --all --check + + - name: Run cargo clippy + run: cargo clippy --all-targets -- -D warnings From 710a96eb75d18ed145183eb28ea4f033925b8262 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 08:10:26 +0000 Subject: [PATCH 110/184] Bump mio from 0.8.9 to 0.8.11 Bumps [mio](https://github.com/tokio-rs/mio) from 0.8.9 to 0.8.11. - [Release notes](https://github.com/tokio-rs/mio/releases) - [Changelog](https://github.com/tokio-rs/mio/blob/master/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/mio/compare/v0.8.9...v0.8.11) --- updated-dependencies: - dependency-name: mio dependency-type: indirect ... Signed-off-by: dependabot[bot] --- zero_bin/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index b84b37faf..c9e849f15 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", From 55ee6da753938d1c8eae0538603753a1cf986948 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 6 Mar 2024 17:53:43 +0900 Subject: [PATCH 111/184] Update circuit location --- zero_bin/.gitignore | 12 ++++++--- .../common/src/prover_state/persistence.rs | 26 ++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index 4150ca773..82b38c198 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -1,5 +1,11 @@ /target -/prover_state + +# Default extension for generated block proofs *.zkproof -prover_state_* -verifier_state_* + +# Folder containing all the locally generated circuit data +circuits/ + +# Folders containing logs from the utility scripts in tools/ +debug/ +proofs/ diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index d807df3a9..23b63dd4c 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -16,8 +16,9 @@ use super::{ Config, RecursiveCircuitsForTableSize, SIZE, }; -const PROVER_STATE_FILE_PREFIX: &str = "./prover_state"; -const VERIFIER_STATE_FILE_PREFIX: &str = "./verifier_state"; +const CIRCUITS_FOLDER: &str = "./circuits"; +const PROVER_STATE_FILE_PREFIX: &str = "prover_state"; +const VERIFIER_STATE_FILE_PREFIX: &str = "verifier_state"; fn get_serializers() -> ( DefaultGateSerializer, @@ -70,6 +71,15 @@ pub(crate) trait DiskResource { p: &Self::PathConstrutor, r: &Self::Resource, ) -> Result<(), DiskResourceError> { + // Create the base folder if non-existent. + if std::fs::metadata(CIRCUITS_FOLDER).is_err() { + std::fs::create_dir(CIRCUITS_FOLDER).map_err(|_| { + DiskResourceError::IoError::(std::io::Error::other( + "Could not create circuits folder", + )) + })?; + } + Ok(OpenOptions::new() .write(true) .create(true) @@ -92,7 +102,8 @@ impl DiskResource for BaseProverResource { fn path(p: &Self::PathConstrutor) -> String { format!( - "{}_base_{}", + "{}/{}_base_{}", + CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, p.get_configuration_digest() ) @@ -126,7 +137,8 @@ impl DiskResource for MonolithicProverResource { fn path(p: &Self::PathConstrutor) -> String { format!( - "{}_monolithic_{}", + "{}/{}_monolithic_{}", + CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, p.get_configuration_digest() ) @@ -159,7 +171,8 @@ impl DiskResource for RecursiveCircuitResource { fn path((circuit_type, size): &Self::PathConstrutor) -> String { format!( - "{}_{}_{}", + "{}/{}_{}_{}", + CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, circuit_type.as_short_str(), size @@ -201,7 +214,8 @@ impl DiskResource for VerifierResource { fn path(p: &Self::PathConstrutor) -> String { format!( - "{}_{}", + "{}/{}_{}", + CIRCUITS_FOLDER, VERIFIER_STATE_FILE_PREFIX, p.get_configuration_digest() ) From f88151ca36ed64175e916455527c83792e1b1c7d Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Mon, 11 Mar 2024 16:08:49 +0900 Subject: [PATCH 112/184] Bump deps and fix compile failure --- zero_bin/Cargo.lock | 4 ++-- zero_bin/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index c9e849f15..0ed5c3b8a 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1956,9 +1956,9 @@ dependencies = [ [[package]] name = "paladin-core" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c10eebceee2898070e490a57ada2bd3810c236a6d80aadccab4d70ef27c7aa34" +checksum = "5af1955eaab1506a43d046628c218b7b3915539554838feb85ed31f54aace2f2" dependencies = [ "anyhow", "async-trait", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index b5527f107..a050be2a3 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "common", "ops", "verifier", "rpc", "prover"] resolver = "2" [workspace.dependencies] -paladin-core = "0.4.1" +paladin-core = "0.4.2" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" From 410a1cc22d7061a0c75c7ab8eab1c908e6e7bd0b Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 12 Mar 2024 10:54:46 -0600 Subject: [PATCH 113/184] Fixed proof gen debug script not forcing `1` worker --- zero_bin/tools/debug_block.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/tools/debug_block.sh b/zero_bin/tools/debug_block.sh index e9ff3679d..1d8a491ea 100755 --- a/zero_bin/tools/debug_block.sh +++ b/zero_bin/tools/debug_block.sh @@ -5,7 +5,7 @@ # 2 --> Rpc endpoint:port (eg. http://35.246.1.96:8545) export RUST_BACKTRACE=1 -export RUST_LOG=plonky2=info,evm_arithmetization=trace +export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace # Speciying smallest ranges, as we won't need them anyway. export ARITHMETIC_CIRCUIT_SIZE="16..17" @@ -23,7 +23,7 @@ OUT_LOG_PATH="${OUTPUT_DIR}/b${1}.log" echo "Testing block ${1}..." mkdir -p $OUTPUT_DIR -cargo r --release --features test_only --bin leader -- --runtime in-memory jerigon --rpc-url "$2" --block-number "$1" --checkpoint-block-number "$(($1-1))" --proof-output-path $OUT_DUMMY_PROOF_PATH > $OUT_LOG_PATH 2>&1 +cargo r --release --features test_only --bin leader -- -n 1 --runtime in-memory jerigon --rpc-url "$2" --block-number "$1" --checkpoint-block-number "$(($1-1))" --proof-output-path $OUT_DUMMY_PROOF_PATH > $OUT_LOG_PATH 2>&1 retVal=$? if [ $retVal -ne 0 ]; then # Some error occured. From 0e3e5c9e540ccad1e2c7d6581d2ac44370fa9f0b Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 12 Mar 2024 11:28:01 -0600 Subject: [PATCH 114/184] Added a section about branches and testing - We didn't have anything regarding development branches and how to use the testing tools, and this PR adds a bit of info for both. --- zero_bin/README.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/zero_bin/README.md b/zero_bin/README.md index a3bf95ea7..eed43b171 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -21,6 +21,7 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [Verifier Usage](#verifier-usage) - [RPC Usage](#rpc-usage) - [Docker](#docker) + - [Development Branches](#development-branches) - [License](#license) - [Contribution](#contribution) @@ -328,6 +329,46 @@ cargo r --release --bin rpc fetch --rpc-url --block-number 16 > ./outp Docker images are provided for both the [leader](leader.Dockerfile) and [worker](worker.Dockerfile) binaries. +## Development Branches + +There are three branches that are used for development: + +- `main` --> Always points to the latest production release +- `develop` --> All PRs should be merged into this branch +- `testing` --> For testing against the latest changes. Should always point to the `develop` branch for the `zk_evm` deps + +## Testing Blocks + +For testing proof generation for blocks, the `testing` branch should be used. + +If you want to generate a full block proof, you can use `tools/prove_blocks.sh`: + +```sh +./prove_blocks.sh +``` + +Which may look like this: + +```sh +./prove_blocks.sh 17 18 http://127.0.0.1:8545 +``` + +Which will attempt to generate blocks `17` & `18` consecutively. + +However, proving blocks is very resource intensive in both CPU and memory. You can also only generate the witness for a block instead to significantly reduce the CPU and memory requirements: + +```sh +./debug_block.sh +``` + +Filled in: + +```sh +./debug_block.sh 18299898 http://34.89.57.138:8545 +``` + +Finally, note that both of these testing scripts force proof generation to be sequential by allowing only one worker. Because of this, this is not a realistic representation of performance but makes the debugging logs much easier to follow. + ## License Licensed under either of From 157964585d3ec494d4b538a56b305a104bbb21c4 Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 12 Mar 2024 11:33:26 -0600 Subject: [PATCH 115/184] Increased stack size for testing - Some block manage to overflow the stack (inside `plonky2`?), and we need to use a larger stack size. --- zero_bin/tools/debug_block.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/zero_bin/tools/debug_block.sh b/zero_bin/tools/debug_block.sh index 1d8a491ea..df1a9c68c 100755 --- a/zero_bin/tools/debug_block.sh +++ b/zero_bin/tools/debug_block.sh @@ -5,6 +5,7 @@ # 2 --> Rpc endpoint:port (eg. http://35.246.1.96:8545) export RUST_BACKTRACE=1 +export RUST_MIN_STACK=8388608 export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace # Speciying smallest ranges, as we won't need them anyway. From aea9355688aeed8832ceab38cbd3afc1b5f0ff5f Mon Sep 17 00:00:00 2001 From: Julian Braha Date: Fri, 15 Mar 2024 18:15:12 +0000 Subject: [PATCH 116/184] Fix dead link in README --- zero_bin/README.md | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/zero_bin/README.md b/zero_bin/README.md index eed43b171..ef266a38d 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -1,6 +1,6 @@ # Zero Bin -A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plonky-block-proof-gen`](https://github.com/0xPolygonZero/plonky-block-proof-gen). Given the [proof generation protocol](/leader/src/prover_input.rs) as input, generate a proof. The project is instrumented with [`paladin`](https://github.com/0xPolygonZero/paladin), and as such can distribute proof generation across multiple worker machines. +A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plonky-block-proof-gen`](https://github.com/0xPolygonZero/plonky-block-proof-gen). Given the [proof generation protocol](/prover/src/lib.rs) as input, generate a proof. The project is instrumented with [`paladin`](https://github.com/0xPolygonZero/paladin), and as such can distribute proof generation across multiple worker machines. - [Zero Bin](#zero-bin) - [Project layout](#project-layout) @@ -25,8 +25,8 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [License](#license) - [Contribution](#contribution) - ## Project layout + ``` ops ├── Cargo.toml @@ -49,13 +49,17 @@ verifier └── src └── main.rs ``` + ### Ops + Defines the proof operations that can be distributed to workers. ### Worker + The worker process. Receives proof operations from the leader, and returns the result. ### Leader + The leader process. Receives proof generation requests, and distributes them to workers. ### RPC @@ -69,6 +73,7 @@ A binary to verify the correctness of the generated proof. ## Leader Usage The leader has various subcommands for different io modes. The leader binary arguments are as follows: + ``` cargo r --release --bin leader -- --help @@ -156,11 +161,12 @@ Table circuit sizes: Note that both paladin and plonky2 table circuit sizes are configurable via command line arguments and environment variables. The command line arguments take precedence over the environment variables. -**TABLE CIRCUIT SIZES ARE _ONLY_ RELEVANT FOR THE LEADER WHEN RUNNING IN `in-memory` MODE**. +**TABLE CIRCUIT SIZES ARE _ONLY_ RELEVANT FOR THE LEADER WHEN RUNNING IN `in-memory` MODE**. If you want to configure the table circuit sizes when running in a distributed environment, you must configure the table circuit sizes on the worker processes (the command line arguments are the same). ### stdio + The stdio command reads proof input from stdin and writes output to stdout. ``` @@ -176,11 +182,13 @@ Options: ``` Pull prover input from the rpc binary. + ```bash cargo r --release --bin rpc fetch --rpc-url -b 6 > ./input/block_6.json ``` Pipe the block input to the leader binary. + ```bash cat ./input/block_6.json | cargo r --release --bin leader -- -r in-memory stdio > ./output/proof_6.json ``` @@ -212,6 +220,7 @@ Options: ``` Prove a block. + ```bash cargo r --release --bin leader -- -r in-memory jerigon -u -b 16 > ./output/proof_16.json ``` @@ -219,6 +228,7 @@ cargo r --release --bin leader -- -r in-memory jerigon -u -b 16 > ./ou ### HTTP The HTTP command reads proof input from HTTP and writes output to a directory. + ``` cargo r --release --bin leader http --help @@ -233,18 +243,19 @@ Options: ``` Pull prover input from the rpc binary. + ```bash cargo r --release --bin rpc fetch -u -b 6 > ./input/block_6.json ``` Start the server. + ```bash RUST_LOG=debug cargo r --release --bin leader http --output-dir ./output ``` Note that HTTP mode requires a [slightly modified input format](./leader/src/http.rs#L56) from the rest of the commands. In particular, [the previous proof is expected to be part of the payload](./leader/src/http.rs#L58). This is due to the fact that the HTTP mode may handle multiple requests concurrently, and thus the previous proof cannot reasonably be given by a command line argument like the other modes. - Using `jq` we can merge the previous proof and the block input into a single JSON object. ```bash @@ -258,6 +269,7 @@ Paladin supports both an AMQP and in-memory runtime. The in-memory runtime will #### Starting an AMQP enabled cluster Start rabbitmq + ```bash docker run --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management ``` @@ -289,6 +301,7 @@ cat ./input/block_6.json | cargo r --release --bin leader -- -r in-memory stdio ## Verifier Usage A verifier binary is provided to verify the correctness of the generated proof. The verifier expects output in the format generated by the leader. The verifier binary arguments are as follows: + ``` cargo r --bin verifier -- --help @@ -300,6 +313,7 @@ Options: ``` Example: + ```bash cargo r --release --bin verifier -- -f ./output/proof_16.json ``` @@ -307,6 +321,7 @@ cargo r --release --bin verifier -- -f ./output/proof_16.json ## RPC Usage An rpc binary is provided to generate the block trace format expected by the leader. + ``` cargo r --bin rpc -- --help @@ -321,6 +336,7 @@ Options: ``` Example: + ```bash cargo r --release --bin rpc fetch --rpc-url --block-number 16 > ./output/block-16.json ``` @@ -373,12 +389,11 @@ Finally, note that both of these testing scripts force proof generation to be se Licensed under either of -* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) -* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) +- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. - ### Contribution -Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. \ No newline at end of file +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. From 2661d84f03a3b74005b6dd8edad4c3f24907d19c Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 18 Mar 2024 17:10:51 +0000 Subject: [PATCH 117/184] Update CODEOWNERS --- zero_bin/.github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/.github/CODEOWNERS b/zero_bin/.github/CODEOWNERS index deb924f18..20e2b14b8 100644 --- a/zero_bin/.github/CODEOWNERS +++ b/zero_bin/.github/CODEOWNERS @@ -1 +1 @@ -* @cpubot @muursh +* @cpubot @muursh @Nashtare From 3984a912b334ee76dd6eb8f76b137ae8104ad413 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Tue, 19 Mar 2024 01:46:52 -0700 Subject: [PATCH 118/184] Fix new nightly clippy warning (#41) --- zero_bin/common/src/prover_state/persistence.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index 23b63dd4c..94c6fc920 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -100,7 +100,7 @@ impl DiskResource for BaseProverResource { type Error = IoError; type PathConstrutor = CircuitConfig; - fn path(p: &Self::PathConstrutor) -> String { + fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( "{}/{}_base_{}", CIRCUITS_FOLDER, @@ -135,7 +135,7 @@ impl DiskResource for MonolithicProverResource { type Error = IoError; type PathConstrutor = CircuitConfig; - fn path(p: &Self::PathConstrutor) -> String { + fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( "{}/{}_monolithic_{}", CIRCUITS_FOLDER, @@ -169,7 +169,7 @@ impl DiskResource for RecursiveCircuitResource { type Error = IoError; type PathConstrutor = (Circuit, usize); - fn path((circuit_type, size): &Self::PathConstrutor) -> String { + fn path((circuit_type, size): &Self::PathConstrutor) -> impl AsRef { format!( "{}/{}_{}_{}", CIRCUITS_FOLDER, @@ -212,7 +212,7 @@ impl DiskResource for VerifierResource { type Error = IoError; type PathConstrutor = CircuitConfig; - fn path(p: &Self::PathConstrutor) -> String { + fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( "{}/{}_{}", CIRCUITS_FOLDER, From 3d9c98e4aa55b090b53a57fed699132937119b04 Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 19 Mar 2024 14:57:57 -0600 Subject: [PATCH 119/184] Ran `cargo update` --- zero_bin/Cargo.lock | 1037 ++++++++++++++++++++++++++----------------- 1 file changed, 630 insertions(+), 407 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 0ed5c3b8a..088e7d407 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "const-random", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -124,43 +124,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" dependencies = [ "backtrace", ] @@ -173,41 +173,43 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-channel" -version = "1.9.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 5.2.0", + "event-listener-strategy 0.5.0", "futures-core", + "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0c4a4f319e45986f347ee47fef8bf5e81c9abc3f6f58dc2391439f30df65f0" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock", + "async-lock 3.3.0", "async-task", "concurrent-queue", "fastrand 2.0.1", - "futures-lite", + "futures-lite 2.3.0", "slab", ] [[package]] name = "async-global-executor" -version = "2.3.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ "async-channel", "async-executor", - "async-io", - "async-lock", + "async-io 2.3.2", + "async-lock 3.3.0", "blocking", - "futures-lite", + "futures-lite 2.3.0", "once_cell", ] @@ -228,27 +230,57 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock", + "async-lock 2.8.0", "autocfg", "cfg-if", "concurrent-queue", - "futures-lite", + "futures-lite 1.13.0", "log", "parking", - "polling", - "rustix 0.37.26", + "polling 2.8.0", + "rustix 0.37.27", "slab", "socket2 0.4.10", "waker-fn", ] +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock 3.3.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.5.0", + "rustix 0.38.31", + "slab", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "async-lock" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", ] [[package]] @@ -257,7 +289,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a6012d170ad00de56c9ee354aef2e358359deb1ec504254e0e5a3774771de0e" dependencies = [ - "async-io", + "async-io 1.13.0", "async-trait", "futures-core", "reactor-trait", @@ -265,26 +297,26 @@ dependencies = [ [[package]] name = "async-task" -version = "4.5.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "atomic-polyfill" -version = "0.1.11" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" dependencies = [ "critical-section", ] @@ -381,9 +413,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bitflags" @@ -393,9 +425,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -429,25 +461,25 @@ dependencies = [ [[package]] name = "blocking" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c36a4d0d48574b3dd360b4b7d95cc651d2b6557b6402848a27d4b228a473e2a" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ "async-channel", - "async-lock", + "async-lock 3.3.0", "async-task", "fastrand 2.0.1", "futures-io", - "futures-lite", + "futures-lite 2.3.0", "piper", "tracing", ] [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "byte-slice-cast" @@ -481,12 +513,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -496,22 +525,22 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets", + "windows-targets 0.52.4", ] [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -520,15 +549,15 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", "half", @@ -546,9 +575,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.7" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" dependencies = [ "clap_builder", "clap_derive", @@ -556,33 +585,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "cobs" @@ -606,24 +635,24 @@ dependencies = [ "plonky2", "proof_gen", "thiserror", - "trace_decoder", + "trace_decoder 0.1.1", "tracing", ] [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] [[package]] name = "const-random" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ "const-random-macro", ] @@ -647,9 +676,9 @@ checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -657,15 +686,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbc60abd742b35f2492f808e1abbb83d45f72db402e14c55057edc9c7b1e9e4" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -678,11 +707,10 @@ checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" [[package]] name = "crossbeam" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" dependencies = [ - "cfg-if", "crossbeam-channel", "crossbeam-deque", "crossbeam-epoch", @@ -692,68 +720,56 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-skiplist" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883a5821d7d079fcf34ac55f27a833ee61678110f6b97637cc74513c0d0b42fc" +checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -773,9 +789,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ "darling_core", "darling_macro", @@ -783,27 +799,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.38", + "strsim 0.10.0", + "syn 2.0.53", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] @@ -821,9 +837,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", "serde", @@ -863,9 +879,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[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 = "embedded-io" @@ -888,28 +904,28 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "enumn" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" +checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -926,12 +942,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -967,11 +983,53 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +dependencies = [ + "event-listener 5.2.0", + "pin-project-lite", +] + [[package]] name = "evm_arithmetization" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2af65f5b147f04c94df5df5e21ff9d1632fd357511e183d5e04de059d6fa93" +checksum = "f8460fed1dc1b098aab4dd9f5b7a2281423f2cd078393284ce1edbf13d49b55c" dependencies = [ "anyhow", "bytes", @@ -983,7 +1041,7 @@ dependencies = [ "jemallocator", "keccak-hash 0.10.0", "log", - "mpt_trie", + "mpt_trie 0.2.0", "num", "num-bigint", "once_cell", @@ -1060,6 +1118,15 @@ dependencies = [ "spin", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1068,9 +1135,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1083,9 +1150,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1098,9 +1165,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1108,15 +1175,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1125,9 +1192,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -1144,34 +1211,47 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.0.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1197,9 +1277,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1210,15 +1290,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "h2" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" dependencies = [ "bytes", "fnv", @@ -1226,7 +1306,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.0.2", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -1235,9 +1315,13 @@ dependencies = [ [[package]] name = "half" -version = "1.8.2" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +dependencies = [ + "cfg-if", + "crunchy", +] [[package]] name = "hash32" @@ -1268,9 +1352,9 @@ dependencies = [ [[package]] name = "heapless" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" dependencies = [ "atomic-polyfill", "hash32", @@ -1286,11 +1370,17 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1315,9 +1405,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -1326,9 +1416,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -1355,9 +1445,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -1370,7 +1460,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.6", "tokio", "tower-service", "tracing", @@ -1393,9 +1483,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1422,9 +1512,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1481,9 +1571,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.2" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1517,7 +1607,7 @@ checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1528,13 +1618,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ "hermit-abi", - "rustix 0.38.21", - "windows-sys", + "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1548,9 +1638,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jemalloc-sys" @@ -1574,9 +1664,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1612,7 +1702,7 @@ dependencies = [ "async-reactor-trait", "async-trait", "executor-trait", - "flume", + "flume 0.10.14", "futures-core", "futures-io", "parking_lot", @@ -1654,28 +1744,28 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "linkme" -version = "0.3.17" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ed2ee9464ff9707af8e9ad834cffa4802f072caad90639c583dd3c62e6e608" +checksum = "bb2cfee0de9bd869589fb9a015e155946d1be5ff415cb844c2caccc6cc4b5db9" dependencies = [ "linkme-impl", ] [[package]] name = "linkme-impl" -version = "0.3.17" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba125974b109d512fccbc6c0244e7580143e460895dfd6ea7f8bbb692fd94396" +checksum = "adf157a4dc5a29b7b464aa8fe7edeff30076e07e13646a1c3874f58477dc99f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] @@ -1686,9 +1776,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -1703,9 +1793,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "matchers" @@ -1724,18 +1814,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" @@ -1751,9 +1832,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[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", ] @@ -1766,7 +1847,7 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1790,6 +1871,27 @@ dependencies = [ "uint", ] +[[package]] +name = "mpt_trie" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276984ee63f94fab7907336095c1ff0d6a9117d8c42291564f79101ac275037b" +dependencies = [ + "bytes", + "enum-as-inner", + "ethereum-types", + "hex", + "keccak-hash 0.10.0", + "log", + "num", + "num-traits", + "parking_lot", + "rlp", + "serde", + "thiserror", + "uint", +] + [[package]] name = "nom" version = "7.1.3" @@ -1838,29 +1940,34 @@ 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", "rand", ] +[[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", @@ -1881,9 +1988,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", ] @@ -1900,18 +2007,18 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl-probe" @@ -1928,7 +2035,7 @@ dependencies = [ "paladin-core", "proof_gen", "serde", - "trace_decoder", + "trace_decoder 0.1.1", ] [[package]] @@ -1994,14 +2101,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af25dcb10b7c0ce99abee8694e2e79e4787d7f778b9339dc5a50ba6fc45e5cc9" dependencies = [ "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec", "bitvec", @@ -2013,9 +2120,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2049,7 +2156,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -2060,15 +2167,15 @@ checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.5" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" dependencies = [ "memchr", "thiserror", @@ -2077,9 +2184,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.5" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026" dependencies = [ "pest", "pest_generator", @@ -2087,22 +2194,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.5" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "pest_meta" -version = "2.7.5" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293" dependencies = [ "once_cell", "pest", @@ -2111,22 +2218,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] @@ -2143,12 +2250,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pinky-swear" -version = "6.1.0" +version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d894b67aa7a4bf295db5e85349078c604edaa6fa5c8721e8eca3c7729a27f2ac" +checksum = "6cfae3ead413ca051a681152bd266438d3bfa301c9bdf836939a14c721bb2a21" dependencies = [ "doc-comment", - "flume", + "flume 0.11.0", "parking_lot", "tracing", ] @@ -2233,7 +2340,21 @@ dependencies = [ "libc", "log", "pin-project-lite", - "windows-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix 0.38.31", + "tracing", + "windows-sys 0.52.0", ] [[package]] @@ -2285,28 +2406,28 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ - "once_cell", + "toml_datetime", "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] [[package]] name = "proof_gen" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "657003bc7dcee8b7c487807b8c9e6bf8aef8413f80501948a948b40c885ab7e7" +checksum = "b632ae384e13ad12ed9556e544650bfd79a54b3574fe3da4a749083ea6125440" dependencies = [ "ethereum-types", "evm_arithmetization", @@ -2314,7 +2435,7 @@ dependencies = [ "paste", "plonky2", "serde", - "trace_decoder", + "trace_decoder 0.2.0", ] [[package]] @@ -2328,15 +2449,15 @@ dependencies = [ "paladin-core", "proof_gen", "serde", - "trace_decoder", + "trace_decoder 0.1.1", "tracing", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -2379,9 +2500,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" dependencies = [ "either", "rayon-core", @@ -2389,9 +2510,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -2428,13 +2549,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.6", "regex-syntax 0.8.2", ] @@ -2449,9 +2570,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -2472,9 +2593,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64", "bytes", @@ -2498,6 +2619,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-rustls", @@ -2512,16 +2634,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2564,7 +2687,7 @@ dependencies = [ "serde_path_to_error", "thiserror", "tokio", - "trace_decoder", + "trace_decoder 0.1.1", "tracing", "tracing-subscriber", ] @@ -2592,36 +2715,36 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.26" +version = "0.37.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f3f8f960ed3b5a59055428714943298bf3fa2d4a1d53135084e0544829d995" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", "errno", "io-lifetimes", "libc", "linux-raw-sys 0.3.8", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys 0.4.10", - "windows-sys", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring", @@ -2631,9 +2754,9 @@ dependencies = [ [[package]] name = "rustls-connector" -version = "0.18.3" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060bcc1795b840d0e56d78f3293be5f652aa1611d249b0e63ffe19f4a8c9ae23" +checksum = "25da151615461c7347114b1ad1a7458b4cdebc69cb220cd140cd5cb324b1dd37" dependencies = [ "log", "rustls", @@ -2655,9 +2778,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ "base64", ] @@ -2680,17 +2803,17 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2734,35 +2857,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2771,9 +2894,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ "itoa", "serde", @@ -2793,16 +2916,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.4.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.0.2", + "indexmap 2.2.5", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -2810,14 +2934,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] @@ -2871,9 +2995,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" @@ -2887,12 +3011,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2939,6 +3063,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "subtle" version = "2.5.0" @@ -2958,9 +3088,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -3014,38 +3144,38 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -3053,12 +3183,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -3073,10 +3204,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -3106,9 +3238,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -3118,9 +3250,9 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.6", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3142,7 +3274,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] @@ -3171,9 +3303,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -3196,17 +3328,17 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.2.5", "toml_datetime", "winnow", ] @@ -3256,7 +3388,32 @@ dependencies = [ "hex-literal", "keccak-hash 0.10.0", "log", - "mpt_trie", + "mpt_trie 0.1.1", + "rlp", + "rlp-derive", + "serde", + "serde_with", + "thiserror", +] + +[[package]] +name = "trace_decoder" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69c42e0c922b0a7eafaad55ca960f8bc9a8fa95eed4b8ec1beb3749d6543d789" +dependencies = [ + "bytes", + "ciborium", + "ciborium-io", + "enum-as-inner", + "enumn", + "ethereum-types", + "evm_arithmetization", + "hex", + "hex-literal", + "keccak-hash 0.10.0", + "log", + "mpt_trie 0.2.0", "rlp", "rlp-derive", "serde", @@ -3284,7 +3441,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] [[package]] @@ -3299,9 +3456,9 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", @@ -3310,9 +3467,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -3328,9 +3485,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" @@ -3358,9 +3515,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -3370,9 +3527,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -3395,9 +3552,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -3412,9 +3569,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "getrandom", "rand", @@ -3471,9 +3628,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3481,24 +3638,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -3508,9 +3665,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3518,28 +3675,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -3547,9 +3704,9 @@ dependencies = [ [[package]] name = "web-time" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee269d72cc29bf77a2c4bc689cc750fb39f5cbd493d2205bbb3f5c7779cf7b0" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -3557,9 +3714,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "winapi" @@ -3594,11 +3751,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.4", ] [[package]] @@ -3607,7 +3764,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", ] [[package]] @@ -3616,13 +3782,28 @@ 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", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -3631,47 +3812,89 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + [[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_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + [[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_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + [[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_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + [[package]] name = "winnow" -version = "0.5.17" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -3683,7 +3906,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3733,5 +3956,5 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.53", ] From e91515d4dc375bbe21b6045d24ff2637cbef62fb Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 19 Mar 2024 15:59:13 -0600 Subject: [PATCH 120/184] Also ran `cargo upgrades` and updated deps further --- zero_bin/Cargo.lock | 205 +++++++++++++++++++++++-------------- zero_bin/Cargo.toml | 6 +- zero_bin/leader/Cargo.toml | 2 +- 3 files changed, 131 insertions(+), 82 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 088e7d407..a74908cbe 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -257,7 +257,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.5.0", - "rustix 0.38.31", + "rustix 0.38.32", "slab", "tracing", "windows-sys 0.52.0", @@ -335,18 +335,19 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.20" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", "axum-core", - "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.2.0", + "hyper-util", "itoa", "matchit", "memchr", @@ -363,23 +364,28 @@ dependencies = [ "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] name = "axum-core" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -635,7 +641,7 @@ dependencies = [ "plonky2", "proof_gen", "thiserror", - "trace_decoder 0.1.1", + "trace_decoder", "tracing", ] @@ -1041,7 +1047,7 @@ dependencies = [ "jemallocator", "keccak-hash 0.10.0", "log", - "mpt_trie 0.2.0", + "mpt_trie", "num", "num-bigint", "once_cell", @@ -1305,7 +1311,26 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", + "indexmap 2.2.5", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", "indexmap 2.2.5", "slab", "tokio", @@ -1414,6 +1439,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -1421,7 +1457,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -1453,9 +1512,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -1467,6 +1526,26 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.3", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1474,13 +1553,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.28", "rustls", "tokio", "tokio-rustls", ] +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.2.0", + "pin-project-lite", + "socket2 0.5.6", + "tokio", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -1850,27 +1945,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "mpt_trie" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf6d77f630021e46e127abfa047aebfba78bf207ed3dfd1c4f9e2370f9b60cd" -dependencies = [ - "bytes", - "enum-as-inner", - "ethereum-types", - "hex", - "keccak-hash 0.10.0", - "log", - "num", - "num-traits", - "parking_lot", - "rlp", - "serde", - "thiserror", - "uint", -] - [[package]] name = "mpt_trie" version = "0.2.0" @@ -2035,7 +2109,7 @@ dependencies = [ "paladin-core", "proof_gen", "serde", - "trace_decoder 0.1.1", + "trace_decoder", ] [[package]] @@ -2352,7 +2426,7 @@ dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite", - "rustix 0.38.31", + "rustix 0.38.32", "tracing", "windows-sys 0.52.0", ] @@ -2435,7 +2509,7 @@ dependencies = [ "paste", "plonky2", "serde", - "trace_decoder 0.2.0", + "trace_decoder", ] [[package]] @@ -2449,7 +2523,7 @@ dependencies = [ "paladin-core", "proof_gen", "serde", - "trace_decoder 0.1.1", + "trace_decoder", "tracing", ] @@ -2602,10 +2676,10 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-rustls", "ipnet", "js-sys", @@ -2687,7 +2761,7 @@ dependencies = [ "serde_path_to_error", "thiserror", "tokio", - "trace_decoder 0.1.1", + "trace_decoder", "tracing", "tracing-subscriber", ] @@ -2729,9 +2803,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ "bitflags 2.5.0", "errno", @@ -3371,31 +3445,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" -[[package]] -name = "trace_decoder" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08487265f29176ad03c894b1c1cf8da5adf9d82fc151b3191eb7f55350b5c58" -dependencies = [ - "bytes", - "ciborium", - "ciborium-io", - "enum-as-inner", - "enumn", - "ethereum-types", - "evm_arithmetization", - "hex", - "hex-literal", - "keccak-hash 0.10.0", - "log", - "mpt_trie 0.1.1", - "rlp", - "rlp-derive", - "serde", - "serde_with", - "thiserror", -] - [[package]] name = "trace_decoder" version = "0.2.0" @@ -3413,7 +3462,7 @@ dependencies = [ "hex-literal", "keccak-hash 0.10.0", "log", - "mpt_trie 0.2.0", + "mpt_trie", "rlp", "rlp-derive", "serde", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index a050be2a3..131f3c883 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -19,9 +19,9 @@ futures = "0.3.29" # zk-evm dependencies plonky2 = "0.2.0" -evm_arithmetization = "0.1.1" -trace_decoder = "0.1.1" -proof_gen = "0.1.1" +evm_arithmetization = "0.1.2" +trace_decoder = "0.2.0" +proof_gen = "0.1.2" [workspace.package] edition = "2021" diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index b7c0f964b..5c7bcc92e 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -21,7 +21,7 @@ proof_gen = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } ethereum-types = { workspace = true } -axum = "0.6.20" +axum = "0.7.4" # Local dependencies ops = { path = "../ops" } From d04f78a7457d38fa61edd044018067961eb188b8 Mon Sep 17 00:00:00 2001 From: muursh Date: Thu, 21 Mar 2024 12:20:53 +0400 Subject: [PATCH 121/184] fix axum api --- zero_bin/leader/src/http.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index f6578db6f..841877944 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -23,10 +23,8 @@ pub(crate) async fn http_main(runtime: Runtime, port: u16, output_dir: PathBuf) move |body| prove(body, runtime, output_dir.clone()) }), ); - - Ok(axum::Server::bind(&addr) - .serve(app.into_make_service()) - .await?) + let listener = tokio::net::TcpListener::bind(&addr).await?; + Ok(axum::serve(listener, app).await?) } /// Writes the generated block proof to a file. From d8c9759d7d50864065b8017d0160b3cd51c5651e Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 26 Mar 2024 10:18:05 -0600 Subject: [PATCH 122/184] Updated `.gitignore` to ignore generated plonky2 state --- zero_bin/.gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index 82b38c198..42acc2486 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -9,3 +9,7 @@ circuits/ # Folders containing logs from the utility scripts in tools/ debug/ proofs/ + +# Serialized generated prover & verifier state used by plonky2 +prover_state_* +verifier_state_* From 72df63e4658324545a74cad4c8c4a03a0e7e4287 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Thu, 28 Mar 2024 21:41:12 +0900 Subject: [PATCH 123/184] Update prover default features (#46) * Update Cargo.toml Remove test-only from default features. * Fix Literal(proof) * Fix Clippy --------- Co-authored-by: Linda Guiga --- zero_bin/prover/Cargo.toml | 2 +- zero_bin/prover/src/lib.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index ca0cb86c2..fc7fd24e8 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -22,5 +22,5 @@ futures = { workspace = true } ops = { path = "../ops" } [features] -default = ["test_only"] +default = [] test_only = ["ops/test_only"] \ No newline at end of file diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 0789423e0..abf424a95 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -1,5 +1,6 @@ use anyhow::Result; use ethereum_types::U256; +#[cfg(feature = "test_only")] use futures::stream::TryStreamExt; use ops::TxProof; use paladin::{ @@ -56,7 +57,7 @@ impl ProverInput { intern: p, }); - let block_proof = paladin::Literal(proof) + let block_proof = paladin::directive::Literal(proof) .map(&ops::BlockProof { prev }) .run(runtime) .await?; From 32bb50e50530c9b4c3ec6ce5892a8f540fae8694 Mon Sep 17 00:00:00 2001 From: Vladimir Trifonov Date: Tue, 2 Apr 2024 14:44:47 +0300 Subject: [PATCH 124/184] feat: add circuit version consistency check --- zero_bin/Cargo.lock | 60 ++++++++++++++++--- .../common/src/prover_state/persistence.rs | 13 ++-- zero_bin/leader/Cargo.toml | 1 + zero_bin/leader/src/main.rs | 13 ++++ zero_bin/leader/src/utils.rs | 34 +++++++++++ 5 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 zero_bin/leader/src/utils.rs diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index a74908cbe..f0790de93 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1833,6 +1833,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "tokio", + "toml", "tracing", "tracing-subscriber", ] @@ -2480,12 +2481,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "toml_datetime", - "toml_edit", + "toml_edit 0.20.2", ] [[package]] @@ -2976,6 +2976,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3400,11 +3409,26 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.9", +] + [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3414,7 +3438,20 @@ checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ "indexmap 2.2.5", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +dependencies = [ + "indexmap 2.2.5", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.5", ] [[package]] @@ -3948,6 +3985,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index 94c6fc920..cd33b04e0 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -1,3 +1,4 @@ +use std::env; use std::{ fmt::{Debug, Display}, fs::{self, OpenOptions}, @@ -102,9 +103,10 @@ impl DiskResource for BaseProverResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_base_{}", + "{}/{}_base_{}_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, + env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } @@ -137,9 +139,10 @@ impl DiskResource for MonolithicProverResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_monolithic_{}", + "{}/{}_monolithic_{}_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, + env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } @@ -171,9 +174,10 @@ impl DiskResource for RecursiveCircuitResource { fn path((circuit_type, size): &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_{}_{}", + "{}/{}_{}_{}_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, + env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), circuit_type.as_short_str(), size ) @@ -214,9 +218,10 @@ impl DiskResource for VerifierResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_{}", + "{}/{}_{}_{}", CIRCUITS_FOLDER, VERIFIER_STATE_FILE_PREFIX, + env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 5c7bcc92e..de39328a8 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -22,6 +22,7 @@ serde_json = { workspace = true } serde_path_to_error = { workspace = true } ethereum-types = { workspace = true } axum = "0.7.4" +toml = "0.8.12" # Local dependencies ops = { path = "../ops" } diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 36d2f1e3b..7cc9db8ce 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -1,3 +1,4 @@ +use std::env; use std::{fs::File, path::PathBuf}; use anyhow::Result; @@ -9,11 +10,14 @@ use ops::register; use paladin::runtime::Runtime; use proof_gen::types::PlonkyProofIntern; +use crate::utils::get_package_version; + mod cli; mod http; mod init; mod jerigon; mod stdio; +mod utils; fn get_previous_proof(path: Option) -> Result> { if path.is_none() { @@ -32,6 +36,15 @@ async fn main() -> Result<()> { dotenv().ok(); init::tracing(); + if env::var("EVM_ARITHMETIZATION_PKG_VER").is_err() { + let pkg_ver = get_package_version("evm_arithmetization")?; + // Set the environment variable for the evm_arithmetization package version + env::set_var( + "EVM_ARITHMETIZATION_PKG_VER", + pkg_ver.unwrap_or("NA".to_string()), + ); + } + let args = cli::Cli::parse(); if let paladin::config::Runtime::InMemory = args.paladin.runtime { // If running in emulation mode, we'll need to initialize the prover diff --git a/zero_bin/leader/src/utils.rs b/zero_bin/leader/src/utils.rs new file mode 100644 index 000000000..3a9a1ef3d --- /dev/null +++ b/zero_bin/leader/src/utils.rs @@ -0,0 +1,34 @@ +use std::fs::File; +use std::io::{BufReader, Read}; +use std::path::Path; + +use anyhow::Result; + +pub(crate) fn get_package_version(package_name: &str) -> Result> { + let manifest_dir = env!("CARGO_MANIFEST_DIR"); + let zero_bin_path = Path::new(manifest_dir) + .join("../") // Adjust the path according to your workspace structure + .canonicalize()?; + + let cargo_lock_path = zero_bin_path.join("Cargo.lock"); + let cargo_lock_file = File::open(cargo_lock_path); + if cargo_lock_file.is_err() { + return Ok(None); + } + + let mut cargo_lock_contents = String::new(); + BufReader::new(cargo_lock_file?).read_to_string(&mut cargo_lock_contents)?; + + let lockfile: toml::Value = toml::from_str(&cargo_lock_contents)?; + if let Some(package) = lockfile["package"] + .as_array() + .unwrap() + .iter() + .find(|&p| p["name"].as_str() == Some(package_name)) + { + let version = package["version"].as_str().unwrap(); + return Ok(Some(version.to_string())); + } + + Ok(None) +} From f3c10624ad51ae584a3c342d8e0b6798ebc7cc86 Mon Sep 17 00:00:00 2001 From: Vladimir Trifonov Date: Wed, 3 Apr 2024 16:30:28 +0300 Subject: [PATCH 125/184] fix: use circuits code digests instead of evm_arithmetization pkg version for circuits consistency check --- zero_bin/Cargo.lock | 90 +++++-------------- zero_bin/Cargo.toml | 6 +- zero_bin/common/Cargo.toml | 1 + zero_bin/common/src/prover_state/mod.rs | 29 ++++-- .../common/src/prover_state/persistence.rs | 15 ++-- zero_bin/common/src/prover_state/utils.rs | 86 ++++++++++++++++++ zero_bin/leader/Cargo.toml | 1 - zero_bin/leader/src/main.rs | 13 --- zero_bin/leader/src/utils.rs | 34 ------- 9 files changed, 142 insertions(+), 133 deletions(-) create mode 100644 zero_bin/common/src/prover_state/utils.rs delete mode 100644 zero_bin/leader/src/utils.rs diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index f0790de93..d0c1ac3fb 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -640,6 +640,7 @@ dependencies = [ "evm_arithmetization", "plonky2", "proof_gen", + "seahash", "thiserror", "trace_decoder", "tracing", @@ -1033,9 +1034,8 @@ dependencies = [ [[package]] name = "evm_arithmetization" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8460fed1dc1b098aab4dd9f5b7a2281423f2cd078393284ce1edbf13d49b55c" +version = "0.1.3" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.0#423e2614d31d323e950b4a461a27ef565a820b75" dependencies = [ "anyhow", "bytes", @@ -1833,7 +1833,6 @@ dependencies = [ "serde_json", "serde_path_to_error", "tokio", - "toml", "tracing", "tracing-subscriber", ] @@ -1948,9 +1947,8 @@ dependencies = [ [[package]] name = "mpt_trie" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276984ee63f94fab7907336095c1ff0d6a9117d8c42291564f79101ac275037b" +version = "0.2.1" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.0#423e2614d31d323e950b4a461a27ef565a820b75" dependencies = [ "bytes", "enum-as-inner", @@ -2348,9 +2346,9 @@ dependencies = [ [[package]] name = "plonky2" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b25deb9a4b9c2014c2f99cd36078f30e453d188d0ca8dd4c5ffd1d494b661ac1" +checksum = "d04c7dfa293cd62a8e1e3f21157dba8508ab2de6078b0e5fae202a4fc98ef224" dependencies = [ "ahash", "anyhow", @@ -2373,9 +2371,9 @@ dependencies = [ [[package]] name = "plonky2_field" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465a741ba134485af571152aab5086457a470aa8893391186cf78dd389694440" +checksum = "e27aab0723672905a49e4771232d7fcf71b97dd0e57634f1dfb5492635f765fc" dependencies = [ "anyhow", "itertools", @@ -2485,7 +2483,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "toml_edit 0.20.2", + "toml_edit", ] [[package]] @@ -2499,9 +2497,8 @@ dependencies = [ [[package]] name = "proof_gen" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b632ae384e13ad12ed9556e544650bfd79a54b3574fe3da4a749083ea6125440" +version = "0.1.3" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.0#423e2614d31d323e950b4a461a27ef565a820b75" dependencies = [ "ethereum-types", "evm_arithmetization", @@ -2906,6 +2903,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "2.9.2" @@ -2976,15 +2979,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3119,9 +3113,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "starky" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e0a1eec739c7a67cb1c6f916c0b7bf2d281cf2edb35d3db5caa6989090133e" +checksum = "acf2fe03f53197fbd5e2f2e5fbb809f8e953881cc729261b55f71134323bbfd6" dependencies = [ "ahash", "anyhow", @@ -3409,26 +3403,11 @@ dependencies = [ "tracing", ] -[[package]] -name = "toml" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.22.9", -] - [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" -dependencies = [ - "serde", -] [[package]] name = "toml_edit" @@ -3438,20 +3417,7 @@ checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ "indexmap 2.2.5", "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" -dependencies = [ - "indexmap 2.2.5", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.6.5", + "winnow", ] [[package]] @@ -3484,9 +3450,8 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "trace_decoder" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69c42e0c922b0a7eafaad55ca960f8bc9a8fa95eed4b8ec1beb3749d6543d789" +version = "0.3.0" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.0#423e2614d31d323e950b4a461a27ef565a820b75" dependencies = [ "bytes", "ciborium", @@ -3985,15 +3950,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winnow" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" -dependencies = [ - "memchr", -] - [[package]] name = "winreg" version = "0.50.0" diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 131f3c883..07c6f2074 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -19,9 +19,9 @@ futures = "0.3.29" # zk-evm dependencies plonky2 = "0.2.0" -evm_arithmetization = "0.1.2" -trace_decoder = "0.2.0" -proof_gen = "0.1.2" +evm_arithmetization = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.0" } +trace_decoder = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.0" } +proof_gen = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.0" } [workspace.package] edition = "2021" diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 8dc464d5e..2eab391d0 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -17,3 +17,4 @@ evm_arithmetization = { workspace = true } clap = { workspace = true } anyhow = { workspace = true } trace_decoder = { workspace = true } +seahash = "4.1.0" diff --git a/zero_bin/common/src/prover_state/mod.rs b/zero_bin/common/src/prover_state/mod.rs index 090201f16..6753ad6c5 100644 --- a/zero_bin/common/src/prover_state/mod.rs +++ b/zero_bin/common/src/prover_state/mod.rs @@ -14,9 +14,12 @@ use std::{fmt::Display, sync::OnceLock}; use clap::ValueEnum; -use evm_arithmetization::{proof::AllProof, prover::prove, AllStark, StarkConfig}; +use evm_arithmetization::{ + cpu::kernel::aggregator::KERNEL, proof::AllProof, prover::prove, AllStark, StarkConfig, +}; use plonky2::{ - field::goldilocks_field::GoldilocksField, plonk::config::PoseidonGoldilocksConfig, + field::goldilocks_field::GoldilocksField, + plonk::config::{GenericHashOut, PoseidonGoldilocksConfig}, util::timing::TimingTree, }; use proof_gen::{proof_types::GeneratedTxnProof, prover_state::ProverState, VerifierState}; @@ -24,14 +27,18 @@ use trace_decoder::types::TxnProofGenIR; use tracing::info; use self::circuit::{CircuitConfig, NUM_TABLES}; -use crate::prover_state::persistence::{ - BaseProverResource, DiskResource, MonolithicProverResource, RecursiveCircuitResource, - VerifierResource, +use crate::prover_state::{ + persistence::{ + BaseProverResource, DiskResource, MonolithicProverResource, RecursiveCircuitResource, + VerifierResource, + }, + utils::pkg_consistency_check, }; pub mod circuit; pub mod cli; pub mod persistence; +mod utils; pub(crate) type Config = PoseidonGoldilocksConfig; pub(crate) type Field = GoldilocksField; @@ -252,6 +259,18 @@ impl ProverStateManager { CircuitPersistence::Disk(strategy) => { info!("attempting to load preprocessed circuits from disk..."); + // Check the package consistency before loading the circuits. + pkg_consistency_check(&[ + self.circuit_config + .as_all_recursive_circuits() + .block + .circuit + .verifier_only + .circuit_digest + .to_bytes(), + KERNEL.hash().to_fixed_bytes().to_vec(), + ]); + let disk_state = match strategy { TableLoadStrategy::OnDemand => BaseProverResource::get(&self.circuit_config), TableLoadStrategy::Monolithic => { diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index cd33b04e0..dae26e640 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -1,4 +1,3 @@ -use std::env; use std::{ fmt::{Debug, Display}, fs::{self, OpenOptions}, @@ -17,7 +16,7 @@ use super::{ Config, RecursiveCircuitsForTableSize, SIZE, }; -const CIRCUITS_FOLDER: &str = "./circuits"; +pub(crate) const CIRCUITS_FOLDER: &str = "./circuits"; const PROVER_STATE_FILE_PREFIX: &str = "prover_state"; const VERIFIER_STATE_FILE_PREFIX: &str = "verifier_state"; @@ -103,10 +102,9 @@ impl DiskResource for BaseProverResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_base_{}_{}", + "{}/{}_base_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, - env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } @@ -139,10 +137,9 @@ impl DiskResource for MonolithicProverResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_monolithic_{}_{}", + "{}/{}_monolithic_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, - env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } @@ -174,10 +171,9 @@ impl DiskResource for RecursiveCircuitResource { fn path((circuit_type, size): &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_{}_{}_{}", + "{}/{}_{}_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, - env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), circuit_type.as_short_str(), size ) @@ -218,10 +214,9 @@ impl DiskResource for VerifierResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_{}_{}", + "{}/{}_{}", CIRCUITS_FOLDER, VERIFIER_STATE_FILE_PREFIX, - env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } diff --git a/zero_bin/common/src/prover_state/utils.rs b/zero_bin/common/src/prover_state/utils.rs new file mode 100644 index 000000000..83024a13e --- /dev/null +++ b/zero_bin/common/src/prover_state/utils.rs @@ -0,0 +1,86 @@ +use std::fs::{self, File}; +use std::hash::Hasher; +use std::io::{Read, Write}; +use std::path::Path; + +use seahash::SeaHasher; +use tracing::info; + +use super::persistence::CIRCUITS_FOLDER; + +/// Checks the consistency of circuits code by comparing a computed hash +/// derived from the provided array of circuit code hashes against a reference +/// hash stored in a designated file within the circuits folder. This function +/// performs several actions based on this comparison: +/// +/// - If the computed aggregate hash differs from the stored hash, or if the +/// hash file does not exist, the function will delete the existing circuits +/// folder (if it exists), recreate it, and then write the new computed hash +/// into the hash file. +/// +/// - If the computed hash matches the stored hash, indicating no changes in the +/// circuits code, the function takes no action. +/// +/// This process ensures that the stored hash always reflects the current state +/// of the circuits code, providing a mechanism for detecting changes and +/// maintaining consistency. +/// +/// # Parameters +/// +/// * `circuits_hashes` - A dynamic number of `Vec` arguments representing +/// circuit code hashes. +/// +/// # Side Effects +/// +/// - May delete and recreate the circuits folder. +/// - May modify or create a file within the circuits folder to store the latest +/// hash. +pub(crate) fn pkg_consistency_check(circuits_hashes: I) +where + I: IntoIterator, + T: AsRef<[u8]>, +{ + let mut hasher = SeaHasher::new(); + for hash in circuits_hashes { + hasher.write(hash.as_ref()); + } + let hash = hasher.finish(); + + let hash_file_path = Path::new(CIRCUITS_FOLDER).join("circuits_consistency_hash"); + + // Check if the circuits folder exists + match fs::metadata(CIRCUITS_FOLDER) { + Ok(_) => { + // Circuits folder exists, check the hash file + let mut existing_hash = String::new(); + if let Ok(mut hash_file) = File::open(&hash_file_path) { + // If the hash file exists and can be read, compare the hash + if hash_file.read_to_string(&mut existing_hash).is_ok() + && existing_hash == hash.to_string() + { + // Hashes are the same, do nothing + return; + } + } + + // Hashes differ or hash file cannot be read, delete the folder + if fs::remove_dir_all(CIRCUITS_FOLDER).is_err() { + return; // Early return if unable to delete + } + } + Err(_) => { + info!( + "Initializing circuits storage folder with new consistency hash: {}", + hash + ); + } + } + + // Recreate the circuits folder and write the new hash + if fs::create_dir(CIRCUITS_FOLDER).is_ok() { + if let Ok(mut hash_file) = File::create(&hash_file_path) { + // Ignore errors in writing the hash + let _ = hash_file.write_all(hash.to_string().as_bytes()); + } + } +} diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index de39328a8..5c7bcc92e 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -22,7 +22,6 @@ serde_json = { workspace = true } serde_path_to_error = { workspace = true } ethereum-types = { workspace = true } axum = "0.7.4" -toml = "0.8.12" # Local dependencies ops = { path = "../ops" } diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 7cc9db8ce..36d2f1e3b 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -1,4 +1,3 @@ -use std::env; use std::{fs::File, path::PathBuf}; use anyhow::Result; @@ -10,14 +9,11 @@ use ops::register; use paladin::runtime::Runtime; use proof_gen::types::PlonkyProofIntern; -use crate::utils::get_package_version; - mod cli; mod http; mod init; mod jerigon; mod stdio; -mod utils; fn get_previous_proof(path: Option) -> Result> { if path.is_none() { @@ -36,15 +32,6 @@ async fn main() -> Result<()> { dotenv().ok(); init::tracing(); - if env::var("EVM_ARITHMETIZATION_PKG_VER").is_err() { - let pkg_ver = get_package_version("evm_arithmetization")?; - // Set the environment variable for the evm_arithmetization package version - env::set_var( - "EVM_ARITHMETIZATION_PKG_VER", - pkg_ver.unwrap_or("NA".to_string()), - ); - } - let args = cli::Cli::parse(); if let paladin::config::Runtime::InMemory = args.paladin.runtime { // If running in emulation mode, we'll need to initialize the prover diff --git a/zero_bin/leader/src/utils.rs b/zero_bin/leader/src/utils.rs deleted file mode 100644 index 3a9a1ef3d..000000000 --- a/zero_bin/leader/src/utils.rs +++ /dev/null @@ -1,34 +0,0 @@ -use std::fs::File; -use std::io::{BufReader, Read}; -use std::path::Path; - -use anyhow::Result; - -pub(crate) fn get_package_version(package_name: &str) -> Result> { - let manifest_dir = env!("CARGO_MANIFEST_DIR"); - let zero_bin_path = Path::new(manifest_dir) - .join("../") // Adjust the path according to your workspace structure - .canonicalize()?; - - let cargo_lock_path = zero_bin_path.join("Cargo.lock"); - let cargo_lock_file = File::open(cargo_lock_path); - if cargo_lock_file.is_err() { - return Ok(None); - } - - let mut cargo_lock_contents = String::new(); - BufReader::new(cargo_lock_file?).read_to_string(&mut cargo_lock_contents)?; - - let lockfile: toml::Value = toml::from_str(&cargo_lock_contents)?; - if let Some(package) = lockfile["package"] - .as_array() - .unwrap() - .iter() - .find(|&p| p["name"].as_str() == Some(package_name)) - { - let version = package["version"].as_str().unwrap(); - return Ok(Some(version.to_string())); - } - - Ok(None) -} From 522d02ac2bf455fa236b9b2a25ae4acd104f06cf Mon Sep 17 00:00:00 2001 From: Vladimir Trifonov Date: Wed, 3 Apr 2024 16:40:04 +0300 Subject: [PATCH 126/184] fix: fix clippy issue --- zero_bin/common/src/prover_state/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/common/src/prover_state/mod.rs b/zero_bin/common/src/prover_state/mod.rs index 6753ad6c5..1c0e2142c 100644 --- a/zero_bin/common/src/prover_state/mod.rs +++ b/zero_bin/common/src/prover_state/mod.rs @@ -260,7 +260,7 @@ impl ProverStateManager { info!("attempting to load preprocessed circuits from disk..."); // Check the package consistency before loading the circuits. - pkg_consistency_check(&[ + pkg_consistency_check([ self.circuit_config .as_all_recursive_circuits() .block From 76a3b0c3c3770b76b4a89d6749e62250a61897d9 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Mon, 8 Apr 2024 09:36:11 +0900 Subject: [PATCH 127/184] Reduce verbosity in logs --- zero_bin/leader/src/init.rs | 6 +++--- zero_bin/rpc/src/init.rs | 6 +++--- zero_bin/verifier/src/init.rs | 6 +++--- zero_bin/worker/src/init.rs | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/zero_bin/leader/src/init.rs b/zero_bin/leader/src/init.rs index 28c00d482..f93914895 100644 --- a/zero_bin/leader/src/init.rs +++ b/zero_bin/leader/src/init.rs @@ -1,10 +1,10 @@ -use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; +use tracing_subscriber::{prelude::*, util::SubscriberInitExt, EnvFilter}; pub(crate) fn tracing() { tracing_subscriber::Registry::default() .with( tracing_subscriber::fmt::layer() - .pretty() - .with_span_events(FmtSpan::CLOSE) + .with_ansi(false) + .compact() .with_filter(EnvFilter::from_default_env()), ) .init(); diff --git a/zero_bin/rpc/src/init.rs b/zero_bin/rpc/src/init.rs index 28c00d482..f93914895 100644 --- a/zero_bin/rpc/src/init.rs +++ b/zero_bin/rpc/src/init.rs @@ -1,10 +1,10 @@ -use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; +use tracing_subscriber::{prelude::*, util::SubscriberInitExt, EnvFilter}; pub(crate) fn tracing() { tracing_subscriber::Registry::default() .with( tracing_subscriber::fmt::layer() - .pretty() - .with_span_events(FmtSpan::CLOSE) + .with_ansi(false) + .compact() .with_filter(EnvFilter::from_default_env()), ) .init(); diff --git a/zero_bin/verifier/src/init.rs b/zero_bin/verifier/src/init.rs index 28c00d482..f93914895 100644 --- a/zero_bin/verifier/src/init.rs +++ b/zero_bin/verifier/src/init.rs @@ -1,10 +1,10 @@ -use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; +use tracing_subscriber::{prelude::*, util::SubscriberInitExt, EnvFilter}; pub(crate) fn tracing() { tracing_subscriber::Registry::default() .with( tracing_subscriber::fmt::layer() - .pretty() - .with_span_events(FmtSpan::CLOSE) + .with_ansi(false) + .compact() .with_filter(EnvFilter::from_default_env()), ) .init(); diff --git a/zero_bin/worker/src/init.rs b/zero_bin/worker/src/init.rs index 28c00d482..f93914895 100644 --- a/zero_bin/worker/src/init.rs +++ b/zero_bin/worker/src/init.rs @@ -1,10 +1,10 @@ -use tracing_subscriber::{fmt::format::FmtSpan, prelude::*, util::SubscriberInitExt, EnvFilter}; +use tracing_subscriber::{prelude::*, util::SubscriberInitExt, EnvFilter}; pub(crate) fn tracing() { tracing_subscriber::Registry::default() .with( tracing_subscriber::fmt::layer() - .pretty() - .with_span_events(FmtSpan::CLOSE) + .with_ansi(false) + .compact() .with_filter(EnvFilter::from_default_env()), ) .init(); From cd0b29b4ed0b9d7a84aff6ee4d4ed0b652d40137 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 01:15:09 +0000 Subject: [PATCH 128/184] Bump h2 from 0.3.25 to 0.3.26 Bumps [h2](https://github.com/hyperium/h2) from 0.3.25 to 0.3.26. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/v0.3.26/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.25...v0.3.26) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- zero_bin/Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index a74908cbe..c45e8c152 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1302,9 +1302,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "h2" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -1512,14 +1512,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.25", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2676,7 +2676,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.3.25", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", From 6c65436f730b4b03bc7dafaeb8d989d817310c94 Mon Sep 17 00:00:00 2001 From: Vladimir Trifonov Date: Tue, 9 Apr 2024 09:13:46 +0300 Subject: [PATCH 129/184] fix: add pr comments fixes --- zero_bin/common/src/prover_state/utils.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/zero_bin/common/src/prover_state/utils.rs b/zero_bin/common/src/prover_state/utils.rs index 83024a13e..21d042aa7 100644 --- a/zero_bin/common/src/prover_state/utils.rs +++ b/zero_bin/common/src/prover_state/utils.rs @@ -4,7 +4,7 @@ use std::io::{Read, Write}; use std::path::Path; use seahash::SeaHasher; -use tracing::info; +use tracing::{info, warn}; use super::persistence::CIRCUITS_FOLDER; @@ -61,11 +61,13 @@ where // Hashes are the same, do nothing return; } + } else { + warn!("Unable to read circuits consistency hash file"); } // Hashes differ or hash file cannot be read, delete the folder if fs::remove_dir_all(CIRCUITS_FOLDER).is_err() { - return; // Early return if unable to delete + panic!("Failed to delete circuits storage folder"); } } Err(_) => { @@ -82,5 +84,7 @@ where // Ignore errors in writing the hash let _ = hash_file.write_all(hash.to_string().as_bytes()); } + } else { + panic!("Failed to create circuits storage folder"); } } From c7cabda67ec0be47bce7f899c07c9ddde18885e1 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 10 Apr 2024 13:53:10 -0600 Subject: [PATCH 130/184] Debug & proving scripts now use indentical logging - Previously they were both different, and both were missing important modules. --- zero_bin/tools/debug_block.sh | 2 +- zero_bin/tools/prove_blocks.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/tools/debug_block.sh b/zero_bin/tools/debug_block.sh index df1a9c68c..0b639ffae 100755 --- a/zero_bin/tools/debug_block.sh +++ b/zero_bin/tools/debug_block.sh @@ -6,7 +6,7 @@ export RUST_BACKTRACE=1 export RUST_MIN_STACK=8388608 -export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace +export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace,leader=info # Speciying smallest ranges, as we won't need them anyway. export ARITHMETIC_CIRCUIT_SIZE="16..17" diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index a6f4e4bbc..f1d62a325 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -7,7 +7,7 @@ # 4 --> Ignore previous proofs (boolean) export RUST_BACKTRACE=1 -export RUST_LOG=plonky2=trace,evm_arithmetization=trace +export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace,leader=info export ARITHMETIC_CIRCUIT_SIZE="16..23" export BYTE_PACKING_CIRCUIT_SIZE="9..21" From a5a99120b90ee67580f782be9a4ff12522893c75 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 11 Apr 2024 09:25:40 +0900 Subject: [PATCH 131/184] Add flag to scripts --- zero_bin/tools/debug_block.sh | 1 + zero_bin/tools/prove_blocks.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/zero_bin/tools/debug_block.sh b/zero_bin/tools/debug_block.sh index 0b639ffae..74323e201 100755 --- a/zero_bin/tools/debug_block.sh +++ b/zero_bin/tools/debug_block.sh @@ -7,6 +7,7 @@ export RUST_BACKTRACE=1 export RUST_MIN_STACK=8388608 export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace,leader=info +export RUSTFLAGS='-Ctarget-cpu=native' # Speciying smallest ranges, as we won't need them anyway. export ARITHMETIC_CIRCUIT_SIZE="16..17" diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index f1d62a325..c27317efd 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -8,6 +8,7 @@ export RUST_BACKTRACE=1 export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace,leader=info +export RUSTFLAGS='-Ctarget-cpu=native' export ARITHMETIC_CIRCUIT_SIZE="16..23" export BYTE_PACKING_CIRCUIT_SIZE="9..21" From ddd6f11c6c7ca410da8dd9ea294b0e2e8d2cc4f4 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 12 Apr 2024 18:45:21 -0400 Subject: [PATCH 132/184] Allow verifier to load .env file --- zero_bin/Cargo.lock | 1 + zero_bin/verifier/Cargo.toml | 1 + zero_bin/verifier/src/main.rs | 2 ++ 3 files changed, 4 insertions(+) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index c45e8c152..a62582da5 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -3640,6 +3640,7 @@ dependencies = [ "anyhow", "clap", "common", + "dotenvy", "proof_gen", "serde", "serde_json", diff --git a/zero_bin/verifier/Cargo.toml b/zero_bin/verifier/Cargo.toml index 482ec7831..cbd76b150 100644 --- a/zero_bin/verifier/Cargo.toml +++ b/zero_bin/verifier/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" clap = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } +dotenvy = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index 60ba1d520..4ef86692f 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -2,6 +2,7 @@ use std::fs::File; use anyhow::Result; use clap::Parser; +use dotenvy::dotenv; use proof_gen::types::PlonkyProofIntern; use serde_json::Deserializer; @@ -9,6 +10,7 @@ mod cli; mod init; fn main() -> Result<()> { + dotenv().ok(); init::tracing(); let args = cli::Cli::parse(); From d4291201a2a474efcd28075cf6e5fd71be602b23 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 12 Apr 2024 18:47:57 -0400 Subject: [PATCH 133/184] Add logging info from verifier side --- zero_bin/verifier/src/main.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index 4ef86692f..271a1346e 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -5,6 +5,7 @@ use clap::Parser; use dotenvy::dotenv; use proof_gen::types::PlonkyProofIntern; use serde_json::Deserializer; +use tracing::info; mod cli; mod init; @@ -23,7 +24,10 @@ fn main() -> Result<()> { .into_prover_state_manager() .verifier()?; - verifer.verify(&input)?; + match verifer.verify(&input) { + Ok(_) => info!("Proof verified successfully!"), + Err(e) => info!("Proof verification failed with error: {:?}", e), + }; Ok(()) } From 427648debef6ed1dd0efdafbe0bd074f3b7a88b2 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 17 Apr 2024 10:25:12 -0600 Subject: [PATCH 134/184] Updated docs for new parameter in `prove_blocks.sh` - Was not mentioned in the readme at all, and people would always run into this if they followed the old docs. --- zero_bin/README.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/zero_bin/README.md b/zero_bin/README.md index ef266a38d..e57611812 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -357,21 +357,30 @@ There are three branches that are used for development: For testing proof generation for blocks, the `testing` branch should be used. +### Proving Blocks + If you want to generate a full block proof, you can use `tools/prove_blocks.sh`: ```sh -./prove_blocks.sh +./prove_blocks.sh ``` Which may look like this: ```sh -./prove_blocks.sh 17 18 http://127.0.0.1:8545 +./prove_blocks.sh 17 18 http://127.0.0.1:8545 false ``` -Which will attempt to generate blocks `17` & `18` consecutively. +Which will attempt to generate blocks `17` & `18` consecutively and incorporate the previous block proof during generation. + +A few other notes: + +- Proving blocks is very resource intensive in terms of both CPU and memory. You can also only generate the witness for a block instead (see [Generating Witnesses Only](#generating-witnesses-only)) to significantly reduce the CPU and memory requirements. +- Because incorporating the previous block proof requires a chain of proofs back to the last checkpoint height, you can also disable this requirement by passing `true` for `` (which internally just sets the current checkpoint height to the current block height). + +### Generating Witnesses Only -However, proving blocks is very resource intensive in both CPU and memory. You can also only generate the witness for a block instead to significantly reduce the CPU and memory requirements: +If you want to test a block without the high CPU & memory requirements that come with creating a full proof, you can instead generate only the witness using `tools/debug_block.sh`: ```sh ./debug_block.sh From bb37594dfd496fcac24c13f79d8ac3b0aef4f9f7 Mon Sep 17 00:00:00 2001 From: BGluth Date: Wed, 17 Apr 2024 10:57:38 -0600 Subject: [PATCH 135/184] Apply suggestions from code review (Nashtare) Co-authored-by: Robin Salen <30937548+Nashtare@users.noreply.github.com> --- zero_bin/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/README.md b/zero_bin/README.md index e57611812..6b410242d 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -371,12 +371,12 @@ Which may look like this: ./prove_blocks.sh 17 18 http://127.0.0.1:8545 false ``` -Which will attempt to generate blocks `17` & `18` consecutively and incorporate the previous block proof during generation. +Which will attempt to generate proofs for blocks `17` & `18` consecutively and incorporate the previous block proof during generation. A few other notes: - Proving blocks is very resource intensive in terms of both CPU and memory. You can also only generate the witness for a block instead (see [Generating Witnesses Only](#generating-witnesses-only)) to significantly reduce the CPU and memory requirements. -- Because incorporating the previous block proof requires a chain of proofs back to the last checkpoint height, you can also disable this requirement by passing `true` for `` (which internally just sets the current checkpoint height to the current block height). +- Because incorporating the previous block proof requires a chain of proofs back to the last checkpoint height, you can also disable this requirement by passing `true` for `` (which internally just sets the current checkpoint height to the previous block height). ### Generating Witnesses Only From 204a4437ff0f6c83fdf0af4fbe9119b8560c908b Mon Sep 17 00:00:00 2001 From: BGluth Date: Thu, 18 Apr 2024 18:51:27 -0600 Subject: [PATCH 136/184] Now logs time to generate proofs --- zero_bin/Cargo.lock | 4 ++ zero_bin/Cargo.toml | 2 + zero_bin/ops/Cargo.toml | 4 ++ zero_bin/ops/src/lib.rs | 128 ++++++++++++++++++++++++++++++++++++---- 4 files changed, 128 insertions(+), 10 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 5e901dc67..53a3d9706 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2104,11 +2104,15 @@ name = "ops" version = "0.1.0" dependencies = [ "common", + "ethereum-types", "evm_arithmetization", + "keccak-hash 0.10.0", "paladin-core", "proof_gen", + "rlp", "serde", "trace_decoder", + "tracing", ] [[package]] diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 07c6f2074..eeca6b8a8 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -16,6 +16,8 @@ serde_json = "1.0.107" ethereum-types = "0.14.1" thiserror = "1.0.50" futures = "0.3.29" +rlp = "0.5.2" +keccak-hash = "0.10.0" # zk-evm dependencies plonky2 = "0.2.0" diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 48235c647..3072cdb08 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -14,6 +14,10 @@ serde = { workspace = true } evm_arithmetization = { workspace = true, optional = true} proof_gen = { workspace = true } trace_decoder = { workspace = true } +tracing = { workspace = true } +rlp = { workspace = true } +ethereum-types = "0.14.1" +keccak-hash = { workspace = true } common = { path = "../common" } diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index c1b56e062..34fe6156d 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,4 +1,7 @@ +use std::{ops::RangeInclusive, time::Instant}; + use common::prover_state::p_state; +use keccak_hash::keccak; use paladin::{ operation::{FatalError, FatalStrategy, Monoid, Operation, Result}, registry, RemoteExecute, @@ -8,22 +11,43 @@ use proof_gen::{ proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, }; use serde::{Deserialize, Serialize}; -use trace_decoder::types::TxnProofGenIR; +use trace_decoder::types::{BlockHeight, TxnProofGenIR}; +use tracing::{event, info_span, Level}; registry!(); #[derive(Deserialize, Serialize, RemoteExecute)] pub struct TxProof; +fn run_and_wrap_closure_in_elapsed_span(f: F, ident: String) -> Result +where + F: Fn() -> Result, +{ + let _span = info_span!("proof generation", ident).entered(); + let start = Instant::now(); + + let proof = f()?; + + event!(Level::INFO, "Proof {:.4} took {:?}", ident, start.elapsed()); + Ok(proof) +} + #[cfg(not(feature = "test_only"))] impl Operation for TxProof { type Input = TxnProofGenIR; type Output = proof_gen::proof_types::AggregatableProof; fn execute(&self, input: Self::Input) -> Result { - let proof = common::prover_state::p_manager() - .generate_txn_proof(input) - .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; + let txn_ident = Self::txn_ident(&input); + + let proof = run_and_wrap_closure_in_elapsed_span( + || { + common::prover_state::p_manager() + .generate_txn_proof(input.clone()) + .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate).into()) + }, + txn_ident, + )?; Ok(proof.into()) } @@ -35,13 +59,37 @@ impl Operation for TxProof { type Output = (); fn execute(&self, input: Self::Input) -> Result { - evm_arithmetization::prover::testing::simulate_execution::(input) - .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; + let txn_ident = Self::txn_ident(&input); + + run_and_wrap_closure_in_elapsed_span( + || { + evm_arithmetization::prover::testing::simulate_execution::( + input.clone(), + ) + .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate).into()) + }, + txn_ident, + )?; Ok(()) } } +impl TxProof { + fn txn_ident(ir: &TxnProofGenIR) -> String { + let txn_hash_str = ir + .signed_txn + .as_ref() + .map(|txn| format!("{:x}", keccak(txn))) + .unwrap_or_else(|| "Dummy".to_string()); + + format!( + "Txn b{} - {} ({})", + ir.block_metadata.block_number, ir.txn_number_before, txn_hash_str + ) + } +} + #[derive(Deserialize, Serialize, RemoteExecute)] pub struct AggProof; @@ -49,7 +97,11 @@ impl Monoid for AggProof { type Elem = AggregatableProof; fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { - let result = generate_agg_proof(p_state(), &a, &b).map_err(FatalError::from)?; + let ident = Self::agg_ident(&a, &b); + let result = run_and_wrap_closure_in_elapsed_span( + || generate_agg_proof(p_state(), &a, &b).map_err(|e| FatalError::from(e).into()), + ident, + )?; Ok(result.into()) } @@ -60,6 +112,21 @@ impl Monoid for AggProof { } } +impl AggProof { + fn agg_ident(a: &AggregatableProof, b: &AggregatableProof) -> String { + let b_height = b_height_from_aggregatable_proof(a); + let a_range = proof_range_from_aggregatable_proof(a); + let b_range = proof_range_from_aggregatable_proof(b); + + format!( + "Agg b{} - {}..={}", + b_height, + *a_range.start(), + *b_range.end() + ) + } +} + #[derive(Deserialize, Serialize, RemoteExecute)] pub struct BlockProof { pub prev: Option, @@ -70,9 +137,50 @@ impl Operation for BlockProof { type Output = GeneratedBlockProof; fn execute(&self, input: Self::Input) -> Result { - Ok( - generate_block_proof(p_state(), self.prev.as_ref(), &input) - .map_err(FatalError::from)?, + let ident = Self::block_ident(&input); + + run_and_wrap_closure_in_elapsed_span( + || { + generate_block_proof(p_state(), self.prev.as_ref(), &input) + .map_err(|e| FatalError::from(e).into()) + }, + ident, ) } } + +impl BlockProof { + fn block_ident(p: &GeneratedAggProof) -> String { + let b_height = p.p_vals.block_metadata.block_number; + let b_range = aggregated_proof_range(p); + + format!( + "Block b{} ({}..={})", + b_height, + *b_range.start(), + *b_range.end() + ) + } +} + +fn proof_range_from_aggregatable_proof(p: &AggregatableProof) -> RangeInclusive { + match p { + AggregatableProof::Txn(info) => { + let txn_idx = info.p_vals.extra_block_data.txn_number_before.as_usize(); + txn_idx..=txn_idx + } + AggregatableProof::Agg(info) => aggregated_proof_range(info), + } +} + +fn aggregated_proof_range(p: &GeneratedAggProof) -> RangeInclusive { + p.p_vals.extra_block_data.txn_number_before.as_usize() + ..=p.p_vals.extra_block_data.txn_number_after.as_usize() +} + +fn b_height_from_aggregatable_proof(p: &AggregatableProof) -> BlockHeight { + match p { + AggregatableProof::Txn(info) => info.p_vals.block_metadata.block_number.as_u64(), + AggregatableProof::Agg(info) => info.p_vals.block_metadata.block_number.as_u64(), + } +} From 17535a910f051fa49926f6f830464715a34d0ffe Mon Sep 17 00:00:00 2001 From: BGluth Date: Fri, 19 Apr 2024 09:07:23 -0600 Subject: [PATCH 137/184] Removed agg & block proof timing logic --- zero_bin/ops/Cargo.toml | 2 +- zero_bin/ops/src/lib.rs | 87 ++++++++--------------------------------- 2 files changed, 17 insertions(+), 72 deletions(-) diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 3072cdb08..9ca1ea27b 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -16,7 +16,7 @@ proof_gen = { workspace = true } trace_decoder = { workspace = true } tracing = { workspace = true } rlp = { workspace = true } -ethereum-types = "0.14.1" +ethereum-types = { workspace = true } keccak-hash = { workspace = true } common = { path = "../common" } diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 34fe6156d..0c0b4ca22 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,4 +1,4 @@ -use std::{ops::RangeInclusive, time::Instant}; +use std::time::Instant; use common::prover_state::p_state; use keccak_hash::keccak; @@ -11,7 +11,7 @@ use proof_gen::{ proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, }; use serde::{Deserialize, Serialize}; -use trace_decoder::types::{BlockHeight, TxnProofGenIR}; +use trace_decoder::types::TxnProofGenIR; use tracing::{event, info_span, Level}; registry!(); @@ -19,7 +19,7 @@ registry!(); #[derive(Deserialize, Serialize, RemoteExecute)] pub struct TxProof; -fn run_and_wrap_closure_in_elapsed_span(f: F, ident: String) -> Result +fn run_and_wrap_txn_proof_in_elapsed_span(f: F, ident: String) -> Result where F: Fn() -> Result, { @@ -28,7 +28,12 @@ where let proof = f()?; - event!(Level::INFO, "Proof {:.4} took {:?}", ident, start.elapsed()); + event!( + Level::INFO, + "txn proof {:.4} took {:?}", + ident, + start.elapsed() + ); Ok(proof) } @@ -40,7 +45,7 @@ impl Operation for TxProof { fn execute(&self, input: Self::Input) -> Result { let txn_ident = Self::txn_ident(&input); - let proof = run_and_wrap_closure_in_elapsed_span( + let proof = run_and_wrap_txn_proof_in_elapsed_span( || { common::prover_state::p_manager() .generate_txn_proof(input.clone()) @@ -61,7 +66,7 @@ impl Operation for TxProof { fn execute(&self, input: Self::Input) -> Result { let txn_ident = Self::txn_ident(&input); - run_and_wrap_closure_in_elapsed_span( + run_and_wrap_txn_proof_in_elapsed_span( || { evm_arithmetization::prover::testing::simulate_execution::( input.clone(), @@ -84,7 +89,7 @@ impl TxProof { .unwrap_or_else(|| "Dummy".to_string()); format!( - "Txn b{} - {} ({})", + "b{} - {} ({})", ir.block_metadata.block_number, ir.txn_number_before, txn_hash_str ) } @@ -97,11 +102,7 @@ impl Monoid for AggProof { type Elem = AggregatableProof; fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { - let ident = Self::agg_ident(&a, &b); - let result = run_and_wrap_closure_in_elapsed_span( - || generate_agg_proof(p_state(), &a, &b).map_err(|e| FatalError::from(e).into()), - ident, - )?; + let result = generate_agg_proof(p_state(), &a, &b).map_err(FatalError::from)?; Ok(result.into()) } @@ -112,21 +113,6 @@ impl Monoid for AggProof { } } -impl AggProof { - fn agg_ident(a: &AggregatableProof, b: &AggregatableProof) -> String { - let b_height = b_height_from_aggregatable_proof(a); - let a_range = proof_range_from_aggregatable_proof(a); - let b_range = proof_range_from_aggregatable_proof(b); - - format!( - "Agg b{} - {}..={}", - b_height, - *a_range.start(), - *b_range.end() - ) - } -} - #[derive(Deserialize, Serialize, RemoteExecute)] pub struct BlockProof { pub prev: Option, @@ -137,50 +123,9 @@ impl Operation for BlockProof { type Output = GeneratedBlockProof; fn execute(&self, input: Self::Input) -> Result { - let ident = Self::block_ident(&input); - - run_and_wrap_closure_in_elapsed_span( - || { - generate_block_proof(p_state(), self.prev.as_ref(), &input) - .map_err(|e| FatalError::from(e).into()) - }, - ident, - ) - } -} - -impl BlockProof { - fn block_ident(p: &GeneratedAggProof) -> String { - let b_height = p.p_vals.block_metadata.block_number; - let b_range = aggregated_proof_range(p); - - format!( - "Block b{} ({}..={})", - b_height, - *b_range.start(), - *b_range.end() + Ok( + generate_block_proof(p_state(), self.prev.as_ref(), &input) + .map_err(FatalError::from)?, ) } } - -fn proof_range_from_aggregatable_proof(p: &AggregatableProof) -> RangeInclusive { - match p { - AggregatableProof::Txn(info) => { - let txn_idx = info.p_vals.extra_block_data.txn_number_before.as_usize(); - txn_idx..=txn_idx - } - AggregatableProof::Agg(info) => aggregated_proof_range(info), - } -} - -fn aggregated_proof_range(p: &GeneratedAggProof) -> RangeInclusive { - p.p_vals.extra_block_data.txn_number_before.as_usize() - ..=p.p_vals.extra_block_data.txn_number_after.as_usize() -} - -fn b_height_from_aggregatable_proof(p: &AggregatableProof) -> BlockHeight { - match p { - AggregatableProof::Txn(info) => info.p_vals.block_metadata.block_number.as_u64(), - AggregatableProof::Agg(info) => info.p_vals.block_metadata.block_number.as_u64(), - } -} From f99f4a6d45a17c251d8561052182ca85187c7f27 Mon Sep 17 00:00:00 2001 From: BGluth Date: Fri, 19 Apr 2024 12:51:14 -0600 Subject: [PATCH 138/184] Fixed txn proof logs not rendering correctly - Txn ident was being printed twice. - Only the first `4` chars of the ident were being printed. --- zero_bin/ops/src/lib.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 0c0b4ca22..a72edf4b7 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -28,12 +28,7 @@ where let proof = f()?; - event!( - Level::INFO, - "txn proof {:.4} took {:?}", - ident, - start.elapsed() - ); + event!(Level::INFO, "txn proof took {:?}", start.elapsed()); Ok(proof) } From 211983b256eb11a868b2b74143f6f28dadffe669 Mon Sep 17 00:00:00 2001 From: BGluth Date: Fri, 19 Apr 2024 15:12:10 -0600 Subject: [PATCH 139/184] Cleaned up txn proof timing output even more --- zero_bin/ops/Cargo.toml | 4 ++-- zero_bin/ops/src/lib.rs | 52 ++++++++++++++++++++--------------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 9ca1ea27b..f22ad6ad8 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -11,7 +11,7 @@ categories.workspace = true [dependencies] paladin-core = { workspace = true } serde = { workspace = true } -evm_arithmetization = { workspace = true, optional = true} +evm_arithmetization = { workspace = true } proof_gen = { workspace = true } trace_decoder = { workspace = true } tracing = { workspace = true } @@ -23,4 +23,4 @@ common = { path = "../common" } [features] default = [] -test_only = ["evm_arithmetization"] +test_only = [] diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index a72edf4b7..1bfd8404f 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,6 +1,7 @@ use std::time::Instant; use common::prover_state::p_state; +use evm_arithmetization::GenerationInputs; use keccak_hash::keccak; use paladin::{ operation::{FatalError, FatalStrategy, Monoid, Operation, Result}, @@ -19,34 +20,19 @@ registry!(); #[derive(Deserialize, Serialize, RemoteExecute)] pub struct TxProof; -fn run_and_wrap_txn_proof_in_elapsed_span(f: F, ident: String) -> Result -where - F: Fn() -> Result, -{ - let _span = info_span!("proof generation", ident).entered(); - let start = Instant::now(); - - let proof = f()?; - - event!(Level::INFO, "txn proof took {:?}", start.elapsed()); - Ok(proof) -} - #[cfg(not(feature = "test_only"))] impl Operation for TxProof { type Input = TxnProofGenIR; type Output = proof_gen::proof_types::AggregatableProof; fn execute(&self, input: Self::Input) -> Result { - let txn_ident = Self::txn_ident(&input); - - let proof = run_and_wrap_txn_proof_in_elapsed_span( + let proof = Self::run_and_wrap_txn_proof_in_elapsed_span( || { common::prover_state::p_manager() .generate_txn_proof(input.clone()) .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate).into()) }, - txn_ident, + &input, )?; Ok(proof.into()) @@ -59,16 +45,14 @@ impl Operation for TxProof { type Output = (); fn execute(&self, input: Self::Input) -> Result { - let txn_ident = Self::txn_ident(&input); - - run_and_wrap_txn_proof_in_elapsed_span( + Self::run_and_wrap_txn_proof_in_elapsed_span( || { evm_arithmetization::prover::testing::simulate_execution::( input.clone(), ) .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate).into()) }, - txn_ident, + &input, )?; Ok(()) @@ -76,17 +60,33 @@ impl Operation for TxProof { } impl TxProof { - fn txn_ident(ir: &TxnProofGenIR) -> String { + fn run_and_wrap_txn_proof_in_elapsed_span(f: F, ir: &GenerationInputs) -> Result + where + F: Fn() -> Result, + { + let id = format!( + "b{} - {}", + ir.block_metadata.block_number, ir.txn_number_before + ); + + let _span = info_span!("p_gen", id).entered(); + let start = Instant::now(); + + let proof = f()?; + let txn_hash_str = ir .signed_txn .as_ref() .map(|txn| format!("{:x}", keccak(txn))) .unwrap_or_else(|| "Dummy".to_string()); - format!( - "b{} - {} ({})", - ir.block_metadata.block_number, ir.txn_number_before, txn_hash_str - ) + event!( + Level::INFO, + "txn proof ({}) took {:?}", + txn_hash_str, + start.elapsed() + ); + Ok(proof) } } From e92f3b31a4c824e7fb0a901c8416fa595177eab8 Mon Sep 17 00:00:00 2001 From: John Hilliard Date: Mon, 22 Apr 2024 09:07:57 -0400 Subject: [PATCH 140/184] feat: adding block proof ci --- zero_bin/.github/workflows/ci.yml | 14 +++++++ zero_bin/tools/simple_test.sh | 69 +++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100755 zero_bin/tools/simple_test.sh diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml index c4ffc8e17..77fc47d05 100644 --- a/zero_bin/.github/workflows/ci.yml +++ b/zero_bin/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: branches: - main pull_request: + types: [opened, synchronize, reopened, ready_for_review] branches: - "**" workflow_dispatch: @@ -63,3 +64,16 @@ jobs: - name: Run cargo clippy run: cargo clippy --all-targets -- -D warnings + + simple_proof: + name: Execute bash script to generate and verify a proof from a small block + runs-on: zero-ci + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Run the script + run: | + pushd tools + ./simple_test.sh diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh new file mode 100755 index 000000000..bf5e17ad9 --- /dev/null +++ b/zero_bin/tools/simple_test.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# This is meant to be a somewhat self contained script for quickly +# proving an Ethereum mainnet block with the type 1 prover. The goal +# is to use this for benchmarking and CI. This is the block in +# question: https://etherscan.io/block/19240705 + +# We're going to set the paralellism in line with the total cpu count +num_procs=$(nproc) + +2>&1 echo "Pulling sample witness" +witness_cid_hash="QmbwnLGuZ2qxZDqETAFb5DnyjZry8Sv3UFwYnsgKmsE3of" +curl -s -L "https://cf-ipfs.com/ipfs/$witness_cid_hash" > witness.json.bz2 +bunzip2 -f witness.json.bz2 + +# Configured Rayon and Tokio with rough defaults +export RAYON_NUM_THREADS=$num_procs +export TOKIO_WORKER_THREADS=$num_procs + +export RUST_MIN_STACK=33554432 +export RUST_BACKTRACE=full +export RUST_LOG=info +export RUSTFLAGS='-C target-cpu=native' + +# This sizes are configured specifically for this witness. Don't use this in other scenarios +export ARITHMETIC_CIRCUIT_SIZE="15..19" +export BYTE_PACKING_CIRCUIT_SIZE="9..19" +export CPU_CIRCUIT_SIZE="12..21" +export KECCAK_CIRCUIT_SIZE="14..18" +export KECCAK_SPONGE_CIRCUIT_SIZE="9..13" +export LOGIC_CIRCUIT_SIZE="12..17" +export MEMORY_CIRCUIT_SIZE="17..23" + +# If we run ./simple_test test_only, we'll generate a dummy +# proof. This is useful for quickly testing decoding and all of the +# other non-proving code. +if [[ $1 == "test_only" ]]; then + cargo run --release --features test_only --bin leader -- --runtime in-memory stdio < witness.json | tee test.out + if grep 'Successfully generated witness for block' test.out; then + echo "Success - Note this was just a test, not a proof" + exit + else + echo "Failed to create a witness" + exit 1 + fi +fi + +cargo build --release --jobs "$num_procs" + +start_time=$(date +%s%N) +../target/release/leader --runtime in-memory stdio < witness.json | tee leader.out +end_time=$(date +%s%N) + +tail -n 1 leader.out > proof.json + +../target/release/verifier -f proof.json | tee verify.out + +if grep 'Proof verified successfully!' verify.out; then + duration_ns=$((end_time - start_time)) + duration_sec=$(echo "$duration_ns / 1000000000" | bc -l) + echo "Success!" + printf "Duration: %.3f seconds\n" $duration_sec + echo "Note, this duration is inclusive of circuit handling and overall process initialization"; +else + echo "there was an issue with proof verification"; + exit 1 +fi + + From 3a008ed930336ef9b5b5370b2bec2c825058d5c3 Mon Sep 17 00:00:00 2001 From: John Hilliard Date: Mon, 22 Apr 2024 10:39:35 -0400 Subject: [PATCH 141/184] Update tools/simple_test.sh Co-authored-by: Robin Salen <30937548+Nashtare@users.noreply.github.com> --- zero_bin/tools/simple_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh index bf5e17ad9..89f1900b5 100755 --- a/zero_bin/tools/simple_test.sh +++ b/zero_bin/tools/simple_test.sh @@ -23,7 +23,7 @@ export RUST_LOG=info export RUSTFLAGS='-C target-cpu=native' # This sizes are configured specifically for this witness. Don't use this in other scenarios -export ARITHMETIC_CIRCUIT_SIZE="15..19" +export ARITHMETIC_CIRCUIT_SIZE="16..19" export BYTE_PACKING_CIRCUIT_SIZE="9..19" export CPU_CIRCUIT_SIZE="12..21" export KECCAK_CIRCUIT_SIZE="14..18" From 1798fde72a43ded1d44f38520c07ef71b5b447f2 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 23 Apr 2024 16:51:09 +0100 Subject: [PATCH 142/184] Cargo audit updates (#66) * cargo audit update * update plony2/evm * fmt --- zero_bin/Cargo.lock | 59 +++++++++++++++++-------- zero_bin/Cargo.toml | 8 ++-- zero_bin/common/src/prover_state/mod.rs | 10 ++--- zero_bin/ops/src/lib.rs | 5 +-- 4 files changed, 52 insertions(+), 30 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 53a3d9706..d9777c378 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1035,7 +1035,7 @@ dependencies = [ [[package]] name = "evm_arithmetization" version = "0.1.3" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.0#423e2614d31d323e950b4a461a27ef565a820b75" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.1#c55f9e05f571b1b8658315e6de83427fe1d4efa3" dependencies = [ "anyhow", "bytes", @@ -1321,9 +1321,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" +checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" dependencies = [ "bytes", "fnv", @@ -1519,7 +1519,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.6", "tokio", "tower-service", "tracing", @@ -1535,7 +1535,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.3", + "h2 0.4.4", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -1624,6 +1624,17 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-num-traits" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" +dependencies = [ + "integer-sqrt", + "num-traits", + "uint", +] + [[package]] name = "impl-rlp" version = "0.3.0" @@ -1694,6 +1705,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + [[package]] name = "io-lifetimes" version = "1.0.11" @@ -1948,12 +1968,16 @@ dependencies = [ [[package]] name = "mpt_trie" version = "0.2.1" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.0#423e2614d31d323e950b4a461a27ef565a820b75" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.1#c55f9e05f571b1b8658315e6de83427fe1d4efa3" dependencies = [ "bytes", "enum-as-inner", "ethereum-types", "hex", + "impl-codec", + "impl-num-traits", + "impl-rlp", + "impl-serde", "keccak-hash 0.10.0", "log", "num", @@ -2350,9 +2374,9 @@ dependencies = [ [[package]] name = "plonky2" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04c7dfa293cd62a8e1e3f21157dba8508ab2de6078b0e5fae202a4fc98ef224" +checksum = "85f26b090b989aebdeaf6a4eed748c1fbcabf67e7273a22e4e0c877b63846d0f" dependencies = [ "ahash", "anyhow", @@ -2375,9 +2399,9 @@ dependencies = [ [[package]] name = "plonky2_field" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27aab0723672905a49e4771232d7fcf71b97dd0e57634f1dfb5492635f765fc" +checksum = "3a1dca60ad900d81b1fe2df3d0b88d43345988e2935e6709176e96573f4bcf5d" dependencies = [ "anyhow", "itertools", @@ -2502,7 +2526,7 @@ dependencies = [ [[package]] name = "proof_gen" version = "0.1.3" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.0#423e2614d31d323e950b4a461a27ef565a820b75" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.1#c55f9e05f571b1b8658315e6de83427fe1d4efa3" dependencies = [ "ethereum-types", "evm_arithmetization", @@ -2510,7 +2534,6 @@ dependencies = [ "paste", "plonky2", "serde", - "trace_decoder", ] [[package]] @@ -2817,9 +2840,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" dependencies = [ "log", "ring", @@ -3117,9 +3140,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "starky" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf2fe03f53197fbd5e2f2e5fbb809f8e953881cc729261b55f71134323bbfd6" +checksum = "8a8480ca5b8eedf83ad070a780783b4e21a56c6ef66b4c0d1b7520b72bdfda1b" dependencies = [ "ahash", "anyhow", @@ -3454,8 +3477,8 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "trace_decoder" -version = "0.3.0" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.0#423e2614d31d323e950b4a461a27ef565a820b75" +version = "0.3.1" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.1#c55f9e05f571b1b8658315e6de83427fe1d4efa3" dependencies = [ "bytes", "ciborium", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index eeca6b8a8..3979d7f43 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -20,10 +20,10 @@ rlp = "0.5.2" keccak-hash = "0.10.0" # zk-evm dependencies -plonky2 = "0.2.0" -evm_arithmetization = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.0" } -trace_decoder = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.0" } -proof_gen = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.0" } +plonky2 = "0.2.2" +evm_arithmetization = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.1" } +trace_decoder = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.1" } +proof_gen = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.1" } [workspace.package] edition = "2021" diff --git a/zero_bin/common/src/prover_state/mod.rs b/zero_bin/common/src/prover_state/mod.rs index 1c0e2142c..b2c18e39c 100644 --- a/zero_bin/common/src/prover_state/mod.rs +++ b/zero_bin/common/src/prover_state/mod.rs @@ -15,7 +15,8 @@ use std::{fmt::Display, sync::OnceLock}; use clap::ValueEnum; use evm_arithmetization::{ - cpu::kernel::aggregator::KERNEL, proof::AllProof, prover::prove, AllStark, StarkConfig, + cpu::kernel::aggregator::KERNEL, proof::AllProof, prover::prove, AllStark, GenerationInputs, + StarkConfig, }; use plonky2::{ field::goldilocks_field::GoldilocksField, @@ -23,7 +24,6 @@ use plonky2::{ util::timing::TimingTree, }; use proof_gen::{proof_types::GeneratedTxnProof, prover_state::ProverState, VerifierState}; -use trace_decoder::types::TxnProofGenIR; use tracing::info; use self::circuit::{CircuitConfig, NUM_TABLES}; @@ -194,7 +194,7 @@ impl ProverStateManager { /// Generate a transaction proof using the specified input, loading the /// circuit tables as needed to shrink the individual STARK proofs, and /// finally aggregating them to a final transaction proof. - fn txn_proof_on_demand(&self, input: TxnProofGenIR) -> anyhow::Result { + fn txn_proof_on_demand(&self, input: GenerationInputs) -> anyhow::Result { let config = StarkConfig::standard_fast_config(); let all_stark = AllStark::default(); let all_proof = prove(&all_stark, &config, input, &mut TimingTree::default(), None)?; @@ -211,7 +211,7 @@ impl ProverStateManager { /// Generate a transaction proof using the specified input on the monolithic /// circuit. - fn txn_proof_monolithic(&self, input: TxnProofGenIR) -> anyhow::Result { + fn txn_proof_monolithic(&self, input: GenerationInputs) -> anyhow::Result { let (intern, p_vals) = p_state().state.prove_root( &AllStark::default(), &StarkConfig::standard_fast_config(), @@ -232,7 +232,7 @@ impl ProverStateManager { /// - If the persistence strategy is [`CircuitPersistence::Disk`] with /// [`TableLoadStrategy::OnDemand`], the table circuits are loaded as /// needed. - pub fn generate_txn_proof(&self, input: TxnProofGenIR) -> anyhow::Result { + pub fn generate_txn_proof(&self, input: GenerationInputs) -> anyhow::Result { match self.persistence { CircuitPersistence::None | CircuitPersistence::Disk(TableLoadStrategy::Monolithic) => { info!("using monolithic circuit {:?}", self); diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 1bfd8404f..04faa1c7f 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -12,7 +12,6 @@ use proof_gen::{ proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, }; use serde::{Deserialize, Serialize}; -use trace_decoder::types::TxnProofGenIR; use tracing::{event, info_span, Level}; registry!(); @@ -22,7 +21,7 @@ pub struct TxProof; #[cfg(not(feature = "test_only"))] impl Operation for TxProof { - type Input = TxnProofGenIR; + type Input = GenerationInputs; type Output = proof_gen::proof_types::AggregatableProof; fn execute(&self, input: Self::Input) -> Result { @@ -41,7 +40,7 @@ impl Operation for TxProof { #[cfg(feature = "test_only")] impl Operation for TxProof { - type Input = TxnProofGenIR; + type Input = GenerationInputs; type Output = (); fn execute(&self, input: Self::Input) -> Result { From 75e8dc1278c8528499ecb3331c9b71d29628ef66 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Tue, 23 Apr 2024 14:22:27 -0600 Subject: [PATCH 143/184] Implement RAII span for transaction timing to avoid cloning input (#67) --- zero_bin/ops/src/lib.rs | 86 ++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 35 deletions(-) diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 04faa1c7f..1200047c5 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -25,14 +25,10 @@ impl Operation for TxProof { type Output = proof_gen::proof_types::AggregatableProof; fn execute(&self, input: Self::Input) -> Result { - let proof = Self::run_and_wrap_txn_proof_in_elapsed_span( - || { - common::prover_state::p_manager() - .generate_txn_proof(input.clone()) - .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate).into()) - }, - &input, - )?; + let _span = TxProofSpan::new(&input); + let proof = common::prover_state::p_manager() + .generate_txn_proof(input) + .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; Ok(proof.into()) } @@ -44,48 +40,68 @@ impl Operation for TxProof { type Output = (); fn execute(&self, input: Self::Input) -> Result { - Self::run_and_wrap_txn_proof_in_elapsed_span( - || { - evm_arithmetization::prover::testing::simulate_execution::( - input.clone(), - ) - .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate).into()) - }, - &input, - )?; + let _span = TxProofSpan::new(&input); + evm_arithmetization::prover::testing::simulate_execution::(input) + .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; Ok(()) } } -impl TxProof { - fn run_and_wrap_txn_proof_in_elapsed_span(f: F, ir: &GenerationInputs) -> Result - where - F: Fn() -> Result, - { - let id = format!( +/// RAII struct to measure the time taken by a transaction proof. +/// +/// - When created, it starts a span with the transaction proof id. +/// - When dropped, it logs the time taken by the transaction proof. +struct TxProofSpan { + _span: tracing::span::EnteredSpan, + start: Instant, + descriptor: String, +} + +impl TxProofSpan { + /// Get a unique id for the transaction proof. + fn get_id(ir: &GenerationInputs) -> String { + format!( "b{} - {}", ir.block_metadata.block_number, ir.txn_number_before - ); - - let _span = info_span!("p_gen", id).entered(); - let start = Instant::now(); - - let proof = f()?; + ) + } - let txn_hash_str = ir - .signed_txn + /// Get a textual descriptor for the transaction proof. + /// + /// Either the hex-encoded hash of the transaction or "Dummy" if the + /// transaction is not present. + fn get_descriptor(ir: &GenerationInputs) -> String { + ir.signed_txn .as_ref() .map(|txn| format!("{:x}", keccak(txn))) - .unwrap_or_else(|| "Dummy".to_string()); + .unwrap_or_else(|| "Dummy".to_string()) + } + + /// Create a new transaction proof span. + /// + /// When dropped, it logs the time taken by the transaction proof. + fn new(ir: &GenerationInputs) -> Self { + let id = Self::get_id(ir); + let span = info_span!("p_gen", id).entered(); + let start = Instant::now(); + let descriptor = Self::get_descriptor(ir); + Self { + _span: span, + start, + descriptor, + } + } +} +impl Drop for TxProofSpan { + fn drop(&mut self) { event!( Level::INFO, "txn proof ({}) took {:?}", - txn_hash_str, - start.elapsed() + self.descriptor, + self.start.elapsed() ); - Ok(proof) } } From 5ac1350cff5a52a1dc87deadcc17e4425a611664 Mon Sep 17 00:00:00 2001 From: Vladimir Trifonov Date: Wed, 24 Apr 2024 20:07:23 +0300 Subject: [PATCH 144/184] feat: provide IR for debugging upon failure (#48) * feat: provide IR for debugging upon failure * fix: fix clippy issues * fix: fix pr comments * fix: make evm_arithmetization non optional for ops * fix: fix pr comments * fix: fix clippy issues * fix: fix clippy issue * fix: fix pr comment * fix: fix clippy issue * fix: fix cargo lock * fix: fix pr comments * fix: fix format issues * fix: fix save input on error for test-only * fix: fix pr comments * fix: fix * fix: fix clippy issue * fix: fmt fix --------- Co-authored-by: Vladimir Trifonov --- zero_bin/Cargo.lock | 2 + zero_bin/README.md | 5 ++ zero_bin/common/Cargo.toml | 2 + zero_bin/common/src/debug_utils.rs | 102 +++++++++++++++++++++++++++ zero_bin/common/src/lib.rs | 1 + zero_bin/leader/src/cli.rs | 9 +++ zero_bin/leader/src/http.rs | 16 ++++- zero_bin/leader/src/jerigon.rs | 5 +- zero_bin/leader/src/main.rs | 17 +++-- zero_bin/leader/src/stdio.rs | 3 +- zero_bin/ops/src/lib.rs | 107 +++++++++++++++++++++++++---- zero_bin/prover/src/lib.rs | 19 +++-- 12 files changed, 263 insertions(+), 25 deletions(-) create mode 100644 zero_bin/common/src/debug_utils.rs diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index d9777c378..ba777c30e 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -641,6 +641,8 @@ dependencies = [ "plonky2", "proof_gen", "seahash", + "serde", + "serde_json", "thiserror", "trace_decoder", "tracing", diff --git a/zero_bin/README.md b/zero_bin/README.md index 6b410242d..d826ab96e 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -22,6 +22,9 @@ A composition of [`paladin`](https://github.com/0xPolygonZero/paladin) and [`plo - [RPC Usage](#rpc-usage) - [Docker](#docker) - [Development Branches](#development-branches) + - [Testing Blocks](#testing-blocks) + - [Proving Blocks](#proving-blocks) + - [Generating Witnesses Only](#generating-witnesses-only) - [License](#license) - [Contribution](#contribution) @@ -217,6 +220,8 @@ Options: If provided, write the generated proof to this file instead of stdout -h, --help Print help + -s, --save-inputs-on-error + If provided, save the public inputs to disk on error ``` Prove a block. diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 2eab391d0..9a08bbd18 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -17,4 +17,6 @@ evm_arithmetization = { workspace = true } clap = { workspace = true } anyhow = { workspace = true } trace_decoder = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } seahash = "4.1.0" diff --git a/zero_bin/common/src/debug_utils.rs b/zero_bin/common/src/debug_utils.rs new file mode 100644 index 000000000..f8cb53dd6 --- /dev/null +++ b/zero_bin/common/src/debug_utils.rs @@ -0,0 +1,102 @@ +use std::fs::{self, File}; +use std::io::{self, Write}; +use std::path::{Path, PathBuf}; + +use serde::Serialize; +use serde_json::Error as SerdeError; +use thiserror::Error; + +const DEBUG_FOLDER: &str = "./debug"; + +/// Ensures that the specified directory exists on the filesystem. +/// +/// This function checks if the directory at `folder_path` exists. If not, it +/// attempts to create the directory. It returns an error if the path is not a +/// directory or if there are issues accessing or creating the directory. +/// +/// # Parameters +/// * `folder_path` - A reference to a `Path` that specifies the directory to +/// check or create. +/// +/// # Returns +/// * `Ok(())` - The directory exists or was successfully created. +/// * `Err(io::Error)` - The path is not a directory, or there was a problem +/// accessing or creating the directory. +fn ensure_directory_exists(folder_path: &Path) -> io::Result<()> { + match fs::metadata(folder_path) { + Ok(metadata) => { + if metadata.is_dir() { + Ok(()) // The directory already exists + } else { + Err(io::Error::new( + io::ErrorKind::AlreadyExists, + "The path exists but is not a directory", + )) + } + } + Err(e) => { + if e.kind() == io::ErrorKind::NotFound { + // Directory does not exist, try to create it + fs::create_dir(folder_path) + } else { + // Re-throw the error if it's not a 'NotFound' error + Err(e) + } + } + } +} + +/// An error type for save debug input information. +#[derive(Error, Debug)] +pub enum SaveInputError { + #[error("failed to create directory '{0}'")] + CreateDirectoryError(PathBuf, #[source] io::Error), + + #[error("failed to create file '{0}'")] + CreateFileError(PathBuf, #[source] io::Error), + + #[error("failed to serialize inputs")] + SerializationError(#[source] SerdeError), + + #[error("failed to write to file '{0}'")] + WriteToFileError(PathBuf, #[source] io::Error), +} + +/// Serializes a collection of inputs to a pretty-printed JSON format and saves +/// them to a file. +/// +/// # Arguments +/// +/// * `file_name` - The name of the file (including the extension) where the +/// serialized data will be saved. +/// * `inputs` - A collection of items to be serialized. Each item in the +/// collection must implement the `Serialize` trait. +/// +/// # Returns +/// +/// This function returns a `Result<(), std::io::Error>` indicating the +/// operation's success or failure. +pub fn save_inputs_to_disk( + file_name: String, + inputs: T, +) -> Result<(), SaveInputError> { + let debug_folder = Path::new(DEBUG_FOLDER); + let input_file_path = debug_folder.join(file_name); + + // Ensure the DEBUG_FOLDER exists + ensure_directory_exists(debug_folder) + .map_err(|e| SaveInputError::CreateDirectoryError(debug_folder.to_path_buf(), e))?; + + let mut file = File::create(&input_file_path) + .map_err(|e| SaveInputError::CreateFileError(input_file_path.clone(), e))?; + + // Serialize the entire collection to a pretty JSON string + let all_inputs_str = + serde_json::to_string_pretty(&inputs).map_err(SaveInputError::SerializationError)?; + + // Write the serialized data to the file + file.write_all(all_inputs_str.as_bytes()) + .map_err(|e| SaveInputError::WriteToFileError(input_file_path, e))?; + + Ok(()) +} diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs index 234099cf5..e9e7b504b 100644 --- a/zero_bin/common/src/lib.rs +++ b/zero_bin/common/src/lib.rs @@ -1,2 +1,3 @@ +pub mod debug_utils; pub mod parsing; pub mod prover_state; diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 6ab9d8fb4..10316f6ac 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -25,6 +25,9 @@ pub(crate) enum Command { /// The previous proof output. #[arg(long, short = 'f', value_hint = ValueHint::FilePath)] previous_proof: Option, + /// If true, save the public inputs to disk on error. + #[arg(short, long, default_value_t = false)] + save_inputs_on_error: bool, }, /// Reads input from a Jerigon node and writes output to stdout. Jerigon { @@ -44,6 +47,9 @@ pub(crate) enum Command { /// stdout. #[arg(long, short = 'o', value_hint = ValueHint::FilePath)] proof_output_path: Option, + /// If true, save the public inputs to disk on error. + #[arg(short, long, default_value_t = false)] + save_inputs_on_error: bool, }, /// Reads input from HTTP and writes output to a directory. Http { @@ -53,5 +59,8 @@ pub(crate) enum Command { /// The directory to which output should be written. #[arg(short, long, value_hint = ValueHint::DirPath)] output_dir: PathBuf, + /// If true, save the public inputs to disk on error. + #[arg(short, long, default_value_t = false)] + save_inputs_on_error: bool, }, } diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index 841877944..80111ce45 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -11,7 +11,12 @@ use serde_json::to_writer; use tracing::{debug, error, info}; /// The main function for the HTTP mode. -pub(crate) async fn http_main(runtime: Runtime, port: u16, output_dir: PathBuf) -> Result<()> { +pub(crate) async fn http_main( + runtime: Runtime, + port: u16, + output_dir: PathBuf, + save_inputs_on_error: bool, +) -> Result<()> { let addr = SocketAddr::from(([0, 0, 0, 0], port)); debug!("listening on {}", addr); @@ -20,7 +25,7 @@ pub(crate) async fn http_main(runtime: Runtime, port: u16, output_dir: PathBuf) "/prove", post({ let runtime = runtime.clone(); - move |body| prove(body, runtime, output_dir.clone()) + move |body| prove(body, runtime, output_dir.clone(), save_inputs_on_error) }), ); let listener = tokio::net::TcpListener::bind(&addr).await?; @@ -60,12 +65,17 @@ async fn prove( Json(payload): Json, runtime: Arc, output_dir: PathBuf, + save_inputs_on_error: bool, ) -> StatusCode { debug!("Received payload: {:#?}", payload); let block_number = payload.prover_input.get_block_number(); - match payload.prover_input.prove(&runtime, payload.previous).await { + match payload + .prover_input + .prove(&runtime, payload.previous, save_inputs_on_error) + .await + { Ok(b_proof) => match write_to_file(output_dir, block_number, &b_proof) { Ok(file) => { info!("Successfully wrote proof to {}", file.display()); diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 899ea20ee..6719112af 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -16,6 +16,7 @@ pub(crate) async fn jerigon_main( checkpoint_block_number: u64, previous: Option, proof_output_path_opt: Option, + save_inputs_on_error: bool, ) -> Result<()> { let prover_input = rpc::fetch_prover_input(rpc::FetchProverInputRequest { rpc_url, @@ -24,7 +25,9 @@ pub(crate) async fn jerigon_main( }) .await?; - let proof = prover_input.prove(&runtime, previous).await; + let proof = prover_input + .prove(&runtime, previous, save_inputs_on_error) + .await; runtime.close().await?; let proof = serde_json::to_vec(&proof?.intern)?; diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 36d2f1e3b..8c054ea4c 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -47,11 +47,18 @@ async fn main() -> Result<()> { let runtime = Runtime::from_config(&args.paladin, register()).await?; match args.command { - Command::Stdio { previous_proof } => { + Command::Stdio { + previous_proof, + save_inputs_on_error, + } => { let previous_proof = get_previous_proof(previous_proof)?; - stdio::stdio_main(runtime, previous_proof).await?; + stdio::stdio_main(runtime, previous_proof, save_inputs_on_error).await?; } - Command::Http { port, output_dir } => { + Command::Http { + port, + output_dir, + save_inputs_on_error, + } => { // check if output_dir exists, is a directory, and is writable let output_dir_metadata = std::fs::metadata(&output_dir); if output_dir_metadata.is_err() { @@ -61,7 +68,7 @@ async fn main() -> Result<()> { panic!("output-dir is not a writable directory"); } - http::http_main(runtime, port, output_dir).await?; + http::http_main(runtime, port, output_dir, save_inputs_on_error).await?; } Command::Jerigon { rpc_url, @@ -69,6 +76,7 @@ async fn main() -> Result<()> { checkpoint_block_number, previous_proof, proof_output_path, + save_inputs_on_error, } => { let previous_proof = get_previous_proof(previous_proof)?; @@ -79,6 +87,7 @@ async fn main() -> Result<()> { checkpoint_block_number, previous_proof, proof_output_path, + save_inputs_on_error, ) .await?; } diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index e3b6ec5aa..7f1e6e3fe 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -9,13 +9,14 @@ use prover::ProverInput; pub(crate) async fn stdio_main( runtime: Runtime, previous: Option, + save_inputs_on_error: bool, ) -> Result<()> { let mut buffer = String::new(); std::io::stdin().read_to_string(&mut buffer)?; let des = &mut serde_json::Deserializer::from_str(&buffer); let input: ProverInput = serde_path_to_error::deserialize(des)?; - let proof = input.prove(&runtime, previous).await; + let proof = input.prove(&runtime, previous, save_inputs_on_error).await; runtime.close().await?; let proof = proof?; diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 1200047c5..5b6caf69e 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,7 +1,7 @@ use std::time::Instant; -use common::prover_state::p_state; -use evm_arithmetization::GenerationInputs; +use common::{debug_utils::save_inputs_to_disk, prover_state::p_state}; +use evm_arithmetization::{proof::PublicValues, GenerationInputs}; use keccak_hash::keccak; use paladin::{ operation::{FatalError, FatalStrategy, Monoid, Operation, Result}, @@ -12,12 +12,14 @@ use proof_gen::{ proof_types::{AggregatableProof, GeneratedAggProof, GeneratedBlockProof}, }; use serde::{Deserialize, Serialize}; -use tracing::{event, info_span, Level}; +use tracing::{error, event, info_span, Level}; registry!(); #[derive(Deserialize, Serialize, RemoteExecute)] -pub struct TxProof; +pub struct TxProof { + pub save_inputs_on_error: bool, +} #[cfg(not(feature = "test_only"))] impl Operation for TxProof { @@ -26,9 +28,27 @@ impl Operation for TxProof { fn execute(&self, input: Self::Input) -> Result { let _span = TxProofSpan::new(&input); - let proof = common::prover_state::p_manager() - .generate_txn_proof(input) - .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; + let proof = if self.save_inputs_on_error { + common::prover_state::p_manager() + .generate_txn_proof(input.clone()) + .map_err(|err| { + if let Err(write_err) = save_inputs_to_disk( + format!( + "b{}_txn_{}_input.log", + input.block_metadata.block_number, input.txn_number_before + ), + input, + ) { + error!("Failed to save txn proof input to disk: {:?}", write_err); + } + + FatalError::from_anyhow(err, FatalStrategy::Terminate) + })? + } else { + common::prover_state::p_manager() + .generate_txn_proof(input) + .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))? + }; Ok(proof.into()) } @@ -41,8 +61,30 @@ impl Operation for TxProof { fn execute(&self, input: Self::Input) -> Result { let _span = TxProofSpan::new(&input); - evm_arithmetization::prover::testing::simulate_execution::(input) + + if self.save_inputs_on_error { + evm_arithmetization::prover::testing::simulate_execution::( + input.clone(), + ) + .map_err(|err| { + if let Err(write_err) = save_inputs_to_disk( + format!( + "b{}_txn_{}_input.log", + input.block_metadata.block_number, input.txn_number_before + ), + input, + ) { + error!("Failed to save txn proof input to disk: {:?}", write_err); + } + + FatalError::from_anyhow(err, FatalStrategy::Terminate) + })?; + } else { + evm_arithmetization::prover::testing::simulate_execution::( + input, + ) .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))?; + } Ok(()) } @@ -106,13 +148,40 @@ impl Drop for TxProofSpan { } #[derive(Deserialize, Serialize, RemoteExecute)] -pub struct AggProof; +pub struct AggProof { + pub save_inputs_on_error: bool, +} + +fn get_agg_proof_public_values(elem: AggregatableProof) -> PublicValues { + match elem { + AggregatableProof::Txn(info) => info.p_vals, + AggregatableProof::Agg(info) => info.p_vals, + } +} impl Monoid for AggProof { type Elem = AggregatableProof; fn combine(&self, a: Self::Elem, b: Self::Elem) -> Result { - let result = generate_agg_proof(p_state(), &a, &b).map_err(FatalError::from)?; + let result = generate_agg_proof(p_state(), &a, &b).map_err(|e| { + if self.save_inputs_on_error { + let pv = vec![ + get_agg_proof_public_values(a), + get_agg_proof_public_values(b), + ]; + if let Err(write_err) = save_inputs_to_disk( + format!( + "b{}_agg_lhs_rhs_inputs.log", + pv[0].block_metadata.block_number + ), + pv, + ) { + error!("Failed to save agg proof inputs to disk: {:?}", write_err); + } + } + + FatalError::from(e) + })?; Ok(result.into()) } @@ -126,6 +195,7 @@ impl Monoid for AggProof { #[derive(Deserialize, Serialize, RemoteExecute)] pub struct BlockProof { pub prev: Option, + pub save_inputs_on_error: bool, } impl Operation for BlockProof { @@ -134,8 +204,21 @@ impl Operation for BlockProof { fn execute(&self, input: Self::Input) -> Result { Ok( - generate_block_proof(p_state(), self.prev.as_ref(), &input) - .map_err(FatalError::from)?, + generate_block_proof(p_state(), self.prev.as_ref(), &input).map_err(|e| { + if self.save_inputs_on_error { + if let Err(write_err) = save_inputs_to_disk( + format!( + "b{}_block_input.log", + input.p_vals.block_metadata.block_number + ), + input.p_vals, + ) { + error!("Failed to save block proof input to disk: {:?}", write_err); + } + } + + FatalError::from(e) + })?, ) } } diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index abf424a95..8cef43036 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -35,6 +35,7 @@ impl ProverInput { self, runtime: &Runtime, previous: Option, + save_inputs_on_error: bool, ) -> Result { let block_number = self.get_block_number(); info!("Proving block {block_number}"); @@ -46,8 +47,12 @@ impl ProverInput { )?; let agg_proof = IndexedStream::from(txs) - .map(&TxProof) - .fold(&ops::AggProof) + .map(&TxProof { + save_inputs_on_error, + }) + .fold(&ops::AggProof { + save_inputs_on_error, + }) .run(runtime) .await?; @@ -58,7 +63,10 @@ impl ProverInput { }); let block_proof = paladin::directive::Literal(proof) - .map(&ops::BlockProof { prev }) + .map(&ops::BlockProof { + prev, + save_inputs_on_error, + }) .run(runtime) .await?; @@ -74,6 +82,7 @@ impl ProverInput { self, runtime: &Runtime, _previous: Option, + save_inputs_on_error: bool, ) -> Result { let block_number = self.get_block_number(); info!("Testing witness generation for block {block_number}."); @@ -85,7 +94,9 @@ impl ProverInput { )?; IndexedStream::from(txs) - .map(&TxProof) + .map(&TxProof { + save_inputs_on_error, + }) .run(runtime) .await? .try_collect::>() From 35fb73a4c1ee6abf9f59f65211487fc0926f785c Mon Sep 17 00:00:00 2001 From: Vladimir Trifonov Date: Wed, 24 Apr 2024 20:41:36 +0300 Subject: [PATCH 145/184] fix: fix circuit version consistency check (#58) * fix: fix circuit version consistency check * fix: fix clippy issues * fix: update deps --------- Co-authored-by: Vladimir Trifonov Co-authored-by: Robin Salen --- zero_bin/Cargo.lock | 51 ++++++++++- zero_bin/common/src/prover_state/mod.rs | 28 ++---- .../common/src/prover_state/persistence.rs | 15 ++-- zero_bin/common/src/prover_state/utils.rs | 90 ------------------- zero_bin/leader/Cargo.toml | 1 + zero_bin/leader/src/main.rs | 17 ++++ zero_bin/leader/src/utils.rs | 72 +++++++++++++++ 7 files changed, 154 insertions(+), 120 deletions(-) delete mode 100644 zero_bin/common/src/prover_state/utils.rs create mode 100644 zero_bin/leader/src/utils.rs diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index ba777c30e..d09d1d71d 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1855,6 +1855,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "tokio", + "toml", "tracing", "tracing-subscriber", ] @@ -2513,7 +2514,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "toml_edit", + "toml_edit 0.20.2", ] [[package]] @@ -3008,6 +3009,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3432,11 +3442,26 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.9", +] + [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3446,7 +3471,20 @@ checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ "indexmap 2.2.5", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +dependencies = [ + "indexmap 2.2.5", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.6", ] [[package]] @@ -3980,6 +4018,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" diff --git a/zero_bin/common/src/prover_state/mod.rs b/zero_bin/common/src/prover_state/mod.rs index b2c18e39c..44463b53d 100644 --- a/zero_bin/common/src/prover_state/mod.rs +++ b/zero_bin/common/src/prover_state/mod.rs @@ -15,30 +15,24 @@ use std::{fmt::Display, sync::OnceLock}; use clap::ValueEnum; use evm_arithmetization::{ - cpu::kernel::aggregator::KERNEL, proof::AllProof, prover::prove, AllStark, GenerationInputs, - StarkConfig, + proof::AllProof, prover::prove, AllStark, GenerationInputs, StarkConfig, }; use plonky2::{ - field::goldilocks_field::GoldilocksField, - plonk::config::{GenericHashOut, PoseidonGoldilocksConfig}, + field::goldilocks_field::GoldilocksField, plonk::config::PoseidonGoldilocksConfig, util::timing::TimingTree, }; use proof_gen::{proof_types::GeneratedTxnProof, prover_state::ProverState, VerifierState}; use tracing::info; use self::circuit::{CircuitConfig, NUM_TABLES}; -use crate::prover_state::{ - persistence::{ - BaseProverResource, DiskResource, MonolithicProverResource, RecursiveCircuitResource, - VerifierResource, - }, - utils::pkg_consistency_check, +use crate::prover_state::persistence::{ + BaseProverResource, DiskResource, MonolithicProverResource, RecursiveCircuitResource, + VerifierResource, }; pub mod circuit; pub mod cli; pub mod persistence; -mod utils; pub(crate) type Config = PoseidonGoldilocksConfig; pub(crate) type Field = GoldilocksField; @@ -259,18 +253,6 @@ impl ProverStateManager { CircuitPersistence::Disk(strategy) => { info!("attempting to load preprocessed circuits from disk..."); - // Check the package consistency before loading the circuits. - pkg_consistency_check([ - self.circuit_config - .as_all_recursive_circuits() - .block - .circuit - .verifier_only - .circuit_digest - .to_bytes(), - KERNEL.hash().to_fixed_bytes().to_vec(), - ]); - let disk_state = match strategy { TableLoadStrategy::OnDemand => BaseProverResource::get(&self.circuit_config), TableLoadStrategy::Monolithic => { diff --git a/zero_bin/common/src/prover_state/persistence.rs b/zero_bin/common/src/prover_state/persistence.rs index dae26e640..cd33b04e0 100644 --- a/zero_bin/common/src/prover_state/persistence.rs +++ b/zero_bin/common/src/prover_state/persistence.rs @@ -1,3 +1,4 @@ +use std::env; use std::{ fmt::{Debug, Display}, fs::{self, OpenOptions}, @@ -16,7 +17,7 @@ use super::{ Config, RecursiveCircuitsForTableSize, SIZE, }; -pub(crate) const CIRCUITS_FOLDER: &str = "./circuits"; +const CIRCUITS_FOLDER: &str = "./circuits"; const PROVER_STATE_FILE_PREFIX: &str = "prover_state"; const VERIFIER_STATE_FILE_PREFIX: &str = "verifier_state"; @@ -102,9 +103,10 @@ impl DiskResource for BaseProverResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_base_{}", + "{}/{}_base_{}_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, + env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } @@ -137,9 +139,10 @@ impl DiskResource for MonolithicProverResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_monolithic_{}", + "{}/{}_monolithic_{}_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, + env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } @@ -171,9 +174,10 @@ impl DiskResource for RecursiveCircuitResource { fn path((circuit_type, size): &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_{}_{}", + "{}/{}_{}_{}_{}", CIRCUITS_FOLDER, PROVER_STATE_FILE_PREFIX, + env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), circuit_type.as_short_str(), size ) @@ -214,9 +218,10 @@ impl DiskResource for VerifierResource { fn path(p: &Self::PathConstrutor) -> impl AsRef { format!( - "{}/{}_{}", + "{}/{}_{}_{}", CIRCUITS_FOLDER, VERIFIER_STATE_FILE_PREFIX, + env::var("EVM_ARITHMETIZATION_PKG_VER").unwrap_or("NA".to_string()), p.get_configuration_digest() ) } diff --git a/zero_bin/common/src/prover_state/utils.rs b/zero_bin/common/src/prover_state/utils.rs deleted file mode 100644 index 21d042aa7..000000000 --- a/zero_bin/common/src/prover_state/utils.rs +++ /dev/null @@ -1,90 +0,0 @@ -use std::fs::{self, File}; -use std::hash::Hasher; -use std::io::{Read, Write}; -use std::path::Path; - -use seahash::SeaHasher; -use tracing::{info, warn}; - -use super::persistence::CIRCUITS_FOLDER; - -/// Checks the consistency of circuits code by comparing a computed hash -/// derived from the provided array of circuit code hashes against a reference -/// hash stored in a designated file within the circuits folder. This function -/// performs several actions based on this comparison: -/// -/// - If the computed aggregate hash differs from the stored hash, or if the -/// hash file does not exist, the function will delete the existing circuits -/// folder (if it exists), recreate it, and then write the new computed hash -/// into the hash file. -/// -/// - If the computed hash matches the stored hash, indicating no changes in the -/// circuits code, the function takes no action. -/// -/// This process ensures that the stored hash always reflects the current state -/// of the circuits code, providing a mechanism for detecting changes and -/// maintaining consistency. -/// -/// # Parameters -/// -/// * `circuits_hashes` - A dynamic number of `Vec` arguments representing -/// circuit code hashes. -/// -/// # Side Effects -/// -/// - May delete and recreate the circuits folder. -/// - May modify or create a file within the circuits folder to store the latest -/// hash. -pub(crate) fn pkg_consistency_check(circuits_hashes: I) -where - I: IntoIterator, - T: AsRef<[u8]>, -{ - let mut hasher = SeaHasher::new(); - for hash in circuits_hashes { - hasher.write(hash.as_ref()); - } - let hash = hasher.finish(); - - let hash_file_path = Path::new(CIRCUITS_FOLDER).join("circuits_consistency_hash"); - - // Check if the circuits folder exists - match fs::metadata(CIRCUITS_FOLDER) { - Ok(_) => { - // Circuits folder exists, check the hash file - let mut existing_hash = String::new(); - if let Ok(mut hash_file) = File::open(&hash_file_path) { - // If the hash file exists and can be read, compare the hash - if hash_file.read_to_string(&mut existing_hash).is_ok() - && existing_hash == hash.to_string() - { - // Hashes are the same, do nothing - return; - } - } else { - warn!("Unable to read circuits consistency hash file"); - } - - // Hashes differ or hash file cannot be read, delete the folder - if fs::remove_dir_all(CIRCUITS_FOLDER).is_err() { - panic!("Failed to delete circuits storage folder"); - } - } - Err(_) => { - info!( - "Initializing circuits storage folder with new consistency hash: {}", - hash - ); - } - } - - // Recreate the circuits folder and write the new hash - if fs::create_dir(CIRCUITS_FOLDER).is_ok() { - if let Ok(mut hash_file) = File::create(&hash_file_path) { - // Ignore errors in writing the hash - let _ = hash_file.write_all(hash.to_string().as_bytes()); - } - } else { - panic!("Failed to create circuits storage folder"); - } -} diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 5c7bcc92e..de39328a8 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -22,6 +22,7 @@ serde_json = { workspace = true } serde_path_to_error = { workspace = true } ethereum-types = { workspace = true } axum = "0.7.4" +toml = "0.8.12" # Local dependencies ops = { path = "../ops" } diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 8c054ea4c..5fc4d7675 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -1,3 +1,4 @@ +use std::env; use std::{fs::File, path::PathBuf}; use anyhow::Result; @@ -9,11 +10,14 @@ use ops::register; use paladin::runtime::Runtime; use proof_gen::types::PlonkyProofIntern; +use crate::utils::get_package_version; + mod cli; mod http; mod init; mod jerigon; mod stdio; +mod utils; fn get_previous_proof(path: Option) -> Result> { if path.is_none() { @@ -32,6 +36,19 @@ async fn main() -> Result<()> { dotenv().ok(); init::tracing(); + if env::var("EVM_ARITHMETIZATION_PKG_VER").is_err() { + let pkg_ver = get_package_version("evm_arithmetization")?; + // Extract the major and minor version parts and append 'x' as the patch version + if let Some((major_minor, _)) = pkg_ver.as_ref().and_then(|s| s.rsplit_once('.')) { + let circuits_version = format!("{}.x", major_minor); + // Set the environment variable for the evm_arithmetization package version + env::set_var("EVM_ARITHMETIZATION_PKG_VER", circuits_version); + } else { + // Set to "NA" if version extraction fails + env::set_var("EVM_ARITHMETIZATION_PKG_VER", "NA"); + } + } + let args = cli::Cli::parse(); if let paladin::config::Runtime::InMemory = args.paladin.runtime { // If running in emulation mode, we'll need to initialize the prover diff --git a/zero_bin/leader/src/utils.rs b/zero_bin/leader/src/utils.rs new file mode 100644 index 000000000..e2c7d5f10 --- /dev/null +++ b/zero_bin/leader/src/utils.rs @@ -0,0 +1,72 @@ +use std::fs::File; +use std::io::{BufReader, Read}; +use std::path::Path; + +use anyhow::Result; + +/// Retrieves the version of a specified package from the `Cargo.lock` file. +/// +/// This function attempts to find the version of a package specified by +/// `package_name` by reading and parsing the `Cargo.lock` file. The +/// `Cargo.lock` file is expected to be located one directory level up from the +/// directory specified by the `CARGO_MANIFEST_DIR` environment variable. The +/// path may need adjustment depending on the structure of the project. +/// +/// # Parameters +/// - `package_name`: The name of the package for which the version is being +/// retrieved. +/// +/// # Returns +/// - `Ok(Some(String))`: If the package is found in the `Cargo.lock` file, +/// returns the version of the package. +/// - `Ok(None)`: If the package is not found in the `Cargo.lock` file, or if +/// the `Cargo.lock` file does not exist. +/// - `Err(_)`: If any error occurs during the execution, such as issues with +/// file paths, file access, reading, or parsing the `Cargo.lock` file. +/// +/// # Examples +/// ```no_run +/// let version = get_package_version("my_package"); +/// match version { +/// Ok(Some(ver)) => println!("Found version: {}", ver), +/// Ok(None) => println!("Package not found."), +/// Err(e) => println!("Error occurred: {}", e), +/// } +/// ``` +/// +/// # Errors +/// This function can return an `Err` result if: +/// - There is a problem finding, opening, or reading the `Cargo.lock` file. +/// - There is a failure in parsing the `Cargo.lock` file as TOML. +/// +/// The function uses `?` to propagate errors upwards, so the exact nature of +/// the error will be indicated by the error value returned in the `Err` variant +/// of the `Result`. +pub(crate) fn get_package_version(package_name: &str) -> Result> { + let manifest_dir = env!("CARGO_MANIFEST_DIR"); + let zero_bin_path = Path::new(manifest_dir) + .join("../") // Adjust the path according to your workspace structure + .canonicalize()?; + + let cargo_lock_path = zero_bin_path.join("Cargo.lock"); + let cargo_lock_file = File::open(cargo_lock_path); + if cargo_lock_file.is_err() { + return Ok(None); + } + + let mut cargo_lock_contents = String::new(); + BufReader::new(cargo_lock_file?).read_to_string(&mut cargo_lock_contents)?; + + let lockfile: toml::Value = toml::from_str(&cargo_lock_contents)?; + if let Some(package) = lockfile["package"] + .as_array() + .unwrap() + .iter() + .find(|&p| p["name"].as_str() == Some(package_name)) + { + let version = package["version"].as_str().unwrap(); + return Ok(Some(version.to_string())); + } + + Ok(None) +} From e49ef4b566d2f4ca55ca31a3591fc4933ff2d2e4 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Thu, 25 Apr 2024 03:35:51 +0900 Subject: [PATCH 146/184] Reduce sizes and add distinction with test_only mode (#69) --- zero_bin/tools/simple_test.sh | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh index 89f1900b5..f00e34ced 100755 --- a/zero_bin/tools/simple_test.sh +++ b/zero_bin/tools/simple_test.sh @@ -22,14 +22,26 @@ export RUST_BACKTRACE=full export RUST_LOG=info export RUSTFLAGS='-C target-cpu=native' -# This sizes are configured specifically for this witness. Don't use this in other scenarios -export ARITHMETIC_CIRCUIT_SIZE="16..19" -export BYTE_PACKING_CIRCUIT_SIZE="9..19" -export CPU_CIRCUIT_SIZE="12..21" -export KECCAK_CIRCUIT_SIZE="14..18" -export KECCAK_SPONGE_CIRCUIT_SIZE="9..13" -export LOGIC_CIRCUIT_SIZE="12..17" -export MEMORY_CIRCUIT_SIZE="17..23" +if [[ $1 == "test_only" ]]; then + # Circuit sizes don't matter in test_only mode, so we keep them minimal. + export ARITHMETIC_CIRCUIT_SIZE="16..17" + export BYTE_PACKING_CIRCUIT_SIZE="9..10" + export CPU_CIRCUIT_SIZE="12..13" + export KECCAK_CIRCUIT_SIZE="14..15" + export KECCAK_SPONGE_CIRCUIT_SIZE="9..10" + export LOGIC_CIRCUIT_SIZE="12..13" + export MEMORY_CIRCUIT_SIZE="17..18" +else + # These sizes are configured specifically for this witness. Don't use this in other scenarios + export ARITHMETIC_CIRCUIT_SIZE="16..19" + export BYTE_PACKING_CIRCUIT_SIZE="16..19" + export CPU_CIRCUIT_SIZE="18..21" + export KECCAK_CIRCUIT_SIZE="15..18" + export KECCAK_SPONGE_CIRCUIT_SIZE="10..13" + export LOGIC_CIRCUIT_SIZE="13..17" + export MEMORY_CIRCUIT_SIZE="20..23" +fi + # If we run ./simple_test test_only, we'll generate a dummy # proof. This is useful for quickly testing decoding and all of the From ecfe184555ed5ad703b59b4cdcc30755d96017ef Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 02:24:50 +0200 Subject: [PATCH 147/184] mark: 0xaatif/ethers2alloy From eda823a9291dc654a02841514d6798b89b620d0c Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 04:13:41 +0200 Subject: [PATCH 148/184] wip --- zero_bin/Cargo.lock | 1312 +++++++++++++++++++++++++++++++++++- zero_bin/Cargo.toml | 15 +- zero_bin/common/Cargo.toml | 2 + zero_bin/leader/Cargo.toml | 2 +- zero_bin/ops/Cargo.toml | 4 +- zero_bin/prover/Cargo.toml | 7 +- zero_bin/rpc/Cargo.toml | 6 +- 7 files changed, 1319 insertions(+), 29 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index d09d1d71d..e4e0d7111 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -45,6 +45,380 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "alloy" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-provider", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-rpc-types-trace", + "alloy-serde", + "alloy-transport", + "alloy-transport-http", + "reqwest 0.12.4", +] + +[[package]] +name = "alloy-consensus" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "serde", +] + +[[package]] +name = "alloy-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7253846c7bf55147775fd66c334abc1dd0a41e97e6155577b3dc513c6e66ef2" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8425a283510106b1a6ad25dd4bb648ecde7da3fd2baeb9400a85ad62f51ec90b" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow 0.6.6", +] + +[[package]] +name = "alloy-eips" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-abi" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e30946aa6173020259055a44971f5cf40a7d76c931d209caeb51b333263df4f" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-types", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "futures-utils-wasm", + "thiserror", +] + +[[package]] +name = "alloy-primitives" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8aa973e647ec336810a9356af8aea787249c9d00b1525359f3db29a68d231b" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-rpc-types-trace", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "pin-project", + "reqwest 0.12.4", + "serde_json", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8037e03c7f462a063f28daec9fda285a9a89da003c552f8637a80b9c8fd96241" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest 0.12.4", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.12.1", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "alloy-rpc-types-trace" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types", + "alloy-serde", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dbd17d67f3e89478c8a634416358e539e577899666c927bc3d2b1328ee9b6ca" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6da95adcf4760bb4b108fefa51d50096c5e5fdd29ee72fed3e86ee414f2e34" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.4.1", + "indexmap 2.2.5", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.53", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c8da04c1343871fb6ce5a489218f9c85323c8340a36e9106b5fc98d4dd59d5" +dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.53", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368cae4dc052cad1d8f72eb2ae0c38027116933eeb49213c200a9e9875f208d7" +dependencies = [ + "winnow 0.6.6", +] + +[[package]] +name = "alloy-sol-types" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a64d2d2395c1ac636b62419a7b17ec39031d6b2367e66e9acbf566e6055e9c" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "url", + "wasm-bindgen-futures", +] + +[[package]] +name = "alloy-transport-http" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest 0.12.4", + "serde_json", + "tower", + "tracing", + "url", +] + [[package]] name = "amq-protocol" version = "7.1.2" @@ -165,6 +539,130 @@ dependencies = [ "backtrace", ] +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.0", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +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 = "arrayvec" version = "0.7.4" @@ -295,6 +793,28 @@ dependencies = [ "reactor-trait", ] +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "async-task" version = "4.7.0" @@ -327,6 +847,17 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -417,12 +948,45 @@ dependencies = [ "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.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[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" @@ -481,6 +1045,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "blst" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + [[package]] name = "bumpalo" version = "3.15.4" @@ -508,6 +1084,20 @@ dependencies = [ "serde", ] +[[package]] +name = "c-kzg" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf100c4cea8f207e883ff91ca886d621d8a166cb04971dfaa9bb8fd99ed95df" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "serde", +] + [[package]] name = "cbc" version = "0.1.2" @@ -635,10 +1225,12 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" name = "common" version = "0.1.0" dependencies = [ + "alloy", "anyhow", "clap", "evm_arithmetization", "plonky2", + "primitive-types 0.12.2", "proof_gen", "seahash", "serde", @@ -657,6 +1249,25 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-hex" +version = "1.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ff96486ccc291d36a958107caf2c0af8c78c0af7d31ae2f35ce055130de1a6" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "const-random" version = "0.1.18" @@ -677,6 +1288,12 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "cookie-factory" version = "0.3.2" @@ -786,6 +1403,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -844,6 +1473,16 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.11" @@ -854,6 +1493,30 @@ dependencies = [ "serde", ] +[[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 = "des" version = "0.8.1" @@ -863,6 +1526,15 @@ dependencies = [ "cipher", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" @@ -870,6 +1542,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -886,12 +1559,51 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "either" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "embedded-io" version = "0.4.0" @@ -1045,7 +1757,7 @@ dependencies = [ "ethereum-types", "hashbrown 0.14.3", "hex-literal", - "itertools", + "itertools 0.11.0", "jemallocator", "keccak-hash 0.10.0", "log", @@ -1093,6 +1805,27 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[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 = [ + "rand_core", + "subtle", +] + [[package]] name = "fixed-hash" version = "0.7.0" @@ -1141,6 +1874,21 @@ 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" @@ -1273,6 +2021,12 @@ dependencies = [ "slab", ] +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + [[package]] name = "generic-array" version = "0.14.7" @@ -1281,6 +2035,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1302,6 +2057,23 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[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.26" @@ -1385,7 +2157,7 @@ checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" dependencies = [ "atomic-polyfill", "hash32", - "rustc_version", + "rustc_version 0.4.0", "serde", "spin", "stable_deref_trait", @@ -1414,6 +2186,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hex-literal" @@ -1427,7 +2202,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -1546,6 +2321,7 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", + "want", ] [[package]] @@ -1562,6 +2338,22 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.2.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.3" @@ -1569,6 +2361,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" dependencies = [ "bytes", + "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.0", @@ -1576,6 +2369,9 @@ dependencies = [ "pin-project-lite", "socket2 0.5.6", "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -1744,6 +2540,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.11.0" @@ -1753,6 +2558,24 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.10" @@ -1788,6 +2611,29 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + +[[package]] +name = "keccak-asm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "keccak-hash" version = "0.8.0" @@ -1866,6 +2712,12 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "linkme" version = "0.3.25" @@ -1915,6 +2767,15 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.3", +] + [[package]] name = "matchers" version = "0.1.0" @@ -1992,6 +2853,24 @@ dependencies = [ "uint", ] +[[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 = "nom" version = "7.1.3" @@ -2088,11 +2967,12 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2120,12 +3000,50 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.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.53", +] + [[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.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "ops" version = "0.1.0" @@ -2375,6 +3293,22 @@ dependencies = [ "futures-io", ] +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "plonky2" version = "0.2.2" @@ -2385,7 +3319,7 @@ dependencies = [ "anyhow", "getrandom", "hashbrown 0.14.3", - "itertools", + "itertools 0.11.0", "keccak-hash 0.8.0", "log", "num", @@ -2407,7 +3341,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a1dca60ad900d81b1fe2df3d0b88d43345988e2935e6709176e96573f4bcf5d" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "num", "plonky2_util", "rand", @@ -2517,6 +3451,30 @@ dependencies = [ "toml_edit 0.20.2", ] +[[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.79" @@ -2539,21 +3497,50 @@ dependencies = [ "serde", ] +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.2", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prover" version = "0.1.0" dependencies = [ + "alloy", "anyhow", - "ethereum-types", + "common", "futures", + "num-traits", "ops", "paladin-core", "proof_gen", + "ruint", "serde", "trace_decoder", "tracing", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.35" @@ -2599,6 +3586,15 @@ 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.9.0" @@ -2698,7 +3694,7 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -2716,7 +3712,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", @@ -2730,7 +3726,56 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.2.0", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.1.2", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.52.0", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", ] [[package]] @@ -2773,6 +3818,7 @@ dependencies = [ name = "rpc" version = "0.1.0" dependencies = [ + "alloy", "anyhow", "clap", "common", @@ -2781,8 +3827,9 @@ dependencies = [ "futures", "hex", "hex-literal", + "itertools 0.13.0", "prover", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "serde_path_to_error", @@ -2791,8 +3838,39 @@ dependencies = [ "trace_decoder", "tracing", "tracing-subscriber", + "url", +] + +[[package]] +name = "ruint" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f308135fef9fc398342da5472ce7c484529df23743fb7c734e0f3d472971e62" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types 0.12.2", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", ] +[[package]] +name = "ruint-macro" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2805,13 +3883,22 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.22", ] [[package]] @@ -2872,7 +3959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "schannel", "security-framework", ] @@ -2883,9 +3970,25 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", ] +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -2902,6 +4005,18 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.17" @@ -2939,6 +4054,20 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.9.2" @@ -2962,12 +4091,30 @@ dependencies = [ "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.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + [[package]] name = "serde" version = "1.0.197" @@ -3036,7 +4183,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" dependencies = [ - "base64", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", @@ -3068,7 +4215,7 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -3079,7 +4226,17 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha3-asm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +dependencies = [ + "cc", + "cfg-if", ] [[package]] @@ -3100,6 +4257,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core", +] + [[package]] name = "slab" version = "0.4.9" @@ -3144,6 +4311,16 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3159,7 +4336,7 @@ dependencies = [ "ahash", "anyhow", "hashbrown 0.14.3", - "itertools", + "itertools 0.11.0", "log", "num-bigint", "plonky2", @@ -3213,6 +4390,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8db114c44cf843a8bacd37a146e37987a0b823a0e8bc4fdc610c9c72ab397a5" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -3255,7 +4444,19 @@ dependencies = [ "cfg-if", "p12", "rustls-connector", - "rustls-pemfile", + "rustls-pemfile 1.0.4", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand 2.0.1", + "rustix 0.38.32", + "windows-sys 0.52.0", ] [[package]] @@ -3297,6 +4498,15 @@ dependencies = [ "once_cell", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "time" version = "0.3.34" @@ -3393,6 +4603,16 @@ dependencies = [ "syn 2.0.53", ] +[[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-reactor-trait" version = "1.1.0" @@ -3426,6 +4646,7 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", ] [[package]] @@ -3631,6 +4852,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -3702,6 +4929,12 @@ 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 = "verifier" version = "0.1.0" @@ -3724,6 +4957,15 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "waker-fn" version = "1.1.1" @@ -4037,6 +5279,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "worker" version = "0.1.0" @@ -4086,3 +5338,23 @@ dependencies = [ "quote", "syn 2.0.53", ] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +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.53", +] diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 3979d7f43..4332b9bf1 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -13,11 +13,22 @@ tokio = { version = "1.33.0", features = ["full"] } serde = "1.0.183" serde_path_to_error = "0.1.14" serde_json = "1.0.107" -ethereum-types = "0.14.1" thiserror = "1.0.50" futures = "0.3.29" -rlp = "0.5.2" keccak-hash = "0.10.0" +alloy = { git = "https://github.com/alloy-rs/alloy", features = [ + "rpc-types-eth", + "rpc-types-trace", + "providers", + "transports", + "transport-http", + "rpc-client", + "consensus", + "rlp", +] } +__compat_ethereum-types = { version = "0.14.1", package = "ethereum-types" } +__compat_rlp = { version = "0.5.2", package = "rlp" } + # zk-evm dependencies plonky2 = "0.2.2" diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 9a08bbd18..59b2ab12e 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -9,6 +9,7 @@ keywords.workspace = true categories.workspace = true [dependencies] +alloy.workspace = true thiserror = { workspace = true } tracing = { workspace = true } proof_gen = { workspace = true } @@ -20,3 +21,4 @@ trace_decoder = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } seahash = "4.1.0" +__compat_primitive-types = { version = "0.12.2", package = "primitive-types" } diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index de39328a8..341ebbca8 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -20,7 +20,7 @@ tokio = { workspace = true } proof_gen = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } -ethereum-types = { workspace = true } +__compat_ethereum-types.workspace = true axum = "0.7.4" toml = "0.8.12" diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index f22ad6ad8..1148a1898 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -15,9 +15,9 @@ evm_arithmetization = { workspace = true } proof_gen = { workspace = true } trace_decoder = { workspace = true } tracing = { workspace = true } -rlp = { workspace = true } -ethereum-types = { workspace = true } keccak-hash = { workspace = true } +__compat_rlp.workspace = true +__compat_ethereum-types.workspace = true common = { path = "../common" } diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index fc7fd24e8..240fcff52 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -14,13 +14,16 @@ proof_gen = { workspace = true } trace_decoder = { workspace = true } tracing = { workspace = true } paladin-core = { workspace = true } -ethereum-types = { workspace = true } anyhow = { workspace = true } futures = { workspace = true } +alloy.workspace = true +ruint = { version = "1.12.1", features = ["num-traits", "primitive-types"] } # Local dependencies ops = { path = "../ops" } +common = { path = "../common" } +num-traits = "0.2.19" [features] default = [] -test_only = ["ops/test_only"] \ No newline at end of file +test_only = ["ops/test_only"] diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 999169f6b..62c6aa1bf 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -18,19 +18,21 @@ trace_decoder = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } clap = { workspace = true } -ethereum-types = { workspace = true } evm_arithmetization = { workspace = true } thiserror = { workspace = true } +alloy.workspace = true futures = { workspace = true } - hex = "0.4.3" hex-literal = "0.4.1" reqwest = { version = "0.11.22", default-features = false, features = [ "json", "rustls-tls", ] } +__compat_ethereum-types.workspace = true # Local dependencies common = { path = "../common" } prover = { path = "../prover" } +itertools = "0.13.0" +url = "2.5.0" From de66688a6afbf3c8d7ea60c47f2f7102ec92fa50 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 04:14:36 +0200 Subject: [PATCH 149/184] refactor: migrate prover --- zero_bin/prover/src/lib.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 8cef43036..b00b47428 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -1,7 +1,8 @@ +use alloy::primitives::U256; use anyhow::Result; -use ethereum_types::U256; #[cfg(feature = "test_only")] use futures::stream::TryStreamExt; +use num_traits::ToPrimitive as _; use ops::TxProof; use paladin::{ directive::{Directive, IndexedStream}, @@ -27,7 +28,7 @@ fn resolve_code_hash_fn(_: &CodeHash) -> Vec { impl ProverInput { pub fn get_block_number(&self) -> U256 { - self.other_data.b_data.b_meta.block_number + self.other_data.b_data.b_meta.block_number.into() } #[cfg(not(feature = "test_only"))] @@ -37,6 +38,8 @@ impl ProverInput { previous: Option, save_inputs_on_error: bool, ) -> Result { + use anyhow::Context as _; + let block_number = self.get_block_number(); info!("Proving block {block_number}"); @@ -57,8 +60,11 @@ impl ProverInput { .await?; if let proof_gen::proof_types::AggregatableProof::Agg(proof) = agg_proof { + let block_number = block_number + .to_u64() + .context("block number overflows u64")?; let prev = previous.map(|p| GeneratedBlockProof { - b_height: block_number.as_u64() - 1, + b_height: block_number - 1, intern: p, }); From 9d34e1304275082dc6d3775322b15d0ddd9dbe37 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 04:14:52 +0200 Subject: [PATCH 150/184] wip: migrate rpc --- zero_bin/common/src/lib.rs | 22 +++ zero_bin/leader/src/jerigon.rs | 2 +- zero_bin/rpc/src/cli.rs | 23 --- zero_bin/rpc/src/init.rs | 11 -- zero_bin/rpc/src/lib.rs | 153 +++++++++++++- zero_bin/rpc/src/main.rs | 70 ++++--- zero_bin/rpc/src/rpc.rs | 352 --------------------------------- 7 files changed, 218 insertions(+), 415 deletions(-) delete mode 100644 zero_bin/rpc/src/cli.rs delete mode 100644 zero_bin/rpc/src/init.rs delete mode 100644 zero_bin/rpc/src/rpc.rs diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs index e9e7b504b..a360eeaf6 100644 --- a/zero_bin/common/src/lib.rs +++ b/zero_bin/common/src/lib.rs @@ -1,3 +1,25 @@ pub mod debug_utils; pub mod parsing; pub mod prover_state; + +pub trait Compat { + fn compat(self) -> Out; +} + +impl Compat<__compat_primitive_types::H160> for alloy::primitives::Address { + fn compat(self) -> __compat_primitive_types::H160 { + todo!() + } +} + +impl Compat<__compat_primitive_types::H256> for alloy::primitives::B256 { + fn compat(self) -> __compat_primitive_types::H256 { + todo!() + } +} + +impl Compat<[__compat_primitive_types::U256; 8]> for alloy::primitives::Bloom { + fn compat(self) -> [__compat_primitive_types::U256; 8] { + todo!() + } +} diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 6719112af..aa154c9df 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -18,7 +18,7 @@ pub(crate) async fn jerigon_main( proof_output_path_opt: Option, save_inputs_on_error: bool, ) -> Result<()> { - let prover_input = rpc::fetch_prover_input(rpc::FetchProverInputRequest { + let prover_input = rpc::prover_input(rpc::FetchProverInputRequest { rpc_url, block_number, checkpoint_block_number, diff --git a/zero_bin/rpc/src/cli.rs b/zero_bin/rpc/src/cli.rs deleted file mode 100644 index 5afe67c70..000000000 --- a/zero_bin/rpc/src/cli.rs +++ /dev/null @@ -1,23 +0,0 @@ -use clap::{Parser, Subcommand, ValueHint}; - -#[derive(Parser)] -pub(crate) struct Cli { - #[command(subcommand)] - pub(crate) command: Commands, -} - -#[derive(Subcommand)] -pub(crate) enum Commands { - /// Fetch and generate prover input from the RPC endpoint - Fetch { - /// The RPC URL - #[arg(short = 'u', long, value_hint = ValueHint::Url)] - rpc_url: String, - /// The block number - #[arg(short, long)] - block_number: u64, - /// The checkpoint block number - #[arg(short, long, default_value_t = 0)] - checkpoint_block_number: u64, - }, -} diff --git a/zero_bin/rpc/src/init.rs b/zero_bin/rpc/src/init.rs deleted file mode 100644 index f93914895..000000000 --- a/zero_bin/rpc/src/init.rs +++ /dev/null @@ -1,11 +0,0 @@ -use tracing_subscriber::{prelude::*, util::SubscriberInitExt, EnvFilter}; -pub(crate) fn tracing() { - tracing_subscriber::Registry::default() - .with( - tracing_subscriber::fmt::layer() - .with_ansi(false) - .compact() - .with_filter(EnvFilter::from_default_env()), - ) - .init(); -} diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 4e74ff49e..d768c0dbc 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -1,2 +1,151 @@ -mod rpc; -pub use rpc::{fetch_prover_input, FetchProverInputRequest}; +use alloy::{ + providers::Provider, + rpc::types::eth::{BlockId, Withdrawal}, + transports::Transport, +}; +use anyhow::Context as _; +use common::Compat as _; +use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; +use futures::{StreamExt as _, TryStreamExt as _}; +use itertools::{Either, Itertools as _}; +use prover::ProverInput; +use serde::Deserialize; +use serde_json::json; +use trace_decoder::{ + trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, + types::{BlockLevelData, OtherBlockData}, +}; + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "snake_case")] +#[allow(clippy::large_enum_variant)] +enum JerigonTrace { + Result(TxnInfo), + BlockWitness(BlockTraceTriePreImages), +} + +const BLOCK_WITHOUT_FULL_TRANSACTIONS: bool = false; + +pub async fn prover_input( + provider: ProviderT, + target_block_id: BlockId, + checkpoint_block_id: BlockId, +) -> anyhow::Result +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + // Grab trace information + ///////////////////////// + let traces = provider + .raw_request::<_, Vec>( + "debug_traceBlockByNumber".into(), + (target_block_id, json!({"tracer": "zeroTracer"})), + ) + .await?; + + let (txn_info, mut pre_images) = + traces + .into_iter() + .partition_map::, Vec<_>, _, _, _>(|it| match it { + JerigonTrace::Result(it) => Either::Left(it), + JerigonTrace::BlockWitness(it) => Either::Right(it), + }); + + // Grab block info + ////////////////// + let target_block = provider + .get_block(target_block_id, BLOCK_WITHOUT_FULL_TRANSACTIONS) + .await? + .context("target block does not exist")?; + let target_block_number = target_block + .header + .number + .context("target block is missing field `number`")?; + let chain_id = provider.get_chain_id().await?; + let checkpoint_state_trie_root = provider + .get_block(checkpoint_block_id, BLOCK_WITHOUT_FULL_TRANSACTIONS) + .await? + .context("checkpoint block does not exist")? + .header + .state_root; + + let mut prev_hashes = [alloy::primitives::B256::ZERO; 256]; + let concurrency = prev_hashes.len(); + futures::stream::iter( + prev_hashes + .iter_mut() + .rev() // fill RTL + .zip(std::iter::successors(Some(target_block_number), |it| { + it.checked_sub(1) + })) + .map(|(dst, n)| { + let provider = &provider; + async move { + let block = provider + .get_block(n.into(), BLOCK_WITHOUT_FULL_TRANSACTIONS) + .await + .context("couldn't get block")? + .context("no such block")?; + *dst = block.header.parent_hash; + anyhow::Ok(()) + } + }), + ) + .buffered(concurrency) + .try_collect::<()>() + .await + .context("couldn't fill previous hashes")?; + + // Assemble + /////////// + Ok(ProverInput { + block_trace: BlockTrace { + trie_pre_images: pre_images.pop().context("trace had no BlockWitness")?, + txn_info, + }, + other_data: OtherBlockData { + b_data: BlockLevelData { + b_meta: BlockMetadata { + block_beneficiary: target_block.header.miner.compat(), + block_timestamp: target_block.header.timestamp.into(), + block_number: target_block_number.into(), + block_difficulty: target_block.header.difficulty.into(), + block_random: target_block + .header + .mix_hash + .context("target block is missing field `mix_hash`")? + .compat(), + block_gaslimit: target_block.header.gas_limit.into(), + block_chain_id: chain_id.into(), + block_base_fee: target_block + .header + .base_fee_per_gas + .context("target block is missing field `base_fee_per_gas`")? + .into(), + block_gas_used: target_block.header.gas_used.into(), + block_bloom: target_block.header.logs_bloom.compat(), + }, + b_hashes: BlockHashes { + prev_hashes: prev_hashes.map(|it| it.compat()).into(), + cur_hash: target_block + .header + .hash + .context("target block is missing field `hash`")? + .compat(), + }, + withdrawals: target_block + .withdrawals + .into_iter() + .flatten() + .map( + |Withdrawal { + address, amount, .. + }| { (address.compat(), amount.into()) }, + ) + .collect(), + }, + checkpoint_state_trie_root: checkpoint_state_trie_root.compat(), + }, + }) +} diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs index 00bfc4c43..e4647379a 100644 --- a/zero_bin/rpc/src/main.rs +++ b/zero_bin/rpc/src/main.rs @@ -1,33 +1,51 @@ -use std::io::Write; +use std::io; -use anyhow::Result; -use clap::Parser; -use cli::Commands; -use rpc::{fetch_prover_input, FetchProverInputRequest}; +use alloy::{providers::RootProvider, rpc::types::eth::BlockId}; +use clap::{Parser, ValueHint}; +use tracing_subscriber::{prelude::*, EnvFilter}; +use url::Url; -mod cli; -mod init; -mod rpc; +#[derive(Parser)] +pub enum Args { + /// Fetch and generate prover input from the RPC endpoint + Fetch { + /// The RPC URL + #[arg(short = 'u', long, value_hint = ValueHint::Url)] + rpc_url: Url, + /// The block number + #[arg(short, long)] + block_number: BlockId, + /// The checkpoint block number + // TODO(aatifsyed): impl Display for alloy::..::BlockId + #[arg(short, long, default_value = "0")] + checkpoint_block_number: BlockId, + }, +} #[tokio::main] -async fn main() -> Result<()> { - init::tracing(); - let args = cli::Cli::parse(); +async fn main() -> anyhow::Result<()> { + tracing_subscriber::Registry::default() + .with( + tracing_subscriber::fmt::layer() + .with_ansi(false) + .compact() + .with_filter(EnvFilter::from_default_env()), + ) + .init(); + + let Args::Fetch { + rpc_url, + block_number, + checkpoint_block_number, + } = Args::parse(); + let prover_input = rpc::prover_input( + RootProvider::new_http(rpc_url), + block_number, + checkpoint_block_number, + ) + .await?; + + serde_json::to_writer_pretty(io::stdout(), &prover_input)?; - match args.command { - Commands::Fetch { - rpc_url, - block_number, - checkpoint_block_number, - } => { - let prover_input = fetch_prover_input(FetchProverInputRequest { - rpc_url: &rpc_url, - block_number, - checkpoint_block_number, - }) - .await?; - std::io::stdout().write_all(&serde_json::to_vec(&prover_input)?)?; - } - } Ok(()) } diff --git a/zero_bin/rpc/src/rpc.rs b/zero_bin/rpc/src/rpc.rs deleted file mode 100644 index 2abc255ec..000000000 --- a/zero_bin/rpc/src/rpc.rs +++ /dev/null @@ -1,352 +0,0 @@ -use anyhow::{Context, Result}; -use ethereum_types::{Address, Bloom, H256, U256}; -use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; -use futures::{stream::FuturesOrdered, TryStreamExt}; -use prover::ProverInput; -use reqwest::IntoUrl; -use serde::Deserialize; -use thiserror::Error; -use tokio::try_join; -use trace_decoder::{ - trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, - types::{BlockLevelData, OtherBlockData}, -}; -use tracing::{debug, info}; - -#[derive(Deserialize, Debug)] -#[serde(rename_all = "snake_case")] -#[allow(clippy::large_enum_variant)] -enum JerigonResultItem { - Result(TxnInfo), - BlockWitness(BlockTraceTriePreImages), -} - -/// The response from the `debug_traceBlockByNumber` RPC method. -#[derive(Deserialize, Debug)] -struct JerigonTraceResponse { - result: Vec, -} - -#[derive(Error, Debug)] -enum JerigonTraceError { - #[error("expected BlockTraceTriePreImages in block_witness key")] - BlockTraceTriePreImagesNotFound, -} - -impl TryFrom for BlockTrace { - type Error = JerigonTraceError; - - fn try_from(value: JerigonTraceResponse) -> Result { - let mut txn_info = Vec::new(); - let mut trie_pre_images = None; - - for item in value.result { - match item { - JerigonResultItem::Result(info) => { - txn_info.push(info); - } - JerigonResultItem::BlockWitness(pre_images) => { - trie_pre_images = Some(pre_images); - } - } - } - - let trie_pre_images = - trie_pre_images.ok_or(JerigonTraceError::BlockTraceTriePreImagesNotFound)?; - - Ok(Self { - txn_info, - trie_pre_images, - }) - } -} - -impl JerigonTraceResponse { - /// Fetches the block trace for the given block number. - async fn fetch(rpc_url: U, block_number: u64) -> Result { - let client = reqwest::Client::new(); - let block_number_hex = format!("0x{:x}", block_number); - info!("Fetching block trace for block {}", block_number_hex); - - let response = client - .post(rpc_url) - .json(&serde_json::json!({ - "jsonrpc": "2.0", - "method": "debug_traceBlockByNumber", - "params": [&block_number_hex, {"tracer": "zeroTracer"}], - "id": 1, - })) - .send() - .await - .context("fetching debug_traceBlockByNumber")?; - - let bytes = response.bytes().await?; - let des = &mut serde_json::Deserializer::from_slice(&bytes); - let parsed = serde_path_to_error::deserialize(des) - .context("deserializing debug_traceBlockByNumber")?; - - Ok(parsed) - } -} - -#[derive(Deserialize, Debug)] -#[serde(rename_all = "camelCase")] -struct EthGetBlockByNumberResult { - base_fee_per_gas: U256, - difficulty: U256, - gas_limit: U256, - gas_used: U256, - hash: H256, - logs_bloom: Bloom, - miner: Address, - mix_hash: H256, - number: U256, - parent_hash: H256, - state_root: H256, - timestamp: U256, - withdrawals: Vec, -} - -#[derive(Deserialize, Debug)] -#[serde(rename_all = "camelCase")] -struct Withdrawal { - address: Address, - amount: U256, -} - -impl From for (Address, U256) { - fn from(v: Withdrawal) -> Self { - (v.address, v.amount) - } -} - -/// The response from the `eth_getBlockByNumber` RPC method. -#[derive(Deserialize, Debug)] -struct EthGetBlockByNumberResponse { - result: EthGetBlockByNumberResult, -} - -impl EthGetBlockByNumberResponse { - /// Fetches the block metadata for the given block number. - async fn fetch(rpc_url: U, block_number: u64) -> Result { - let client = reqwest::Client::new(); - let block_number_hex = format!("0x{:x}", block_number); - info!("Fetching block metadata for block {}", block_number_hex); - - let response = client - .post(rpc_url) - .json(&serde_json::json!({ - "jsonrpc": "2.0", - "method": "eth_getBlockByNumber", - "params": [&block_number_hex, false], - "id": 1, - })) - .send() - .await - .context("fetching eth_getBlockByNumber")?; - - let bytes = response.bytes().await?; - let des = &mut serde_json::Deserializer::from_slice(&bytes); - let parsed = - serde_path_to_error::deserialize(des).context("deserializing eth_getBlockByNumber")?; - - Ok(parsed) - } - - async fn fetch_previous_block_hashes( - rpc_url: U, - block_number: u64, - ) -> Result> { - if block_number == 0 { - return Ok(vec![H256::default(); 256]); - } - - let mut hashes = Vec::with_capacity(256); - - let padding_delta = block_number as i64 - 256; - if padding_delta < 0 { - let default = H256::default(); - for _ in 0..padding_delta.abs() { - hashes.push(default); - } - } - - // Every block response includes the _parent_ hash along with its hash, so we - // can just fetch half the blocks to acquire all hashes for the range. - let start = block_number.saturating_sub(256); - let mut futs: FuturesOrdered<_> = (start..=block_number) - .step_by(2) - .map(|block_number| Self::fetch(rpc_url, block_number)) - .collect(); - - while let Some(response) = futs.try_next().await? { - // Ignore hash of the current block. - if response.result.number == block_number.into() { - hashes.push(response.result.parent_hash); - continue; - } - - // Ignore the parent of the start block. - if response.result.number != start.into() { - hashes.push(response.result.parent_hash); - } - - hashes.push(response.result.hash); - } - - Ok(hashes) - } - - async fn fetch_checkpoint_state_trie_root( - rpc_url: U, - block_number: u64, - ) -> Result { - let res = Self::fetch(rpc_url, block_number).await?; - Ok(res.result.state_root) - } -} - -/// The response from the `eth_chainId` RPC method. -#[derive(Deserialize, Debug)] -struct EthChainIdResponse { - result: U256, -} - -impl EthChainIdResponse { - /// Fetches the chain id. - async fn fetch(rpc_url: U) -> Result { - let client = reqwest::Client::new(); - info!("Fetching chain id"); - - let response = client - .post(rpc_url) - .json(&serde_json::json!({ - "jsonrpc": "2.0", - "method": "eth_chainId", - "params": [], - "id": 1, - })) - .send() - .await - .context("fetching eth_chainId")?; - - let bytes = response.bytes().await?; - let des = &mut serde_json::Deserializer::from_slice(&bytes); - let parsed = serde_path_to_error::deserialize(des).context("deserializing eth_chainId")?; - - Ok(parsed) - } -} - -/// Product of the `eth_getBlockByNumber` and `eth_chainId` RPC methods. -/// -/// Contains the necessary data to construct the `OtherBlockData` struct. -struct RpcBlockMetadata { - block_by_number: EthGetBlockByNumberResponse, - chain_id: EthChainIdResponse, - prev_hashes: Vec, - checkpoint_state_trie_root: H256, -} - -impl RpcBlockMetadata { - async fn fetch(rpc_url: &str, block_number: u64, checkpoint_block_number: u64) -> Result { - let (block_result, chain_id_result, prev_hashes, checkpoint_state_trie_root) = try_join!( - EthGetBlockByNumberResponse::fetch(rpc_url, block_number), - EthChainIdResponse::fetch(rpc_url), - EthGetBlockByNumberResponse::fetch_previous_block_hashes(rpc_url, block_number), - EthGetBlockByNumberResponse::fetch_checkpoint_state_trie_root( - rpc_url, - checkpoint_block_number - ) - )?; - - Ok(Self { - block_by_number: block_result, - chain_id: chain_id_result, - prev_hashes, - checkpoint_state_trie_root, - }) - } -} - -impl From for OtherBlockData { - fn from( - RpcBlockMetadata { - block_by_number, - chain_id, - prev_hashes, - checkpoint_state_trie_root, - }: RpcBlockMetadata, - ) -> Self { - let mut bloom = [U256::zero(); 8]; - - for (i, word) in block_by_number - .result - .logs_bloom - .as_fixed_bytes() - .chunks_exact(32) - .enumerate() - { - bloom[i] = U256::from_big_endian(word); - } - - let block_metadata = BlockMetadata { - block_beneficiary: block_by_number.result.miner, - block_timestamp: block_by_number.result.timestamp, - block_number: block_by_number.result.number, - block_difficulty: block_by_number.result.difficulty, - block_random: block_by_number.result.mix_hash, - block_gaslimit: block_by_number.result.gas_limit, - block_chain_id: chain_id.result, - block_base_fee: block_by_number.result.base_fee_per_gas, - block_gas_used: block_by_number.result.gas_used, - block_bloom: bloom, - }; - - let withdrawals = block_by_number - .result - .withdrawals - .into_iter() - .map(|w| w.into()) - .collect(); - Self { - b_data: BlockLevelData { - b_meta: block_metadata, - b_hashes: BlockHashes { - prev_hashes, - cur_hash: block_by_number.result.hash, - }, - withdrawals, - }, - checkpoint_state_trie_root, - } - } -} - -pub struct FetchProverInputRequest<'a> { - pub rpc_url: &'a str, - pub block_number: u64, - pub checkpoint_block_number: u64, -} - -pub async fn fetch_prover_input( - FetchProverInputRequest { - rpc_url, - block_number, - checkpoint_block_number, - }: FetchProverInputRequest<'_>, -) -> Result { - let (trace_result, rpc_block_metadata) = try_join!( - JerigonTraceResponse::fetch(rpc_url, block_number), - RpcBlockMetadata::fetch(rpc_url, block_number, checkpoint_block_number), - )?; - - debug!("Got block result: {:?}", rpc_block_metadata.block_by_number); - debug!("Got trace result: {:?}", trace_result); - debug!("Got chain_id: {:?}", rpc_block_metadata.chain_id); - - Ok(ProverInput { - block_trace: trace_result.try_into()?, - other_data: rpc_block_metadata.into(), - }) -} From fabc7eee91fe38105387f7dc473af21fa6186de1 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 04:19:44 +0200 Subject: [PATCH 151/184] refactor: migrate leader --- zero_bin/Cargo.lock | 2 +- zero_bin/leader/Cargo.toml | 2 +- zero_bin/leader/src/http.rs | 2 +- zero_bin/leader/src/jerigon.rs | 11 ++++++----- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index e4e0d7111..dc3beedd1 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2686,12 +2686,12 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" name = "leader" version = "0.1.0" dependencies = [ + "alloy", "anyhow", "axum", "clap", "common", "dotenvy", - "ethereum-types", "ops", "paladin-core", "proof_gen", diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 341ebbca8..7efadacfb 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -20,7 +20,7 @@ tokio = { workspace = true } proof_gen = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } -__compat_ethereum-types.workspace = true +alloy.workspace = true axum = "0.7.4" toml = "0.8.12" diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index 80111ce45..d718b3e69 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -1,8 +1,8 @@ use std::{net::SocketAddr, path::PathBuf, sync::Arc}; +use alloy::primitives::U256; use anyhow::{bail, Result}; use axum::{http::StatusCode, routing::post, Json, Router}; -use ethereum_types::U256; use paladin::runtime::Runtime; use proof_gen::{proof_types::GeneratedBlockProof, types::PlonkyProofIntern}; use prover::ProverInput; diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index aa154c9df..5074a5aef 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -4,6 +4,7 @@ use std::{ path::PathBuf, }; +use alloy::providers::RootProvider; use anyhow::Result; use paladin::runtime::Runtime; use proof_gen::types::PlonkyProofIntern; @@ -18,11 +19,11 @@ pub(crate) async fn jerigon_main( proof_output_path_opt: Option, save_inputs_on_error: bool, ) -> Result<()> { - let prover_input = rpc::prover_input(rpc::FetchProverInputRequest { - rpc_url, - block_number, - checkpoint_block_number, - }) + let prover_input = rpc::prover_input( + RootProvider::new_http(rpc_url.parse()?), + block_number.into(), + checkpoint_block_number.into(), + ) .await?; let proof = prover_input From 8fbb52c78f0e5c0a25f2f7018f11edd39423f1ce Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 04:30:32 +0200 Subject: [PATCH 152/184] chore: clean up deps --- zero_bin/Cargo.lock | 240 ++++--------------------------------- zero_bin/Cargo.toml | 6 - zero_bin/common/Cargo.toml | 2 - zero_bin/ops/Cargo.toml | 3 - zero_bin/prover/Cargo.toml | 2 - zero_bin/rpc/Cargo.toml | 13 +- 6 files changed, 26 insertions(+), 240 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index dc3beedd1..35f063e66 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -57,11 +57,10 @@ dependencies = [ "alloy-provider", "alloy-rpc-client", "alloy-rpc-types", - "alloy-rpc-types-trace", "alloy-serde", "alloy-transport", "alloy-transport-http", - "reqwest 0.12.4", + "reqwest", ] [[package]] @@ -86,7 +85,6 @@ dependencies = [ "alloy-dyn-abi", "alloy-json-abi", "alloy-primitives", - "alloy-rlp", "alloy-sol-types", ] @@ -217,7 +215,7 @@ dependencies = [ "futures-utils-wasm", "lru", "pin-project", - "reqwest 0.12.4", + "reqwest", "serde_json", "tokio", "tracing", @@ -256,7 +254,7 @@ dependencies = [ "alloy-transport-http", "futures", "pin-project", - "reqwest 0.12.4", + "reqwest", "serde", "serde_json", "tokio", @@ -412,7 +410,7 @@ source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7 dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest 0.12.4", + "reqwest", "serde_json", "tower", "tracing", @@ -874,10 +872,10 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.0", + "http", + "http-body", "http-body-util", - "hyper 1.2.0", + "hyper", "hyper-util", "itoa", "matchit", @@ -907,8 +905,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.0", + "http", + "http-body", "http-body-util", "mime", "pin-project-lite", @@ -1232,11 +1230,9 @@ dependencies = [ "plonky2", "primitive-types 0.12.2", "proof_gen", - "seahash", "serde", "serde_json", "thiserror", - "trace_decoder", "tracing", ] @@ -1610,15 +1606,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" -[[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 = "enum-as-inner" version = "0.6.0" @@ -2074,25 +2061,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.2.5", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "h2" version = "0.4.4" @@ -2104,7 +2072,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http 1.1.0", + "http", "indexmap 2.2.5", "slab", "tokio", @@ -2205,17 +2173,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -2227,17 +2184,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.0" @@ -2245,7 +2191,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -2256,8 +2202,8 @@ checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" dependencies = [ "bytes", "futures-core", - "http 1.1.0", - "http-body 1.0.0", + "http", + "http-body", "pin-project-lite", ] @@ -2279,30 +2225,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.6", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.2.0" @@ -2312,9 +2234,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.4", - "http 1.1.0", - "http-body 1.0.0", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -2324,20 +2246,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.28", - "rustls", - "tokio", - "tokio-rustls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -2346,7 +2254,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.2.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2363,9 +2271,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "hyper 1.2.0", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2 0.5.6", "tokio", @@ -3049,14 +2957,11 @@ name = "ops" version = "0.1.0" dependencies = [ "common", - "ethereum-types", "evm_arithmetization", "keccak-hash 0.10.0", "paladin-core", "proof_gen", - "rlp", "serde", - "trace_decoder", "tracing", ] @@ -3688,47 +3593,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.28", - "hyper-rustls", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg 0.50.0", -] - [[package]] name = "reqwest" version = "0.12.4" @@ -3739,10 +3603,10 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.1.0", - "http-body 1.0.0", + "http", + "http-body", "http-body-util", - "hyper 1.2.0", + "hyper", "hyper-tls", "hyper-util", "ipnet", @@ -3765,7 +3629,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.52.0", + "winreg", ] [[package]] @@ -3822,17 +3686,14 @@ dependencies = [ "anyhow", "clap", "common", - "ethereum-types", "evm_arithmetization", "futures", "hex", "hex-literal", "itertools 0.13.0", "prover", - "reqwest 0.11.27", "serde", "serde_json", - "serde_path_to_error", "thiserror", "tokio", "trace_decoder", @@ -4048,12 +3909,6 @@ dependencies = [ "untrusted", ] -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "sec1" version = "0.7.3" @@ -4408,27 +4263,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tap" version = "1.0.1" @@ -4627,16 +4461,6 @@ dependencies = [ "tokio-stream", ] -[[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-stream" version = "0.1.15" @@ -5073,12 +4897,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - [[package]] name = "winapi" version = "0.3.9" @@ -5269,16 +5087,6 @@ 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 0.48.0", -] - [[package]] name = "winreg" version = "0.52.0" diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 4332b9bf1..a34224fdf 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -18,16 +18,10 @@ futures = "0.3.29" keccak-hash = "0.10.0" alloy = { git = "https://github.com/alloy-rs/alloy", features = [ "rpc-types-eth", - "rpc-types-trace", "providers", "transports", "transport-http", - "rpc-client", - "consensus", - "rlp", ] } -__compat_ethereum-types = { version = "0.14.1", package = "ethereum-types" } -__compat_rlp = { version = "0.5.2", package = "rlp" } # zk-evm dependencies diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 59b2ab12e..b30024de8 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -17,8 +17,6 @@ plonky2 = { workspace = true } evm_arithmetization = { workspace = true } clap = { workspace = true } anyhow = { workspace = true } -trace_decoder = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -seahash = "4.1.0" __compat_primitive-types = { version = "0.12.2", package = "primitive-types" } diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 1148a1898..11c265aa8 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -13,11 +13,8 @@ paladin-core = { workspace = true } serde = { workspace = true } evm_arithmetization = { workspace = true } proof_gen = { workspace = true } -trace_decoder = { workspace = true } tracing = { workspace = true } keccak-hash = { workspace = true } -__compat_rlp.workspace = true -__compat_ethereum-types.workspace = true common = { path = "../common" } diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 240fcff52..553341876 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -18,8 +18,6 @@ anyhow = { workspace = true } futures = { workspace = true } alloy.workspace = true ruint = { version = "1.12.1", features = ["num-traits", "primitive-types"] } - -# Local dependencies ops = { path = "../ops" } common = { path = "../common" } num-traits = "0.2.19" diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 62c6aa1bf..83daf08b2 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -16,7 +16,6 @@ anyhow = { workspace = true } serde = { workspace = true } trace_decoder = { workspace = true } serde_json = { workspace = true } -serde_path_to_error = { workspace = true } clap = { workspace = true } evm_arithmetization = { workspace = true } thiserror = { workspace = true } @@ -24,15 +23,7 @@ alloy.workspace = true futures = { workspace = true } hex = "0.4.3" hex-literal = "0.4.1" -reqwest = { version = "0.11.22", default-features = false, features = [ - "json", - "rustls-tls", -] } -__compat_ethereum-types.workspace = true - - -# Local dependencies -common = { path = "../common" } -prover = { path = "../prover" } itertools = "0.13.0" url = "2.5.0" +common = { path = "../common" } +prover = { path = "../prover" } From e08b62ac4f006c35dfbdd4f6e244e4a135c59fb8 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 05:21:53 +0200 Subject: [PATCH 153/184] feat: fill out compat --- zero_bin/common/src/lib.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs index a360eeaf6..5eba54402 100644 --- a/zero_bin/common/src/lib.rs +++ b/zero_bin/common/src/lib.rs @@ -1,3 +1,5 @@ +use std::array; + pub mod debug_utils; pub mod parsing; pub mod prover_state; @@ -8,18 +10,36 @@ pub trait Compat { impl Compat<__compat_primitive_types::H160> for alloy::primitives::Address { fn compat(self) -> __compat_primitive_types::H160 { - todo!() + let alloy::primitives::Address(alloy::primitives::FixedBytes(arr)) = self; + __compat_primitive_types::H160(arr) } } impl Compat<__compat_primitive_types::H256> for alloy::primitives::B256 { fn compat(self) -> __compat_primitive_types::H256 { - todo!() + let alloy::primitives::FixedBytes(arr) = self; + __compat_primitive_types::H256(arr) } } impl Compat<[__compat_primitive_types::U256; 8]> for alloy::primitives::Bloom { fn compat(self) -> [__compat_primitive_types::U256; 8] { - todo!() + let alloy::primitives::Bloom(alloy::primitives::FixedBytes(src)) = self; + // have u8 * 256 + // want U256 * 8 + // (no unsafe, no unstable) + let mut chunks = src.chunks_exact(32); + let dst = array::from_fn(|_ix| { + __compat_primitive_types::U256::from( + <[u8; 32]>::try_from(chunks.next().unwrap()).unwrap(), + ) + }); + assert_eq!(chunks.len(), 0); + dst } } + +#[test] +fn bloom() { + let _did_not_panic = alloy::primitives::Bloom::ZERO.compat(); +} From b209c1ba7efb91cf585b347c29e0c493c244fdc2 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 11:16:13 +0200 Subject: [PATCH 154/184] try: used --- zero_bin/Cargo.lock | 6 ++---- zero_bin/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 35f063e66..46406acc4 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2991,8 +2991,7 @@ dependencies = [ [[package]] name = "paladin-core" version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5af1955eaab1506a43d046628c218b7b3915539554838feb85ed31f54aace2f2" +source = "git+https://github.com/0xPolygonZero/paladin?branch=0xaatif/used#a1c2de851eb9e4a2eecc20ea560c2d4d629cd06d" dependencies = [ "anyhow", "async-trait", @@ -3024,8 +3023,7 @@ dependencies = [ [[package]] name = "paladin-opkind-derive" version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25dcb10b7c0ce99abee8694e2e79e4787d7f778b9339dc5a50ba6fc45e5cc9" +source = "git+https://github.com/0xPolygonZero/paladin?branch=0xaatif/used#a1c2de851eb9e4a2eecc20ea560c2d4d629cd06d" dependencies = [ "quote", "syn 2.0.53", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index a34224fdf..730b78a84 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "common", "ops", "verifier", "rpc", "prover"] resolver = "2" [workspace.dependencies] -paladin-core = "0.4.2" +paladin-core = { git = "https://github.com/0xPolygonZero/paladin", branch = "0xaatif/used" } anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" From 2f311168e0bfbb0cbc1de5f71e78d00099f89394 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 11:32:18 +0200 Subject: [PATCH 155/184] Revert "try: used" This reverts commit b209c1ba7efb91cf585b347c29e0c493c244fdc2. --- zero_bin/Cargo.lock | 6 ++++-- zero_bin/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 46406acc4..35f063e66 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -2991,7 +2991,8 @@ dependencies = [ [[package]] name = "paladin-core" version = "0.4.2" -source = "git+https://github.com/0xPolygonZero/paladin?branch=0xaatif/used#a1c2de851eb9e4a2eecc20ea560c2d4d629cd06d" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5af1955eaab1506a43d046628c218b7b3915539554838feb85ed31f54aace2f2" dependencies = [ "anyhow", "async-trait", @@ -3023,7 +3024,8 @@ dependencies = [ [[package]] name = "paladin-opkind-derive" version = "0.4.1" -source = "git+https://github.com/0xPolygonZero/paladin?branch=0xaatif/used#a1c2de851eb9e4a2eecc20ea560c2d4d629cd06d" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25dcb10b7c0ce99abee8694e2e79e4787d7f778b9339dc5a50ba6fc45e5cc9" dependencies = [ "quote", "syn 2.0.53", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 730b78a84..a34224fdf 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -3,7 +3,7 @@ members = ["leader", "worker", "common", "ops", "verifier", "rpc", "prover"] resolver = "2" [workspace.dependencies] -paladin-core = { git = "https://github.com/0xPolygonZero/paladin", branch = "0xaatif/used" } +paladin-core = "0.4.2" anyhow = { version = "1.0.75", features = ["backtrace"] } dotenvy = "0.15.7" tracing = "0.1" From da32ab0de1882c067fd49919d2cc3dd677bfb650 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 11:36:54 +0200 Subject: [PATCH 156/184] fix: -Zlinker-features=-lld --- zero_bin/tools/simple_test.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh index f00e34ced..3cee5e50f 100755 --- a/zero_bin/tools/simple_test.sh +++ b/zero_bin/tools/simple_test.sh @@ -17,10 +17,17 @@ bunzip2 -f witness.json.bz2 export RAYON_NUM_THREADS=$num_procs export TOKIO_WORKER_THREADS=$num_procs +# - paladin-core uses linkme: https://github.com/0xPolygonZero/paladin/blob/72c5fdf62e67851e29b5841d83374e6d57939a40/paladin-core/src/lib.rs#L237 +# - we get linker errors using the `zero-ci` runner: +# - https://github.com/0xPolygonZero/zero-bin/blob/b49074a8e293060737521d53e4b81cff25b22167/.github/workflows/ci.yml#L70 +# - https://github.com/0xPolygonZero/zero-bin/actions/runs/9201764830/job/25310482047?pr=78 +# - linkme hits an error using rust-lld on nightly: https://github.com/dtolnay/linkme/pull/88 +# +# so copy linkme's workaround +export RUSTFLAGS='-C target-cpu=native -Zlinker-features=-lld' export RUST_MIN_STACK=33554432 export RUST_BACKTRACE=full export RUST_LOG=info -export RUSTFLAGS='-C target-cpu=native' if [[ $1 == "test_only" ]]; then # Circuit sizes don't matter in test_only mode, so we keep them minimal. From 22a4ad9d76b06b0311f352719d05853432395368 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Thu, 23 May 2024 02:46:09 -0700 Subject: [PATCH 157/184] Fix linkme lld issue in CI (#79) --- zero_bin/.cargo/config.toml | 4 ++++ zero_bin/tools/simple_test.sh | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 zero_bin/.cargo/config.toml diff --git a/zero_bin/.cargo/config.toml b/zero_bin/.cargo/config.toml new file mode 100644 index 000000000..6859b6af7 --- /dev/null +++ b/zero_bin/.cargo/config.toml @@ -0,0 +1,4 @@ +[build] +# https://github.com/rust-lang/rust/pull/124129 +# https://github.com/dtolnay/linkme/pull/88 +rustflags = ["-Zlinker-features=-lld"] diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh index f00e34ced..72ad06ab8 100755 --- a/zero_bin/tools/simple_test.sh +++ b/zero_bin/tools/simple_test.sh @@ -20,7 +20,10 @@ export TOKIO_WORKER_THREADS=$num_procs export RUST_MIN_STACK=33554432 export RUST_BACKTRACE=full export RUST_LOG=info -export RUSTFLAGS='-C target-cpu=native' +# Disable the lld linker for now, as it's causing issues with the linkme package. +# https://github.com/rust-lang/rust/pull/124129 +# https://github.com/dtolnay/linkme/pull/88 +export RUSTFLAGS='-C target-cpu=native -Zlinker-features=-lld' if [[ $1 == "test_only" ]]; then # Circuit sizes don't matter in test_only mode, so we keep them minimal. From ebcd0edd1df544baeb334eca3a18aaf3da88ee19 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 12:08:17 +0200 Subject: [PATCH 158/184] Revert "fix: -Zlinker-features=-lld" This reverts commit da32ab0de1882c067fd49919d2cc3dd677bfb650. --- zero_bin/tools/simple_test.sh | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh index 3cee5e50f..f00e34ced 100755 --- a/zero_bin/tools/simple_test.sh +++ b/zero_bin/tools/simple_test.sh @@ -17,17 +17,10 @@ bunzip2 -f witness.json.bz2 export RAYON_NUM_THREADS=$num_procs export TOKIO_WORKER_THREADS=$num_procs -# - paladin-core uses linkme: https://github.com/0xPolygonZero/paladin/blob/72c5fdf62e67851e29b5841d83374e6d57939a40/paladin-core/src/lib.rs#L237 -# - we get linker errors using the `zero-ci` runner: -# - https://github.com/0xPolygonZero/zero-bin/blob/b49074a8e293060737521d53e4b81cff25b22167/.github/workflows/ci.yml#L70 -# - https://github.com/0xPolygonZero/zero-bin/actions/runs/9201764830/job/25310482047?pr=78 -# - linkme hits an error using rust-lld on nightly: https://github.com/dtolnay/linkme/pull/88 -# -# so copy linkme's workaround -export RUSTFLAGS='-C target-cpu=native -Zlinker-features=-lld' export RUST_MIN_STACK=33554432 export RUST_BACKTRACE=full export RUST_LOG=info +export RUSTFLAGS='-C target-cpu=native' if [[ $1 == "test_only" ]]; then # Circuit sizes don't matter in test_only mode, so we keep them minimal. From 9e91f16655e49ef49f95935a6b1360a426c9273b Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Thu, 23 May 2024 12:16:35 +0200 Subject: [PATCH 159/184] refactor: common::Compat -> rpc::Compat --- zero_bin/Cargo.lock | 3 +-- zero_bin/common/Cargo.toml | 2 -- zero_bin/common/src/lib.rs | 42 ------------------------------------- zero_bin/rpc/Cargo.toml | 1 + zero_bin/rpc/src/lib.rs | 43 +++++++++++++++++++++++++++++++++++++- 5 files changed, 44 insertions(+), 47 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 35f063e66..3e89c745b 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1223,12 +1223,10 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" name = "common" version = "0.1.0" dependencies = [ - "alloy", "anyhow", "clap", "evm_arithmetization", "plonky2", - "primitive-types 0.12.2", "proof_gen", "serde", "serde_json", @@ -3691,6 +3689,7 @@ dependencies = [ "hex", "hex-literal", "itertools 0.13.0", + "primitive-types 0.12.2", "prover", "serde", "serde_json", diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index b30024de8..1ef0c7f8f 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -9,7 +9,6 @@ keywords.workspace = true categories.workspace = true [dependencies] -alloy.workspace = true thiserror = { workspace = true } tracing = { workspace = true } proof_gen = { workspace = true } @@ -19,4 +18,3 @@ clap = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -__compat_primitive-types = { version = "0.12.2", package = "primitive-types" } diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs index 5eba54402..e9e7b504b 100644 --- a/zero_bin/common/src/lib.rs +++ b/zero_bin/common/src/lib.rs @@ -1,45 +1,3 @@ -use std::array; - pub mod debug_utils; pub mod parsing; pub mod prover_state; - -pub trait Compat { - fn compat(self) -> Out; -} - -impl Compat<__compat_primitive_types::H160> for alloy::primitives::Address { - fn compat(self) -> __compat_primitive_types::H160 { - let alloy::primitives::Address(alloy::primitives::FixedBytes(arr)) = self; - __compat_primitive_types::H160(arr) - } -} - -impl Compat<__compat_primitive_types::H256> for alloy::primitives::B256 { - fn compat(self) -> __compat_primitive_types::H256 { - let alloy::primitives::FixedBytes(arr) = self; - __compat_primitive_types::H256(arr) - } -} - -impl Compat<[__compat_primitive_types::U256; 8]> for alloy::primitives::Bloom { - fn compat(self) -> [__compat_primitive_types::U256; 8] { - let alloy::primitives::Bloom(alloy::primitives::FixedBytes(src)) = self; - // have u8 * 256 - // want U256 * 8 - // (no unsafe, no unstable) - let mut chunks = src.chunks_exact(32); - let dst = array::from_fn(|_ix| { - __compat_primitive_types::U256::from( - <[u8; 32]>::try_from(chunks.next().unwrap()).unwrap(), - ) - }); - assert_eq!(chunks.len(), 0); - dst - } -} - -#[test] -fn bloom() { - let _did_not_panic = alloy::primitives::Bloom::ZERO.compat(); -} diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 83daf08b2..330b0643a 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -27,3 +27,4 @@ itertools = "0.13.0" url = "2.5.0" common = { path = "../common" } prover = { path = "../prover" } +__compat_primitive-types = { version = "0.12.2", package = "primitive-types" } diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index d768c0dbc..79e1b3906 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -4,7 +4,6 @@ use alloy::{ transports::Transport, }; use anyhow::Context as _; -use common::Compat as _; use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; use futures::{StreamExt as _, TryStreamExt as _}; use itertools::{Either, Itertools as _}; @@ -149,3 +148,45 @@ where }, }) } + +trait Compat { + fn compat(self) -> Out; +} + +impl Compat<__compat_primitive_types::H160> for alloy::primitives::Address { + fn compat(self) -> __compat_primitive_types::H160 { + let alloy::primitives::Address(alloy::primitives::FixedBytes(arr)) = self; + __compat_primitive_types::H160(arr) + } +} + +impl Compat<__compat_primitive_types::H256> for alloy::primitives::B256 { + fn compat(self) -> __compat_primitive_types::H256 { + let alloy::primitives::FixedBytes(arr) = self; + __compat_primitive_types::H256(arr) + } +} + +impl Compat<[__compat_primitive_types::U256; 8]> for alloy::primitives::Bloom { + fn compat(self) -> [__compat_primitive_types::U256; 8] { + let alloy::primitives::Bloom(alloy::primitives::FixedBytes(src)) = self; + // have u8 * 256 + // want U256 * 8 + // (no unsafe, no unstable) + let mut chunks = src.chunks_exact(32); + let dst = core::array::from_fn(|_ix| { + // This is a bit spicy because we're going from an uninterpeted array of bytes + // to wide integers, but we trust this `From` impl to do the right thing + __compat_primitive_types::U256::from( + <[u8; 32]>::try_from(chunks.next().unwrap()).unwrap(), + ) + }); + assert_eq!(chunks.len(), 0); + dst + } +} + +#[test] +fn bloom() { + let _did_not_panic = alloy::primitives::Bloom::ZERO.compat(); +} From 0e678fac20eb3cfa6c51e7222b82d1411314fb40 Mon Sep 17 00:00:00 2001 From: 0xaatif Date: Sun, 26 May 2024 10:28:46 +0200 Subject: [PATCH 160/184] tweak: trivial review changes --- zero_bin/rpc/src/lib.rs | 14 ++++++++++---- zero_bin/rpc/src/main.rs | 9 ++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 79e1b3906..151e1b736 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -18,11 +18,17 @@ use trace_decoder::{ #[derive(Deserialize, Debug)] #[serde(rename_all = "snake_case")] #[allow(clippy::large_enum_variant)] -enum JerigonTrace { +enum ZeroTrace { Result(TxnInfo), BlockWitness(BlockTraceTriePreImages), } +/// When [fetching a block over RPC](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber), +/// we can choose the transaction format, between: +/// - Full JSON. +/// - Just the hash. +/// +/// We only need the latter. const BLOCK_WITHOUT_FULL_TRANSACTIONS: bool = false; pub async fn prover_input( @@ -37,7 +43,7 @@ where // Grab trace information ///////////////////////// let traces = provider - .raw_request::<_, Vec>( + .raw_request::<_, Vec>( "debug_traceBlockByNumber".into(), (target_block_id, json!({"tracer": "zeroTracer"})), ) @@ -47,8 +53,8 @@ where traces .into_iter() .partition_map::, Vec<_>, _, _, _>(|it| match it { - JerigonTrace::Result(it) => Either::Left(it), - JerigonTrace::BlockWitness(it) => Either::Right(it), + ZeroTrace::Result(it) => Either::Left(it), + ZeroTrace::BlockWitness(it) => Either::Right(it), }); // Grab block info diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs index e4647379a..391499b12 100644 --- a/zero_bin/rpc/src/main.rs +++ b/zero_bin/rpc/src/main.rs @@ -7,16 +7,15 @@ use url::Url; #[derive(Parser)] pub enum Args { - /// Fetch and generate prover input from the RPC endpoint + /// Fetch and generate prover input from the RPC endpoint. Fetch { - /// The RPC URL + /// The RPC URL. #[arg(short = 'u', long, value_hint = ValueHint::Url)] rpc_url: Url, - /// The block number + /// The block number. #[arg(short, long)] block_number: BlockId, - /// The checkpoint block number - // TODO(aatifsyed): impl Display for alloy::..::BlockId + /// The checkpoint block number. #[arg(short, long, default_value = "0")] checkpoint_block_number: BlockId, }, From ef5270c8a67649981da83bcd2f61aa72b2a27341 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Tue, 28 May 2024 13:57:24 -0400 Subject: [PATCH 161/184] fix: fix compilation with `test_only` feature (#84) * fix: fix compilation with test_only feature * ci: add job to test script with test_only feature --- zero_bin/.github/workflows/ci.yml | 17 +++++++++++++++-- zero_bin/prover/src/lib.rs | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml index 77fc47d05..9f463625a 100644 --- a/zero_bin/.github/workflows/ci.yml +++ b/zero_bin/.github/workflows/ci.yml @@ -65,8 +65,8 @@ jobs: - name: Run cargo clippy run: cargo clippy --all-targets -- -D warnings - simple_proof: - name: Execute bash script to generate and verify a proof from a small block + simple_proof_regular: + name: Execute bash script to generate and verify a proof for a small block. runs-on: zero-ci steps: @@ -77,3 +77,16 @@ jobs: run: | pushd tools ./simple_test.sh + + simple_proof_witness_only: + name: Execute bash script to generate the proof witness for a small block. + runs-on: zero-ci + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Run the script + run: | + pushd tools + ./simple_test.sh test_only diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index b00b47428..5e4846411 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -112,7 +112,9 @@ impl ProverInput { // Dummy proof to match expected output type. Ok(GeneratedBlockProof { - b_height: block_number.as_u64(), + b_height: block_number + .to_u64() + .expect("Block number should fit in a u64"), intern: proof_gen::proof_gen::dummy_proof()?, }) } From f6853086d8373b7075c79c809cf1baf29a81c044 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Tue, 28 May 2024 14:10:32 -0400 Subject: [PATCH 162/184] chore: remove duplicate print in script and lighten circuit loading (#85) --- zero_bin/tools/simple_test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh index 72ad06ab8..19223f5ba 100755 --- a/zero_bin/tools/simple_test.sh +++ b/zero_bin/tools/simple_test.sh @@ -50,7 +50,7 @@ fi # proof. This is useful for quickly testing decoding and all of the # other non-proving code. if [[ $1 == "test_only" ]]; then - cargo run --release --features test_only --bin leader -- --runtime in-memory stdio < witness.json | tee test.out + cargo run --release --features test_only --bin leader -- --runtime in-memory --load-strategy on-demand stdio < witness.json | tee test.out if grep 'Successfully generated witness for block' test.out; then echo "Success - Note this was just a test, not a proof" exit @@ -70,7 +70,7 @@ tail -n 1 leader.out > proof.json ../target/release/verifier -f proof.json | tee verify.out -if grep 'Proof verified successfully!' verify.out; then +if grep -q 'Proof verified successfully!' verify.out; then duration_ns=$((end_time - start_time)) duration_sec=$(echo "$duration_ns / 1000000000" | bc -l) echo "Success!" From cd604d364d3b61a747d737ad09f8e5851c7583aa Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Fri, 7 Jun 2024 20:20:53 -0400 Subject: [PATCH 163/184] Remove `Monolithic` load stragegy `restriction` for `InMemory` leader mode (#100) --- zero_bin/leader/src/main.rs | 4 ---- zero_bin/tools/simple_test.sh | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 5fc4d7675..046948b60 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -4,7 +4,6 @@ use std::{fs::File, path::PathBuf}; use anyhow::Result; use clap::Parser; use cli::Command; -use common::prover_state::TableLoadStrategy; use dotenvy::dotenv; use ops::register; use paladin::runtime::Runtime; @@ -55,9 +54,6 @@ async fn main() -> Result<()> { // state here. args.prover_state_config .into_prover_state_manager() - // Use the monolithic load strategy for the prover state when running in - // emulation mode. - .with_load_strategy(TableLoadStrategy::Monolithic) .initialize()?; } diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh index 19223f5ba..292c2ba96 100755 --- a/zero_bin/tools/simple_test.sh +++ b/zero_bin/tools/simple_test.sh @@ -63,7 +63,7 @@ fi cargo build --release --jobs "$num_procs" start_time=$(date +%s%N) -../target/release/leader --runtime in-memory stdio < witness.json | tee leader.out +../target/release/leader --runtime in-memory --load-strategy monolithic stdio < witness.json | tee leader.out end_time=$(date +%s%N) tail -n 1 leader.out > proof.json From 3c75186b29508f377b73f91d3efb8cd065294808 Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Mon, 10 Jun 2024 17:28:48 +0200 Subject: [PATCH 164/184] feat: block interval and parallel block proving (#90) * feat: add block interval * fix: follow from loop * feat: add block hash parsing for interval * fix: proving logic * fix: typos * fix: review * fix: doc tests * feat: add block time cli argument * fix: interval display * feat: add from string for block interval * fix: remove block interval single variant * feat: implement concurrent block proving #88 #89 (#96) * feat: implement concurrent block proving #88 #89 * Update prover/src/lib.rs Co-authored-by: 0xaatif <169152398+0xaatif@users.noreply.github.com> * fix suggestion * Fix duplicated import when #[cfg(feature = "test_only")] --------- Co-authored-by: 0xaatif <169152398+0xaatif@users.noreply.github.com> Co-authored-by: Marko Atanasievski * fix: block interval fmt * fix: make parsing functions private * fix: use futures iterator instead of tokio-stream * fix: use anyhow error instead of block interval error --------- Co-authored-by: Zach Brown Co-authored-by: 0xaatif <169152398+0xaatif@users.noreply.github.com> --- zero_bin/.gitignore | 4 + zero_bin/Cargo.lock | 6 + zero_bin/README.md | 6 +- zero_bin/common/Cargo.toml | 4 + zero_bin/common/src/block_interval.rs | 272 ++++++++++++++++++++ zero_bin/common/src/lib.rs | 1 + zero_bin/common/src/parsing.rs | 70 +++-- zero_bin/common/src/prover_state/circuit.rs | 4 +- zero_bin/leader/Cargo.toml | 1 + zero_bin/leader/src/cli.rs | 14 +- zero_bin/leader/src/http.rs | 16 +- zero_bin/leader/src/jerigon.rs | 34 ++- zero_bin/leader/src/main.rs | 28 +- zero_bin/leader/src/stdio.rs | 18 +- zero_bin/prover/Cargo.toml | 1 + zero_bin/prover/src/lib.rs | 72 +++++- zero_bin/rpc/src/lib.rs | 77 ++++-- zero_bin/rpc/src/main.rs | 3 +- zero_bin/tools/debug_block.sh | 39 --- zero_bin/tools/prove_blocks.sh | 111 ++++++-- zero_bin/verifier/src/main.rs | 6 +- 21 files changed, 629 insertions(+), 158 deletions(-) create mode 100644 zero_bin/common/src/block_interval.rs delete mode 100755 zero_bin/tools/debug_block.sh diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index 42acc2486..b50b613e3 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -13,3 +13,7 @@ proofs/ # Serialized generated prover & verifier state used by plonky2 prover_state_* verifier_state_* + + +# Ignore IntelliJ IDEA/RustRover/Clion metadata +.idea/ diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 3e89c745b..f8aef11f4 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1223,14 +1223,18 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" name = "common" version = "0.1.0" dependencies = [ + "alloy", "anyhow", + "async-stream", "clap", "evm_arithmetization", + "futures", "plonky2", "proof_gen", "serde", "serde_json", "thiserror", + "tokio", "tracing", ] @@ -2598,6 +2602,7 @@ dependencies = [ "clap", "common", "dotenvy", + "futures", "ops", "paladin-core", "proof_gen", @@ -3434,6 +3439,7 @@ dependencies = [ "proof_gen", "ruint", "serde", + "tokio", "trace_decoder", "tracing", ] diff --git a/zero_bin/README.md b/zero_bin/README.md index d826ab96e..7ba9ad2f0 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -385,16 +385,16 @@ A few other notes: ### Generating Witnesses Only -If you want to test a block without the high CPU & memory requirements that come with creating a full proof, you can instead generate only the witness using `tools/debug_block.sh`: +If you want to test a block without the high CPU & memory requirements that come with creating a full proof, you can instead generate only the witness using `tools/prove_blocks.sh` in the `test_only` mode: ```sh -./debug_block.sh +./prove_blocks.sh test_only ``` Filled in: ```sh -./debug_block.sh 18299898 http://34.89.57.138:8545 +./prove_blocks.sh 18299898 18299899 http://34.89.57.138:8545 true test_only ``` Finally, note that both of these testing scripts force proof generation to be sequential by allowing only one worker. Because of this, this is not a realistic representation of performance but makes the debugging logs much easier to follow. diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 1ef0c7f8f..679897447 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -18,3 +18,7 @@ clap = { workspace = true } anyhow = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +futures = { workspace = true } +tokio = { workspace = true } +alloy = { workspace = true } +async-stream = "0.3.5" diff --git a/zero_bin/common/src/block_interval.rs b/zero_bin/common/src/block_interval.rs new file mode 100644 index 000000000..5d0e3c1e5 --- /dev/null +++ b/zero_bin/common/src/block_interval.rs @@ -0,0 +1,272 @@ +use alloy::primitives::B256; +use alloy::rpc::types::eth::BlockId; +use alloy::{hex, providers::Provider, transports::Transport}; +use anyhow::{anyhow, Result}; +use async_stream::try_stream; +use futures::Stream; +use tracing::info; + +use crate::parsing; + +const DEFAULT_BLOCK_TIME: u64 = 1000; + +/// Range of blocks to be processed and proven. +#[derive(Debug, PartialEq, Clone)] +pub enum BlockInterval { + // A single block id (could be number or hash) + SingleBlockId(BlockId), + // A range of blocks. + Range(std::ops::Range), + // Dynamic interval from the start block to the latest network block + FollowFrom { + // Interval starting block number + start_block: u64, + // Block time specified in milliseconds. + // If not set, use the default block time to poll node. + block_time: Option, + }, +} + +impl BlockInterval { + /// Create a new block interval + /// + /// A valid block range is of the form: + /// * `block_number` for a single block number + /// * `lhs..rhs`, `lhs..=rhs` as an exclusive/inclusive range + /// * `lhs..` for a range starting from `lhs` to the chain tip. `lhs..=` + /// is also valid format. + /// + /// # Example + /// + /// ```rust + /// # use alloy::rpc::types::eth::BlockId; + /// # use common::block_interval::BlockInterval; + /// assert_eq!(BlockInterval::new("0..10").unwrap(), BlockInterval::Range(0..10)); + /// assert_eq!(BlockInterval::new("0..=10").unwrap(), BlockInterval::Range(0..11)); + /// assert_eq!(BlockInterval::new("32141").unwrap(), BlockInterval::SingleBlockId(BlockId::Number(32141.into()))); + /// assert_eq!(BlockInterval::new("100..").unwrap(), BlockInterval::FollowFrom{start_block: 100, block_time: None}); + /// ``` + pub fn new(s: &str) -> anyhow::Result { + if (s.starts_with("0x") && s.len() == 66) || s.len() == 64 { + // Try to parse hash + let hash = s + .parse::() + .map_err(|_| anyhow!("invalid block hash '{s}'"))?; + return Ok(BlockInterval::SingleBlockId(BlockId::Hash(hash.into()))); + } + + // First we parse for inclusive range and then for exclusive range, + // because both separators start with `..` + if let Ok(range) = parsing::parse_range_inclusive(s) { + Ok(BlockInterval::Range(range)) + } else if let Ok(range) = parsing::parse_range_exclusive(s) { + Ok(BlockInterval::Range(range)) + } + // Now we look for the follow from range + else if s.contains("..") { + let mut split = s.trim().split("..").filter(|s| *s != "=" && !s.is_empty()); + + // Any other character after `..` or `..=` is invalid + if split.clone().count() > 1 { + return Err(anyhow!("invalid block interval range '{s}'")); + } + let num = split + .next() + .map(|num| { + num.parse::() + .map_err(|_| anyhow!("invalid block number '{num}'")) + }) + .ok_or(anyhow!("invalid block interval range '{s}'"))??; + return Ok(BlockInterval::FollowFrom { + start_block: num, + block_time: None, + }); + } + // Only single block number is left to try to parse + else { + let num: u64 = s + .trim() + .parse() + .map_err(|_| anyhow!("invalid block interval range '{s}'"))?; + return Ok(BlockInterval::SingleBlockId(BlockId::Number(num.into()))); + } + } + + /// Convert the block interval into an async stream of block numbers. + pub fn into_bounded_stream(self) -> anyhow::Result> { + match self { + BlockInterval::SingleBlockId(BlockId::Number(num)) => { + let num = num + .as_number() + .ok_or(anyhow!("invalid block number '{num}'"))?; + Ok(futures::stream::iter(num..num + 1)) + } + BlockInterval::Range(range) => Ok(futures::stream::iter(range)), + _ => Err(anyhow!( + "could not create bounded stream from unbounded follow-from interval", + )), + } + } + + /// Convert the block interval into an unbounded async stream of block + /// numbers. Query the blockchain node for the latest block number. + pub async fn into_unbounded_stream( + self, + provider: ProviderT, + ) -> Result>, anyhow::Error> + where + ProviderT: Provider, + TransportT: Transport + Clone, + { + match self { + BlockInterval::FollowFrom { + start_block, + block_time, + } => Ok(try_stream! { + let mut current = start_block; + loop { + let last_block_number = provider.get_block_number().await.map_err(|e: alloy::transports::RpcError<_>| { + anyhow!("could not retrieve latest block number from the provider: {e}") + })?; + + if current < last_block_number { + current += 1; + yield current; + } else { + info!("Waiting for the new blocks to be mined, requested block number: {current}, \ + latest block number: {last_block_number}"); + let block_time = block_time.unwrap_or(DEFAULT_BLOCK_TIME); + // No need to poll the node too frequently, waiting + // a block time interval for a block to be mined should be enough + tokio::time::sleep(tokio::time::Duration::from_millis(block_time)).await; + } + } + }), + _ => Err(anyhow!( + "could not create unbounded follow-from stream from fixed bounded interval", + )), + } + } +} + +impl std::fmt::Display for BlockInterval { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + BlockInterval::SingleBlockId(block_id) => match block_id { + BlockId::Number(it) => f.write_fmt(format_args!("{}", it)), + BlockId::Hash(it) => f.write_fmt(format_args!("0x{}", &hex::encode(it.block_hash))), + }, + BlockInterval::Range(range) => { + write!(f, "{}..{}", range.start, range.end) + } + BlockInterval::FollowFrom { start_block, .. } => { + write!(f, "{start_block}..") + } + } + } +} + +impl std::str::FromStr for BlockInterval { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + BlockInterval::new(s) + } +} + +#[cfg(test)] +mod test { + use alloy::primitives::B256; + + use super::*; + + #[test] + fn can_create_block_interval_from_exclusive_range() { + assert_eq!( + BlockInterval::new("0..10").unwrap(), + BlockInterval::Range(0..10) + ); + } + + #[test] + fn can_create_block_interval_from_inclusive_range() { + assert_eq!( + BlockInterval::new("0..=10").unwrap(), + BlockInterval::Range(0..11) + ); + } + + #[test] + fn can_create_follow_from_block_interval() { + assert_eq!( + BlockInterval::new("100..").unwrap(), + BlockInterval::FollowFrom { + start_block: 100, + block_time: None + } + ); + } + + #[test] + fn can_create_single_block_interval() { + assert_eq!( + BlockInterval::new("123415131").unwrap(), + BlockInterval::SingleBlockId(BlockId::Number(123415131.into())) + ); + } + + #[test] + fn new_interval_proper_single_block_error() { + assert_eq!( + BlockInterval::new("113A").err().unwrap().to_string(), + "invalid block interval range '113A'" + ); + } + + #[test] + fn new_interval_proper_range_error() { + assert_eq!( + BlockInterval::new("111...156").err().unwrap().to_string(), + "invalid block interval range '111...156'" + ); + } + + #[test] + fn new_interval_parse_block_hash() { + assert_eq!( + BlockInterval::new( + "0xb51ceca7ba912779ed6721d2b93849758af0d2354683170fb71dead6e439e6cb" + ) + .unwrap(), + BlockInterval::SingleBlockId(BlockId::Hash( + "0xb51ceca7ba912779ed6721d2b93849758af0d2354683170fb71dead6e439e6cb" + .parse::() + .unwrap() + .into() + )) + ) + } + + #[tokio::test] + async fn can_into_bounded_stream() { + use futures::StreamExt; + let mut result = Vec::new(); + let mut stream = BlockInterval::new("1..10") + .unwrap() + .into_bounded_stream() + .unwrap(); + while let Some(val) = stream.next().await { + result.push(val); + } + assert_eq!(result, Vec::from_iter(1u64..10u64)); + } + + #[test] + fn can_create_from_string() { + use std::str::FromStr; + assert_eq!( + &format!("{}", BlockInterval::from_str("0..10").unwrap()), + "0..10" + ); + } +} diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs index e9e7b504b..635eba33d 100644 --- a/zero_bin/common/src/lib.rs +++ b/zero_bin/common/src/lib.rs @@ -1,3 +1,4 @@ +pub mod block_interval; pub mod debug_utils; pub mod parsing; pub mod prover_state; diff --git a/zero_bin/common/src/parsing.rs b/zero_bin/common/src/parsing.rs index 911d35e39..d1452a464 100644 --- a/zero_bin/common/src/parsing.rs +++ b/zero_bin/common/src/parsing.rs @@ -1,5 +1,5 @@ //! Parsing utilities. -use std::{fmt::Display, ops::Range, str::FromStr}; +use std::{fmt::Display, ops::Add, ops::Range, str::FromStr}; use thiserror::Error; @@ -21,22 +21,43 @@ where RhsMissing, } -/// Parse a range from a string. +/// Parse an exclusive range from a string. /// /// A valid range is of the form `lhs..rhs`, where `lhs` and `rhs` are numbers. +pub(crate) fn parse_range_exclusive( + s: &str, +) -> Result, RangeParseError> +where + NumberT: Display + FromStr + From + Add, + NumberT::Err: Display, +{ + parse_range_gen(s, "..", false) +} + +/// Parse an inclusive range from a string. /// -/// # Example -/// -/// ```rust -/// # use common::parsing::parse_range; -/// assert_eq!(parse_range::("0..10"), Ok(0..10)); -/// ``` -pub fn parse_range(s: &str) -> Result, RangeParseError> +/// A valid range is of the form `lhs..=rhs`, where `lhs` and `rhs` are numbers. +pub(crate) fn parse_range_inclusive( + s: &str, +) -> Result, RangeParseError> where - T: Display + FromStr, - T::Err: Display, + NumberT: Display + FromStr + From + Add, + NumberT::Err: Display, { - let mut pairs = s.split(".."); + parse_range_gen(s, "..=", true) +} + +pub(crate) fn parse_range_gen( + s: &str, + separator: SeparatorT, + inclusive: bool, +) -> Result, RangeParseError> +where + NumberT: Display + FromStr + From + Add, + NumberT::Err: Display, + SeparatorT: AsRef, +{ + let mut pairs = s.split(separator.as_ref()); match (pairs.next(), pairs.next()) { // Empty input, "" (Some(""), None) => Err(RangeParseError::EmptyInput), @@ -47,7 +68,11 @@ where (Some(lhs), Some(rhs)) => { let lhs = lhs.parse().map_err(RangeParseError::LhsParseError)?; let rhs = rhs.parse().map_err(RangeParseError::RhsParseError)?; - Ok(lhs..rhs) + if inclusive { + Ok(lhs..(rhs + NumberT::from(1u8))) + } else { + Ok(lhs..rhs) + } } // (None, _) is not possible, because split always returns at least one element. _ => unreachable!(), @@ -59,14 +84,19 @@ mod test { use super::*; #[test] - fn it_parses_ranges() { - assert_eq!(parse_range::("0..10"), Ok(0..10)); + fn it_parses_exclusive_ranges() { + assert_eq!(parse_range_exclusive::("0..10"), Ok(0..10)); + } + + #[test] + fn it_parses_inclusive_ranges() { + assert_eq!(parse_range_inclusive::("0..=10"), Ok(0..11)); } #[test] fn it_handles_missing_lhs() { assert_eq!( - parse_range::("..10").unwrap_err(), + parse_range_exclusive::("..10").unwrap_err(), RangeParseError::LhsMissing ); } @@ -74,7 +104,7 @@ mod test { #[test] fn it_handles_missing_rhs() { assert_eq!( - parse_range::("10..").unwrap_err(), + parse_range_exclusive::("10..").unwrap_err(), RangeParseError::RhsMissing ); } @@ -82,7 +112,7 @@ mod test { #[test] fn it_handles_empty_input() { assert_eq!( - parse_range::("").unwrap_err(), + parse_range_exclusive::("").unwrap_err(), RangeParseError::EmptyInput ); } @@ -90,7 +120,7 @@ mod test { #[test] fn it_handles_rhs_parse_error() { assert_eq!( - parse_range::("10..f").unwrap_err(), + parse_range_exclusive::("10..f").unwrap_err(), RangeParseError::RhsParseError("f".parse::().unwrap_err()) ); } @@ -98,7 +128,7 @@ mod test { #[test] fn it_handles_lhs_parse_error() { assert_eq!( - parse_range::("hello..10").unwrap_err(), + parse_range_exclusive::("hello..10").unwrap_err(), RangeParseError::LhsParseError("hello".parse::().unwrap_err()) ); } diff --git a/zero_bin/common/src/prover_state/circuit.rs b/zero_bin/common/src/prover_state/circuit.rs index 6ab1a03a4..5eaf2da7a 100644 --- a/zero_bin/common/src/prover_state/circuit.rs +++ b/zero_bin/common/src/prover_state/circuit.rs @@ -8,7 +8,7 @@ use std::{ use evm_arithmetization::{AllStark, StarkConfig}; use proof_gen::types::AllRecursiveCircuits; -use crate::parsing::{parse_range, RangeParseError}; +use crate::parsing::{parse_range_exclusive, RangeParseError}; /// Number of tables defined in plonky2. /// @@ -51,7 +51,7 @@ impl FromStr for CircuitSize { type Err = RangeParseError; fn from_str(s: &str) -> Result { - Ok(CircuitSize(parse_range(s)?)) + Ok(CircuitSize(parse_range_exclusive(s)?)) } } diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 7efadacfb..b1ca703a0 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -20,6 +20,7 @@ tokio = { workspace = true } proof_gen = { workspace = true } serde_json = { workspace = true } serde_path_to_error = { workspace = true } +futures = { workspace = true } alloy.workspace = true axum = "0.7.4" toml = "0.8.12" diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 10316f6ac..06a71b61a 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -34,22 +34,26 @@ pub(crate) enum Command { // The Jerigon RPC URL. #[arg(long, short = 'u', value_hint = ValueHint::Url)] rpc_url: String, - /// The block number for which to generate a proof. - #[arg(short, long)] - block_number: u64, + /// The block interval for which to generate a proof. + #[arg(long, short = 'i')] + block_interval: String, /// The checkpoint block number. #[arg(short, long, default_value_t = 0)] checkpoint_block_number: u64, /// The previous proof output. #[arg(long, short = 'f', value_hint = ValueHint::FilePath)] previous_proof: Option, - /// If provided, write the generated proof to this file instead of + /// If provided, write the generated proofs to this directory instead of /// stdout. #[arg(long, short = 'o', value_hint = ValueHint::FilePath)] - proof_output_path: Option, + proof_output_dir: Option, /// If true, save the public inputs to disk on error. #[arg(short, long, default_value_t = false)] save_inputs_on_error: bool, + /// Network block time in milliseconds. This value is used + /// to determine the blockchain node polling interval. + #[arg(short, long, env = "ZERO_BIN_BLOCK_TIME", default_value_t = 2000)] + block_time: u64, }, /// Reads input from HTTP and writes output to a directory. Http { diff --git a/zero_bin/leader/src/http.rs b/zero_bin/leader/src/http.rs index d718b3e69..63f9543f5 100644 --- a/zero_bin/leader/src/http.rs +++ b/zero_bin/leader/src/http.rs @@ -4,8 +4,8 @@ use alloy::primitives::U256; use anyhow::{bail, Result}; use axum::{http::StatusCode, routing::post, Json, Router}; use paladin::runtime::Runtime; -use proof_gen::{proof_types::GeneratedBlockProof, types::PlonkyProofIntern}; -use prover::ProverInput; +use proof_gen::proof_types::GeneratedBlockProof; +use prover::BlockProverInput; use serde::{Deserialize, Serialize}; use serde_json::to_writer; use tracing::{debug, error, info}; @@ -46,7 +46,7 @@ fn write_to_file( match file { Ok(file) => { - to_writer(file, &generated_block_proof.intern)?; + to_writer(file, &generated_block_proof)?; Ok(fully_qualified_file_name) } Err(e) => { @@ -57,8 +57,8 @@ fn write_to_file( #[derive(Serialize, Deserialize, Debug)] struct HttpProverInput { - prover_input: ProverInput, - previous: Option, + prover_input: BlockProverInput, + previous: Option, } async fn prove( @@ -73,7 +73,11 @@ async fn prove( match payload .prover_input - .prove(&runtime, payload.previous, save_inputs_on_error) + .prove( + &runtime, + payload.previous.map(futures::future::ok), + save_inputs_on_error, + ) .await { Ok(b_proof) => match write_to_file(output_dir, block_number, &b_proof) { diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index 5074a5aef..f3cf1e747 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -6,37 +6,47 @@ use std::{ use alloy::providers::RootProvider; use anyhow::Result; +use common::block_interval::BlockInterval; use paladin::runtime::Runtime; -use proof_gen::types::PlonkyProofIntern; +use proof_gen::proof_types::GeneratedBlockProof; /// The main function for the jerigon mode. pub(crate) async fn jerigon_main( runtime: Runtime, rpc_url: &str, - block_number: u64, + block_interval: BlockInterval, checkpoint_block_number: u64, - previous: Option, - proof_output_path_opt: Option, + previous_proof: Option, + proof_output_dir_opt: Option, save_inputs_on_error: bool, ) -> Result<()> { let prover_input = rpc::prover_input( RootProvider::new_http(rpc_url.parse()?), - block_number.into(), + block_interval, checkpoint_block_number.into(), ) .await?; - let proof = prover_input - .prove(&runtime, previous, save_inputs_on_error) - .await; + let block_proofs = prover_input + .prove(&runtime, previous_proof, save_inputs_on_error) + .await?; runtime.close().await?; - let proof = serde_json::to_vec(&proof?.intern)?; - write_proof(proof, proof_output_path_opt) + for block_proof in block_proofs { + let block_proof_str = serde_json::to_vec(&block_proof)?; + write_proof( + block_proof_str, + proof_output_dir_opt.clone().map(|mut path| { + path.push(format!("b{}.zkproof", block_proof.b_height)); + path + }), + )?; + } + Ok(()) } -fn write_proof(proof: Vec, proof_output_path_opt: Option) -> Result<()> { - match proof_output_path_opt { +fn write_proof(proof: Vec, proof_output_dir_opt: Option) -> Result<()> { + match proof_output_dir_opt { Some(p) => { if let Some(parent) = p.parent() { create_dir_all(parent)?; diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 046948b60..f03822c6e 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -4,10 +4,12 @@ use std::{fs::File, path::PathBuf}; use anyhow::Result; use clap::Parser; use cli::Command; +use common::block_interval::BlockInterval; use dotenvy::dotenv; use ops::register; use paladin::runtime::Runtime; -use proof_gen::types::PlonkyProofIntern; +use proof_gen::proof_types::GeneratedBlockProof; +use tracing::info; use crate::utils::get_package_version; @@ -18,7 +20,7 @@ mod jerigon; mod stdio; mod utils; -fn get_previous_proof(path: Option) -> Result> { +fn get_previous_proof(path: Option) -> Result> { if path.is_none() { return Ok(None); } @@ -26,7 +28,7 @@ fn get_previous_proof(path: Option) -> Result let path = path.unwrap(); let file = File::open(path)?; let des = &mut serde_json::Deserializer::from_reader(&file); - let proof: PlonkyProofIntern = serde_path_to_error::deserialize(des)?; + let proof: GeneratedBlockProof = serde_path_to_error::deserialize(des)?; Ok(Some(proof)) } @@ -85,21 +87,33 @@ async fn main() -> Result<()> { } Command::Jerigon { rpc_url, - block_number, + block_interval, checkpoint_block_number, previous_proof, - proof_output_path, + proof_output_dir, save_inputs_on_error, + block_time, } => { let previous_proof = get_previous_proof(previous_proof)?; + let mut block_interval = BlockInterval::new(&block_interval)?; + + if let BlockInterval::FollowFrom { + start_block: _, + block_time: ref mut block_time_opt, + } = block_interval + { + *block_time_opt = Some(block_time); + } + + info!("Proving interval {block_interval}"); jerigon::jerigon_main( runtime, &rpc_url, - block_number, + block_interval, checkpoint_block_number, previous_proof, - proof_output_path, + proof_output_dir, save_inputs_on_error, ) .await?; diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index 7f1e6e3fe..b49223dc1 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -2,25 +2,31 @@ use std::io::{Read, Write}; use anyhow::Result; use paladin::runtime::Runtime; -use proof_gen::types::PlonkyProofIntern; -use prover::ProverInput; +use proof_gen::proof_types::GeneratedBlockProof; +use prover::BlockProverInput; /// The main function for the stdio mode. pub(crate) async fn stdio_main( runtime: Runtime, - previous: Option, + previous: Option, save_inputs_on_error: bool, ) -> Result<()> { let mut buffer = String::new(); std::io::stdin().read_to_string(&mut buffer)?; let des = &mut serde_json::Deserializer::from_str(&buffer); - let input: ProverInput = serde_path_to_error::deserialize(des)?; - let proof = input.prove(&runtime, previous, save_inputs_on_error).await; + let input: BlockProverInput = serde_path_to_error::deserialize(des)?; + let proof = input + .prove( + &runtime, + previous.map(futures::future::ok), + save_inputs_on_error, + ) + .await; runtime.close().await?; let proof = proof?; - std::io::stdout().write_all(&serde_json::to_vec(&proof.intern)?)?; + std::io::stdout().write_all(&serde_json::to_vec(&proof)?)?; Ok(()) } diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 553341876..05dc591d6 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -17,6 +17,7 @@ paladin-core = { workspace = true } anyhow = { workspace = true } futures = { workspace = true } alloy.workspace = true +tokio = {workspace = true} ruint = { version = "1.12.1", features = ["num-traits", "primitive-types"] } ops = { path = "../ops" } common = { path = "../common" } diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 5e4846411..9f0d528d5 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -1,15 +1,17 @@ +use std::future::Future; + use alloy::primitives::U256; use anyhow::Result; -#[cfg(feature = "test_only")] -use futures::stream::TryStreamExt; +use futures::{future::BoxFuture, stream::FuturesOrdered, FutureExt, TryFutureExt, TryStreamExt}; use num_traits::ToPrimitive as _; use ops::TxProof; use paladin::{ directive::{Directive, IndexedStream}, runtime::Runtime, }; -use proof_gen::{proof_types::GeneratedBlockProof, types::PlonkyProofIntern}; +use proof_gen::proof_types::GeneratedBlockProof; use serde::{Deserialize, Serialize}; +use tokio::sync::oneshot; use trace_decoder::{ processed_block_trace::ProcessingMeta, trace_protocol::BlockTrace, @@ -18,7 +20,7 @@ use trace_decoder::{ use tracing::info; #[derive(Debug, Deserialize, Serialize)] -pub struct ProverInput { +pub struct BlockProverInput { pub block_trace: BlockTrace, pub other_data: OtherBlockData, } @@ -26,7 +28,7 @@ fn resolve_code_hash_fn(_: &CodeHash) -> Vec { todo!() } -impl ProverInput { +impl BlockProverInput { pub fn get_block_number(&self) -> U256 { self.other_data.b_data.b_meta.block_number.into() } @@ -35,7 +37,7 @@ impl ProverInput { pub async fn prove( self, runtime: &Runtime, - previous: Option, + previous: Option>>, save_inputs_on_error: bool, ) -> Result { use anyhow::Context as _; @@ -63,10 +65,10 @@ impl ProverInput { let block_number = block_number .to_u64() .context("block number overflows u64")?; - let prev = previous.map(|p| GeneratedBlockProof { - b_height: block_number - 1, - intern: p, - }); + let prev = match previous { + Some(it) => Some(it.await?), + None => None, + }; let block_proof = paladin::directive::Literal(proof) .map(&ops::BlockProof { @@ -87,7 +89,7 @@ impl ProverInput { pub async fn prove( self, runtime: &Runtime, - _previous: Option, + _previous: Option>>, save_inputs_on_error: bool, ) -> Result { let block_number = self.get_block_number(); @@ -119,3 +121,51 @@ impl ProverInput { }) } } + +#[derive(Debug, Deserialize, Serialize)] +pub struct ProverInput { + pub blocks: Vec, +} + +impl ProverInput { + pub async fn prove( + self, + runtime: &Runtime, + previous_proof: Option, + save_inputs_on_error: bool, + ) -> Result> { + let mut prev: Option>> = + previous_proof.map(|proof| Box::pin(futures::future::ok(proof)) as BoxFuture<_>); + + let results: FuturesOrdered<_> = self + .blocks + .into_iter() + .map(|block| { + let block_number = block.get_block_number(); + info!("Proving block {block_number}"); + + let (tx, rx) = oneshot::channel::(); + + // Prove the block + let fut = block + .prove(runtime, prev.take(), save_inputs_on_error) + .then(|proof| async { + let proof = proof?; + + if tx.send(proof.clone()).is_err() { + anyhow::bail!("Failed to send proof"); + } + + Ok(proof) + }) + .boxed(); + + prev = Some(Box::pin(rx.map_err(anyhow::Error::new))); + + fut + }) + .collect(); + + results.try_collect().await + } +} diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 151e1b736..0d7fcb78b 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -1,13 +1,16 @@ +use alloy::primitives::B256; +use alloy::rpc::types::eth::BlockNumberOrTag; use alloy::{ providers::Provider, - rpc::types::eth::{BlockId, Withdrawal}, + rpc::types::eth::{Block, BlockId, Withdrawal}, transports::Transport, }; use anyhow::Context as _; +use common::block_interval::BlockInterval; use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; use futures::{StreamExt as _, TryStreamExt as _}; use itertools::{Either, Itertools as _}; -use prover::ProverInput; +use prover::{BlockProverInput, ProverInput}; use serde::Deserialize; use serde_json::json; use trace_decoder::{ @@ -29,13 +32,29 @@ enum ZeroTrace { /// - Just the hash. /// /// We only need the latter. -const BLOCK_WITHOUT_FULL_TRANSACTIONS: bool = false; +const BLOCK_WITH_FULL_TRANSACTIONS: bool = false; -pub async fn prover_input( +/// Retrieve block information from the provider +pub async fn get_block( + provider: &mut ProviderT, + target_block_id: BlockId, + full_transaction_data: bool, +) -> anyhow::Result +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + provider + .get_block(target_block_id, full_transaction_data) + .await? + .context("block does not exist") +} + +pub async fn block_prover_input( provider: ProviderT, target_block_id: BlockId, - checkpoint_block_id: BlockId, -) -> anyhow::Result + checkpoint_state_trie_root: B256, +) -> anyhow::Result where ProviderT: Provider, TransportT: Transport + Clone, @@ -60,7 +79,7 @@ where // Grab block info ////////////////// let target_block = provider - .get_block(target_block_id, BLOCK_WITHOUT_FULL_TRANSACTIONS) + .get_block(target_block_id, BLOCK_WITH_FULL_TRANSACTIONS) .await? .context("target block does not exist")?; let target_block_number = target_block @@ -68,12 +87,6 @@ where .number .context("target block is missing field `number`")?; let chain_id = provider.get_chain_id().await?; - let checkpoint_state_trie_root = provider - .get_block(checkpoint_block_id, BLOCK_WITHOUT_FULL_TRANSACTIONS) - .await? - .context("checkpoint block does not exist")? - .header - .state_root; let mut prev_hashes = [alloy::primitives::B256::ZERO; 256]; let concurrency = prev_hashes.len(); @@ -88,7 +101,7 @@ where let provider = &provider; async move { let block = provider - .get_block(n.into(), BLOCK_WITHOUT_FULL_TRANSACTIONS) + .get_block(n.into(), BLOCK_WITH_FULL_TRANSACTIONS) .await .context("couldn't get block")? .context("no such block")?; @@ -104,7 +117,7 @@ where // Assemble /////////// - Ok(ProverInput { + Ok(BlockProverInput { block_trace: BlockTrace { trie_pre_images: pre_images.pop().context("trace had no BlockWitness")?, txn_info, @@ -155,6 +168,40 @@ where }) } +/// Obtain the prover input for a given block interval +pub async fn prover_input( + mut provider: ProviderT, + block_interval: BlockInterval, + checkpoint_block_id: BlockId, +) -> anyhow::Result +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + // Grab interval checkpoint block state trie + let checkpoint_state_trie_root = get_block( + &mut provider, + checkpoint_block_id, + BLOCK_WITH_FULL_TRANSACTIONS, + ) + .await? + .header + .state_root; + + let mut block_proofs = Vec::new(); + let mut block_interval = block_interval.into_bounded_stream()?; + + while let Some(block_num) = block_interval.next().await { + let block_id = BlockId::Number(BlockNumberOrTag::Number(block_num)); + let block_prover_input = + block_prover_input(&provider, block_id, checkpoint_state_trie_root).await?; + block_proofs.push(block_prover_input); + } + Ok(ProverInput { + blocks: block_proofs, + }) +} + trait Compat { fn compat(self) -> Out; } diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs index 391499b12..a38ee7a73 100644 --- a/zero_bin/rpc/src/main.rs +++ b/zero_bin/rpc/src/main.rs @@ -2,6 +2,7 @@ use std::io; use alloy::{providers::RootProvider, rpc::types::eth::BlockId}; use clap::{Parser, ValueHint}; +use common::block_interval::BlockInterval; use tracing_subscriber::{prelude::*, EnvFilter}; use url::Url; @@ -39,7 +40,7 @@ async fn main() -> anyhow::Result<()> { } = Args::parse(); let prover_input = rpc::prover_input( RootProvider::new_http(rpc_url), - block_number, + BlockInterval::SingleBlockId(block_number), checkpoint_block_number, ) .await?; diff --git a/zero_bin/tools/debug_block.sh b/zero_bin/tools/debug_block.sh deleted file mode 100755 index 74323e201..000000000 --- a/zero_bin/tools/debug_block.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# Args: -# 1 --> Block idx -# 2 --> Rpc endpoint:port (eg. http://35.246.1.96:8545) - -export RUST_BACKTRACE=1 -export RUST_MIN_STACK=8388608 -export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace,leader=info -export RUSTFLAGS='-Ctarget-cpu=native' - -# Speciying smallest ranges, as we won't need them anyway. -export ARITHMETIC_CIRCUIT_SIZE="16..17" -export BYTE_PACKING_CIRCUIT_SIZE="9..10" -export CPU_CIRCUIT_SIZE="12..13" -export KECCAK_CIRCUIT_SIZE="14..15" -export KECCAK_SPONGE_CIRCUIT_SIZE="9..10" -export LOGIC_CIRCUIT_SIZE="12..13" -export MEMORY_CIRCUIT_SIZE="17..18" - -OUTPUT_DIR="debug" -OUT_DUMMY_PROOF_PATH="${OUTPUT_DIR}/b${1}.zkproof" -OUT_LOG_PATH="${OUTPUT_DIR}/b${1}.log" - -echo "Testing block ${1}..." -mkdir -p $OUTPUT_DIR - -cargo r --release --features test_only --bin leader -- -n 1 --runtime in-memory jerigon --rpc-url "$2" --block-number "$1" --checkpoint-block-number "$(($1-1))" --proof-output-path $OUT_DUMMY_PROOF_PATH > $OUT_LOG_PATH 2>&1 -retVal=$? -if [ $retVal -ne 0 ]; then - # Some error occured. - echo "Witness generation for block ${1} errored. See ${OUT_LOG_PATH} for more details." -else - echo "Witness generation for block ${1} succeeded." - # Remove the log / dummy proof on success. - rm $OUT_DUMMY_PROOF_PATH - rm $OUT_LOG_PATH -fi - diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_blocks.sh index c27317efd..62766157c 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_blocks.sh @@ -5,48 +5,99 @@ # 2 --> End block index (inclusive) # 3 --> Rpc endpoint:port (eg. http://35.246.1.96:8545) # 4 --> Ignore previous proofs (boolean) +# 5 --> Test run only flag `test_only` (optional) +export RUST_MIN_STACK=33554432 export RUST_BACKTRACE=1 -export RUST_LOG=mpt_trie=info,trace_decoder=info,plonky2=info,evm_arithmetization=trace,leader=info -export RUSTFLAGS='-Ctarget-cpu=native' +export RUST_LOG=info +# Disable the lld linker for now, as it's causing issues with the linkme package. +# https://github.com/rust-lang/rust/pull/124129 +# https://github.com/dtolnay/linkme/pull/88 +export RUSTFLAGS='-C target-cpu=native -Zlinker-features=-lld' -export ARITHMETIC_CIRCUIT_SIZE="16..23" -export BYTE_PACKING_CIRCUIT_SIZE="9..21" -export CPU_CIRCUIT_SIZE="12..25" -export KECCAK_CIRCUIT_SIZE="14..20" -export KECCAK_SPONGE_CIRCUIT_SIZE="9..15" -export LOGIC_CIRCUIT_SIZE="12..18" -export MEMORY_CIRCUIT_SIZE="17..28" +if [[ $5 == "test_only" ]]; then + # Circuit sizes don't matter in test_only mode, so we keep them minimal. + export ARITHMETIC_CIRCUIT_SIZE="16..17" + export BYTE_PACKING_CIRCUIT_SIZE="9..10" + export CPU_CIRCUIT_SIZE="12..13" + export KECCAK_CIRCUIT_SIZE="14..15" + export KECCAK_SPONGE_CIRCUIT_SIZE="9..10" + export LOGIC_CIRCUIT_SIZE="12..13" + export MEMORY_CIRCUIT_SIZE="17..18" +else + export ARITHMETIC_CIRCUIT_SIZE="16..23" + export BYTE_PACKING_CIRCUIT_SIZE="9..21" + export CPU_CIRCUIT_SIZE="12..25" + export KECCAK_CIRCUIT_SIZE="14..20" + export KECCAK_SPONGE_CIRCUIT_SIZE="9..15" + export LOGIC_CIRCUIT_SIZE="12..18" + export MEMORY_CIRCUIT_SIZE="17..28" +fi PROOF_OUTPUT_DIR="proofs" +OUT_LOG_PATH="${PROOF_OUTPUT_DIR}/b${i}.log" ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. - TOT_BLOCKS=$(($2-$1+1)) + +START_BLOCK=$1 +END_BLOCK=$2 +NODE_RPC_URL=$3 IGNORE_PREVIOUS_PROOFS=$4 -echo "Proving blocks ${1}..=${2}... (Total: ${TOT_BLOCKS})" + mkdir -p $PROOF_OUTPUT_DIR -for ((i=$1; i<=$2; i++)) -do - echo "Proving block ${i}..." - OUT_PROOF_PATH="${PROOF_OUTPUT_DIR}/b${i}.zkproof" - OUT_LOG_PATH="${PROOF_OUTPUT_DIR}/b${i}.log" +if [ $IGNORE_PREVIOUS_PROOFS ]; then + # Set checkpoint height to previous block number for the first block in range + prev_proof_num=$(($1-1)) + PREV_PROOF_EXTRA_ARG="--checkpoint-block-number ${prev_proof_num}" +else + if [ $1 -gt 1 ]; then + prev_proof_num=$(($1-1)) + PREV_PROOF_EXTRA_ARG="-f ${PROOF_OUTPUT_DIR}/b${prev_proof_num}.zkproof" + fi +fi + +# Convert hex to decimal parameters +if [[ $START_BLOCK == 0x* ]]; then + START_BLOCK=$((16#${START_BLOCK#"0x"})) +fi +if [[ $END_BLOCK == 0x* ]]; then + END_BLOCK=$((16#${END_BLOCK#"0x"})) +fi - if [ $IGNORE_PREVIOUS_PROOFS ]; then - # Set checkpoint height to previous block number - prev_proof_num=$((i-1)) - PREV_PROOF_EXTRA_ARG="--checkpoint-block-number ${prev_proof_num}" - else - if [ $i -gt 1 ]; then - prev_proof_num=$((i-1)) - PREV_PROOF_EXTRA_ARG="-f ${PROOF_OUTPUT_DIR}/b${prev_proof_num}.zkproof" +# Define block interval +if [ $START_BLOCK == $END_BLOCK ]; then + BLOCK_INTERVAL=$((16#${START_BLOCK#"0x"})) +else + BLOCK_INTERVAL=$START_BLOCK..=$END_BLOCK +fi + + +# If we set test_only flag, we'll generate a dummy +# proof. This is useful for quickly testing decoding and all of the +# other non-proving code. +if [[ $5 == "test_only" ]]; then + # test only run + echo "Proving blocks ${BLOCK_INTERVAL} in a test_only mode now... (Total: ${TOT_BLOCKS})" + cargo r --release --features test_only --bin leader -- --runtime in-memory --load-strategy on-demand jerigon --rpc-url "$NODE_RPC_URL" --block-interval $BLOCK_INTERVAL --proof-output-dir $PROOF_OUTPUT_DIR $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 + if grep 'Successfully generated witness for block' $OUT_LOG_PATH; then + echo "Success - Note this was just a test, not a proof" + # Remove the log on success if we don't want to keep it. + if [ $ALWAYS_WRITE_LOGS -ne 1 ]; then + rm $OUT_LOG_PATH fi + exit + else + echo "Failed to create a witness" + exit 1 fi +else + # normal run + echo "Proving blocks ${BLOCK_INTERVAL} now... (Total: ${TOT_BLOCKS})" + cargo r --release --bin leader -- --runtime in-memory --load-strategy on-demand jerigon --rpc-url "$3" --block-interval $BLOCK_INTERVAL --proof-output-dir $PROOF_OUTPUT_DIR $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 - cargo r --release --bin leader -- --runtime in-memory jerigon --rpc-url "$3" --block-number $i --proof-output-path $OUT_PROOF_PATH $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 - retVal=$? if [ $retVal -ne 0 ]; then # Some error occured. @@ -58,6 +109,10 @@ do rm $OUT_LOG_PATH fi fi -done -echo "Successfully generated ${TOT_BLOCKS} proofs!" \ No newline at end of file + echo "Successfully generated ${TOT_BLOCKS} proofs!" +fi + + + + diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index 271a1346e..5e7402552 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -3,7 +3,7 @@ use std::fs::File; use anyhow::Result; use clap::Parser; use dotenvy::dotenv; -use proof_gen::types::PlonkyProofIntern; +use proof_gen::proof_types::GeneratedBlockProof; use serde_json::Deserializer; use tracing::info; @@ -17,14 +17,14 @@ fn main() -> Result<()> { let args = cli::Cli::parse(); let file = File::open(args.file_path)?; let des = &mut Deserializer::from_reader(&file); - let input: PlonkyProofIntern = serde_path_to_error::deserialize(des)?; + let input: GeneratedBlockProof = serde_path_to_error::deserialize(des)?; let verifer = args .prover_state_config .into_prover_state_manager() .verifier()?; - match verifer.verify(&input) { + match verifer.verify(&input.intern) { Ok(_) => info!("Proof verified successfully!"), Err(e) => info!("Proof verification failed with error: {:?}", e), }; From 893bb13280bd05212f21545e3877fb7294054e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Vincent?= <28714795+leovct@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:10:14 +0200 Subject: [PATCH 165/184] fix: docker images (#108) --- zero_bin/leader.Dockerfile | 7 +++---- zero_bin/worker.Dockerfile | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/zero_bin/leader.Dockerfile b/zero_bin/leader.Dockerfile index 18b0a910d..7e0eb6e8c 100644 --- a/zero_bin/leader.Dockerfile +++ b/zero_bin/leader.Dockerfile @@ -1,7 +1,6 @@ FROM rustlang/rust:nightly-bullseye-slim as builder -# Install jemalloc -RUN apt-get update && apt-get install -y libjemalloc2 libjemalloc-dev make +RUN apt-get update && apt-get install -y libjemalloc2 libjemalloc-dev make libssl-dev pkg-config RUN \ mkdir -p ops/src && touch ops/src/lib.rs && \ @@ -22,7 +21,7 @@ COPY leader/Cargo.toml ./leader/Cargo.toml COPY ./rust-toolchain.toml ./ -RUN cargo build --release --bin leader +RUN cargo build --release --bin leader COPY ops ./ops COPY common ./common @@ -36,7 +35,7 @@ RUN \ touch prover/src/lib.rs && \ touch leader/src/main.rs -RUN cargo build --release --bin leader +RUN cargo build --release --bin leader FROM debian:bullseye-slim RUN apt-get update && apt-get install -y ca-certificates libjemalloc2 diff --git a/zero_bin/worker.Dockerfile b/zero_bin/worker.Dockerfile index ecf7ae917..39036aa2c 100644 --- a/zero_bin/worker.Dockerfile +++ b/zero_bin/worker.Dockerfile @@ -1,7 +1,6 @@ FROM rustlang/rust:nightly-bullseye-slim as builder -# Install jemalloc -RUN apt-get update && apt-get install -y libjemalloc2 libjemalloc-dev make +RUN apt-get update && apt-get install -y libjemalloc2 libjemalloc-dev make libssl-dev RUN \ mkdir -p common/src && touch common/src/lib.rs && \ @@ -18,7 +17,7 @@ COPY worker/Cargo.toml ./worker/Cargo.toml COPY ./rust-toolchain.toml ./ -RUN cargo build --release --bin worker +RUN cargo build --release --bin worker COPY common ./common COPY ops ./ops @@ -28,7 +27,7 @@ RUN \ touch ops/src/lib.rs && \ touch worker/src/main.rs -RUN cargo build --release --bin worker +RUN cargo build --release --bin worker FROM debian:bullseye-slim RUN apt-get update && apt-get install -y ca-certificates libjemalloc2 From ade0466a60727ff5ca865b72b13a3e4dba4fe41c Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Wed, 12 Jun 2024 23:32:15 +0200 Subject: [PATCH 166/184] feat: add transaction hash to zero trace (#103) * feat: add txHash to ZeroTrace Retrieve block witness with a separate rpc call * fix: update zk_evm dependency to develop branch * fix: comments * fix: use zk_evm v0.4.0 --- zero_bin/Cargo.lock | 16 +++++++------- zero_bin/Cargo.toml | 6 +++--- zero_bin/rpc/src/lib.rs | 46 +++++++++++++++++++++-------------------- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index f8aef11f4..9217b8715 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -1737,8 +1737,8 @@ dependencies = [ [[package]] name = "evm_arithmetization" -version = "0.1.3" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.1#c55f9e05f571b1b8658315e6de83427fe1d4efa3" +version = "0.2.0" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.4.0#46eb449a5a97438ade3f22e2555d7f266b54b290" dependencies = [ "anyhow", "bytes", @@ -2742,8 +2742,8 @@ dependencies = [ [[package]] name = "mpt_trie" -version = "0.2.1" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.1#c55f9e05f571b1b8658315e6de83427fe1d4efa3" +version = "0.3.0" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.4.0#46eb449a5a97438ade3f22e2555d7f266b54b290" dependencies = [ "bytes", "enum-as-inner", @@ -3394,8 +3394,8 @@ dependencies = [ [[package]] name = "proof_gen" -version = "0.1.3" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.1#c55f9e05f571b1b8658315e6de83427fe1d4efa3" +version = "0.2.0" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.4.0#46eb449a5a97438ade3f22e2555d7f266b54b290" dependencies = [ "ethereum-types", "evm_arithmetization", @@ -4567,8 +4567,8 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "trace_decoder" -version = "0.3.1" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.3.1#c55f9e05f571b1b8658315e6de83427fe1d4efa3" +version = "0.4.0" +source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.4.0#46eb449a5a97438ade3f22e2555d7f266b54b290" dependencies = [ "bytes", "ciborium", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index a34224fdf..8433d3326 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -26,9 +26,9 @@ alloy = { git = "https://github.com/alloy-rs/alloy", features = [ # zk-evm dependencies plonky2 = "0.2.2" -evm_arithmetization = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.1" } -trace_decoder = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.1" } -proof_gen = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.3.1" } +evm_arithmetization = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } +trace_decoder = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } +proof_gen = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } [workspace.package] edition = "2021" diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 0d7fcb78b..9fbbe122e 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -9,23 +9,28 @@ use anyhow::Context as _; use common::block_interval::BlockInterval; use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; use futures::{StreamExt as _, TryStreamExt as _}; -use itertools::{Either, Itertools as _}; use prover::{BlockProverInput, ProverInput}; use serde::Deserialize; use serde_json::json; use trace_decoder::{ - trace_protocol::{BlockTrace, BlockTraceTriePreImages, TxnInfo}, + trace_protocol::{ + BlockTrace, BlockTraceTriePreImages, CombinedPreImages, TrieCompact, TxnInfo, + }, types::{BlockLevelData, OtherBlockData}, }; -#[derive(Deserialize, Debug)] -#[serde(rename_all = "snake_case")] -#[allow(clippy::large_enum_variant)] -enum ZeroTrace { - Result(TxnInfo), - BlockWitness(BlockTraceTriePreImages), +/// Transaction traces retrieved from Erigon zeroTracer. +#[derive(Debug, Deserialize)] +pub struct ZeroTxResult { + #[serde(rename(deserialize = "txHash"))] + pub tx_hash: alloy::primitives::TxHash, + pub result: TxnInfo, } +/// Block witness retrieved from Erigon zeroTracer. +#[derive(Debug, Deserialize)] +pub struct ZeroBlockWitness(TrieCompact); + /// When [fetching a block over RPC](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber), /// we can choose the transaction format, between: /// - Full JSON. @@ -60,24 +65,19 @@ where TransportT: Transport + Clone, { // Grab trace information - ///////////////////////// - let traces = provider - .raw_request::<_, Vec>( + let tx_results = provider + .raw_request::<_, Vec>( "debug_traceBlockByNumber".into(), (target_block_id, json!({"tracer": "zeroTracer"})), ) .await?; - let (txn_info, mut pre_images) = - traces - .into_iter() - .partition_map::, Vec<_>, _, _, _>(|it| match it { - ZeroTrace::Result(it) => Either::Left(it), - ZeroTrace::BlockWitness(it) => Either::Right(it), - }); + // Grab block witness info (packed as combined trie pre-images) + let block_witness = provider + .raw_request::<_, ZeroBlockWitness>("eth_getWitness".into(), vec![target_block_id]) + .await?; // Grab block info - ////////////////// let target_block = provider .get_block(target_block_id, BLOCK_WITH_FULL_TRANSACTIONS) .await? @@ -116,11 +116,13 @@ where .context("couldn't fill previous hashes")?; // Assemble - /////////// Ok(BlockProverInput { block_trace: BlockTrace { - trie_pre_images: pre_images.pop().context("trace had no BlockWitness")?, - txn_info, + trie_pre_images: BlockTraceTriePreImages::Combined(CombinedPreImages { + compact: block_witness.0, + }), + txn_info: tx_results.into_iter().map(|it| it.result).collect(), + code_db: Default::default(), }, other_data: OtherBlockData { b_data: BlockLevelData { From c2e2331885933f5bca80d9c17e5ff80f1d58fc0d Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Fri, 14 Jun 2024 19:34:51 +0200 Subject: [PATCH 167/184] fix: discard intermediate proofs (#106) * fix: discard intermediary proofs * fix: write intermediate proofs on creation * fix: return list of blocks proved * fix: remove files * fix: comment * fix: reviews * fix: rename jerigon params to proof params * fix: error * fix: refactor * fix: comment --- zero_bin/Cargo.lock | 1 + zero_bin/common/src/fs.rs | 7 ++++ zero_bin/common/src/lib.rs | 1 + zero_bin/leader/src/cli.rs | 9 ++++ zero_bin/leader/src/jerigon.rs | 75 ++++++++++++++++++---------------- zero_bin/leader/src/main.rs | 16 +++++--- zero_bin/prover/Cargo.toml | 1 + zero_bin/prover/src/lib.rs | 47 ++++++++++++++++++--- 8 files changed, 109 insertions(+), 48 deletions(-) create mode 100644 zero_bin/common/src/fs.rs diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 9217b8715..3af52fd77 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -3439,6 +3439,7 @@ dependencies = [ "proof_gen", "ruint", "serde", + "serde_json", "tokio", "trace_decoder", "tracing", diff --git a/zero_bin/common/src/fs.rs b/zero_bin/common/src/fs.rs new file mode 100644 index 000000000..7603f5100 --- /dev/null +++ b/zero_bin/common/src/fs.rs @@ -0,0 +1,7 @@ +use std::path::PathBuf; + +pub fn generate_block_proof_file_name(directory: &Option<&str>, block_height: u64) -> PathBuf { + let mut path = PathBuf::from(directory.unwrap_or("")); + path.push(format!("b{}.zkproof", block_height)); + path +} diff --git a/zero_bin/common/src/lib.rs b/zero_bin/common/src/lib.rs index 635eba33d..1b0b18e9b 100644 --- a/zero_bin/common/src/lib.rs +++ b/zero_bin/common/src/lib.rs @@ -1,4 +1,5 @@ pub mod block_interval; pub mod debug_utils; +pub mod fs; pub mod parsing; pub mod prover_state; diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 06a71b61a..96f2c0725 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -54,6 +54,15 @@ pub(crate) enum Command { /// to determine the blockchain node polling interval. #[arg(short, long, env = "ZERO_BIN_BLOCK_TIME", default_value_t = 2000)] block_time: u64, + /// Keep intermediate proofs. Default action is to + /// delete them after the final proof is generated. + #[arg( + short, + long, + env = "ZERO_BIN_KEEP_INTERMEDIATE_PROOFS", + default_value_t = false + )] + keep_intermediate_proofs: bool, }, /// Reads input from HTTP and writes output to a directory. Http { diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index f3cf1e747..ce03f6150 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -1,61 +1,64 @@ -use std::{ - fs::{create_dir_all, File}, - io::Write, - path::PathBuf, -}; +use std::path::PathBuf; use alloy::providers::RootProvider; use anyhow::Result; use common::block_interval::BlockInterval; +use common::fs::generate_block_proof_file_name; use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; +use tracing::{error, warn}; + +#[derive(Debug, Default)] +pub struct ProofParams { + pub checkpoint_block_number: u64, + pub previous_proof: Option, + pub proof_output_dir: Option, + pub save_inputs_on_error: bool, + pub keep_intermediate_proofs: bool, +} /// The main function for the jerigon mode. pub(crate) async fn jerigon_main( runtime: Runtime, rpc_url: &str, block_interval: BlockInterval, - checkpoint_block_number: u64, - previous_proof: Option, - proof_output_dir_opt: Option, - save_inputs_on_error: bool, + mut params: ProofParams, ) -> Result<()> { let prover_input = rpc::prover_input( RootProvider::new_http(rpc_url.parse()?), block_interval, - checkpoint_block_number.into(), + params.checkpoint_block_number.into(), ) .await?; - let block_proofs = prover_input - .prove(&runtime, previous_proof, save_inputs_on_error) + // If `keep_intermediate_proofs` is not set we only keep the last block + // proof from the interval. It contains all the necessary information to + // verify the whole sequence. + let proved_blocks = prover_input + .prove( + &runtime, + params.previous_proof.take(), + params.save_inputs_on_error, + params.proof_output_dir.clone(), + ) .await?; runtime.close().await?; - for block_proof in block_proofs { - let block_proof_str = serde_json::to_vec(&block_proof)?; - write_proof( - block_proof_str, - proof_output_dir_opt.clone().map(|mut path| { - path.push(format!("b{}.zkproof", block_proof.b_height)); - path - }), - )?; - } - Ok(()) -} - -fn write_proof(proof: Vec, proof_output_dir_opt: Option) -> Result<()> { - match proof_output_dir_opt { - Some(p) => { - if let Some(parent) = p.parent() { - create_dir_all(parent)?; - } - - let mut f = File::create(p)?; - f.write_all(&proof)?; - } - None => std::io::stdout().write_all(&proof)?, + if params.keep_intermediate_proofs { + warn!("Skipping cleanup, intermediate proofs are kept"); + } else if let Some(proof_output_dir) = params.proof_output_dir.as_ref() { + proved_blocks + .into_iter() + .rev() + .skip(1) + .map(|b| generate_block_proof_file_name(&proof_output_dir.to_str(), b)) + .for_each(|path| { + if let Err(e) = std::fs::remove_file(path) { + error!("Failed to remove intermediate proof file: {e}"); + } + }); + } else { + // Proofs are written to stdio, so no need to clean up } Ok(()) diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index f03822c6e..f04cfc579 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -11,6 +11,7 @@ use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; use tracing::info; +use crate::jerigon::{jerigon_main, ProofParams}; use crate::utils::get_package_version; mod cli; @@ -93,6 +94,7 @@ async fn main() -> Result<()> { proof_output_dir, save_inputs_on_error, block_time, + keep_intermediate_proofs, } => { let previous_proof = get_previous_proof(previous_proof)?; let mut block_interval = BlockInterval::new(&block_interval)?; @@ -106,15 +108,17 @@ async fn main() -> Result<()> { } info!("Proving interval {block_interval}"); - - jerigon::jerigon_main( + jerigon_main( runtime, &rpc_url, block_interval, - checkpoint_block_number, - previous_proof, - proof_output_dir, - save_inputs_on_error, + ProofParams { + checkpoint_block_number, + previous_proof, + proof_output_dir, + save_inputs_on_error, + keep_intermediate_proofs, + }, ) .await?; } diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 05dc591d6..ff5c1227c 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -18,6 +18,7 @@ anyhow = { workspace = true } futures = { workspace = true } alloy.workspace = true tokio = {workspace = true} +serde_json = {workspace = true} ruint = { version = "1.12.1", features = ["num-traits", "primitive-types"] } ops = { path = "../ops" } common = { path = "../common" } diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 9f0d528d5..0758ea1fd 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -1,7 +1,9 @@ use std::future::Future; +use std::path::PathBuf; -use alloy::primitives::U256; -use anyhow::Result; +use alloy::primitives::{BlockNumber, U256}; +use anyhow::{Context, Result}; +use common::fs::generate_block_proof_file_name; use futures::{future::BoxFuture, stream::FuturesOrdered, FutureExt, TryFutureExt, TryStreamExt}; use num_traits::ToPrimitive as _; use ops::TxProof; @@ -11,6 +13,7 @@ use paladin::{ }; use proof_gen::proof_types::GeneratedBlockProof; use serde::{Deserialize, Serialize}; +use tokio::io::AsyncWriteExt; use tokio::sync::oneshot; use trace_decoder::{ processed_block_trace::ProcessingMeta, @@ -133,7 +136,8 @@ impl ProverInput { runtime: &Runtime, previous_proof: Option, save_inputs_on_error: bool, - ) -> Result> { + proof_output_dir: Option, + ) -> Result> { let mut prev: Option>> = previous_proof.map(|proof| Box::pin(futures::future::ok(proof)) as BoxFuture<_>); @@ -147,16 +151,21 @@ impl ProverInput { let (tx, rx) = oneshot::channel::(); // Prove the block + let proof_output_dir = proof_output_dir.clone(); let fut = block .prove(runtime, prev.take(), save_inputs_on_error) - .then(|proof| async { + .then(move |proof| async move { let proof = proof?; + let block_number = proof.b_height; - if tx.send(proof.clone()).is_err() { + // Write latest generated proof to disk or stdout + ProverInput::write_proof(proof_output_dir, &proof).await?; + + if tx.send(proof).is_err() { anyhow::bail!("Failed to send proof"); } - Ok(proof) + Ok(block_number) }) .boxed(); @@ -168,4 +177,30 @@ impl ProverInput { results.try_collect().await } + + /// Write the proof to the disk (if `output_dir` is provided) or stdout. + pub(crate) async fn write_proof( + output_dir: Option, + proof: &GeneratedBlockProof, + ) -> Result<()> { + let proof_serialized = serde_json::to_vec(proof)?; + let block_proof_file_path = + output_dir.map(|path| generate_block_proof_file_name(&path.to_str(), proof.b_height)); + match block_proof_file_path { + Some(p) => { + if let Some(parent) = p.parent() { + tokio::fs::create_dir_all(parent).await?; + } + + let mut f = tokio::fs::File::create(p).await?; + f.write_all(&proof_serialized) + .await + .context("Failed to write proof to disk") + } + None => tokio::io::stdout() + .write_all(&proof_serialized) + .await + .context("Failed to write proof to stdout"), + } + } } From 3a3a16e03201e39e0cbad087ae523fa92568d842 Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Sat, 15 Jun 2024 01:00:18 +0200 Subject: [PATCH 168/184] feat: stdio parallel proving (#109) * feat: fearigon witness extractor initiall commit * fix: update rpc and stdio test case * fix: error output * fix: script * fix: verifier and rename stdio_test.sh * fix: rename prove_blocks to prove_jerigon * fix: verifier * fix: script * fix: remove repeated output * fix: verification message * fix: update script and add ci multi block proving * fix: typo * fix: rebase on top of discard-intermediary-proofs * fix: invalid printout * fix: cleanup * fix: cleanup * fix: test_only stdio output * fix: jerigon mode output to stdout * fix: printout * fix: printout 2 * fix: printout 3 * fix: printout 4 --- zero_bin/.github/workflows/ci.yml | 17 +- zero_bin/README.md | 12 +- zero_bin/leader/src/jerigon.rs | 39 +- zero_bin/leader/src/stdio.rs | 30 +- zero_bin/prover/src/lib.rs | 20 +- zero_bin/rpc/src/main.rs | 26 +- .../tools/artifacts/witness_b19240705.json | 1390 ++++++++++ zero_bin/tools/artifacts/witness_b2_b7.json | 2414 +++++++++++++++++ .../{prove_blocks.sh => prove_jerigon.sh} | 6 +- zero_bin/tools/prove_stdio.sh | 101 + zero_bin/tools/simple_test.sh | 84 - zero_bin/verifier/src/main.rs | 14 +- 12 files changed, 4024 insertions(+), 129 deletions(-) create mode 100644 zero_bin/tools/artifacts/witness_b19240705.json create mode 100644 zero_bin/tools/artifacts/witness_b2_b7.json rename zero_bin/tools/{prove_blocks.sh => prove_jerigon.sh} (93%) create mode 100755 zero_bin/tools/prove_stdio.sh delete mode 100755 zero_bin/tools/simple_test.sh diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml index 9f463625a..1b20aefdd 100644 --- a/zero_bin/.github/workflows/ci.yml +++ b/zero_bin/.github/workflows/ci.yml @@ -76,7 +76,7 @@ jobs: - name: Run the script run: | pushd tools - ./simple_test.sh + ./prove_stdio.sh artifacts/witness_b19240705.json simple_proof_witness_only: name: Execute bash script to generate the proof witness for a small block. @@ -89,4 +89,17 @@ jobs: - name: Run the script run: | pushd tools - ./simple_test.sh test_only + ./prove_stdio.sh artifacts/witness_b19240705.json test_only + + multi_blocks_proof_regular: + name: Execute bash script to generate and verify a proof for multiple blocks using parallel proving. + runs-on: zero-ci + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Run the script + run: | + pushd tools + ./prove_stdio.sh artifacts/witness_b2_b7.json \ No newline at end of file diff --git a/zero_bin/README.md b/zero_bin/README.md index 7ba9ad2f0..39329809d 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -364,16 +364,16 @@ For testing proof generation for blocks, the `testing` branch should be used. ### Proving Blocks -If you want to generate a full block proof, you can use `tools/prove_blocks.sh`: +If you want to generate a full block proof, you can use `tools/prove_jerigon.sh`: ```sh -./prove_blocks.sh +./prove_jerigon.sh ``` Which may look like this: ```sh -./prove_blocks.sh 17 18 http://127.0.0.1:8545 false +./prove_jerigon.sh 17 18 http://127.0.0.1:8545 false ``` Which will attempt to generate proofs for blocks `17` & `18` consecutively and incorporate the previous block proof during generation. @@ -385,16 +385,16 @@ A few other notes: ### Generating Witnesses Only -If you want to test a block without the high CPU & memory requirements that come with creating a full proof, you can instead generate only the witness using `tools/prove_blocks.sh` in the `test_only` mode: +If you want to test a block without the high CPU & memory requirements that come with creating a full proof, you can instead generate only the witness using `tools/prove_jerigon.sh` in the `test_only` mode: ```sh -./prove_blocks.sh test_only +./prove_jerigon.sh test_only ``` Filled in: ```sh -./prove_blocks.sh 18299898 18299899 http://34.89.57.138:8545 true test_only +./prove_jerigon.sh 18299898 18299899 http://34.89.57.138:8545 true test_only ``` Finally, note that both of these testing scripts force proof generation to be sequential by allowing only one worker. Because of this, this is not a realistic representation of performance but makes the debugging logs much easier to follow. diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/jerigon.rs index ce03f6150..a19dd45c1 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/jerigon.rs @@ -1,3 +1,4 @@ +use std::io::Write; use std::path::PathBuf; use alloy::providers::RootProvider; @@ -6,7 +7,7 @@ use common::block_interval::BlockInterval; use common::fs::generate_block_proof_file_name; use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; -use tracing::{error, warn}; +use tracing::{error, info, warn}; #[derive(Debug, Default)] pub struct ProofParams { @@ -31,6 +32,12 @@ pub(crate) async fn jerigon_main( ) .await?; + if cfg!(feature = "test_only") { + info!("All proof witnesses have been generated successfully."); + } else { + info!("All proofs have been generated successfully."); + } + // If `keep_intermediate_proofs` is not set we only keep the last block // proof from the interval. It contains all the necessary information to // verify the whole sequence. @@ -41,24 +48,46 @@ pub(crate) async fn jerigon_main( params.save_inputs_on_error, params.proof_output_dir.clone(), ) - .await?; + .await; runtime.close().await?; + let proved_blocks = proved_blocks?; if params.keep_intermediate_proofs { - warn!("Skipping cleanup, intermediate proofs are kept"); + if params.proof_output_dir.is_some() { + // All proof files (including intermediary) are written to disk and kept + warn!("Skipping cleanup, intermediate proof files are kept"); + } else { + // Output all proofs to stdout + std::io::stdout().write_all(&serde_json::to_vec( + &proved_blocks + .into_iter() + .filter_map(|(_, block)| block) + .collect::>(), + )?)?; + } } else if let Some(proof_output_dir) = params.proof_output_dir.as_ref() { + // Remove intermediary proof files proved_blocks .into_iter() .rev() .skip(1) - .map(|b| generate_block_proof_file_name(&proof_output_dir.to_str(), b)) + .map(|(block_number, _)| { + generate_block_proof_file_name(&proof_output_dir.to_str(), block_number) + }) .for_each(|path| { if let Err(e) = std::fs::remove_file(path) { error!("Failed to remove intermediate proof file: {e}"); } }); } else { - // Proofs are written to stdio, so no need to clean up + // Output only last proof to stdout + if let Some(last_block) = proved_blocks + .into_iter() + .filter_map(|(_, block)| block) + .last() + { + std::io::stdout().write_all(&serde_json::to_vec(&last_block)?)?; + } } Ok(()) diff --git a/zero_bin/leader/src/stdio.rs b/zero_bin/leader/src/stdio.rs index b49223dc1..76bcd089b 100644 --- a/zero_bin/leader/src/stdio.rs +++ b/zero_bin/leader/src/stdio.rs @@ -3,7 +3,8 @@ use std::io::{Read, Write}; use anyhow::Result; use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; -use prover::BlockProverInput; +use prover::ProverInput; +use tracing::info; /// The main function for the stdio mode. pub(crate) async fn stdio_main( @@ -15,18 +16,27 @@ pub(crate) async fn stdio_main( std::io::stdin().read_to_string(&mut buffer)?; let des = &mut serde_json::Deserializer::from_str(&buffer); - let input: BlockProverInput = serde_path_to_error::deserialize(des)?; - let proof = input - .prove( - &runtime, - previous.map(futures::future::ok), - save_inputs_on_error, - ) + let prover_input = ProverInput { + blocks: serde_path_to_error::deserialize(des)?, + }; + + let proved_blocks = prover_input + .prove(&runtime, previous, save_inputs_on_error, None) .await; runtime.close().await?; - let proof = proof?; + let proved_blocks = proved_blocks?; + + if cfg!(feature = "test_only") { + info!("All proof witnesses have been generated successfully."); + } else { + info!("All proofs have been generated successfully."); + } - std::io::stdout().write_all(&serde_json::to_vec(&proof)?)?; + let proofs: Vec = proved_blocks + .into_iter() + .filter_map(|(_, proof)| proof) + .collect(); + std::io::stdout().write_all(&serde_json::to_vec(&proofs)?)?; Ok(()) } diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 0758ea1fd..7666d3e38 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -46,7 +46,6 @@ impl BlockProverInput { use anyhow::Context as _; let block_number = self.get_block_number(); - info!("Proving block {block_number}"); let other_data = self.other_data; let txs = self.block_trace.into_txn_proof_gen_ir( @@ -113,8 +112,6 @@ impl BlockProverInput { .try_collect::>() .await?; - info!("Successfully generated witness for block {block_number}."); - // Dummy proof to match expected output type. Ok(GeneratedBlockProof { b_height: block_number @@ -131,13 +128,16 @@ pub struct ProverInput { } impl ProverInput { + /// Prove all the blocks in the input. + /// Return the list of block numbers that are proved and if the proof data + /// is not saved to disk, return the generated block proofs as well. pub async fn prove( self, runtime: &Runtime, previous_proof: Option, save_inputs_on_error: bool, proof_output_dir: Option, - ) -> Result> { + ) -> Result)>> { let mut prev: Option>> = previous_proof.map(|proof| Box::pin(futures::future::ok(proof)) as BoxFuture<_>); @@ -158,14 +158,20 @@ impl ProverInput { let proof = proof?; let block_number = proof.b_height; - // Write latest generated proof to disk or stdout - ProverInput::write_proof(proof_output_dir, &proof).await?; + // Write latest generated proof to disk if proof_output_dir is provided + let return_proof: Option = + if proof_output_dir.is_some() { + ProverInput::write_proof(proof_output_dir, &proof).await?; + None + } else { + Some(proof.clone()) + }; if tx.send(proof).is_err() { anyhow::bail!("Failed to send proof"); } - Ok(block_number) + Ok((block_number, return_proof)) }) .boxed(); diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs index a38ee7a73..bd84b113e 100644 --- a/zero_bin/rpc/src/main.rs +++ b/zero_bin/rpc/src/main.rs @@ -10,15 +10,19 @@ use url::Url; pub enum Args { /// Fetch and generate prover input from the RPC endpoint. Fetch { + // Starting block of interval to fetch + #[arg(short, long)] + start_block: u64, + // End block of interval to fetch + #[arg(short, long)] + end_block: u64, /// The RPC URL. #[arg(short = 'u', long, value_hint = ValueHint::Url)] rpc_url: Url, - /// The block number. + /// The checkpoint block number. If not provided, + /// block before the `start_block` is the checkpoint #[arg(short, long)] - block_number: BlockId, - /// The checkpoint block number. - #[arg(short, long, default_value = "0")] - checkpoint_block_number: BlockId, + checkpoint_block_number: Option, }, } @@ -34,18 +38,24 @@ async fn main() -> anyhow::Result<()> { .init(); let Args::Fetch { + start_block, + end_block, rpc_url, - block_number, checkpoint_block_number, } = Args::parse(); + + let checkpoint_block_number = checkpoint_block_number.unwrap_or((start_block - 1).into()); + let block_interval = BlockInterval::Range(start_block..end_block + 1); + + // Retrieve prover input from the Erigon node let prover_input = rpc::prover_input( RootProvider::new_http(rpc_url), - BlockInterval::SingleBlockId(block_number), + block_interval, checkpoint_block_number, ) .await?; - serde_json::to_writer_pretty(io::stdout(), &prover_input)?; + serde_json::to_writer_pretty(io::stdout(), &prover_input.blocks)?; Ok(()) } diff --git a/zero_bin/tools/artifacts/witness_b19240705.json b/zero_bin/tools/artifacts/witness_b19240705.json new file mode 100644 index 000000000..1422c84ee --- /dev/null +++ b/zero_bin/tools/artifacts/witness_b19240705.json @@ -0,0 +1,1390 @@ +[ + { + "block_trace": { + "trie_pre_images": { + "combined": { + "compact": "0x01031664dbd4a27781c8d129bab370c7498db3f71ad38853cf1c9b54ed0aefdfbc87034d9119280e061867c595d7df73f20434265a3062cae79c005715414be8e0846703324e2ab34b184864cd4c923cff7ac3d9744e0405a88580f858f8999924cb0ff503a6b60e17c4c4601ba1af49e95cf74e90c136153a495b419eb9e05756ff3da0de03310252de1f39746fdf13fa8c97d847a102ba32b3d152730d9423048eccda50790368d497df1f682ffdd3ed4f4a82e250271ac7ae096bead2a17a6207929c610482032479a848475f822582422a97702ae252f39b10b48d669bcc4bc8abdd8b205043036606ddc5a70f0fcfe956030a35ae91a6b003259bfa774a6a2b018a1b8a270c5a03e9f9e21290bfcc332e2c940e6ac9a99dc5e940085314ce91ae5ba4fcbcdca80403681320aa56c59dbc6d76dd24f979fd8e6431d4a555579b03fbd8f4debb14d4940329a98aafd5b252a5cb6edf169e6da01f3131b73a61241b0e5a9974023f20bce303064373a92fbaa74c494b9bb3c09ed235d90ee175fbb2fce2f07cb0d7e6517e3d03e9dcebfbf76992b81a6b596f81f8280c7007539757190f61b4bf7691846952c1038c3e0ea786a08d9d4ff010c17dd80831350bdd04109bd2e5641b1102d0d201d703ce018171a52ff434a6fd849ca812ad5fb12ea24ab5d00e3e92fe4517243c13e1035cfc9421e276d124a62c46c72f2feb99d7f616fa25acd16cf597b7dc531a66ca0312e5a34c61ed89765cb41e1af31f58a2387b45d3d40976446390a53f4c2eb652030a63f2ca64bf32f0a365a1728cda44264fbeefe86d9be4eb6059406b8dfb7c1003d9b3278e5c61faaf09b6914d8626dfe663a88b8b4486219f0e784205c9962a5003078468a40a017c769b325c488872cb5be8a5716d891d0e9d05676b95034a4d7c03f58b271b1ab544c0329216099bc2ea100431a4fb64920eedebe971caa0a74804038931a7b3f1f35ac1e5d35d3c5fc3771bb9f91d77a26cb1d31f8b2f118c75d69003dacbd8664c534de3efc89b9f4320ab03ef2546fc335d79396b02922d12845476033de8ca51e8f5722f83aee0eaca24e08137c8fb72a174e3de4d64e3b828601541032b8de6bd8adf2f22f570b158e9e5a68342d21614eb496e3abfb1d39d4fa0c1a303af3f7c4a5d228f3bf81538c09d60e1ca847c8ff863da885a4d320566d898009d0331e6f9f849baa8f4d97907719237c7e1c465807efb84710d9ea1bfd1360a093903068210e24a700477fa40e242b1287c7405c7332aefcaf77e92fb87b63a104700030bfaac2d323eb6898db67737c27769c6cc5898346fff8f67f60009412c5acc6a03ae56aaf99e2b4171979478eb1f9a0caafe2e98292c6c1526b63910397217cd20031196de1dcd4a9e9ac5e1bf6ae9db3bda7ac39f41a31f90ea9aa985a5e0e23bab0338a3648fe43d0759c2545fbac374ab550f6155703a37f1216014f02c11614ccd05581e0333617c4920d035c85869829581a0a3a3dd9dadf122daad9c47fc2edf400c074771c0d792eca0cb05581e03154df0016effd23a529fe9dba19a32aa7838f956bbc8c9334f0666a5d0040405581e032b3ff3ba56b5c3d896d23ff067c9e26cad3f115e9283dce09e19a270c0040305581e03f158e6cd12159a3cf47403a789dc6c9e7e8c9a09b6da1e03f8e0979e400c0346afca8172ffa0038211f446ac23f136adb55c95b8eba937b16b12d9d32ee30eaca4059191e0207503da31270adeab5b50d0101caa8dd4e2326fae6a43562501680271f83f8fb34787037a3670f78c75958f13f8579474b348612a80af61fa9b61b2c81c415523f170590605581e035e4e75fffbb329e4ba7f1b98156fd87b98d7f9b60be56ac357673ff22007011bffffffffffffffff05581e033cc8f8c15d49a17ea4ffc954f9927f2ea565c8ca347927a41b994e7110040104595ca7608060405260043610610087575f3560e01c806375713a081161005757806375713a08146101215780638024c73a146101345780638129fc1c14610148578063e634edd31461015c578063fa461e331461016f575f80fd5b80630162e2d0146100925780631a12d67c146100a7578063547d00a2146100d45780636e20b1071461010e575f80fd5b3661008e57005b5f80fd5b6100a56100a03660046150df565b61018e565b005b6100ba6100b5366004615263565b61027b565b604080519283526020830191909152015b60405180910390f35b3480156100df575f80fd5b506100f36100ee366004615306565b6103db565b604080519384526020840192909252908201526060016100cb565b6100ba61011c366004615388565b610ac5565b6100a561012f36600461547b565b610bfb565b34801561013f575f80fd5b506100a56113a3565b348015610153575f80fd5b506100a561149c565b6100f361016a36600461552b565b6115c4565b34801561017a575f80fd5b506100a56101893660046155a8565b611c20565b81158061019a57508142145b6101bf5760405162461bcd60e51b81526004016101b690615620565b60405180910390fd5b5f898960028181106101d3576101d361564f565b90506020020135111561026157888860028181106101f3576101f361564f565b905060200201353410156102195760405162461bcd60e51b81526004016101b690615663565b416108fc8a8a60028181106102305761023061564f565b9050602002013590811502906040515f60405180830381858888f1935050505015801561025f573d5f803e3d5ffd5b505b61027089898989898887611f17565b505050505050505050565b5f8083158061028957508342145b6102a55760405162461bcd60e51b81526004016101b690615620565b8b156102f7578b3410156102cb5760405162461bcd60e51b81526004016101b690615663565b60405141908d156108fc02908e905f818181858888f193505050501580156102f5573d5f803e3d5ffd5b505b5f6040518061012001604052808b815260200189151581526020018e81526020018f60028151811061032b5761032b61564f565b60200260200101516001600160a01b031681526020015f6001600160a01b031681526020018881526020018a81526020018781526020018581525090506103728e826124f8565b9094509250508b158061038557508b8310155b6103a15760405162461bcd60e51b81526004016101b69061569a565b8a15806103ae57508a8311155b6103ca5760405162461bcd60e51b81526004016101b6906156c9565b509b509b9950505050505050505050565b5f805f80845f815181106103f1576103f161564f565b60209081029190910101516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561043f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046391906156f6565b90505f8a6064148061047357508a155b61049e575f8a1161049857610493606461048d848e613429565b9061345a565b6104a0565b896104a0565b815b90505f81116104e05760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f42414c414e434560a01b60448201526064016101b6565b866001815181106104f3576104f361564f565b60200260200101516001600160a01b03167368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316036106c4575f6040518061012001604052808d5f14801561054257505f8d115b61054c575f61054e565b8c5b81526020015f151581526020015f8152602001896002815181106105745761057461564f565b60200260200101516001600160a01b03168152602001895f8151811061059c5761059c61564f565b60200260200101516001600160a01b031681526020015f81526020018381526020015f81526020018b81525090505f60026001600160401b038111156105e4576105e461517b565b60405190808252806020026020018201604052801561060d578160200160208202803683370190505b509050875f815181106106225761062261564f565b6020026020010151815f8151811061063c5761063c61564f565b60200260200101906001600160a01b031690816001600160a01b0316815250508760018151811061066f5761066f61564f565b60200260200101518160018151811061068a5761068a61564f565b60200260200101906001600160a01b031690816001600160a01b0316815250506106b481836124f8565b9198509096509450610ab6915050565b8a1580156106d157505f8a115b15610745575f6106fd8b888a6001815181106106ef576106ef61564f565b60200260200101518c61346c565b905082815f815181106107125761071261564f565b602002602001015111156107265782610741565b805f815181106107385761073861564f565b60200260200101515b9150505b855f815181106107575761075761564f565b60200260200101516001600160a01b03166370a08231886002815181106107805761078061564f565b60200260200101516040518263ffffffff1660e01b81526004016107b391906001600160a01b0391909116815260200190565b602060405180830381865afa1580156107ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f291906156f6565b9450865f815181106108065761080661564f565b60200260200101516001600160a01b031663199f7260875f8151811061082e5761082e61564f565b6020026020010151338a60028151811061084a5761084a61564f565b6020026020010151856040518563ffffffff1660e01b8152600401610872949392919061570d565b5f604051808303815f87803b158015610889575f80fd5b505af115801561089b573d5f803e3d5ffd5b5050505084865f815181106108b2576108b261564f565b60200260200101516001600160a01b03166370a08231896002815181106108db576108db61564f565b60200260200101516040518263ffffffff1660e01b815260040161090e91906001600160a01b0391909116815260200190565b602060405180830381865afa158015610929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094d91906156f6565b610957919061574b565b6040516370a0823160e01b81523060048201529095505f905f80516020615c52833981519152906370a0823190602401602060405180830381865afa1580156109a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c691906156f6565b90506109ed87308a6001815181106109e0576109e061564f565b60200260200101516135e0565b506040516370a0823160e01b81523060048201525f9082905f80516020615c52833981519152906370a0823190602401602060405180830381865afa158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c91906156f6565b610a66919061574b565b90505f8111610aac5760405162461bcd60e51b81526020600482015260126024820152711393c81513d2d15394c8149150d15255915160721b60448201526064016101b6565b9194509092508390505b50505b96509650969350505050565b5f80831580610ad357508342145b610aef5760405162461bcd60e51b81526004016101b690615620565b8a15610b41578a341015610b155760405162461bcd60e51b81526004016101b690615663565b60405141908c156108fc02908d905f818181858888f19350505050158015610b3f573d5f803e3d5ffd5b505b5f6040518061012001604052808b815260200189151581526020018d81526020018e600281518110610b7557610b7561564f565b60200260200101516001600160a01b031681526020015f6001600160a01b031681526020018881526020018a8152602001878152602001858152509050610bbc8d826124f8565b9094509250508a1580610bcf57508a8310155b610beb5760405162461bcd60e51b81526004016101b69061569a565b509a509a98505050505050505050565b5f82600481518110610c0f57610c0f61564f565b6020026020010151118015610c3e575081600481518110610c3257610c3261564f565b60200260200101514214155b15610c97576040516001600160a01b038a1681527ff2e7574263ab25e854ccac210f6060de1cb000d665c40e21b3bcb80f2b4511bc9060200160405180910390a160405162461bcd60e51b81526004016101b690615620565b5f5f80516020615c528339815191526001600160a01b038a1614610cbc576003610cbf565b60025b60ff166001600160401b03811115610cd957610cd961517b565b604051908082528060200260200182016040528015610d02578160200160208202803683370190505b50905089815f81518110610d1857610d1861564f565b60200260200101906001600160a01b031690816001600160a01b0316815250508881600181518110610d4c57610d4c61564f565b60200260200101906001600160a01b031690816001600160a01b0316815250508051600303610db7575f80516020615c5283398151915281600281518110610d9657610d9661564f565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6040516370a0823160e01b81523360048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa158015610dfb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e1f91906156f6565b90506001600160a01b0389167368b3465833fb72a70ecdf485e0e4c7bd8665fc45036110c3575f6040518061012001604052805f87600581518110610e6657610e6661564f565b602002602001015111610e79575f610e95565b86600581518110610e8c57610e8c61564f565b60200260200101515b81526020015f151581526020015f81526020018a6001600160a01b03168152602001876001600160a01b0316815260200186600181518110610ed957610ed961564f565b602002602001015181526020015f8a11610f4a57865f81518110610eff57610eff61564f565b6020026020010151606414610f44576064875f81518110610f2257610f2261564f565b602002602001015185610f35919061575e565b610f3f9190615789565b610f4c565b83610f4c565b895b815260200186600281518110610f6457610f6461564f565b602090810291909101810151825201859052604080516002808252606082019092529192505f91908160200160208202803683370190505090508c815f81518110610fb157610fb161564f565b60200260200101906001600160a01b031690816001600160a01b0316815250508b81600181518110610fe557610fe561564f565b60200260200101906001600160a01b031690816001600160a01b0316815250505f61101082846124f8565b509150507f522881958b3c4a6fc0840ad3b7fb947b881edc28c004245a62541647422ade978160405161104591815260200190565b60405180910390a15f8911801561105b57508881105b156110785760405162461bcd60e51b81526004016101b69061569a565b86516007036110bb57866006815181106110945761109461564f565b60200260200101518111156110bb5760405162461bcd60e51b81526004016101b6906156c9565b505050611396565b5f808811611177575f871161112f57845f815181106110e4576110e461564f565b6020026020010151606414611129576064855f815181106111075761110761564f565b60200260200101518361111a919061575e565b6111249190615789565b611179565b81611179565b61112461115888858d8960038151811061114b5761114b61564f565b602002602001015161346c565b5f815181106111695761116961564f565b602002602001015183613837565b875b9050856001600160a01b031663199f7260845f8151811061119c5761119c61564f565b6020026020010151338c856040518563ffffffff1660e01b81526004016111c6949392919061570d565b5f604051808303815f87803b1580156111dd575f80fd5b505af11580156111ef573d5f803e3d5ffd5b505050506111fe83308c6135e0565b506040516370a0823160e01b81523060048201525f905f80516020615c52833981519152906370a0823190602401602060405180830381865afa158015611247573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061126b91906156f6565b90505f8811801561127b57508781105b156112985760405162461bcd60e51b81526004016101b69061569a565b85516007036112db57856006815181106112b4576112b461564f565b60200260200101518111156112db5760405162461bcd60e51b81526004016101b6906156c9565b801561133b57604051632e1a7d4d60e01b8152600481018290525f80516020615c5283398151915290632e1a7d4d906024015f604051808303815f87803b158015611324575f80fd5b505af1158015611336573d5f803e3d5ffd5b505050505b6113608186886002815181106113535761135361564f565b602002602001015161384c565b6040518181527f522881958b3c4a6fc0840ad3b7fb947b881edc28c004245a62541647422ade979060200160405180910390a150505b5050505050505050505050565b5f546001600160a01b031633146113e25760405162461bcd60e51b8152602060048201526003602482015262486d6d60e81b60448201526064016101b6565b5f6001541161142c5760405162461bcd60e51b8152602060048201526016602482015275139bc81199595cc810dd5c9c995b9d1b1e4813ddd95960521b60448201526064016101b6565b60015447101561147e5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420456e6f7567682042616c616e636520546f20436f766572204665657360448201526064016101b6565b5f54600154611496916001600160a01b0316906138fd565b5f600155565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156114e05750825b90505f826001600160401b031660011480156114fb5750303b155b905081158015611509575080155b156115275760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561155157845460ff60401b1916600160401b1785555b5f80546001600160a01b0319167337aab97476ba8dc785476611006fd5dda4eed66b17905583156115bd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a15b5050505050565b5f80806001600160a01b0386167368b3465833fb72a70ecdf485e0e4c7bd8665fc4503611730576040805160028082526060820183525f9260208301908036833701905050905089815f8151811061161e5761161e61564f565b60200260200101906001600160a01b031690816001600160a01b03168152505088816001815181106116525761165261564f565b60200260200101906001600160a01b031690816001600160a01b0316815250505f604051806101200160405280875f815181106116915761169161564f565b602002602001015181526020016001151581526020015f81526020018a6001600160a01b031681526020015f6001600160a01b03168152602001876001815181106116de576116de61564f565b60200260200101518152602001348152602001876002815181106117045761170461564f565b6020026020010151815260200188815250905061172182826124f8565b90965094509250610ab9915050565b5f61174c611740876103e86157a8565b61048d346103e8613429565b90505f5f80516020615c528339815191526001600160a01b038b1614611773576003611776565b60025b60ff166001600160401b038111156117905761179061517b565b6040519080825280602002602001820160405280156117b9578160200160208202803683370190505b5090505f80516020615c52833981519152815f815181106117dc576117dc61564f565b6001600160a01b0392831660209182029290920101528b9082908c165f80516020615c5283398151915214611812576002611815565b60015b60ff16815181106118285761182861564f565b6001600160a01b0392831660209182029290920101528a165f80516020615c52833981519152146118885789816001815181106118675761186761564f565b60200260200101906001600160a01b031690816001600160a01b0316815250505b5f80875f8151811061189c5761189c61564f565b6020026020010151111561193a575f6118cf885f815181106118c0576118c061564f565b6020026020010151848c6139c7565b905083815f815181106118e4576118e461564f565b602002602001015111156118f85783611913565b805f8151811061190a5761190a61564f565b60200260200101515b945083815f815181106119285761192861564f565b6020026020010151111591505061193e565b8293505b61194984838b613b23565b60018351611957919061574b565b815181106119675761196761564f565b602002602001015194505f80516020615c528339815191526001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b1580156119b7575f80fd5b505af11580156119c9573d5f803e3d5ffd5b50505050505f80516020615c528339815191526001600160a01b031663a9059cbb611a288b855f81518110611a0057611a0061564f565b602002602001015186600181518110611a1b57611a1b61564f565b6020026020010151613c59565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018790526044016020604051808303815f875af1158015611a72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9691906157bb565b611aa257611aa26157d6565b6040516370a0823160e01b81523360048201525f906001600160a01b038e16906370a0823190602401602060405180830381865afa158015611ae6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0a91906156f6565b90508115611b4b575f611b37895f81518110611b2857611b2861564f565b6020026020010151858d6139c7565b9050611b458185338e614100565b50611b58565b611b5683338c6135e0565b505b6040516370a0823160e01b815233600482015281906001600160a01b038f16906370a0823190602401602060405180830381865afa158015611b9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc091906156f6565b611bca919061574b565b96505f8711611c105760405162461bcd60e51b81526020600482015260126024820152711393c81513d2d15394c8149150d15255915160721b60448201526064016101b6565b5050505096509650969350505050565b5f841380611c2d57505f83135b611c35575f80fd5b5f80808080611c46868801886157ea565b9550955095505094509450611cbb8585336001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb6919061585f565b614290565b6001600160a01b0316336001600160a01b031614611d0b5760405162461bcd60e51b815260206004820152600d60248201526c46616b652063616c6c6261636b60981b60448201526064016101b6565b5f805f8b13611d2f57866001600160a01b0316866001600160a01b0316108a611d46565b856001600160a01b0316876001600160a01b0316108b5b91509150828111611396578115611e33575f5f80516020615c528339815191526001600160a01b03891614611d7b5787611d8a565b5f80516020615c528339815191525b90506001600160a01b038616301480611db857505f80516020615c528339815191526001600160a01b038916145b15611dce57611dc981873385614354565b611e2d565b60405162ccfb9360e51b81526001600160a01b0386169063199f726090611dff9084908a903390889060040161570d565b5f604051808303815f87803b158015611e16575f80fd5b505af1158015611e28573d5f803e3d5ffd5b505050505b50611396565b5f5f80516020615c528339815191526001600160a01b03881614611e575786611e66565b5f80516020615c528339815191525b90506001600160a01b038616301480611e9457505f80516020615c528339815191526001600160a01b038816145b15611eaa57611ea581873385614354565b611f09565b60405162ccfb9360e51b81526001600160a01b0386169063199f726090611edb9084908a903390889060040161570d565b5f604051808303815f87803b158015611ef2575f80fd5b505af1158015611f04573d5f803e3d5ffd5b505050505b505050505050505050505050565b5f611f5f611f27836103e86157a8565b61048d6103e8611f598c8c6002818110611f4357611f4361564f565b905060200201353461448390919063ffffffff16565b90613429565b90505f8686611f6f60018261574b565b818110611f7e57611f7e61564f565b9050602002016020810190611f939190615881565b6040516370a0823160e01b81523360048201529091505f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611fda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffe91906156f6565b90505f808b8b5f8181106120145761201461564f565b905060200201351161204357604080516001808252818301909252906020808301908036833701905050612099565b6120998b8b5f8181106120585761205861564f565b905060200201358a8a808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508c92506139c7915050565b90505f808c8c5f8181106120af576120af61564f565b905060200201351180156120dc575084825f815181106120d1576120d161564f565b602002602001015111155b6120e65784612101565b815f815181106120f8576120f861564f565b60200260200101515b90505f80516020615c528339815191526001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015612149575f80fd5b505af115801561215b573d5f803e3d5ffd5b50505050505f80516020615c528339815191526001600160a01b031663a9059cbb6121d48a8d8d5f8181106121925761219261564f565b90506020020160208101906121a79190615881565b8e8e60018181106121ba576121ba61564f565b90506020020160208101906121cf9190615881565b613c59565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af115801561221e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061224291906157bb565b61224e5761224e6157d6565b5f8c8c5f8181106122615761226161564f565b9050602002013511801561228e575084825f815181106122835761228361564f565b602002602001015111155b156122d8576122d3828b8b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152503392508d91506141009050565b612336565b6123178a8a808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152503392508c91506135e09050565b825f815181106123295761232961564f565b6020026020010181815250505b6040516370a0823160e01b81523360048201526123a99084906001600160a01b038716906370a08231906024015b602060405180830381865afa15801561237f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a391906156f6565b90614483565b92505f8c8c60018181106123bf576123bf61564f565b905060200201351115612405578b8b60018181106123df576123df61564f565b905060200201358310156124055760405162461bcd60e51b81526004016101b69061569a565b60048b10612446578b8b60038181106124205761242061564f565b905060200201358311156124465760405162461bcd60e51b81526004016101b6906156c9565b61245181878961384c565b7f9f849d23f4955d98202378ea318f2b0c7533695d3c9fb2a3931f0f919fa8c42081845f8f8f5f8181106124875761248761564f565b90506020020135116124b257845f815181106124a5576124a561564f565b60200260200101516124cc565b8e8e5f8181106124c4576124c461564f565b905060200201355b6040805193845260208401929092529082015260600160405180910390a1505050505050505050505050565b5f805f806040518061010001604052808760018151811061251b5761251b61564f565b60200260200101516001600160a01b03168152602001875f815181106125435761254361564f565b60200260200101516001600160a01b03168152602001336001600160a01b03168152602001306001600160a01b0316815260200186608001516001600160a01b031681526020018660c0015181526020015f81526020016001151581525090505f47905085602001511561271757866001815181106125c4576125c461564f565b60200260200101516001600160a01b03165f80516020615c528339815191526001600160a01b03160361262e576126248661010001516103e861260791906157a8565b61048d6103e8611f598a604001513461448390919063ffffffff16565b60a083015261294c565b6126925f80516020615c52833981519152886001815181106126525761265261564f565b602002602001015161268d8961010001516103e861267091906157a8565b61048d6103e8611f598d604001513461448390919063ffffffff16565b61449c565b866001815181106126a5576126a561564f565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156126f3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262491906156f6565b865f815181106127295761272961564f565b60209081029190910101516001600160a01b031682528651879060019081106127545761275461564f565b6020908102919091018101516001600160a01b0316908301523060408301523360608301525f60e0830181905287518891906127925761279261564f565b60209081029190910101516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156127e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061280491906156f6565b60c08301528551158015906128525750866001815181106128275761282761564f565b60200260200101516001600160a01b03165f80516020615c528339815191526001600160a01b031614155b1561294c576040805160028082526060820183525f926020830190803683370190505090508760018151811061288a5761288a61564f565b6020026020010151815f815181106128a4576128a461564f565b60200260200101906001600160a01b031690816001600160a01b0316815250505f80516020615c52833981519152816001815181106128e5576128e561564f565b60200260200101906001600160a01b031690816001600160a01b0316815250505f612928885f015183737a250d5630b4cf539739df2c5dacb4c659f2488d6139c7565b9050805f8151811061293c5761293c61564f565b6020908102919091010151885250505b85515f9015612adf575f87606001516001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015612996573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ba91906158b2565b50505050509150505f6129cc82614577565b90506001600160801b036001600160a01b03821611612a60575f6129f96001600160a01b0383168061575e565b905085602001516001600160a01b0316865f01516001600160a01b031610612a3c57612a37600160c01b8760a001516001600160801b031683614892565b612a58565b612a58818760a001516001600160801b0316600160c01b614892565b935050612adc565b5f612a796001600160a01b03831680600160401b614892565b905085602001516001600160a01b0316865f01516001600160a01b031610612abc57612ab7600160801b8760a001516001600160801b031683614892565b612ad8565b612ad8818760a001516001600160801b0316600160801b614892565b9350505b50505b86515f9015801590612af2575087518210155b15612d5357602084015160408086015190516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015612b45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b6991906156f6565b90505f8089606001516001600160a01b031663128acb08876040015188602001516001600160a01b0316895f01516001600160a01b031610612bad8e5f015161493c565b612bb69061594a565b8a602001516001600160a01b03168b5f01516001600160a01b031610612bfa57612bf5600173fffd8963efd1fc6a506488495d951d5263988d26615964565b612c0a565b612c0a6401000276a3600161598b565b8b604051602001612c1b91906159ab565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401612c4a959493929190615a64565b60408051808303815f875af1158015612c65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c899190615a9e565b9150915085602001516001600160a01b0316865f01516001600160a01b031610612cbc5780612cb78361594a565b612cc6565b81612cc68261594a565b60208801516040808a015190516370a0823160e01b81526001600160a01b039182166004820152929a50612d08935086929116906370a0823190602401612364565b92505f8311612d495760405162461bcd60e51b815260206004820152600d60248201526c1b9bc81d1bdad95b9cc81bdd5d609a1b60448201526064016101b6565b8297505050612f7b565b602084015160408086015190516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015612da1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc591906156f6565b606089015160408601516020870151875160a08901519495505f9485946001600160a01b039081169463128acb089490939082169116109081612e2657612e21600173fffd8963efd1fc6a506488495d951d5263988d26615964565b612e36565b612e366401000276a3600161598b565b8b604051602001612e4791906159ab565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401612e76959493929190615a64565b60408051808303815f875af1158015612e91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eb59190615a9e565b9150915085602001516001600160a01b0316865f01516001600160a01b031610612ee85780612ee38361594a565b612ef2565b81612ef28261594a565b60208801516040808a015190516370a0823160e01b81526001600160a01b039182166004820152929a50612f34935086929116906370a0823190602401612364565b92505f8311612f755760405162461bcd60e51b815260206004820152600d60248201526c1b9bc81d1bdad95b9cc81bdd5d609a1b60448201526064016101b6565b82975050505b87602001516132015783602001516001600160a01b03165f80516020615c528339815191526001600160a01b0316146130405760208401516040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015612ff6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061301a91906156f6565b9050801561303e5761303e85602001515f80516020615c528339815191528361449c565b505b6040516370a0823160e01b81523060048201525f905f80516020615c52833981519152906370a0823190602401602060405180830381865afa158015613088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ac91906156f6565b9050801561310e57604051632e1a7d4d60e01b8152600481018290525f80516020615c5283398151915290632e1a7d4d906024015f604051808303815f87803b1580156130f7575f80fd5b505af1158015613109573d5f803e3d5ffd5b505050505b613122818a61010001518b60e0015161384c565b8096506131b78a5f8151811061313a5761313a61564f565b60209081029190910101516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613188573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131ac91906156f6565b60c087015190614483565b60408051828152602081018a90529081018890529098507f9f849d23f4955d98202378ea318f2b0c7533695d3c9fb2a3931f0f919fa8c4209060600160405180910390a1506133de565b83516001600160a01b03165f80516020615c52833981519152146132ac5783516040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613264573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328891906156f6565b905080156132aa5784516132aa905f80516020615c528339815191528361449c565b505b6040516370a0823160e01b81523060048201525f905f80516020615c52833981519152906370a0823190602401602060405180830381865afa1580156132f4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061331891906156f6565b9050801561337a57604051632e1a7d4d60e01b8152600481018290525f80516020615c5283398151915290632e1a7d4d906024015f604051808303815f87803b158015613363575f80fd5b505af1158015613375573d5f803e3d5ffd5b505050505b613384478561574b565b60408051828152602081018a90529081018890529098507f9f849d23f4955d98202378ea318f2b0c7533695d3c9fb2a3931f0f919fa8c4209060600160405180910390a16133dc888a61010001518b60e0015161384c565b505b5f871161341e5760405162461bcd60e51b815260206004820152600e60248201526d1b9bc81b5bdb995e481cdc195b9d60921b60448201526064016101b6565b505050509250925092565b5f82158061344c5750818361343e828261575e565b925061344a9083615789565b145b613454575f80fd5b92915050565b5f6134658284615789565b9392505050565b60606002845110156134905760405162461bcd60e51b81526004016101b690615ac0565b83516001600160401b038111156134a9576134a961517b565b6040519080825280602002602001820160405280156134d2578160200160208202803683370190505b5090508481600183516134e5919061574b565b815181106134f5576134f561564f565b6020026020010181815250505f60018551613510919061574b565b90505b80156135d7575f806135628761352a60018661574b565b8151811061353a5761353a61564f565b60200260200101518885815181106135545761355461564f565b6020026020010151886149a9565b9150915061359a84848151811061357b5761357b61564f565b602002602001015183838987600114613594575f614a6e565b89614a6e565b846135a660018661574b565b815181106135b6576135b661564f565b602002602001018181525050505080806135cf90615ae6565b915050613513565b50949350505050565b5f805b600185516135f1919061574b565b81101561382f575f8086838151811061360c5761360c61564f565b60200260200101518784600161362291906157a8565b815181106136325761363261564f565b6020026020010151915091505f6136498383614baf565b5090505f613658878585613c59565b90505f805f836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613699573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136bd9190615b11565b506001600160701b031691506001600160701b031691505f80866001600160a01b0316896001600160a01b0316146136f65782846136f9565b83835b6040516370a0823160e01b81526001600160a01b038981166004830152929450909250613734918491908c16906370a0823190602401612364565b94506137428583838f614bdf565b9a50505050505f80846001600160a01b0316876001600160a01b03161461376a57885f61376d565b5f895b915091505f60028d51613780919061574b565b891061378c578b6137ad565b6137ad8b888f61379d8d60026157a8565b81518110611a1b57611a1b61564f565b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0386169063022c0d9f906137ee9086908690869060248101615b5d565b5f604051808303815f87803b158015613805575f80fd5b505af1158015613817573d5f803e3d5ffd5b50506001909a0199506135e398505050505050505050565b509392505050565b5f8183106138455781613465565b5090919050565b5f61385d6103e861048d8686613429565b90505f61387f61387883600154614cfe90919063ffffffff16565b4790614483565b905080156138aa57600a8110156138a05761389a8282614cfe565b506138aa565b6138aa33826138fd565b6001546138b79083614cfe565b600155604080518381523360208201529081018490527f72015ace03712f361249380657b3d40777dd8f8a686664cab48afd9dbbe4499f906060016115b4565b50505050565b604080515f808252602082019092526001600160a01b0384169083906040516139269190615b93565b5f6040518083038185875af1925050503d805f8114613960576040519150601f19603f3d011682016040523d82523d5f602084013e613965565b606091505b50509050806139c25760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016101b6565b505050565b60606002835110156139eb5760405162461bcd60e51b81526004016101b690615ac0565b82516001600160401b03811115613a0457613a0461517b565b604051908082528060200260200182016040528015613a2d578160200160208202803683370190505b509050838160018351613a40919061574b565b81518110613a5057613a5061564f565b6020026020010181815250505f60018451613a6b919061574b565b90505b801561382f575f80613abd86613a8560018661574b565b81518110613a9557613a9561564f565b6020026020010151878581518110613aaf57613aaf61564f565b6020026020010151876149a9565b91509150613ae6848481518110613ad657613ad661564f565b6020026020010151838388614d17565b84613af260018661574b565b81518110613b0257613b0261564f565b60200260200101818152505050508080613b1b90615ae6565b915050613a6e565b6060600283511015613b475760405162461bcd60e51b81526004016101b690615ac0565b82516001600160401b03811115613b6057613b6061517b565b604051908082528060200260200182016040528015613b89578160200160208202803683370190505b50905083815f81518110613b9f57613b9f61564f565b6020026020010181815250505f5b60018451613bbb919061574b565b81101561382f575f80613bff868481518110613bd957613bd961564f565b602002602001015187856001613bef91906157a8565b81518110613aaf57613aaf61564f565b91509150613c28848481518110613c1857613c1861564f565b6020026020010151838388614bdf565b84613c348560016157a8565b81518110613c4457613c4461564f565b60209081029190910101525050600101613bad565b5f805f613c668585614baf565b90925090506001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d03613d4957735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8282604051602001613cb7929190615bae565b60405160208183030381529060405280519060200120604051602001613d2a9291906001600160f81b0319815260609290921b6001600160601b031916600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604051602081830303815290604052805190602001205f1c92506140f7565b6001600160a01b0386167368b3465833fb72a70ecdf485e0e4c7bd8665fc4503613dbc57731f98431c8ad98523631ae4a59f267346ea31f9848282604051602001613d95929190615bae565b60405160208183030381529060405280519060200120604051602001613d2a929190615bd0565b6001600160a01b03861673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f03613e7b5773c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8282604051602001613e08929190615bae565b60405160208183030381529060405280519060200120604051602001613d2a9291906001600160f81b0319815260609290921b6001600160601b031916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b03861673eff92a263d31888d860bd50809a8d171709b7b1c03613f3a57731097053fd2ea711dad45caccc45eff7548fcb3628282604051602001613ec7929190615bae565b60405160208183030381529060405280519060200120604051602001613d2a9291906001600160f81b0319815260609290921b6001600160601b031916600183015260158201527f57224589c67f3f30a6b0d7a1b54cf3153ab84563bc609ef41dfb34f8b2974d2d603582015260550190565b6001600160a01b0386167303f7724180aa6b939894b5ca4314783b0b36b32903613ff95773115934131916c8b277dd010ee02de363c09d037c8282604051602001613f86929190615bae565b60405160208183030381529060405280519060200120604051602001613d2a9291906001600160f81b0319815260609290921b6001600160601b031916600183015260158201527f65d1a3b1e46c6e4f1be1ad5f99ef14dc488ae0549dc97db9b30afe2241ce1c7a603582015260550190565b6001600160a01b038616730c17e776cd218252adfca8d4e761d3fe757e9778036140b8577335113a300ca0d7621374890abfeac30e88f214b18282604051602001614045929190615bae565b60405160208183030381529060405280519060200120604051602001613d2a9291906001600160f81b0319815260609290921b6001600160601b031916600183015260158201527f49d9acd3e20042617be7e378294c731749bc579b09dfd560cd3357445ce0b9e9603582015260550190565b60405162461bcd60e51b8152602060048201526014602482015273149bdd5d195c881b9bdd081cdd5c1c1bdc9d195960621b60448201526064016101b6565b50509392505050565b5f5b60018451614110919061574b565b8110156115bd575f8085838151811061412b5761412b61564f565b60200260200101518684600161414191906157a8565b815181106141515761415161564f565b6020026020010151915091505f6141688383614baf565b5090505f886141788660016157a8565b815181106141885761418861564f565b602002602001015190505f80836001600160a01b0316866001600160a01b0316146141b457825f6141b7565b5f835b915091505f60028b516141ca919061574b565b88106141d657896141e7565b6141e789878d61379d8c60026157a8565b90506141f4898888613c59565b6001600160a01b031663022c0d9f8484845f6040519080825280601f01601f191660200182016040528015614230576020820181803683370190505b506040518563ffffffff1660e01b81526004016142509493929190615b5d565b5f604051808303815f87803b158015614267575f80fd5b505af1158015614279573d5f803e3d5ffd5b505060019099019850614102975050505050505050565b5f826001600160a01b0316846001600160a01b031611156142af579192915b826001600160a01b0316846001600160a01b0316106142cc575f80fd5b604080516001600160a01b03808716602083015285169181019190915262ffffff83166060820152731f98431c8ad98523631ae4a59f267346ea31f9849060800160405160208183030381529060405280519060200120604051602001614334929190615bd0565b60408051601f198184030181529190528051602090910120949350505050565b804710614457576001600160a01b0384165f80516020615c5283398151915203614457575f80516020615c528339815191526001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b1580156143be575f80fd5b505af11580156143d0573d5f803e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b0386166004820152602481018590525f80516020615c52833981519152935063a9059cbb925060440190506020604051808303815f875af115801561442d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061445191906157bb565b506138f7565b306001600160a01b0384160361447757614472848383614e47565b6138f7565b6138f784848484614f56565b5f8261448f838261574b565b9150811115613454575f80fd5b6040805160028082526060820183525f9260208301908036833701905050905083815f815181106144cf576144cf61564f565b60200260200101906001600160a01b031690816001600160a01b03168152505082816001815181106145035761450361564f565b60200260200101906001600160a01b031690816001600160a01b0316815250506145588430614552737a250d5630b4cf539739df2c5dacb4c659f2488d855f81518110611a0057611a0061564f565b85614354565b6115bd8130737a250d5630b4cf539739df2c5dacb4c659f2488d6135e0565b5f805f8360020b1261458c578260020b614593565b8260020b5f035b9050620d89e88111156145b9576040516333a3bdff60e21b815260040160405180910390fd5b5f816001165f036145ce57600160801b6145e0565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615614614576ffff97272373d413259a46990580e213a0260801c5b6004821615614633576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615614652576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615614671576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615614690576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156146af576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156146ce576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156146ee576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561470e576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561472e576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561474e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b61100082161561476e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b61200082161561478e576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156147ae576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156147ce576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156147ef576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561480f576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561482e576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561484b576b048a170391f7dc42444e8fa20260801c5b5f8460020b131561486a57805f198161486657614866615775565b0490505b64010000000081061561487e576001614880565b5f5b60ff16602082901c0192505050919050565b5f80805f19858709858702925082811083820303915050805f036148c6575f84116148bb575f80fd5b508290049050613465565b8084116148d1575f80fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6001600160ff1b038211156149a55760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016101b6565b5090565b5f805f6149b68686614baf565b5090505f806149c6868989613c59565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614a01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a259190615b11565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b031614614a5c578082614a5f565b81815b90999098509650505050505050565b5f808611614abe5760405162461bcd60e51b815260206004820152601a60248201527f494e53554646494349454e545f4f55545055545f414d4f554e5400000000000060448201526064016101b6565b5f85118015614acc57505f84115b614ae85760405162461bcd60e51b81526004016101b690615c21565b5f614af9612710611f59888a613429565b90507310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b0385161480614b42575073eff92a263d31888d860bd50809a8d171709b7b1c6001600160a01b038516145b15614b80575f614b61614b57856126f761574b565b611f59888b614483565b9050614b786001614b728385615789565b90614cfe565b925050614ba5565b5f614b90614b57856126f261574b565b9050614ba16001614b728385615789565b9250505b5095945050505050565b5f80826001600160a01b0316846001600160a01b031610614bd1578284614bd4565b83835b909590945092505050565b5f808511614c2f5760405162461bcd60e51b815260206004820152601960248201527f494e53554646494349454e545f494e5055545f414d4f554e540000000000000060448201526064016101b6565b5f84118015614c3d57505f83115b614c595760405162461bcd60e51b81526004016101b690615c21565b5f7310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b0384161480614ca1575073eff92a263d31888d860bd50809a8d171709b7b1c6001600160a01b038416145b15614cb957614cb2866126f7613429565b9050614cc8565b614cc5866126f2613429565b90505b5f614cd38286613429565b90505f614ce683614b7289612710613429565b9050614cf28183615789565b98975050505050505050565b5f82614d0a83826157a8565b9150811015613454575f80fd5b5f808511614d675760405162461bcd60e51b815260206004820152601a60248201527f494e53554646494349454e545f4f55545055545f414d4f554e5400000000000060448201526064016101b6565b5f84118015614d7557505f83115b614d915760405162461bcd60e51b81526004016101b690615c21565b5f614da2612710611f598789613429565b90507310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b0384161480614deb575073eff92a263d31888d860bd50809a8d171709b7b1c6001600160a01b038416145b15614e1a575f614e016126f7611f59878a614483565b9050614e126001614b728385615789565b9250506135d7565b5f614e2b6126f2611f59878a614483565b9050614e3c6001614b728385615789565b979650505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f92839290871691614ea29190615b93565b5f604051808303815f865af19150503d805f8114614edb576040519150601f19603f3d011682016040523d82523d5f602084013e614ee0565b606091505b5091509150818015614f0a575080511580614f0a575080806020019051810190614f0a91906157bb565b6115bd5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016101b6565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f92839290881691614fb99190615b93565b5f604051808303815f865af19150503d805f8114614ff2576040519150601f19603f3d011682016040523d82523d5f602084013e614ff7565b606091505b509150915081801561502157508051158061502157508080602001905181019061502191906157bb565b6150795760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016101b6565b505050505050565b5f8083601f840112615091575f80fd5b5081356001600160401b038111156150a7575f80fd5b6020830191508360208260051b85010111156150c1575f80fd5b9250929050565b6001600160a01b03811681146150dc575f80fd5b50565b5f805f805f805f805f60e08a8c0312156150f7575f80fd5b89356001600160401b038082111561510d575f80fd5b6151198d838e01615081565b909b50995060208c0135915080821115615131575f80fd5b5061513e8c828d01615081565b90985096505060408a0135615152816150c8565b989b979a5095989497966060860135965060808601359560a0810135955060c001359350915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156151b7576151b761517b565b604052919050565b5f6001600160401b038211156151d7576151d761517b565b5060051b60200190565b5f82601f8301126151f0575f80fd5b81356020615205615200836151bf565b61518f565b8083825260208201915060208460051b870101935086841115615226575f80fd5b602086015b8481101561524b57803561523e816150c8565b835291830191830161522b565b509695505050505050565b80151581146150dc575f80fd5b5f805f805f805f805f805f6101608c8e03121561527e575f80fd5b8b356001600160401b03811115615293575f80fd5b61529f8e828f016151e1565b9b505060208c0135995060408c0135985060608c0135975060808c0135965060a08c0135955060c08c01356152d381615256565b8095505060e08c013593506101008c013592506101208c013591506101408c013590509295989b509295989b9093969950565b5f805f805f8060c0878903121561531b575f80fd5b8635955060208701359450604087013593506060870135925060808701356001600160401b038082111561534d575f80fd5b6153598a838b016151e1565b935060a089013591508082111561536e575f80fd5b5061537b89828a016151e1565b9150509295509295509295565b5f805f805f805f805f806101408b8d0312156153a2575f80fd5b8a356001600160401b038111156153b7575f80fd5b6153c38d828e016151e1565b9a505060208b0135985060408b0135975060608b0135965060808b0135955060a08b01356153f081615256565b999c989b5096999598949794965050505060c08301359260e08101359261010082013592506101209091013590565b5f82601f83011261542e575f80fd5b8135602061543e615200836151bf565b8083825260208201915060208460051b87010193508684111561545f575f80fd5b602086015b8481101561524b5780358352918301918301615464565b5f805f805f805f805f6101208a8c031215615494575f80fd5b893561549f816150c8565b985060208a01356154af816150c8565b975060408a01356154bf816150c8565b965060608a01356154cf816150c8565b955060808a0135945060a08a0135935060c08a01356154ed816150c8565b925060e08a01356001600160401b03811115615507575f80fd5b6155138c828d0161541f565b9250506101008a013590509295985092959850929598565b5f805f805f8060c08789031215615540575f80fd5b863561554b816150c8565b9550602087013561555b816150c8565b9450604087013561556b816150c8565b9350606087013561557b816150c8565b92506080870135915060a08701356001600160401b0381111561559c575f80fd5b61537b89828a0161541f565b5f805f80606085870312156155bb575f80fd5b843593506020850135925060408501356001600160401b03808211156155df575f80fd5b818701915087601f8301126155f2575f80fd5b813581811115615600575f80fd5b886020828501011115615611575f80fd5b95989497505060200194505050565b60208082526015908201527410da185a5b8814994b5bdc99c819195d1958dd1959605a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252601c908201527f4e6f7420656e6f7567682045544820666f72206d696e65722074697000000000604082015260600190565b602080825260159082015274139bdd08195b9bdd59da081d1bdad95b9cc81bdd5d605a1b604082015260600190565b602080825260139082015272151bdbc81b585b9e481d1bdad95b9cc81bdd5d606a1b604082015260600190565b5f60208284031215615706575f80fd5b5051919050565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561345457613454615737565b808202811582820484141761345457613454615737565b634e487b7160e01b5f52601260045260245ffd5b5f826157a357634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561345457613454615737565b5f602082840312156157cb575f80fd5b815161346581615256565b634e487b7160e01b5f52600160045260245ffd5b5f805f805f8060c087890312156157ff575f80fd5b863561580a816150c8565b9550602087013561581a816150c8565b9450604087013561582a816150c8565b9350606087013561583a816150c8565b9250608087013561584a816150c8565b8092505060a087013590509295509295509295565b5f6020828403121561586f575f80fd5b815162ffffff81168114613465575f80fd5b5f60208284031215615891575f80fd5b8135613465816150c8565b805161ffff811681146158ad575f80fd5b919050565b5f805f805f805f60e0888a0312156158c8575f80fd5b87516158d3816150c8565b8097505060208801518060020b81146158ea575f80fd5b95506158f86040890161589c565b94506159066060890161589c565b93506159146080890161589c565b925060a088015160ff81168114615929575f80fd5b60c089015190925061593a81615256565b8091505092959891949750929550565b5f600160ff1b820161595e5761595e615737565b505f0390565b6001600160a01b0382811682821603908082111561598457615984615737565b5092915050565b6001600160a01b0381811683821601908082111561598457615984615737565b5f6101008201905060018060a01b038084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401525060a083015160a083015260c083015160c083015260e0830151151560e083015292915050565b5f5b83811015615a31578181015183820152602001615a19565b50505f910152565b5f8151808452615a50816020860160208601615a17565b601f01601f19169290920160200192915050565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a0608082018190525f90614e3c90830184615a39565b5f8060408385031215615aaf575f80fd5b505080516020909101519092909150565b6020808252600c908201526b0929cac82989288bea082a8960a31b604082015260600190565b5f81615af457615af4615737565b505f190190565b80516001600160701b03811681146158ad575f80fd5b5f805f60608486031215615b23575f80fd5b615b2c84615afb565b9250615b3a60208501615afb565b9150604084015163ffffffff81168114615b52575f80fd5b809150509250925092565b84815283602082015260018060a01b0383166040820152608060608201525f615b896080830184615a39565b9695505050505050565b5f8251615ba4818460208701615a17565b9190910192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160f81b0319815260609290921b6001600160601b031916600183015260158201527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54603582015260550190565b602080825260169082015275494e53554646494349454e545f4c495155494449545960501b60408201526060019056fe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2a2646970667358221220743c8892851ac9b13e466532e3ac230413800df85301b7404b7ea95484eb2c4a64736f6c634300081700330605581e03ae88d60ce5722ba4d45bad2212f1c19dbc045e025144e80b926be7b3400701195ca705581e035f517349c69668843e7b5ebd815ad1205dadeede0831b55f80a5552820040103f693203bcd1962bbac5a3c4d08f7db978e02899ebd2f3a41f5be1702dd265e3f0219fd4d036cf48af9ce5bbf5d3c4d8679a22d6dc4ce50f2460e589be9b4eef3c3b296ac09034c387cc134b025bc72580db4a32e6f93eb6cff1f632cc031116863918672ea6d03aec6040e90b5e1939362f47cfe1b75fc6afc77ed285efbf31d37f66c8c73c8390366dd5a8943fa2e34afdd38a7e29f9b5a260c6aa866bef41848cc9e846278fd0803ec8dcfeb7af17e68816e778c606f011814c881a7ca0420db53979a560445b66003e8658b485991901a3388ac76de1a80ab3c3fe1cef9b781995ceb1e554138717103f274ba96d638a0f12fb0ece331da8b8bfbebde904e8c235ac7a6587a1e8ce1d60219ffff03f1da45c57c01d4f8bc8bd6c9bc6393e84372cfe0f58d59c4d89d45eb6384462203346b8a0a99c4ba441015c58299e81089a9b802b1255390b29c412ca1a12bb86503c55cc21f1e0b7ed64a4d3242270c11fd47d3f4a1cfde25e9687aed1f3d3fb7ad03eb45196994cb6827f64c63e12ae4c35fa30847adc8dac3dfd0d17444cb7e27460219ffff033ea37b4bc18ff0c8c1d4c6eba7ac89a5659ece6afa749617199d93dac0e57f8b031167476f34c04d2d2a1d063e633a9b976d734c6ce3b9aa78f54d772292cb7880036668221048b112a7543000f8295428ea4c6019668dbafa097054fbd35cf538ce03942446c6cf3bb9d492e6fe0d48eb500f03e6347f5da3842de17263cf1786166003d56e88c6f6a7ca937626c16d6bb9df0f72b871c9872a1f86cf5cc744565bfc3b030d933a399cb276af17886a28cbbae9d28561cbc70caf5e03adef1cf434ba86ea030b64ffeb2d73c8658b2f32d23c27c41434b84546c37f6c333fe83c489f052c2d0219ffff032a920fcec7ad7eaf3da21f74afd3eca01ba7ab3c5a978e777300a274a3bd1d2203dc21ea4894a17cb8f0a9e5c0c204c99080059cc2682e8a14c444dd7a53b5023903637df4de77435671cf15bd74dd44977f729aa956a2adef9d6f6f4156d5ba3de1037a1372027f775e5e20feb3b5c6ac3fc3a2d5bd7d4d3301a6797cdb6be9a6492203eadee423ae6a30aa34bf0d837a5ce95fda44aa80c8b092bbe9f78ce0b7241705034470d70e1a9f2a34078454b6ed0a60322dff81f416debb9d2bce3670c3af37800342befbc08e9fd98ae09d083baa646724cb427d58a8d03f5583fd1b8e0b7d254d03b113c8b01d890dc8a4069c34ad779b103a00cb8de02f240db781e00929d71b97033cb0316ffc5cdd9a69b57a3507b6b2420cb74d71b5ad7467a2d8d843d6c5062103a1b4328a38cfac9268faf280fc98bd0c0fa8574f07a1a3afa490d682916a974c03f3fcc742e1ba3a075b94ee89e3326a8ce7b25ee755b744797e27bc0cfa5ef17b03fd0284aaf80f26a314d965f927714102c04737bdd23701a3906de4bfe4de4fd203bb7673f584d9e797bd06344fafec5905507ee8baeb7ad66ce4ae49f37a3e0dd10372d59d1bb5ba502a8310d2a626d6b813ca380433f5419b3d2e734e39a565709d0354ac6fbf7b3633a66737869de6ecaec8f628d1831094be91c6f9951c2f1bf6c10219ffff03735679cda2399ba770a95ba2eec939f077a2a138ef29a62ec1f7f85be02c8b3d03e71d683987c8bab462f584bf46080780650fa506702756b021604a486311cc2d03665dba8379d0e8bbaa1e07b2397e57bbc17314dfbfb3782101be57aaae200ba803018d7267d3a0a8c6070f79f8c42468dc69f6c4899ac7c809bd356a3456c767f60309c52341c2ea613092fd07fe860b6ed3835e54d7c983ea3e8629f4730f2ab01f03393a490158ae5ca743df92d5668aa63a7576c7a8184d8fe26593df8295266c5f03e7c4611ca114168df06cf1807e024d84187bddc5143c5253a1a35acb628d9a4703ecc762b2f0b4ba9b9f2c7f8b0ca3a90ec70a8ec6d80f97202c3e6bd9f1564bb3031b5eca64c3a92e360845c85fe17279d0b81f22da61902bc43d24814ce40f63480399819b79aa9f27c6fd6ae6e2ccfb5872420ba00bad60ee8ff4618422c65011b70219ffff035c72a5b8df6d140b2375c72cac1c4e7881e210d87fe2c87730eb741a17a77d7303905928e185f123232c8c7261b02971dab40ed8e82da5c7a6b15391d3f069403c030bd78f252075f21349d67e3327473579bde5d2acc634ab78a91e79b646746e080399a32d53de3b2f35d769d5b1c4dc76301ed21ce83465e20110fff41ae5b9a8f6032e21e312e91ad7e9d49fe1ba481bfdf70c1fbb49fa03e9d8ce4a82e3c4b5c7b30341a81b27db19ddb1213831bb5cd6b590cf695f321c550f41d455f1b34c199c7a031d66064ee221ce4b3203bbdc0aabd875e2c4fdb789b5f5a61ab0750e3b959194034990e84322e8a1f997bc3b4808f72fee14a893b0c829322f28eecbc0b8ad638c03cf4568c6936b516d41400e0e11cc45d9b0f81a5493080b766305f9aa5959c01103454e866cd0ab911708b1c91e64ad2b97db195f1fe54bf745590b54218f89638e03f1d5ff12623b88e84b2add4e2db8bc622ee888fcc7b185f2581afd8029fe78d5030ce8f42b55e2ea45b52bb0bd7e05d11fb2e1ea1519a05eacf20854cba023f533038f9737d46f65365b46069f3fc22802377e9b61a4872d49e6e00e184d85d16fb0034b19b564ee45e9185490014a4ee16b43dc439d9015426e17fd50e92bf5e866640310ddce46903b3b0b8189d497261fea503471caf88643f4e1f726d880efbbbfaa03965da42acbedae7c965766b94a0193058f482c35ef57423bd68615af8d4b57f10375bd09ae24f56000053686e9f3a867bc53a495d6be7d3ff56ee234cf92192a0303e46f4db1633764b2a6077603a107cb73009d73a677ce7fde14f22a31b9c646fb03b8f7efd3098f280d4c17614060db426eb788d6ea49924918d4225394c83d8cd1034d0daae0cd47b570caf372cc2cfd7fbf5e71b9df1564991394bb9edb7114864503e9cb8c0e0d19329b5e232da4daa112c63da5b4f74859b35797fabc776fa5a3450305cdd717d655902fc921df296e863a7f4000962d18e79bf5bbb5009e1385bab00335ab2dcea26a7a1dea24c18d7dff4b4239977fc6fcd7cbe0e9dd047323a745ca03203db6f69a8ee4c323ed8056da115dc9da6558b3300be2512a9f58d234e50c7403eeeb77529480b032b76ab3271179724ffc4520917fa8950ec9f974a60e3f7ff803a25192e64f727de2f50934985afbee7ac7effba582ab669b12157d3e494fcc45037bedb346c6de914b136ac09c6877c0820b689567f23dcfd7f2ce2a8a4520ff8603908d912c1b509820efe4607bef4463c0347b5d4cda2a4cdbafa3a88c959c624703688354a1e85a8a186ae6e881f2c1c83c7f99470b4ea8ce301074d89660cafd35037efd37571911580076cea911cddbf4d16a6b475a3e37ea084e717ffc04fe6add032031ac15c31e6b72f2561e974bdaace2b18f5ac67db7bf328f567767627d8cce0356ee30f29377dd0bf2c83d72bf759d3a63246fa90e03f65c864bd13e5cf25ee403f55981fb71e58799afe2fd5fb907dc0d0b24052ad552b770f3310b7ddc12f27703a0854707ecc0abdb75020ed2dce429e1786054a44f832bc59a13ab802f7cc925035fdb5b525336196e741576eeec7f4d7aa5bf1ce2d3d248768327ac5e107feaf903cc0ef8701b1ee3e5f8fb5156a8a6a6997f1314ade00b95aad0e57eb8225d98cf038648170679b8fca45120e6350eff29915ca1711a7116ec3fb2869efb3c63ee43034575afeab279534e8792828438ed135a56c875c09d0b3fea7f99840e8bb1a81905581e03861256bc430a7d76c124258551957f339ba0edbd3f4d5b692b5f7cce400c02467a6a2b5f02e805581e03f3875dcbc5783835dc6682d990c44e394b1a1d0d2f3a56a74d8f66496008480de23ca122bec40005581e032625892a32fd2ada575bde80f2dca9e28dfaf0b6feac08e7eb4d8af560040205581e03d569b8e0dfdd1b88f1e60d86ee1f7a8e6f838188564bc8a3b88c1514b0040405581e03786fe573a7611f61fc6214e2be41183b47551bd0c11383d07accd3f1a0084801b10bcae6d91600021919b10390572b0396a1f40ae9189362c57f73dce6d7368ed7d5468bf5f0b0af06bd787303fb5dc0ee7dcf373c536d7113bdb20a5312a30eb9f754d823e856f3f83fa125e503e22712db2102e3ca381e7f1fd521303d75c5f8bdf7d8e99ca9b6240e6f92bdf10219ffff0312ef95182a010f63c037bc5ef6c1edada9ce415b134a6e1adf350854e08cf4a3035e778f7669a42ae82a352f9af4f3b41c101d9eb6a27f339c0f1a9b7acc9852b2039337a9c3bc9ae2e76e91384c31736fdc26a8557c92afebd1938815d4b51978d003291bc35c5bb11dcf7f97da1c2ed0625620f750c27d0aac5ef22fec7634e8b54f0334ef646a608eec2d1d5057624beeb9aa262505160668fe557a5a4b6df8b9096203b14e559e722bac627754c0107c5b18cb8c5d8ef214421c8e1762c220c605329303ae9da8b9fb939d833a55f89cf9a6e64748de6bebb56c01fd1c3a1c26c13fa0b6038c3ba669eea4e60b096bb6062599855d3314d12a8e3b06533eefb5328e78ad130219ffff03226bc07a7cc8aea352cce49b4fd39d020684a1271c88be3aa3b03bab878fd051030586962dfc97fbe066a567d0b1388c20fcd6337fcb275db5db78050405b6d20f0328ba3d28d19bd8c0f0f0016d42133f16a6075c756b9f62712fa7e79a9d1695b103b8f8c6fa9ffaac2de69ddf9f6fe4944eca4eb330b9151a1bc3f69f15e8c0e5d10357fc85c0d5a5a5dacec8e7f7162c24cfe2baabf5c3d07f530e3cea6cd1ac1dd4039a9c45ef912d6d4c03246e84e1c19af508e2613ce61678303ad70e26f5408bf70219ffff0318d43e2a6b470b6a7435f4eae4d7819fa1f66e867c8a27a5442ee98c23e52a34038bda7b4f790cb7ff1861b19407f79b4b52e83ccd012cd9dec73a2f2097296d12037ece001af6626b48e63a0f5d1edb4f64d7ea556694c1151c25b9d3ceea8a04280369782b3fa9c58bfb9c7347c48069ab8063561113c776cabd179e41e2350f84ba039baf46cf56af0ef9d31f77aa778a93c2a131fb0e5b885a634f3c0cef7e2fd4ee036b97b4060da3b1e5c8b785165f2cb0e5bfd0430fbf0548ef3dae6b7aeba297bf032f71b5ce39aed3b63f4f0f089e5e21d227201b8b3a76bd06d34d8407219b7f6503ccec62ee6f67f930afcc0e9996e173589568eb54355b2a3e6ad18a36d5ce7755032276e5c6be2b8fd4327e0b405978eeeb081407fe81c59d3366a4818dab32e78503bcf7e9ca72eea0ba7eea71e7fa426a6e15dbfc4b845ca9f5311147c42c3dd81a03cde19ed13118ec034326156a535603fe3f69b6b50c54357aaf78cd9afffc932e031d03a9ece069167f8b41b18f2c94b4476c0b4529e7287990c98731645acc81680219ffff035c3f99bfb5712981c5a688b2da16749515f3f6ded477e364339b1e147de8f430035769eff213dbda1566c2943184fb815471d65b72c791eede6ad5b703ee634592031ff500b18ef3c07715f78824498a3c0737dc44bb995946f82b41a629159f1b6f0319bdabb5dea19cff6fde5587cd28bcd72ee5e4170ba24070f6a6002fdf731fa503f16b14175705ddb439a255c2c2803be1b25fdb87ae95216bcb7a610e9a9063360324394503bc7bab04c3ae1141256777ecfc42465d006ce4c09bf8ae3a0505fdec03fa0c79c692ca546e2bca4050d15dfb6fed2451e19ace6c8a45c256307152122403e9a87d7f00d36247214bac5ac23668bad58d0e703689a626311795ea662a8f0903d4d1eb3aa092873dfb631e9c717f85690d1cfe18f4f95b815fa1a034745b82fb0331f798882485ca8f70026b07efdfdfbc8a321ac2fef536a2e3d7a13fb2874cf603b222d031faf18b2125cfb48cd5b35bb5b07396f645d123f4e6d29ef8c3b364e80324bbfed77e3bf4d94330e8e7afd5f2f8415bef1985dcc285df500f1fdc7ca2ff03f4073a7a3f0aad3360bfa09da2901733b15821c3e6dc429c201067c58ff96994032c8ad7cb79bf584d41811b65276d3fffda3c3bbf8821db50ce3712de762c2dee03d46133d041ee62fa33bd9341c24169a7d41871b638e08d5999ebc590cc4b08ce03727540e192d1abdee75c4d04dcfe05141d896d4df59d1d3434b4e62d232930e903fc3f397b6c9586e93d73efe0120c7a6f97f23be88d6e8dd9c56e27bca9993dd20373f5e2c15353050277b3d28c14c3eaff37b6c52c7a598724ba1cd5029695f9d703a08979fc8d59e672f084440f9e2752b06bb7594dc4e52e2c043aa90f8ab19666039145679165c3a2ec4db63d803f3ae1f0195c02062cac214cca96e9e450af3aab05581e037a53550dc399a156d54347ef50def8f425931c331dd2b8e53442208bd0040205581e03480a7c8dda2f8d183a8e975e60aba0e1d6bb1ca841027528c06d0f21300c0146b5e620f78d4005581e0346dc4933acd0fe8c0d3469bdbbd7522c52de9cc1c803e0a5f70e312690040305581e0342a72fd9151705b181ebc17546587d9113d29b35e7b87d6e75d5bfd2200c044702801a77a2f94405581e03d51b7fdff2fbaff38b64ad1a59df11a34c66dc0a2c648297d12c9e56100c02470119782e133fb005581e037c48cf7dabeaebd595de1ae697978a8fd4ab361157ccd3094d19998f40040105581e03e00c26999ded424d15fa5b92552e0638e325d168d234595c98c3c721000c014703328b944c400003ce33220d5c7f0d09d75ceff76c05863c5e7d6e801c70dfe7d5d45d4c44e806540306b487d15c028b6df56c3ebb9b7086965eba3a240857a647faece2ff13269f2b05581e03e31911ffeab5320719c6d1778f576f6042a38712df31403962d169452007011bffffffffffffffff04590855608060405234801561001057600080fd5b506004361061007d5760003560e01c80638da5cb5b1161005b5780638da5cb5b146100ce578063aad0ae5b146100df578063c4d66de8146100f2578063f2fde38b1461010557600080fd5b80630a5ea4661461008257806312ec8dcc14610097578063715018a6146100c6575b600080fd5b6100956100903660046106f7565b610118565b005b6065546100aa906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b610095610198565b6033546001600160a01b03166100aa565b6100956100ed3660046106d5565b6101ce565b6100956101003660046106d5565b610244565b6100956101133660046106d5565b610321565b6065546001600160a01b031633146101775760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e417070726f76653a2041636365737320726573747269637465640060448201526064015b60405180910390fd5b8015610192576101926001600160a01b0385168484846103bc565b50505050565b6033546001600160a01b031633146101c25760405162461bcd60e51b815260040161016e9061079f565b6101cc6000610416565b565b6033546001600160a01b031633146101f85760405162461bcd60e51b815260040161016e9061079f565b606580546001600160a01b0319166001600160a01b03831690811790915560405181907ff213750e75b7d8975215501c91778a99d0e1d7e30453ea61619aba02b5e0d17d90600090a350565b600054610100900460ff1661025f5760005460ff1615610263565b303b155b6102c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161016e565b600054610100900460ff161580156102e8576000805461ffff19166101011790555b6102f0610468565b606580546001600160a01b0319166001600160a01b038416179055801561031d576000805461ff00191690555b5050565b6033546001600160a01b0316331461034b5760405162461bcd60e51b815260040161016e9061079f565b6001600160a01b0381166103b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161016e565b6103b981610416565b50565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261019290859061049f565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661048f5760405162461bcd60e51b815260040161016e906107d4565b610497610626565b6101cc61064d565b6104b1826001600160a01b031661067d565b6104fd5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640161016e565b600080836001600160a01b0316836040516105189190610764565b6000604051808303816000865af19150503d8060008114610555576040519150601f19603f3d011682016040523d82523d6000602084013e61055a565b606091505b5091509150816105ac5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640161016e565b80511561019257808060200190518101906105c79190610742565b6101925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161016e565b600054610100900460ff166101cc5760405162461bcd60e51b815260040161016e906107d4565b600054610100900460ff166106745760405162461bcd60e51b815260040161016e906107d4565b6101cc33610416565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906106b157508115155b949350505050565b80356001600160a01b03811681146106d057600080fd5b919050565b6000602082840312156106e757600080fd5b6106f0826106b9565b9392505050565b6000806000806080858703121561070d57600080fd5b610716856106b9565b9350610724602086016106b9565b9250610732604086016106b9565b9396929550929360600135925050565b60006020828403121561075457600080fd5b815180151581146106f057600080fd5b6000825160005b81811015610785576020818601810151858301520161076b565b81811115610794576000828501525b509190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea26469706673582212204145507bfa15500c0eee86c57c125e8500315ccc134912cdaa0914a0badb3f8d64736f6c634300080600330058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630410100582002a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a8254e1c7db7575babf0d3369835678ec9b7f15c0886b00582002f97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75470cbb871e8f30fc8ce23609e9e0ea87b6b222f58021980040219010405581e0364d11e8e3a1420889b55b40236f26171452fc5c2039b36c2ff7eebd1e0070119085505581e03c041a125d5bebf793e4fe76765079b1a6f58561779843267210dab21b00c044656385853200005581e0311f5442609a3d1c9d8b6fcd4116925086103aaa59609edf9372c61ebb00c014622f186d1abe60338d318867d6777429ae9d27eeb574a09ece60292650356363e87b497663cf7db05581e03a72e70a896c5e7e3fd73fc037f9e385a2ff1fcd346c335e8e608f124400c186d471f71d628f1f38803eea6e015c5abaf705debdb853983b714b38e22667b85ff6e05a2db41df0504dc01410f0219effd03a6843d794191119540d18dd93aa3f26f19ee6736289b1728bdb6fc94c6d01aef03f05b8be49c774ea5112ae2b06f09779a49dc595dcd4f90ee6c608aaee100ff3c03acec0c85618661dfc8a7474ffd8eed9c8015ffebd298a260dcd5646f746ac8f30375c93313558d212b012ba9de45416de8a868081a9b692dbe734dac81924addd40328fdc911f176342e62c4f6f5c116a9e9409782b874c181e4deb1363e3ef504f2035f71f76b8ff24905310063097922eb65d32443d0a72bafb3644e7c09a75d73d80375251b39dcf86fbedeb4f16acfa9a96fab03f908a387e2965a90759e8ffa218103b5d8a37ef68dac3b8812669b09392960fc92c87540cd6d61616a7e5e419e495b03dcfdd8ddac2f3c79a632c51a37e9ecf139707623464f7c4cfacb2751ed93e7e60368406e0b3ffe2c3b5a929555b32adfe58f3b85bafc33604e6997cb906673bb7803037103a8515f11e5164f6121e4b98403db352e195fe7d848c812690013d4c18c035c52f86143284b4ffb948c26902cfa5ac33408c4d653b07c7c9356fb4f91c2a903e7148db0ce78e416bd6927721e3beaa5e4c707f3eed4ab9b85d0718bf2c753a30219ffff03a71e294d2d02571517deb4634b261cae905d73885dbac3bb92b437783c03fad5034617a132fd46b0746a642477af55f04d508bf633624ff3a24f92026c42ce5ef703ea8a32a0892cc9162a190dc9557003262a033d6cecd61792656fddb656611905032d815036f3b9c8a7899fc31cabb7d2a30ab09240bb7716a89923847d4692b2e8038170d98859c3e5afaf9382d4ad20f0f0667e474944a816c579830bacd8ed136303fbb43df4eb9fd44f41e741253bb9f1cc03fc4337741529cbef6a90092571c01d035bcf85d3ff03edf81b1367adbc9cb9180d04c08712d7882900e508738fc3089b03e4dbf27791ed2eb9580d54e0c9966a86a290abaeb665c4e3ac7408a07c75f0b003fe736eaf793ce468af4bbb253c8c6309905baf6a0a385b7b1ffba78e72c632dd031eb5bba110765533307bc7844d2549f6aad55d2bdc4d01d704c819627c57bcc40321d1d474b26b89b2aef4d29af2209a8aedefd68060da4fa7134c42cbdcb5c8060385d0fb46317e8decc4c8a9b9396a2cc67b8d8d84951c8ca09916c2651be388080219ffff035900025946d281922a2a3144a22dad27408351e8d3cc81ef80e261b7ad787b1103fe05601ed45fca9fae57f5fde490f733dcc403cce9dfe6e11a6572dfdff55a4d0219ffff035693c2c1841cadcce6bbdf834b1eb0ab5b353a3a0e97227fb049ec9615da3abd0397a56b4955d6201ce452807a7090f7816d5b336774bddc884c2aa979709869fc033bb228620700ed48d7c6722b359bbccaf43843e4eec132e892c589906ba0e34d03208fa1a8cdb23079c52bc53a60e18fcfe50dba6434ae3b881dde353b4b6484630321e9ccdc9c7e8008bddda6018876a33a7fc099bb8a61ac0a6aea5b086047f48703e7d2807dff149f510f87e46de01df997829c73935301328346b0a99f5f04b49903d92232a1be23509197c762fc3ddc4e116af2b00d2b58fffac62b9a29722b2bbc0394b688a92a36ea0541f132f6b3a148f96b78c4e560857195771e40b6ebb98b96032b17c04a457e4b51f16b166eeb7d523c2d9914565fac05922f4e40996df8e8fd0304c46b43f6e10ecdc76a36a768bd1a5dbb2e839fc9b81d3b1905f4014b96225f0380e1582aa2c0269014764b12f00cfd4fb0de432c629108b4f39d16f06b63d68b037ab32135d12fbe72d13468e4a09ade0ca57073cf23eeb094492415d0603f5810039042a74959f462854170ee15ff86df9bd3cdea7b7e278007abc2ebe86b6e7a940219ffff0302ee6748e49feefcd81d7f36cbb0262dd5e253cb09e54b55f89f1bedc2081198037ced7ad4bb05522b0a843ff26d459a8b767e3eabf53c02f6bcd7f09329e2ca4f0381f33cd259fa3721eb9ee3ba328e2662fac73c608223755eb466211ce5cad314037e6b32d3fea0c44ad09041dc3bd7b8844556a358978e1990b35f6b4114665c12035adec0570b1e27de63def72581c89d2b637a660b41c9c4ecc6420a2215a1b3e4035da952844db89701769bacf14fc0318956bc954f6d3e56ea03c33deeb217be610320d471a4c51bda9f860a58db58e5fa40ee851c49de8b07b4a11c52853d9a7a5403b8a80c95d0bc8750735c278aadc0f99ce7abcb8aceeda2047eee7a8b7f89dceb03da6e9638370df8eea75bb2dda24b0da4f2ce74c11fd2af8d16c9e901c7ba96cc03ddefb159b278ad3fb41cd2980832af3cfee6b2e4989e00f69559d0ec14009bf503d342b74cdab6c920201ed43a009696450f0bd78270bc12483fd5dce8492fddc003d9dea40b85826d838afd593b8522829f92b39b2e200d46727dff2556ba97d7c203fa71c50f29c4c86af3617e3e49d01fe9d992839c22dd0e1f67bf5aaabfd0c97903a3fc42bf47045d0114f7cab5b152874e61d00db9daf556eb3e9cecae7c804890033ac9291c220ef9563b6fe0aa556902adb116236b3b499e4b9e1b2d4756476f40034a88fb904aa63c19ff6b92f1a1b7ae8a2cb3232ad3eb85266da1ef00027749e1030873e3808ad184715bbe3b68ac856d9c3b37a187e6d98e584251be1c71e6053f03a40c2194b288fd8373f20cbf63a30b712dfa6c6eb4be8f4d55170d1fde0092bc03b4daca7d995845477da69ae5bfe38f9c8efe98dd81aad0679ad02e4cc100e9ca0398eb3be1d07e74e56a38dd852a517f8627d4c3d8eaea366cb6ebea356659f1d6033b3b9e721e3706a59dffabeabe18561a7abfd200c90944f716f9d3f32e8735bd03758d97923b36ee90d1d726a0ca2941e7794fed165d1c15ec60b63f22586583b403c3313e2c86abebf00faef8000594fc94292e9d953054406e912ba0de562a1045034f6f06069510da768d3d1b765a255f73d7d721cdbb950cccd386da66411d00d803fde78858d765faac65e171d4d997f5a607c9fc7d2f57c1f356b6f9dee89b2819031b54fa51c8b98ace8b52dbb878e6f331913f0207320b4c17602c91a1ea241ebf03692b7aa1880b2fd3cb08a69fb170b955865c0ebe1fa8922bf18303bb7c0739de032683f4365950ab6078ca7dccfecdbd2cc7cf7d902353e26b26c4a9d2bcb727e4038a9deca6a56557b0f8a9a37e363b143791ce28d8ef86427540c607005058906b03163aa4972ecd867d23dfee8b0dc0a7f84dc5b802f239bc597388dc36fe1761e603a1337173b66588069b505117f2f6b03f2687decd611d23089cf266747a3d86a10326ba9631082b28e97a3d2c2d9ce796e2a7e99f0f981bc93223c9b48ba390cd13036eef6590e68a52f414e37daa1cda86067bd4a08f33ffdad65a56eb9d762a1cad032f429836817e5f030d88502f411733ff43cb87b34dc5aae7457447a17f5c870703f5ded695fd33a93686cd4af6e215da0c29a0c3b6a26fd4c42d04d4bd6bfa2ec303916e9b45c46253767d84dc2c538b2a4dbd513ac672874fc2a354fd77c6924a9c03b0b2bfaa982bfa0b74152f2488e9b9d32ff418e8890904dadb4210b9fb766cd603e2c01afb40a1bb4ccf9a79c4915eecbe587ae719c8fbe1f17e23ee0f7995f598037907fd5613aee26f32bc20daa1a7444a3d45422ec495e6ee41997e01dd56f8b403988210ffded5ffb34d5945c489523735955ff1f133794ce9de831ff2b55ee58103e63ca8ea36587045751cd52ff23f480cfd8bfb1df3c60e19e22b9391b1ee30350329f924759d52253b62c21e4b7dde3d0728014b21b292451c4918fad1f6bf46f303c4c062397f4ed5718992327cdb72794471e6da53e0c9fa6f7a0d40ab10845c92035e860bb2f34de14c371c11e22070be4b57ed2ace7a01a2bc4f6d5af79cf4496203f2732092af7bdeb2eda70c80e5784eb5f0ebc392a4a801b3caa70a971991f8c203a5f91fac66be92d9e4a883ed27f772d3213e414c49a338e143825c95ee7f5fda05581e0377e234d8a1d0c939f87874cfb86dfe782e023c206bfe4fbad9a3217240040105581e03471d189c4b053895c86042ac4f3df3293fb829e40af0d3a77e59e5e7d00c02443b9aca00031659de68e6a279da28599e113109376d848bf72a54b56d945750294b8c97e773030657e508cc6d404d8cc89513d451fab06b3288013a5753906560d9cbed22571f05581e0309f88ee63cf75e84a39c1be2be1a2cae55d179b8bdfd190a874eec787007011bffffffffffffffff05581e039d8fb44577e2daf690f073b13fda3e9530b8d7de93799939ee840128b00c0146045b423f9c0004592c1d608060405234801561001057600080fd5b50600436106101b95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a7146105da578063d505accf146105e2578063dd62ed3e14610640578063fff6cae91461067b576101b9565b8063ba9a7a5614610597578063bc25cf771461059f578063c45a0155146105d2576101b9565b80637ecebe00116100d35780637ecebe00146104d757806389afcb441461050a57806395d89b4114610556578063a9059cbb1461055e576101b9565b80636a6278421461046957806370a082311461049c5780637464fc3d146104cf576101b9565b806323b872dd116101665780633644e515116101405780633644e51514610416578063485cc9551461041e5780635909c0d5146104595780635a3d549314610461576101b9565b806323b872dd146103ad57806330adf81f146103f0578063313ce567146103f8576101b9565b8063095ea7b311610197578063095ea7b3146103155780630dfe16811461036257806318160ddd14610393576101b9565b8063022c0d9f146101be57806306fdde03146102595780630902f1ac146102d6575b600080fd5b610257600480360360808110156101d457600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff604083013516919081019060808101606082013564010000000081111561021857600080fd5b82018360208201111561022a57600080fd5b8035906020019184600183028401116401000000008311171561024c57600080fd5b509092509050610683565b005b610261610d57565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102de610d90565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b61034e6004803603604081101561032b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610de5565b604080519115158252519081900360200190f35b61036a610dfc565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61039b610e18565b60408051918252519081900360200190f35b61034e600480360360608110156103c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610e1e565b61039b610efd565b610400610f21565b6040805160ff9092168252519081900360200190f35b61039b610f26565b6102576004803603604081101561043457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610f2c565b61039b611005565b61039b61100b565b61039b6004803603602081101561047f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611011565b61039b600480360360208110156104b257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113cb565b61039b6113dd565b61039b600480360360208110156104ed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113e3565b61053d6004803603602081101561052057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113f5565b6040805192835260208301919091528051918290030190f35b610261611892565b61034e6004803603604081101561057457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356118cb565b61039b6118d8565b610257600480360360208110156105b557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118de565b61036a611ad4565b61036a611af0565b610257600480360360e08110156105f857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611b0c565b61039b6004803603604081101561065657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611dd8565b610257611df5565b600c546001146106f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55841515806107075750600084115b61075c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612b2f6025913960400191505060405180910390fd5b600080610767610d90565b5091509150816dffffffffffffffffffffffffffff168710801561079a5750806dffffffffffffffffffffffffffff1686105b6107ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612b786021913960400191505060405180910390fd5b600654600754600091829173ffffffffffffffffffffffffffffffffffffffff91821691908116908916821480159061085457508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b6108bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f556e697377617056323a20494e56414c49445f544f0000000000000000000000604482015290519081900360640190fd5b8a156108d0576108d0828a8d611fdb565b89156108e1576108e1818a8c611fdb565b86156109c3578873ffffffffffffffffffffffffffffffffffffffff166310d1e85c338d8d8c8c6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b1580156109aa57600080fd5b505af11580156109be573d6000803e3d6000fd5b505050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610a2f57600080fd5b505afa158015610a43573d6000803e3d6000fd5b505050506040513d6020811015610a5957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191955073ffffffffffffffffffffffffffffffffffffffff8316916370a0823191602480820192602092909190829003018186803b158015610acb57600080fd5b505afa158015610adf573d6000803e3d6000fd5b505050506040513d6020811015610af557600080fd5b5051925060009150506dffffffffffffffffffffffffffff85168a90038311610b1f576000610b35565b89856dffffffffffffffffffffffffffff160383035b9050600089856dffffffffffffffffffffffffffff16038311610b59576000610b6f565b89856dffffffffffffffffffffffffffff160383035b90506000821180610b805750600081115b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612b546024913960400191505060405180910390fd5b6000610c09610beb84600363ffffffff6121e816565b610bfd876103e863ffffffff6121e816565b9063ffffffff61226e16565b90506000610c21610beb84600363ffffffff6121e816565b9050610c59620f4240610c4d6dffffffffffffffffffffffffffff8b8116908b1663ffffffff6121e816565b9063ffffffff6121e816565b610c69838363ffffffff6121e816565b1015610cd657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e697377617056323a204b0000000000000000000000000000000000000000604482015290519081900360640190fd5b5050610ce4848488886122e0565b60408051838152602081018390528082018d9052606081018c9052905173ffffffffffffffffffffffffffffffffffffffff8b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600a81526020017f556e69737761702056320000000000000000000000000000000000000000000081525081565b6008546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000008304909116917c0100000000000000000000000000000000000000000000000000000000900463ffffffff1690565b6000610df233848461259c565b5060015b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610ee85773ffffffffffffffffffffffffffffffffffffffff84166000908152600260209081526040808320338452909152902054610eb6908363ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610ef384848461260b565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60055473ffffffffffffffffffffffffffffffffffffffff163314610fb257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c5460011461108457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611094610d90565b50600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905193955091935060009273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d602081101561113857600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d60208110156111db57600080fd5b505190506000611201836dffffffffffffffffffffffffffff871663ffffffff61226e16565b90506000611225836dffffffffffffffffffffffffffff871663ffffffff61226e16565b9050600061123387876126ec565b600054909150806112705761125c6103e8610bfd611257878763ffffffff6121e816565b612878565b985061126b60006103e86128ca565b6112cd565b6112ca6dffffffffffffffffffffffffffff8916611294868463ffffffff6121e816565b8161129b57fe5b046dffffffffffffffffffffffffffff89166112bd868563ffffffff6121e816565b816112c457fe5b0461297a565b98505b60008911611326576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612bc16028913960400191505060405180910390fd5b6113308a8a6128ca565b61133c86868a8a6122e0565b811561137e5760085461137a906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c5460011461146957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611479610d90565b50600654600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905194965092945073ffffffffffffffffffffffffffffffffffffffff9182169391169160009184916370a08231916024808301926020929190829003018186803b1580156114fb57600080fd5b505afa15801561150f573d6000803e3d6000fd5b505050506040513d602081101561152557600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8516916370a08231916024808301926020929190829003018186803b15801561159957600080fd5b505afa1580156115ad573d6000803e3d6000fd5b505050506040513d60208110156115c357600080fd5b5051306000908152600160205260408120549192506115e288886126ec565b600054909150806115f9848763ffffffff6121e816565b8161160057fe5b049a5080611614848663ffffffff6121e816565b8161161b57fe5b04995060008b11801561162e575060008a115b611683576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612b996028913960400191505060405180910390fd5b61168d3084612992565b611698878d8d611fdb565b6116a3868d8c611fdb565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8916916370a08231916024808301926020929190829003018186803b15801561170f57600080fd5b505afa158015611723573d6000803e3d6000fd5b505050506040513d602081101561173957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191965073ffffffffffffffffffffffffffffffffffffffff8816916370a0823191602480820192602092909190829003018186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d60208110156117d557600080fd5b505193506117e585858b8b6122e0565b811561182757600854611823906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b604080518c8152602081018c9052815173ffffffffffffffffffffffffffffffffffffffff8f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b6040518060400160405280600681526020017f554e492d5632000000000000000000000000000000000000000000000000000081525081565b6000610df233848461260b565b6103e881565b600c5460011461194f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654600754600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9485169490931692611a2b9285928792611a26926dffffffffffffffffffffffffffff169185916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6020811015611a1857600080fd5b50519063ffffffff61226e16565b611fdb565b600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611aca9284928792611a26926e01000000000000000000000000000090046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff8616916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b50506001600c5550565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b42841015611b7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e697377617056323a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff80891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015611cdc573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611d5757508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611dc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e415455524500000000604482015290519081900360640190fd5b611dcd89898961259c565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c54600114611e6657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611fd49273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015611edd57600080fd5b505afa158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b158015611f7a57600080fd5b505afa158015611f8e573d6000803e3d6000fd5b505050506040513d6020811015611fa457600080fd5b50516008546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166122e0565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b602083106120e157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016120a4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612143576040519150601f19603f3d011682016040523d82523d6000602084013e612148565b606091505b5091509150818015612176575080511580612176575080806020019051602081101561217357600080fd5b50515b6121e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f556e697377617056323a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b60008115806122035750508082028282828161220057fe5b04145b610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820382811115610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6dffffffffffffffffffffffffffff841180159061230c57506dffffffffffffffffffffffffffff8311155b61237757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f556e697377617056323a204f564552464c4f5700000000000000000000000000604482015290519081900360640190fd5b60085463ffffffff428116917c0100000000000000000000000000000000000000000000000000000000900481168203908116158015906123c757506dffffffffffffffffffffffffffff841615155b80156123e257506dffffffffffffffffffffffffffff831615155b15612492578063ffffffff16612425856123fb86612a57565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169063ffffffff612a7b16565b600980547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169290920201905563ffffffff8116612465846123fb87612a57565b600a80547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216929092020190555b600880547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff888116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008883168102919091177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612641908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054612683908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d602081101561278157600080fd5b5051600b5473ffffffffffffffffffffffffffffffffffffffff821615801594509192509061286457801561285f5760006127d86112576dffffffffffffffffffffffffffff88811690881663ffffffff6121e816565b905060006127e583612878565b90508082111561285c576000612813612804848463ffffffff61226e16565b6000549063ffffffff6121e816565b905060006128388361282c86600563ffffffff6121e816565b9063ffffffff612abc16565b9050600081838161284557fe5b04905080156128585761285887826128ca565b5050505b50505b612870565b8015612870576000600b555b505092915050565b600060038211156128bb575080600160028204015b818110156128b5578091506002818285816128a457fe5b0401816128ad57fe5b04905061288d565b506128c5565b81156128c5575060015b919050565b6000546128dd908263ffffffff612abc16565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054612915908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310612989578161298b565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546129c8908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081209190915554612a02908263ffffffff61226e16565b600090815560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6dffffffffffffffffffffffffffff166e0100000000000000000000000000000290565b60006dffffffffffffffffffffffffffff82167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841681612ab457fe5b049392505050565b80820182811015610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe556e697377617056323a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f494e5055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f4c4951554944495459556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4255524e4544556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a723158207dca18479e58487606bf70c79e44d8dee62353c9ee6d01f9a9d70885b8765f2264736f6c63430005100032032e2bc0c0ff22609eac8f10e1c8736f3e780dcb85055451e7ac674e2667ce4b570058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563048f9c610ebbc61159e00582103e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af051017712623e1bcef3779fa029d2e2f4c9d4005820026cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68854ee1c139ea09924a95b98b56a68efc1104f049f2100582002b661198733f53bb9b621ec808effd2e8a3d86db6962103738e13951e49aab048027f6bb06ff6bb0e0058200242acdcf31e478e05416ff0498747b1eafa6dded723cd84aa3fbaf351918e1b5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0219814000582002575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b582075a68b0fa4968ae75daab7bfd26f9ab84ab59f2c370a2bb03f935f76f2084074005820025a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a84ff26820becbb6cffeb183005372ad1400582002941fd76a619f3a67fa78ba1487c712734af6eab41dc9677b31f2061df8da265820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0219404400582103f6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c704101005821031f25289b5c9db29d46c3566463f71796d2e07c9a7a96a888214082f19288cd0048f746a53b4c6a56a800582002f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3582065cf607b00000000000215a2f25a7370a09800000000000078f317b5af08a25d0058200252222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f54c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20218480219f44505581e03d4635628fef027e57129bd3a095819ae66dbb21fb4a76125a74aae57d00701192c1d03ba69b6e13b06e84ce4faf381891057c2373b95161158cd388cde1468371b679003a730bf4ae8b8d79a8c09ab8d29b845fdd4c90f497f2b15089a8c5320d8cd7d9c03dc9634d9c39ab372aaf8be320e08b89f81ffa41da053dacdb5d6d9c25941f79805581e034591b5db0714bdb9feb551698706b0d8cff472f22c58bf09e6f6905d7007011bffffffffffffffff05581e03b1a88893bf611ec668150981b0b37067adaf203b9858aeed822c2d8c300c04473a8f8ca6524e2e05581e03e1c68af45e0c85feaf3a7e9fe92e28f05c39b3685484103358404cb2b00c0245e8d4a510010219a5f30312ec879be9c677e9cd8c58b81338a3c1f442a39534fa5a20480361821c674ebb03a9b19de15c2de2252a22b9b5d887c9c436742eb269eadc247209b24b4172bacf033506e714a4a01db4c0842dfa4660ff9461fa8dcd0016b355c697f5cff35e542a03325e7a922b7b10fd078dde633987d39d8f11d36c73c25772f0d9292ab0e9843203cf5e1050d248908b6c3f95dd3a9856e716780c8bbc1cedff515677287dcbaf480348e1ea176bc5ad367b7983a2ab37538560113be6bd6b6c4e4a5b64ee104f503f030f06198042726a04fefa7d9a78c2fb1cd58250947f8a622d64a00508e309035303c0a46a8f8e407587943847e371372bb9cd11dadd451a80c84fd172c729f931770386e834850f3cbf84fb35f9c43c8a4af6311c86416b751fb68441e720a454e6cd03e350976bf817e314e74655a286a781918c2e8fb14b93b1cae155199497c6086f0396f1f5d6b310c90daf49e363058565126fb58470cfbbdddd46281740a72fed6e03fef3723d9d6f88255fc973e1c05cf370e97c6b4ca4d817e246da14e2ba1f5165039926cd4851688a6aefcf632eb5c95972342d8043bfee4ed5ddb714ad545c7d8c0219ffff039ce82626dfccfdc04a23de94000cb7e7b5ff29196454a6d3f29d2f34ae3e1ee10300f8bc8529a658177b91483a8c20dd822882ffa84c2173b97f3c54c2e5aa5ab60219ffff03aa5b66c190b04ab77071f0af2a64d663196df1d4b0d26048c21be3431efbc4730353a2fb7a6edface47ef1d1e969afdbbcd75b98f9507b0573087ade8cfbcdbe6e0219ffff03097157d03fca75074a3dc93deb9dafc6342d7b715bfabf71fca899f08b2dd23a0326b342158886796927600e31784c379f8e1e7d1d67327d82bcad9078223b9b73038d77db4a697a0bedc7f67619e6733d2bcc034da5ebc15510c6a114a72b1d04f60219ffff03d0de2e180fff3a55c29c3f515a6018e7c3eb4c32a03ac92442e0d3f687d9b65103ecd7a4ac75cdf85fa4431962fd0f1983a089dc08696a3f2287706e19ace0f6c803f10900d6fdfb05ce1547c147e643ff12ebcea5741a819fb8145b517fcc18b23c0219ffff03878100c6c9978d175f775bc3ae266eb60efc6cfa774c2baa124921d393df04c203ca4eb829dcfaecec905c4f3aa891b389b10d22ed8cd6a945705ee096c7ba8b32035aef37e568230984375b8c038ae04b46877562d2cc4db86c07969dc12a79a68a034b965bdaab97431fb164f668dabd56f4023e5e8589626cca7e625cc85562bbd9038ce1019ba6386eeb4d667511780d27b81eae1c9e4fffe6a59ffd13a71b4d87ef03ac7bd0407d067c58ccb9e10b7c68e497286c6f5710e97b5f4fcbe2d6ae30c740030c91f514a6dc623b7cbb4d3a4fd91ad2827ba569fd6c109b05d8c48a7107155f031f8c7783ff88d7e710280676359dde9afc5b12e4b3ed612c160c36c477fc4f0103e4ce0629ccfa996c8f77b4b8bea1e0e14eeab7c0aeb5224c59531eeec9361c4503db0e5c1161a9ab04e3c80f8e69410bd456db47648ce65ba2524a153129e4ac2e033cb52f93ec611a8da0a05bea4c61653be3b5fee33b255f7c4a4a33d7a598f1fb03e574c20d5407882ea0826a1d6f23218fdcf684c872de8412ae633052ae679b7603c71c4f70e1fcb790d7ea148787479c232ce53786da5931662e3305295b7eda1303fc5d61ab5aea99e55b274ab21b6a194c669d11e6746d4fce409c60294b4bfb92031e1c8733fdd568cc4e51d07fffe8a54175ab5fd9e83375f11da2893ca7e1681b03f4fdc6d79030a30c431df4e85969ee99e6fd99b51342541e5a9801cba5281a870384d0a936894c155431dbf0bcaef8d4c58c66e0b68b2163a0defe33f2afc3d67603a8d4459a41a545aa37f1df4cd1e53dbdfccfe1b92739db8f0b507ba816ea71ab030b081eae3fcb2995062804dfe05064190e89879fe6a8358b7e0716883222b1e20373da16b5a11fd31f687468e7e437c0ce88ed2218ec87097fd68d12aecedbe82103458ae837264127bae70701a77efbd93777c4f2f964eb0ff8749febf21b08f30a03180409dbce0f471a844cde7655d95f99ce57465f2c9b3a3519f6ef0fdf1296ac032411ceacd5de7fcb10320f232f57522a65bdcf9a0367f17cd2a6f2134ab128b6037c229ffc216827e2e26285abdbb2aafec7f91c595696c56c788e8c9d6b378fb30314d17ef0919b0aa2c2c93f207d5eb384998bde11623ef29cb6c192db580c226e03e165e3f2145ad1b10898dbcd711b093702d032e174a5bfcff28e34c0a9915e7203d8a2a04978703613b39788713a45ce2347fe08f90b592b2fd0f77c782f3fd9cd03d142273a6a1c19cc86b6aedf3e313aca349ea9d25b1398b2f2f3cd1ace87667a033c7edaf4c8a204444d65b7f9acb35770d92fe09237a5018e699090ad0a187d4303d0cdbf72330850e1ea2eab63c2c486efa350a5af71292b89b52516ac046a335a03e60096b2ed0595435e292119086017532da0b5ceef785f0b34adce9b8cb383960309e7c17f44c6c75499f1bf67a2b9c9448ac5adae6221167115e0d9ce0e49f23503ec3f036e612279d24a3d407ca0ca1b8137a8d3d2098a5e66a8f214125b3a7f3503c6371abded603253ee4228bcea5add2a8b7400008cd2c7b5aa2ff3f4022f900f03cb803d44a46f933e524d11c4bc2f26aa300b0d2560dc348d3806cf00554f0569039583cb3595c1a6fbaa09a3ccd519076b7720661a4066f398865650ea5ae1896b031b229c9aa259eab43f0e90082bc8425f5e6c04c20e70999a2c9f48d7b72487cf03c67a043590d9eab3067a1c34a179e424063785319153efdc4afb6c94ed99c8c403a8e4a1de078a7ea7818384927df551760df45d456d2a5b9efc8d797378c7246903f0555de3a780a48be182cb3956f3972eaf5106a284c0a7d87c1f77ff3967285a03783780f3097d9d3b8d67969c62f43b69a1c1f7f8b5663c07a34a3780f8c5e29d03103aa12154c07d1154135f1fc68be927ab68f4d8d75b08258469719f378d35c803a40d312748d6b29a5f4d7dd517d1428e5eadb39832845c7993fe5e30384352eb037a4fda7eecbf10b451093aa7e2ad1ba546c4a311b9afa34602a683bfa6af4602037effdea2cbf5b602df64645f5b90f76cc0fa0bcf9b6b20d5148ec979986b066103974a3df45a37ad885cb8d634f3ed912a8487ff4289ce9f7bf69b9d008ee9a18903f27ee8ab8332ff77ad5487e6a9ad201754bc5b99429cd6829d48d57cd689a9d90355d40058e37fccd6ba820f57b8ba73329b414bef035b4b2fa58dcef21445079a036271b1db5ad4c0ad3f180eb86687dd406625ba472119ddaef0b57a160d0aea6903c47460ddfd8303529a1e20b02b0283a695f2c54f1969d4ae9375a871d8bc880503f1b574431f3838d9cdff6e701afd5a058652dab5ae5523288a83d5fad7696139035d1e21f700a49be24991d5b20b17b5bd6c9f9a8827fdcdd22ee081f8bbd1bb9005581e033438101ef5396c10534be9546fc834bd35e6ccfcf8cd3552b4b854d33007011bffffffffffffffff03fe8bcc95af69bde603a5a768dbaa33251965e49b6f41b8029c8662a8db4969f5038d4c389f756f95f370cf7c6fa0651dd5b2cd27e42d12dd9222b0ee4e91797ad205581e03c1da930cccc481a412b5efdbf4997d85c44a1a7b63e2992224a2f4a5300c014705fd13b7002800035fbb31888e45cf7930d8c8e1029831f8ce15991af5b655662300055997f61b3405581e0359b9faca07078cae61867ac6e3dc14b902198ae1980e99c0001ab016600c0346ca879bffa87803fb917bf9a473489d27e723f0e8f448c4e545e27331b6ff02f21f902d020da35805581e03996a3aa27c767b8c3ac816236a0b34c8f2e66d191c3212eb329856db100c0247021a2f33a4a2d005581e0302165eaa9d6e6b7eaf421cf598b0638802abd4d1277516e120f88e71f0040105581d023a6babfab699ca3d07c66886fa4e9e51a2a6e21297dca705c934a9570c1819483f9090fb7868e6ee05581d026cd14160e241b00429968b1668fc8b8e3d9d191b136b0637ef5b1a450c014687852573cc10021948000219fe5803a05659574551ea0cf290a2c70af2481e86893cd0ebcbc5fc2387c80e817927b203c542072960261f3b38cd2dc79531c70c6fc4c0aed4c87f4c6cbd07e79d1c490003c63d5ff108063e3a89891c3f4ea60dd31ca4697cd58adff1a2370b952c47da67034c73f237b3dbc56ce47ece6783b811a0ddfd8a6c3aec26c796cac29d612ce9560394be43c2adad543ba84fdc7f7bd7afdf03a91b794f416fdb5c4c0c2b7b41f67a0219ffff030e0881ad66a02f3fe2c9ebcb27f845215b8b4dc93ea5501b459478f8701e992b0219ffff03a8d34fc25359ac47eb194ea6e30768823481ee1ba924b9848c4ee23556817a3203d85fd32fca06ed5f490940bbfe9d9806208f2362eaed9b75eb27e407532df021030f8f2c11a52847a7be932fd334ae7db84dd2ff21646b915c811f18e68b4182470335891ad75f98d3652a9dbfbf992443c43e26602aa777cefe83fcc70e19e77d170394690fbdfa2ad5e4e129dec7c3237b4f7734abed6dcea962084ea426aceba58f03926b0e126a044fe044ce1d0831c226ad12d47181570def599c1d2d29c2befc95037c5c4cb86021328742bc66980c7b2b71ec34ac9a817cb96e136f713593152a0d03501338a2a200b60e6d0f87dba02d16abd7b1686ccb3136e9b0240a4c0cf5b6c7032db8e251de21bbdaa52da2ab2ac3b2a14886689e3ed30b4cb6a844b51a3c20f303dca97dc0f65415e9879799ba77b6783282c65332dd3a13f425795281003245070219ffff0367f451a4ad47c8220f1729d0a9791ec1ce5bea8f6b7906645e1355bab18735ff0322b54ab719b9e3e71900115871b1f48077880126a617bf38c3b8150b978021960219ffff0302bd4698994add16277367c4bccbb70f1248e5d28e378c04deeaf5688274b1b503f1fc7bfdbc17f4086b74aef53d09b2a82506feebd991a8a0ade752e0003fe5d903171ed47d15ad1089bcf6d352466f44e99bdd2af2ad2ba4cf80363323d9f176fb0355bc01d7ffce21e32df87fb848757e0878eca09f76e1fda3dc7415e0b1ce07c20378e5fdcfbe4d95ddbddf83d1b2110372aff3e388b8c9e4e52a65ddbd34c01b870372002b1bc559bd8b33137ebc94cbaa3ce5f134d124872331b8d1910e83130ff303c21fca0227893af7ee96d8ca1450a18a5d8e5c3c11a8c62801da5739bbd1569a03062b54192802608f44da7d8dc88572d95e312046b506774b73421262e610fe75034599d0b1b1cfc5b7c2211b22d00929b48d1c447e43786f5430727294e4a1a1c7036f3dbf2aefde19bcd4efd4ad6b3863ea328336faad90dc710f7e6e2dc6975c0e03c7ef8aefc48789dc86397aa6315851d86b100b8911c962005c069c4874a2fe0003115289873e516be36694c7c922de641db9395df113345a505433f386dd1b9873030a5aa79d60cdac8e72264a13b956bf58e8f34ca6fb0e8ec6f3db057dea8cd65c03fb1031261c5d5d1992c80f0037f4d191c92398c2fa126389e356d9f38c13d7cf0362323e7dc261fd76fe5455219780f1c9c9f982774cb196f8f765c0af4cc7e6c303fa269f41ed80985a1950fbf26ebad060dedf816a6d5f78d3f7ec07e9827df75303b29f231fe527f9f435efcb02d86914c05750f96b4463eb8483376a680e6eb991030df7a18ffeae72999e556197def50a6baa33a2c3b657eb5cac7b023200e93c7c0310b4b1f0815162aa248e0c9c588f31f00f45ec5418647eb8748b55b81aa0f66f031ac4758ca7b0d836a009ff26dd3c075e679a3162a4a02426e21f115ff549d582034e3fe4262eb2506ce70778c550a215651f9b234b1fff3c13e36ed89f22f7aead03e483ecca68b2b9532792ca69ad8eaa73552e6a75f9b3b235606c60cdcce8d5b30376b84eea0f0aaa1676c6a0ae8b1a6a042041739824a19da7d473a1b2a56bc97703ff604c3b5e3154617bf0364f42c18d10ca313bc62821b24c4aebec56b26fe15a03562c3f1d73ff4f5a6b3f2ae66df841e74add41bc94f4cb5f25302d6f9f43a43f0353978061defd7c4ebb3ff153cddb5b9b3a5b09fb73ba5f0897c1d6c937043ec203630745dc758c3fb321763b4441fe788474762bbc52061f2ce4cb09c5e651ab9f032fab18a72edb2a1718d770f78c3c2851330c5f67aea71542432b0cca2d558d9d03ebf5407db2103bc2170644c2ea67c5fa21cf167f3e4a182dee62a9b6a0e525ed03ca02e8f285c5e442bf6bc2ff36bb401891cc4f772574e6a217c1357894d2b150030558d991cec03efdee59d2d25815b0f71de4a7e4bdb8a4d0c27c1d715c6f1143031d4085a52c1aac855aae027cd0c1d4130979f306d5ba05518a3a5b7c39f9087703ef5431197bff07b8a476584c5c61a40e3cb7ff726d9f1d405f298c270fb6683803a761059ea5af9a1b64c6ff398a71a1e0572de2037f6bfe1969e7166492411d96038138530f6fb246a158dd6b68bc756817e02696f8548fe93ee008aa59e37930e0038425c190044f3304a1aa14185c149858784b9b582178e80721157109b6f0d20e03d1fb26ef4ef14fd1cd15f2aaeb42cc49048fe7d1ffc1023078902b53cb37aa79033ff5200910bb08510effdd04ea6d4f989ce27254fe38eb3cab754fda2a22d21a03a08ba3a324df41304cfe3374fabf34b70a5e477f0013a58cb491bacc0d87d0770335bcbc8fba81b3fb9c6229660536a8614decb7a45b6c3d47cb085cc1ed403fc903da811c580b78eac3ae5ba3c1265c3aa65d21deef1b44fb752d73e67cee94214303cb4d7eb01e97ce22d09191b41d86a60d816b821de3b510486879b8c40778366e0355f374186530d90e7c9719bc3cf70fb0cc5c712c24228a1f5e4458382170eb74036a29255426190bb25fa8db64db6956b68a9be29b0ffb49cd008a89899731aa2703e2b9de7909547916f9f268098b9d3df29f01da900cd7d3c9bcec5f2170fcc21c035d134e2f370c028df4a34fa28eaff9242ad0e804976612aea7cef898722939950399c99f1a6d65a9097e0f8ca61683878ed26099e347359f5cdc600bd194dbe9080334f8e8acfd3df21fb6b4920d3fa69a9856f37a4f9cad8dbcc9ecd7f7a73c7d8e05581d039affa12f89f8662c1507f375c69d80101aaa5b480d7e964080f7d73007011bffffffffffffffff05581d03b51aeb3ee9e7ca0d7d47ac795675339bcd29c50c6ac19c125bc4df60084803ceabeb6ff266000219010801410b05581e03dc1677c4522eca559a65132eb4b85199e621072d97377578460c696cd0040105581e034f25072e0b9fdfbfdea8aa79146512dd27421f764497a8be2957f43a900847421499f8d2800003ae1af30a21312b72edcb045f5268155e027b81270fe04dc2921f94bb804705b70321754bf7895b8714445d33ee8983b68a6ba8fdd6d4e100c0d35d03c09ec29a0d05581e030c22d311bdc1e70fc4b42fff2c58373b6a8e00640950858edc1f22f97007011bffffffffffffffff0219ca42030cfc9fc5667290eed7b5ac7adb68e286859e4ee77557e8560b8abd4db3a9cb560219ffff0219ffff03c518c068d62fd3d91cf967ec08251172165d9ee5751baaa60082ff7bc36d690403b75e4fd4abf4bbd921afa539bf71ce13d3f4c11caec4e5594a306f361eef81dd03995fa5fcf1ab4232768b3266bd9be5549b571fd7928573a7d879bd44c17ce67a0326c967f97e9999cc08ea55be423847fb7ca65a2e66da929ff920751061c7d4e90219ffff03a5066587c590ed21e9f7dc7e44976e9b10472674f6bd37ce627b464ae0a75dd403ee92b8f62185d11b314fddc8c9894dae73a8d1d566ff46b325380cc33c12388303e2cc8541cccaa04c09040f581808a870038ad5931cb969370ad3242f5aad387d0311bdb9fad4c09d7067260c14230de1c6ab3becc2bc6c15b160dea322739a1b37038db49d765e38fc43a357651cf7deb2ad2fee35790c849d0d87d20f69ef0f257903d8ac6b6b7c0d0c49edb0d8aa589b59ca52ac5d6450f14e39b08eb4f29b0dc9c5038293282d89c2663c4ecb581b01adc19b0bf2f146f1ca904a890624a34a6b61a3032294f3f6186f4a5562d601140d3ce5dbc0dc251dbccae758ddb41f50816859ff03f994b3e2f65b080d61b21aab639f99ce65352b1960fca5831efd6ce5e29aefaf03ff38083b3bf9431afdc20c083099823247ff62849a3d8eeaabe78c5d18bd70d003014c09ba7243985098597f841a6ca69159150413e7f8263849c95a8a3cbce86f03c285b0de973206517e2f32b72f6e7665a08306427b96326b6baa3478555362280219ffff03cf4b7ad72e2f7a3b01b4c7c417abfe0840bd69003bef46c3d3eed21de2531ac803c038947683b938fd5a917a384a8ac3ae2873193b1cd3a0b0446acd14dcee91cc037b4f0a4555cee9cb31f97e25e76513ad4f1100eb8ef5464b9871a22d8c0f52f5038f05094655eb5336b7c1ab05e6826bc23f04d4f5ee914d2a3247d6e22be72cd203e5525ecf7a788dfcf1cf011caff57b8668e553256bc9b30abbdf77b97b28765803cbd8906e97ee531eabd8d49fee9c3ae78f5b2f28c20696557ca09654c5f1ade303fcc753912a9db2a5a0b8b3ceecc1f621e1a942c42baf17c3b4882e26a6b37ca303e163ae3ca9fe4cf2d99eedb537f5dbb9b68e9dc7fbab48c83a682d5adb518f9d031d493888c974607dbf2456f935206ef317d3fa83e175eb3c719a262b16ad5d2a031bcdfa82750fcbac4bdbaa853a2bf29593383aaff1c96b19c98453a58aa67e2003abc592271f11f7b1a4ae6c1bad45486c7115063735532507b0d255361cec2f2a03df515b9d6e1e4fe32f602169a59bd354264ad8128455f576cb86775ce31dfe4303d7934fc800f5abb969e43f4702ba707c596df15f3c4bcec2a295ca6fb0a243cc03488d761aa0cbe0a0472e042a4d29b60c162e197a6f154e09f81aad9f7101c35f0383a3092a8366a04b3b83f747c8918e0edd2435d2a0f826036f6d9d99324aaf8603d1da83539dae0099f72cd69e9667e4cb28b5b33ad2d96258c088ee114748c8c503f1ce13bef235983d4066d4f705ea80b2874c73836a2a5640546334f9e45cb96603722022519cf3f20e1b07211e22fb6f65d34ccb0429f638c58d08bf6e1ecb79ea03761f0c601bf8cb02b95116fce2f8c21e7ebd67939b4520972f91ee160b310c94034125e8dd1d536ac4c80e6e9840ac8b29d30465c2dd34ee2d704cfd82c22b51280389d4da338edf84d390cf34c69e8c36ed764423c1a15c50213f1dc1e5dc369a1d0378e94952ce1bc0afde1eea71ca51c365c3d9f1806d3edfcc535103cc32dd245703da781397a8a19b3cb849eb2429e9b3f2d9c7fd8833c19a8be1178ae937302efd037dacccfd5d2dbc236bee7cb777e959ce654c610908d338de3dd4ebaf20704ba303d51f2fca8487e57207f3a4c260bda7252a1d6a2f6f3bbe434c82ed5461867f0e03f83f96d228dc2640f82b03b8016166598a770cb24fea736b49c85ab1885e2c6403fd2d5808e1fceced0e4fcb12844cacae66ebdfe52b2977fc7d298ead33d8cb1303ace34b6bd027f526944c7ec351d854b362f59b789f9b0fea04ce8c5728a539dc030c30dd688be7da097a7931192372452de60035776d01f2ea5444c96e99ee34e103c2c344b5398d297d91632f0f15db6d8396aa44ee5f68fc14c298b091a9fb02a103c52a80712f639e5d71618d76158e26835abec7f439e4b283980fa5f1640bf3980375f97ce3e0fc8ee3c26bafbf906f35ad3f8c5aaf0338ba1b20c5c0352566116c03ae55ce69e6c98fbce62692032113356e0efe54be677f4bee7976bec37d17a7f5033b405d677c8017060b68df3c28b6c15da9e94505c3df263f6ad471fab20e4fcf0378f5167a494b7d754bed3a275e39803baed72470ded6ec1caa0582e17578acff03578c2127074f32fc131f17dc09716bd59d1a9da28e0525440b85e91a77fa5c36034aadfa8ae380e751a027d2dc84f0bfc9a1cd4f4a73b0464a95e491ac905ba1c1032f2577ad00321839febab8416cf64b0e0fdea6d5ada8c4fe105a477625fdbd3203d0745f81e49855fc6a9bd2d3e3897bcdcfb7f23fd5eac8132698624f9f8f939003e472b8b3a4cc6a574a9e899a72381da4eeede12a238fae43cc064996cd15d65c030816e1229f4b52302711d8a527bfca050711ab10235bec03520d3077d6a9908e030291527e64a07367aab20faf5c96279c7900cd4a4e32a3d4fe0c0c418ccb6d8003555d6acdcb125c7be00f942339138a2741ddd1985dfe1da2e2b006d1445b325401410c05581e03d76845474f6b8fc056f04fbf29ab738b82af3d0fda0374cb1c7b3ae980040103a730bf4ae8b8d79a8c09ab8d29b845fdd4c90f497f2b15089a8c5320d8cd7d9c030ca6da658307619963e16e7ee61a42cc711e48fce75d8b9190011addf16a3c9805581d021f15ef2ca3fce0c62b42e9d74d2a181d9cc435631edf0db21949ee9a07011bffffffffffffffff0459368b6080604052600436106102b25760003560e01c80638ae458da11610175578063b2494df3116100dc578063d7f1b27c11610095578063ea0ee5591161006f578063ea0ee55914610842578063eaf993e114610862578063f77c479114610882578063f83d08ba14610897576102b9565b8063d7f1b27c146107e2578063dd62ed3e14610802578063df5e9b2914610822576102b9565b8063b2494df314610738578063c2de0e9d1461074d578063c5d574fe1461076d578063c75640171461078d578063d0ebdbe7146107ad578063d7b96d4e146107cd576102b9565b8063a457c2d71161012e578063a457c2d71461068e578063a4e2d634146106ae578063a69df4b5146106c3578063a7bdad03146106d8578063a9059cbb146106f8578063acf3f07714610718576102b9565b80638ae458da146105d75780638f6f0332146105f757806395d89b411461061757806399d50d5d1461062c5780639dc29fac1461064e578063a06324611461066e576102b9565b806340c10f191161021957806366cb8d2f116101d257806366cb8d2f146105155780636f86c8971461053557806370a08231146105555780637d96659314610575578063802758601461059557806381b2248a146105b7576102b9565b806340c10f191461045e578063481c6a751461047e5780634e353270146104a05780635230c396146104c057806353bae5f7146104d557806363a90fc1146104f5576102b9565b806323b872dd1161026b57806323b872dd1461038f57806326898fe1146103af5780632ba57d17146103cf578063313ce567146103ef57806335bc4e5214610411578063395093511461043e576102b9565b806306fdde03146102be578063095ea7b3146102e95780630ffe0f1e1461031657806318160ddd1461032d5780631ed86f191461034f57806322ebeba41461036f576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102d36108ac565b6040516102e09190612db5565b60405180910390f35b3480156102f557600080fd5b50610309610304366004612b31565b610943565b6040516102e09190612d66565b34801561032257600080fd5b5061032b610961565b005b34801561033957600080fd5b50610342610a4b565b6040516102e09190612ddc565b34801561035b57600080fd5b5061032b61036a366004612a02565b610a51565b34801561037b57600080fd5b5061034261038a366004612a1d565b610b89565b34801561039b57600080fd5b506103096103aa366004612af1565b610ba4565b3480156103bb57600080fd5b5061032b6103ca366004612a51565b610c31565b3480156103db57600080fd5b5061032b6103ea366004612b31565b610ccc565b3480156103fb57600080fd5b50610404610d43565b6040516102e09190613548565b34801561041d57600080fd5b5061043161042c366004612a02565b610d4c565b6040516102e09190612dc8565b34801561044a57600080fd5b50610309610459366004612b31565b610d61565b34801561046a57600080fd5b5061032b610479366004612b31565b610db5565b34801561048a57600080fd5b50610493610dd3565b6040516102e09190612c47565b3480156104ac57600080fd5b5061032b6104bb366004612a02565b610de2565b3480156104cc57600080fd5b50610342610e90565b3480156104e157600080fd5b506103096104f0366004612a02565b610e96565b34801561050157600080fd5b5061032b610510366004612ab4565b610ec9565b34801561052157600080fd5b50610342610530366004612a02565b610f48565b34801561054157600080fd5b5061032b610550366004612a02565b610f56565b34801561056157600080fd5b50610342610570366004612a02565b610fae565b34801561058157600080fd5b50610309610590366004612a1d565b610fc9565b3480156105a157600080fd5b506105aa610fe4565b6040516102e09190612cc2565b3480156105c357600080fd5b506104936105d2366004612bbd565b6111a1565b3480156105e357600080fd5b506102d36105f2366004612a1d565b6111c8565b34801561060357600080fd5b506102d3610612366004612b5b565b6111d4565b34801561062357600080fd5b506102d3611281565b34801561063857600080fd5b506106416112e2565b6040516102e09190612c75565b34801561065a57600080fd5b5061032b610669366004612b31565b611343565b34801561067a57600080fd5b5061032b610689366004612a02565b61135d565b34801561069a57600080fd5b506103096106a9366004612b31565b611483565b3480156106ba57600080fd5b506103096114f1565b3480156106cf57600080fd5b5061032b6114fa565b3480156106e457600080fd5b506106416106f3366004612a02565b61156a565b34801561070457600080fd5b50610309610713366004612b31565b611575565b34801561072457600080fd5b5061032b610733366004612a1d565b611589565b34801561074457600080fd5b50610641611646565b34801561075957600080fd5b5061032b610768366004612bbd565b6116a6565b34801561077957600080fd5b50610493610788366004612bbd565b6116ff565b34801561079957600080fd5b5061032b6107a8366004612a02565b61170c565b3480156107b957600080fd5b5061032b6107c8366004612a02565b6117c6565b3480156107d957600080fd5b50610493611850565b3480156107ee57600080fd5b506103096107fd366004612a02565b61185f565b34801561080e57600080fd5b5061034261081d366004612a1d565b611868565b34801561082e57600080fd5b5061030961083d366004612a02565b611893565b34801561084e57600080fd5b5061032b61085d366004612a1d565b611902565b34801561086e57600080fd5b5061034261087d366004612a02565b6119a6565b34801561088e57600080fd5b50610493611a0d565b3480156108a357600080fd5b5061032b611a21565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109385780601f1061090d57610100808354040283529160200191610938565b820191906000526020600020905b81548152906001019060200180831161091b57829003601f168201915b505050505090505b90565b6000610957610950611a79565b8484611a7d565b5060015b92915050565b600a5460ff161561098d5760405162461bcd60e51b815260040161098490613427565b60405180910390fd5b60013360009081526009602052604090205460ff1660028111156109ad57fe5b146109ca5760405162461bcd60e51b8152600401610984906134b7565b33600081815260096020526040808220805460ff19166002179055600880546001810182559083527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b03191684179055517f27b541a16df0902e262f34789782092ab25125513b8ed73608e802951771b9289190a2565b60025490565b610a59611b31565b6001600160a01b03811660009081526009602052604081205460ff166002811115610a8057fe5b14610a9d5760405162461bcd60e51b815260040161098490612eb1565b6005546040516342f6e38960e01b81526101009091046001600160a01b0316906342f6e38990610ad1908490600401612c47565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190612b9d565b610b3d5760405162461bcd60e51b81526004016109849061316e565b6001600160a01b038116600081815260096020526040808220805460ff19166001179055517fead6a006345da1073a106d5f32372d2d2204f46cb0b4bca8f5ebafcbbed12b8a9190a250565b6000610b9d610b988484611b5d565b611b8c565b9392505050565b6000610bb1848484611ba3565b610c2784610bbd611a79565b610c2285604051806060016040528060288152602001613609602891396001600160a01b038a16600090815260016020526040812090610bfb611a79565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611cc416565b611a7d565b5060019392505050565b610c39611cf0565b610c41611dcd565b6001600160a01b038085166000908152600c6020908152604080832093871683526002909301905220610c7890600101838361288c565b50826001600160a01b0316846001600160a01b03167fb373eedb8e9038a2dcba31f06b2735887c1a904125e5c9f0021ba41ed972318e8484604051610cbe929190612d71565b60405180910390a350505050565b610cd4611cf0565b610cdc611dcd565b6000610ce782611e02565b6001600160a01b0384166000818152600c60205260409081902083905551919250907f8133e2bf34edab764b55c59d1d41f9df637e7c22828bb6b0a9d55b429d008a9790610d36908590612ddc565b60405180910390a2505050565b60055460ff1690565b60096020526000908152604090205460ff1681565b6000610957610d6e611a79565b84610c228560016000610d7f611a79565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611e4716565b610dbd611cf0565b610dc5611dcd565b610dcf8282611e6c565b5050565b6006546001600160a01b031681565b610dea611cf0565b610df2611dcd565b610dfb81611893565b15610e185760405162461bcd60e51b81526004016109849061313f565b600b805460018101825560009182527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03841690811790915560405190917f76da6cf8b40dd2b2c223a5956831e0ff4e75522538a86782108a0bbe1577e29891a250565b600d5481565b600060015b6001600160a01b03831660009081526009602052604090205460ff166002811115610ec257fe5b1492915050565b610ed1611cf0565b610ed9611dcd565b6000610ee482611e02565b6001600160a01b038086166000818152600c602090815260408083209489168084526002909501909152908190208490555192935090917f81a422e27f503e1b92cdb616a6e653aac10a8e0c3fa6832a58dc616c080fd7bd90610cbe908690612ddc565b600061095b610b9883611f38565b610f5e611cf0565b610f66611dcd565b610f77600b8263ffffffff611f5316565b6040516001600160a01b038216907fc605d0bf97f9b921340106a2e59f9428d5eb9039b16866159e0cdd2bf8e963df90600090a250565b6001600160a01b031660009081526020819052604090205490565b6000610b9d82610fd885612080565b9063ffffffff6120f916565b606080610fef61210f565b67ffffffffffffffff8111801561100557600080fd5b5060405190808252806020026020018201604052801561103f57816020015b61102c612906565b8152602001906001900390816110245790505b5090506000805b600b54811015611199576000600b828154811061105f57fe5b60009182526020822001546001600160a01b0316915061107e82611f38565b13156110ed576040805160a0810182526001600160a01b0383168152600060208201529081016110ad83610f48565b8152602001600060ff168152602001604051806020016040528060008152508152508484815181106110db57fe5b60209081029190910101526001909201915b60606110f882612080565b905060005b815181101561118e57600082828151811061111457fe5b602002602001015190506040518060a00160405280856001600160a01b03168152602001826001600160a01b031681526020016111518684610b89565b8152600160208201526040016111678684612194565b81525087878151811061117657fe5b602090810291909101015250600194850194016110fd565b505050600101611046565b509091505090565b600881815481106111ae57fe5b6000918252602090912001546001600160a01b0316905081565b6060610b9d8383612194565b60606111de611cf0565b6111e6611dcd565b61123183838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506001600160a01b03881691905086612252565b905083856001600160a01b03167f2a936dbabeaea30adc1ddad138b1958497988474bef8b09a29411f0105ab8ab285858560405161127193929190612d85565b60405180910390a3949350505050565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109385780601f1061090d57610100808354040283529160200191610938565b6060600b80548060200260200160405190810160405280929190818152602001828054801561093857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161131c575050505050905090565b61134b611cf0565b611353611dcd565b610dcf8282612280565b611365611b31565b600a5460ff16156113885760405162461bcd60e51b815260040161098490613427565b60026001600160a01b03821660009081526009602052604090205460ff1660028111156113b157fe5b146113ce5760405162461bcd60e51b81526004016109849061301f565b806001600160a01b031663847ef08d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561140957600080fd5b505af115801561141d573d6000803e3d6000fd5b505050506001600160a01b0381166000908152600960205260409020805460ff1916905561144c600882611f53565b6040516001600160a01b038216907f0a1ee69f55c33d8467c69ca59ce2007a737a88603d75392972520bf67cb513b890600090a250565b6000610957611490611a79565b84610c228560405180606001604052806025815260200161363160259139600160006114ba611a79565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611cc416565b600a5460ff1681565b611502611cf0565b600a5460ff166115245760405162461bcd60e51b8152600401610984906131ec565b6007546001600160a01b0316331461154e5760405162461bcd60e51b81526004016109849061327c565b600780546001600160a01b0319169055600a805460ff19169055565b606061095b82612080565b6000610957611582611a79565b8484611ba3565b611591611cf0565b611599611dcd565b6001600160a01b0382166000908152600c602052604090206115c4906001018263ffffffff611f5316565b6001600160a01b038083166000908152600c6020908152604080832093851683526002909301905290812081815590611600600183018261294a565b5050806001600160a01b0316826001600160a01b03167f5d0275f68d583838a7e2be68e3ef8ac2c1f9d4eeaa4b223360f4cd093a160d7560405160405180910390a35050565b60606008805480602002602001604051908101604052809291908181526020018280548015610938576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161131c575050505050905090565b6116ae611cf0565b6116b6611dcd565b6116bf81612362565b600d8190556040517fc4e78b3245dc105eefced18655b978e194ff858545a1080f2888dc3b6ae8df0a906116f4908390612ddc565b60405180910390a150565b600b81815481106111ae57fe5b611714611b31565b600a5460ff16156117375760405162461bcd60e51b815260040161098490613427565b60016001600160a01b03821660009081526009602052604090205460ff16600281111561176057fe5b1461177d5760405162461bcd60e51b8152600401610984906134b7565b6001600160a01b038116600081815260096020526040808220805460ff19169055517fd6b18042563148f38d728c1c4d339ffd515b632d0ad2e1833b822412f3f4d8779190a250565b6117ce611b31565b600a5460ff16156117f15760405162461bcd60e51b815260040161098490613427565b600680546001600160a01b038381166001600160a01b03198316179092556040519116907f43fcfef38622d6a5b118be09c27a6ed8cbdbfca21f0ea9245412ce8031c0423c906118449084908490612c5b565b60405180910390a15050565b6007546001600160a01b031681565b60006002610e9b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061095b82600b8054806020026020016040519081016040528092919081815260200182805480156118ef57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118d1575b50505050506120f990919063ffffffff16565b61190a611cf0565b611912611dcd565b61191c8282610fc9565b156119395760405162461bcd60e51b815260040161098490612e54565b6001600160a01b038281166000818152600c60209081526040808320600190810180549182018155845291832090910180546001600160a01b0319169486169485179055517ff71324fa78e1894b364a1fc8d0535c4208f28c7b380f752afe00c8ce386023fb9190a35050565b6000806119b283610f48565b905060606119bf84612080565b905060005b8151811015611a04576119fa6119ed868484815181106119e057fe5b6020026020010151610b89565b849063ffffffff61239d16565b92506001016119c4565b50909392505050565b60055461010090046001600160a01b031681565b611a29611cf0565b600a5460ff1615611a4c5760405162461bcd60e51b815260040161098490612de5565b600780546001600160a01b03191633179055600a805460ff19166001179055565b670de0b6b3a764000090565b3390565b6001600160a01b038316611aa35760405162461bcd60e51b815260040161098490613320565b6001600160a01b038216611ac95760405162461bcd60e51b815260040161098490612ee8565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611b24908590612ddc565b60405180910390a3505050565b6006546001600160a01b03163314611b5b5760405162461bcd60e51b815260040161098490613453565b565b6001600160a01b039182166000908152600c602090815260408083209390941682526002909201909152205490565b600061095b600d54836123e390919063ffffffff16565b6001600160a01b038316611bc95760405162461bcd60e51b8152600401610984906132a4565b6001600160a01b038216611bef5760405162461bcd60e51b815260040161098490612e11565b611bfa838383612406565b611c3d816040518060600160405280602681526020016135ba602691396001600160a01b038616600090815260208190526040902054919063ffffffff611cc416565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611c72908263ffffffff611e4716565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611b24908590612ddc565b60008184841115611ce85760405162461bcd60e51b81526004016109849190612db5565b505050900390565b60023360009081526009602052604090205460ff166002811115611d1057fe5b14611d2d5760405162461bcd60e51b8152600401610984906130c7565b6005546040516342f6e38960e01b81526101009091046001600160a01b0316906342f6e38990611d61903390600401612c47565b60206040518083038186803b158015611d7957600080fd5b505afa158015611d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190612b9d565b611b5b5760405162461bcd60e51b8152600401610984906133e3565b600a5460ff1615611b5b576007546001600160a01b03163314611b5b5760405162461bcd60e51b81526004016109849061304d565b600080611e1a600d548461240b90919063ffffffff16565b9050600083138015611e2a575080155b1561095b5760405162461bcd60e51b815260040161098490612fe8565b600082820183811015610b9d5760405162461bcd60e51b815260040161098490612f2a565b6001600160a01b038216611e925760405162461bcd60e51b8152600401610984906134e7565b611e9e60008383612406565b600254611eb1908263ffffffff611e4716565b6002556001600160a01b038216600090815260208190526040902054611edd908263ffffffff611e4716565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f2c908590612ddc565b60405180910390a35050565b6001600160a01b03166000908152600c602052604090205490565b600080611fb984805480602002602001604051908101604052809291908181526020018280548015611fae57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611f90575b50505050508461242e565b9150915080611fda5760405162461bcd60e51b815260040161098490612e82565b83546000190182811461204c57848181548110611ff357fe5b9060005260206000200160009054906101000a90046001600160a01b031685848154811061201d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8480548061205657fe5b600082815260209020810160001990810180546001600160a01b0319169055019055505b50505050565b6001600160a01b0381166000908152600c60209081526040918290206001018054835181840281018401909452808452606093928301828280156120ed57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116120cf575b50505050509050919050565b600080612106848461242e565b95945050505050565b600080805b600b5481101561218e576000600b828154811061212d57fe5b60009182526020822001546001600160a01b0316915061214c82611f38565b1315612159576001909201915b606061216482612080565b80519091501561218457805161218190859063ffffffff611e4716565b93505b5050600101612114565b50905090565b6001600160a01b038281166000908152600c60209081526040808320938516835260029384018252918290206001908101805484519281161561010002600019011694909404601f8101839004830282018301909352828152606093909290918301828280156122455780601f1061221a57610100808354040283529160200191612245565b820191906000526020600020905b81548152906001019060200180831161222857829003601f168201915b5050505050905092915050565b60606122788484846040518060600160405280602981526020016135e060299139612494565b949350505050565b6001600160a01b0382166122a65760405162461bcd60e51b81526004016109849061323b565b6122b282600083612406565b6122f581604051806060016040528060228152602001613598602291396001600160a01b038516600090815260208190526040902054919063ffffffff611cc416565b6001600160a01b038316600090815260208190526040902055600254612321908263ffffffff61255516565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f2c908590612ddc565b600061236c612597565b90506000612380828463ffffffff6123e316565b13610dcf5760405162461bcd60e51b8152600401610984906132e9565b60008282018183128015906123b25750838112155b806123c757506000831280156123c757508381125b610b9d5760405162461bcd60e51b815260040161098490612f61565b6000610b9d6123f8848463ffffffff61268116565b670de0b6b3a76400006126ec565b505050565b6000610b9d61242884670de0b6b3a764000063ffffffff61268116565b836126ec565b81516000908190815b8181101561248157846001600160a01b031686828151811061245557fe5b60200260200101516001600160a01b031614156124795792506001915061248d9050565b600101612437565b50600019600092509250505b9250929050565b6060824710156124b65760405162461bcd60e51b815260040161098490612fa2565b6124bf8561277a565b6124db5760405162461bcd60e51b815260040161098490613364565b60006060866001600160a01b031685876040516124f89190612c2b565b60006040518083038185875af1925050503d8060008114612535576040519150601f19603f3d011682016040523d82523d6000602084013e61253a565b606091505b509150915061254a828286612780565b979650505050505050565b6000610b9d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cc4565b6000600019815b600b54811015612671576000600b82815481106125b757fe5b60009182526020822001546001600160a01b031691506125de6125d983611f38565b6127b9565b90506000811180156125ef57508381105b156125f8578093505b606061260383612080565b905060005b815181101561266157600082828151811061261f57fe5b60200260200101519050600061263d6126388784611b5d565b6127df565b905060008111801561264e57508781105b15612657578097505b5050600101612608565b50506001909201915061259e9050565b5061267b81612803565b91505090565b6000826126905750600061095b565b826000191480156126a45750600160ff1b82145b156126c15760405162461bcd60e51b8152600401610984906131a5565b828202828482816126ce57fe5b0514610b9d5760405162461bcd60e51b8152600401610984906131a5565b60008161270b5760405162461bcd60e51b81526004016109849061351e565b600160ff1b8314158061272057508160001914155b61273c5760405162461bcd60e51b815260040161098490613214565b600061274e848463ffffffff61282816565b9050600083851812801561276a575082848161276657fe5b0715155b15610b9d57600019019392505050565b3b151590565b6060831561278f575081610b9d565b82511561279f5782518084602001fd5b8160405162461bcd60e51b81526004016109849190612db5565b6000808212156127db5760405162461bcd60e51b815260040161098490613092565b5090565b6000808212156127fa576127f5826000036127b9565b61095b565b61095b826127b9565b6000600160ff1b82106127db5760405162461bcd60e51b81526004016109849061339b565b6000816128475760405162461bcd60e51b815260040161098490613482565b8160001914801561285b5750600160ff1b83145b156128785760405162461bcd60e51b8152600401610984906130fe565b600082848161288357fe5b05949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128cd5782800160ff198235161785556128fa565b828001600101855582156128fa579182015b828111156128fa5782358255916020019190600101906128df565b506127db929150612991565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600060ff168152602001606081525090565b50805460018160011615610100020316600290046000825580601f10612970575061298e565b601f01602090049060005260206000209081019061298e9190612991565b50565b61094091905b808211156127db5760008155600101612997565b80356001600160a01b038116811461095b57600080fd5b60008083601f8401126129d3578182fd5b50813567ffffffffffffffff8111156129ea578182fd5b60208301915083602082850101111561248d57600080fd5b600060208284031215612a13578081fd5b610b9d83836129ab565b60008060408385031215612a2f578081fd5b612a3984846129ab565b9150612a4884602085016129ab565b90509250929050565b60008060008060608587031215612a66578182fd5b8435612a7181613582565b93506020850135612a8181613582565b9250604085013567ffffffffffffffff811115612a9c578283fd5b612aa8878288016129c2565b95989497509550505050565b600080600060608486031215612ac8578283fd5b612ad285856129ab565b9250612ae185602086016129ab565b9150604084013590509250925092565b600080600060608486031215612b05578283fd5b8335612b1081613582565b92506020840135612b2081613582565b929592945050506040919091013590565b60008060408385031215612b43578182fd5b612b4d84846129ab565b946020939093013593505050565b60008060008060608587031215612b70578384fd5b8435612b7b81613582565b935060208501359250604085013567ffffffffffffffff811115612a9c578283fd5b600060208284031215612bae578081fd5b81518015158114610b9d578182fd5b600060208284031215612bce578081fd5b5035919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612c17816020860160208601613556565b601f01601f19169290920160200192915050565b60008251612c3d818460208701613556565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015612cb65783516001600160a01b031683529284019291840191600101612c91565b50909695505050505050565b60208082528251828201819052600091906040908185019080840286018301878501865b83811015612d5857888303603f19018552815180516001600160a01b039081168552888201511688850152868101518785015260608082015160ff169085015260808082015160a08287018190529190612d4283880182612bff565b988b019896505050928801925050600101612ce6565b509098975050505050505050565b901515815260200190565b600060208252612278602083018486612bd5565b600060408252612d99604083018587612bd5565b8281036020840152612dab8185612bff565b9695505050505050565b600060208252610b9d6020830184612bff565b6020810160038310612dd657fe5b91905290565b90815260200190565b602080825260129082015271135d5cdd081b9bdd081899481b1bd8dad95960721b604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260149082015273135bd91d5b1948185b1c9958591e48185919195960621b604082015260600190565b60208082526015908201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604082015260600190565b60208082526018908201527f4d6f64756c65206d757374206e6f742062652061646465640000000000000000604082015260600190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601f908201527f5669727475616c20756e697420636f6e76657273696f6e20696e76616c696400604082015260600190565b602080825260149082015273135bd91d5b19481b5d5cdd08189948185919195960621b604082015260600190565b60208082526025908201527f5768656e206c6f636b65642c206f6e6c7920746865206c6f636b65722063616e6040820152640818d85b1b60da1b606082015260800190565b6020808252818101527f53616665436173743a2076616c7565206d75737420626520706f736974697665604082015260600190565b60208082526018908201527f4f6e6c7920746865206d6f64756c652063616e2063616c6c0000000000000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260159082015274135d5cdd081b9bdd0818994818dbdb5c1bdb995b9d605a1b604082015260600190565b6020808252601d908201527f4d75737420626520656e61626c6564206f6e20436f6e74726f6c6c6572000000604082015260600190565b60208082526027908201527f5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f604082015266766572666c6f7760c81b606082015260800190565b6020808252600e908201526d135d5cdd081899481b1bd8dad95960921b604082015260600190565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600e908201526d26bab9ba103132903637b1b5b2b960911b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526018908201527f4e6577206d756c7469706c69657220746f6f20736d616c6c0000000000000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526028908201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604082015267371034b73a191a9b60c11b606082015260800190565b60208082526024908201527f4d6f64756c65206d75737420626520656e61626c6564206f6e20636f6e74726f604082015263363632b960e11b606082015260800190565b60208082526012908201527113db9b1e481dda195b881d5b9b1bd8dad95960721b604082015260600190565b60208082526015908201527413db9b1e481b585b9859d95c8818d85b8818d85b1b605a1b604082015260600190565b6020808252818101527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604082015260600190565b6020808252601690820152754d6f64756c65206d7573742062652070656e64696e6760501b604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b60208082526010908201526f043616e742064697669646520627920360841b604082015260600190565b60ff91909116815260200190565b60005b83811015613571578181015183820152602001613559565b8381111561207a5750506000910152565b6001600160a01b038116811461298e57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cf4af89f7cfa78e2d4384cff55d4548a6062d655f5be8606d039069af7c903b464736f6c634300060a00330360ea7920ce62b933839c983cff4359cea9f4d40ba7645cca39cc1e5402a537a203aece605703a42cc3191903ca44e8d93c7f0cfe9c38a11b43d20d98fe19d079eb03817af525e983bab0f89ac3adc040c7ea5ba5406dc11cd9f0e6807ee0092f096e03b248b0aa218ce9437d5527aeea2acbcf30e1ce54e9d04934d6f5fc98b9b1589e03597fb92a13c5f9cee69de79819459616163aa87f6a7bab7063bbdc69318c7c04038ef6e594201de8a497fa51cbcd415ff8e6a9da00c7f141d3a86fef301ba8e3fd0345ebdbdf1e995f0b24c19d2306d067636e61ff25afbb6a66172546a401c94a9803d06d15fc48545f2e9495d2e67b15efa8e82e1da82d89f7197f137430810f71a403c7fa824c400e5c511ca9e354f208c685994b6bca2b71c683b03f16fd9aca489f0367f3a50dd1540fd0566e4b9971db42f2d7feef95f7258fec97021c25d213338a03dd6eab68699901082a8ea8d0b1b0019eb89f5808cb23b2ffdce917b5f178dbd00327b174f3d457b9574eaf956fb6894cf6c171c28f9fbaa1d89974abf48faac22703c002a2a7fa946bc4c8d85e660d58eeeffba1a0a2d037b69610368dcfd25febc70319b0306bfe9f803e5a76984fbd3b1dcd65c82acc4eb92f256ee22bd1b5f5de0a00581f02349d274bc7188a5b46e6473ac73cdd8e84278fa55a42020e3650f9fe227f5820fffffffffffffffffffffffffffffffffffffffffffffffe57ffdfa9f6bbfd5000581f02cd4e641d5dc097d27f28b9a0e23a3fe5458682d748afe201584dc073c0a04a014dc15ac70ec6dcdf7f021980100330ca4f85d273fa056f2cbf7cc6f6813650cb8dcba9f80af2a7a93426c61821ec03ef14b2051cb18ad4412cd8975c3e937db64da530a77bf912dbf8e64b07fdc90303e6e1a02945964757a0d562478a0e60a225887f43ae2528255bd178815091a61c00582003ba55c60a0fa4a9fd899dfd4a673d0f9719dac10148afcd5f228ba8ec2d00f04904b8e090c224f16bf703e78b24aca702ba454c9c71a1e6e489a5de4f094887155d3d420125d989a511fd0058200320a8568100753c638523b4721eecd2bc1d49f730adc499e0d7e229c39d5e8049068dc0f6ab76b78e5f038a6a96e2dabaeea96c1d6e50ed429ee22ce2ccc25dbc378f2d3985ee41d9340403532addfb77fb955fb1ca1654ce5f5accefcbaea4a1d5091a9a03a59ee6087d7703ebb91cbd0b3bee7763bf408c2a5e1d1a2d841aafb91e9f90e1312faf2e8d8c88032ed05a017af5c7a17d46022baaf89126037c7a79b212cf638f2c9f6c9e4727c403bf3c18f8c4a1b70103e40fdc3db3fafa127ae0fec7ea38c6d6fda73c92c3e25503503644cc1f69c199037d536d499e33130227e32e9a41282b198228752c9ffe200219ffff0348d264aa096932ffa17497680ec9a0c9fddf5716342ac396bf3ec401dee0adab035f9d2c753b1ece54eaa908171fd993c47277de099863a9f8bb3c729d9ea4681a03fef9e54243ca5f8290d4b6dbe2693bb3cbea9b9df6c24949093e9af33465e4fd03434620618ba07b50f13d8ac61f7718fc4fbf8818ec6881fa8df7ce5b37da6c0d0384e05cc761bf45572ef246a8247ae2d25b27d6e6d27c7e9be97ec9c10e58a89b03fec86154980cc510ad9cb54d257e626983170480f87e7c25c8a824810a55518b034419463465364aa8325f43091944a5715e3bc28a106b44344d4e55119bd62e50032692185f5f8daf24ad9c448a9099bacbd2f3165bf603930ad58c7c4f7b0de58f0219ffff03d34e72b777f28187e287baccd83f73ae9d59bbd26c48f55bec11610c8bc18e3d034097c3505614db42ae89105c5334fb1b065486d8fffcda15955883bd75ff309403e8c29bab046dcf256bb8cb9b6284d387af9dbe6852c78200ece60bd24d4e0b1803ef66232d0f25c47317093eea84c87a75199053f00c6b187fb21365c8f3aa56eb037c6fe2336d56eb64b66ea00824910b85afc78d2cfcaa584da6b28eedf2201f7603b1d51ff745f99c3756b975dc58c27f8d50909be76a9f7e2ac3e32fffff00d39e03b35364f5359252179be91915679b254b9eda1c2d77a1eae414cac7b9c2688345038525f23898b028d8d93ef19d0d78c2eaf32b9525ab25b8049b2722720322152e03f3d86a1e65fff6f637afd02b70b895fd785e0a5bdd3870e1c8b5acf2f7488c700396f90e2844902be3c8b104db58b12dbc6d79b43289c1c75405b33202fbad0d9103f22e70d0927b05d0794334cba00174b6f9030e9ded5d97d1af99255ad21668560336ff865d837cfa5031191bf3633a8b804528311d95af99b967a729729f19fd29038bfb3a29daadd8149f00bcc25c151feb990005f5ae9c41ba76d527255cd8762900582003fa2e1ef7ed4891f7eaf3d99f5ba2d0d270aabd29fcfb9f427469b271f0000041010350ad7a1e103c77c97c3786c8842d58642577cd3105ad215f2fd65ae59e58404a03da884bffa16ef65efc0a542b7346b972b7233f038fbab1e60c9f4d31be985c9e03cc6e71d42b4406ffed6dd22263f27d7721e3ab0a56a91a4926936d90f63962b8032390cae870eda904e39d7c47e01863e25526b66a200ecb6965a154d18194a97203000df4cc52516e3fe0da6292e3945c34a44dbd6a7aef46f11f2719e80fe4f52403e98a78aacfbdc9c25ca5a34b6a50557e4d21fa11f5d14a0e176cc3106830d1b5035f77b7bc095b0487d263589244245a90d5e2a7ed9ecb6852a3ae5acc3ea4c43900582003c7e3794394556e25f5ecf13c05e2fd775bda6b1ac4dd572cbf4311e9d1a4905820fffffffffffffffffffffffffffffffffffffffffffffec6c1075c727b5a516b005820032078711ce01294252b003085eaa0c49afbe6047cca8f1b43f722dab2816c405820fffffffffffffffffffffffffffffffffffffffffffffffe865e8a159b6b9de300581f02eb2c36525a13106cf4035bb6535fea7075d37229dc58c70eb0fbfb83691a5820ffffffffffffffffffffffffffffffffffffffffffffffff26540946cfdb900300581f02e3a84ee4fdc3406cd7a4a31a029ed9ebb7e007228c1a7c10837417923945410100581f028e8ba439adda901ef6c44a001d3dd47301d440e3c8617d025132c678aa9b5820ffffffffffffffffffffffffffffffffffffffffffffffff93a7cc40c3283e3700581f024a8d5c341123cd4ee949dddcb8326974b5d6608244275a63d245c6c267c44618cf323777f40219142803fdc756f7ff0d6e35848fd8e7743150d34e54c8ba511691c9bfda3192237a3fcc03ac2b17e0b2cf0117223684152f239f13b4dd6b3655b2be49db3c2ee9cda03591014200c000582003286855214df8487cfbde892a2d08ce7d0079c7f30c33edc06e2ef7ac3584004954867eca8054b4c8490375829d49c1e3abb17ce1db004b280341685a1602d952d087aea0113d74249a82033b06f0ea641d79d71ebf35c2c325c980044bd5df9aa4b16678aa3289565db0290219ffff034519ab64346f260f31d9de1f04248005442a8bf487763c6af7b3bb941ee57a9603f307c5fd7664ceb397c9ce3943f8e3766ed250b9cfa4dca7c58011e2810cd95c03562414525af04a71e21ad734b9ff47c81a515fbfb2c513917a23494949be50830314a922fbbbc24948c5f28901ed5610a3aa9c8d1b285c564fa4429c1e7bb4b06c036e0f2112a5d75e0963f403b1b561e586740505049e6bca6832028efe11a3a7d30324ee5216e994d7278246247d2140a3a38cb83c27d7908e62a7ca37df0433f2c103c9e2c77bf1158d77fbd2f25d994af57934ecec6850c715f9f41853f46002f2e30219ffff0374b1edb35e17096fc083ddd2a98ff7e996118203b52495c00d7d156c22ed95e8030c9e45be9d8d8f100c01d2ea7e833d4047e90701e08c9f684a1a0e25cecbc9fa03b478375a808daf3ee32b07bf58819bdf924f4df7fcc23ac9653b66edab65b84403566e369f5089642a229892c21f813d3d493a22e7cb37093be36608ae679063fa03612465375a6cdd9a587b08ab4c0c1f7e59d139cbdbd21183cf7434b2bf98e4110380e74b90e67785fe9650cd60c807c53dfe29d02c2aed8e98f8acbd8653ecad0603b8a97ee5c773b0f588bcf0a47e83aad620e34952220680bd6d9e7eff29b5e5fc03c2dc088d21c4069684fc081c0a41b4bd695c2def482ebe5975462f745e8a36e903e97446caf037d2c9e137c062ec8f8945fe04693b206e7325d091185494072d330058200356ea8e9f7a6717567746691d538d897879b771bc4647c73a5a69da6d7349205820fffffffffffffffffffffffffffffffffffffffffffffffee7a8b2fcbfe4ed61036c5628dbb4553305f4bd47efd16c2d85ec0a1e09a63426fbdd1f2ba438759b84033646458c1352d8f5c9890c44102f7bf14eab3457581c50bea8b6c7d354d5232303e67163cfc4f7e53889c4dfa56fae5011a9b668db7d8454084db63420120bb49403b35bf65a50a0c6433a39c4545bd447a175f048cccdf42dfa820071fdf6fef776030d1ce395e015320b7b65a221a135bd96911a5d9a620949ba6590734db74fc3a3033db1cdd3603dd119534c5ca54cc0b563fd84c718c1b4e39a611d4bc58814e9bf03f8dcbd8742d4d43a64ab217499f57b41af1207eea88e56145094a38be1717c8f03ea6e75d3a2c9b48ecc340655734f52a2ed2d0118eb509f166e9c9567f6f97baf03c28d9290573080823105496400298c97e4f1fabb8890779454a913a6cacdedd50304f75971cefaef4023706e4e3c5753c7b34dddc9668a54573808cf0b332af271033d0113019c09bb2f7ad4631dfb8bff0608aac950662b264362d5dbe343dc66bc00582003dd1436ec7d1cd778844d164a21673feae58d0d2ae85340c9b7f68d1bdcc6405820fffffffffffffffffffffffffffffffffffffffffffffffcbe22ed38dfec95440389e216c0828cea6cfda62f518f071ae5f64cdf88f6f9af6571f40db499b94ccb00581f0203cb857c1f88da526238466fcd27659c0601137a2dcb35570ff9288a640f4916bbaf49d9387d1c5400581f02f6d14e8ca06f41679c222b0c291899103ed465ccb47b0fd7d57fe255c3d75820fffffffffffffffffffffffffffffffffffffffffffffffeec3768c48e7bdfaf00581f020e7aa3f550a98e7441986decbba54de0aa16494c47aa0f7786441fbc6f9f5820fe0000000000000000000000000000000000000000000000000000000000000000581f028dbab647369f9731d1ca69aae8a3bdf7ecfe0c247c511dc126569abc6b54484563918244f4000000581f026f50c206ade3be1f6529893678df62d52a20139bc3a789c915374b9c5d2d4a13d746145432c04ad2ef00581f02a54a7ac95148ed8c3c25dbc293c8c1746dfff10acff06f73457717cfb6894814d1120d7b1600000219248d0219ffff03329fd1f4096da071fa63dcb910af71f117af4926fcbe504f4269c8e93b919415031ee90fed9afb36d522978b12dedb0d248da22e721b3f6eb3776ef4234179618f0340b074212ce7e4f6fae4709120f07d0f374bfdce880b43a4f3d7021a549c392e03099b0062d64f901d1b18b502decfb5c9d164fb2621b672fcc6097454a5d780ed03c218b51ccdcf91dc4f95d93a4f79888b3405137c10ea2b685c5cf5dcd334bc70034d707da5efac27c85ed701329d3995ae8d0562327991f75242955e4418fb8ad903779459992fb9bbc066a61ef0a184ad74418a686bb3bf9bf6aff6ba40b595ceba03266ee2f5e65a039fb4a63e3c86257bc112325fd07ebc44f6a9aca25fbd7c07a40312868640842f9d6dadb4f2e49286f56ad6ed6875fb34ff115110344e33d9d1fd0219ffff03c05fa755f2f77c8c5ddcda898ca4784ad7a2dd153acfa494c34c5ccbed7ea4f703e0efb3d5e7913914866b51f5b01656b0ce2b98d5dbe867965247bc9f90cc4ec90219ffff05581d022c8dab52f8f90c271f05bb67675f083fccc293e7a326c3c7afe62bcb0f014805802fe7d705400019368b0219104003562d59a51820d47f520c975e0b2bcffac644a509749a3161f481f57b6e826d210605581e03aba08c489b5ad474c07ebfbe33410ca24439571cfeb3b95724d068960007011bffffffffffffffff05581e03aa752171b2ca99214fbe9c912258dd07e87b2f30c6257a4da69f8770300403031f8b67be329f6419c9282095843235301b6b3475e42bc9e3262b646aba8072060605581e036b0d8253248b15b7a1b12d54f229ee511bcc40b69efc84bf2a16f98ef007011bffffffffffffffff05581e03b60175c43cee12b1004866aa086665d2bec547880437a2759549373f1004010219721a03898e78dad11e17be644381cea0ae7c1d3ad38bfdcc74cd49b46b1fc3b7bb07d10395b59808672fb1353e7f403586324cbca6be75dc3cd93abfe452d0a035f3d538032603d571b139ebd7f01e0066d7dac164a7b8a09c28c1f402f5518b0cc89c8e2d0364805af60650dda41b0b200bfbef51742bbc77da888430fa31b2c8eac68cb918034ceb69ddd1d6fde23d3ac5f6220b87db6d963401eb92df331cc7623fb826c49f03ef053ddb10e6df20e063f1532925f59c38420f435751cff49a6bc16dd32d272003ef5d5dae4ffabe5c846caa0ea177bc513bf30e99bc699dfbffa85ca594edb6790319abfe24aaad4d0fd73cb4f2a5612929c99bd833d65011de189b58c246a9435e03d863a0bcc9387464de132fbbfe12dfde51fee7b3dfc882b0787a6c43ab03276403e81d046085fc47a090b8673c5f77c9ac62232c516f32b895c7bcb203b9faf7b403041dbab8b88d792a0779752b2c1c39a4cbae55bb10fa7f3665781046f1d571fc03ad2468e65640bc4b71a67a8ac043c87860db7e8f200743a19d068d17924ecb430219ffff032f0ee4de7848e944f0b98ccb217fc157f94c5c98ec150f94fb486b6cce04acb503613125e1c61b163fee0d4103f0c8fdd759477be7b8388a30dae3051c79e9ba22032dd258d203531b3bf255270e63356a6c0342895fcbf15a3ff2626e766d96c4550219ffff0386206746b858df0669069442a67ec91f51920cbb483fd8b15bdec382b1a6be860344e6baf813a08fbec1e3dcaaae945379191d13ddeebbccab80560fde94f414650219ffff03d871fc79b151f46dfdbf8c5ab616a8a12274a83dece9f0b88a0563704a387c9703a017311497679948fc2437cde943a41222b0fe06513389f23c8ac362f38baf1a0219ffff030ac22c7b7cce2b8f9fb02f07630853936ed508daed05fe8737d7bbc6aa9e794c03795bf94ba2792add431fa06bfc3c8b7c99f80b32d4bcf808eef9262cb346cb600304a2ecf1a99c3b598c080d4be1bb342a8c9412c8dbe4aa2df63183bcf79d51800219ffff031650191497a8b409c8c7fe01e4591cf485a4b313fd33d3401bcf56a39f97696b03a468d17fd6092b4efdf1790bad8fd877b2bed09d91f570cab5220f1fcd39a2f50306a86098c43e0e3fbdb92cd47459b5dd34c59a089388811190a92a56c6ad97b30305e427e36bc77e9a276c4f8457751fc33b9e022252c1013cda99cd21bc274da7036786e1993791baf9226c4052a8fb37ad27c37ff2bb4f2307f951c328d19904c2039073ee1e985d60302901229de3bcf3bcf578e7e18b7edb00b33d2480191efc890314a13eddeab38bd7df7e4599950ca4255216e9a03d2c09d8c2f3770525af95280362faa5a52289db1f4cfba0b9cc3bdc98edf1203d8507083f4d2b3a58f1d134770339f1c67b059e353d696ac82e7a02bd0a094a3294b41d266d97af01a803f8c1910384082ca5af310f354f23a486be5cbc122c519b8fe4334028720f62154b985ffb033780ea8ec72c0e6c467b4b4262a2a932a05518757d071926fff5d87b29d53a1d0362d0d30c6723438533d8567be7513fe9aa667eb8abaeafc61232486aaa0925a003cbdb3dc65513c802e090a4fbb39e5b323209f6c25d2a27bce5fd481660d1dd0503e8ec37f620834a0c637fa712aa273637f57d53f99dfb6e8f6938f1da3dd381ef030feb1f1078ac4c1f3baa14913b4216ea6fef46388602ffac84cc780c41a35e4c03033cb3e76606fbf8ff953f7594690d3a0331eda7aaadf9e642042df2ecf278ef03f127650e78abd68d95788ae8d7b6d6805e30c5d89d2f3bef3f7b074e18000e9403a95c321fe995d210668461fd4a18e4f471d3d500b370c898bc8587c10e2f6388035131269b9c77b2071c4853d77ce8603ad337693a24a17bc7f0a33932883dd107032b4ddec0b73159580dd4d4706594ed481e9abfee57c4c237f9936f8a40d199f703a1bbe3db57d1bc1b7e873c35ee267c63054f860226377813215564e8ab1cc09103f3ce2fdcd9f13fa517de9dd704a66a02ded5f91f155ea099c40821f4abbf54760351b83ce2933440635dcfdb4808b0b5884e1b6de629b5e4150fb624b771d3ebf40359cd7a40e337cdde43d6b25a43706a33019db9730f6858234b2317727ff067100365d5135d92bff813c2e85bea832701c859f711557a021548a4197ad8cff1398f036d2eec0d268a3dae8cc81b4461ce5d867271d0909ec73fa6d6a8e83a36b53aea036f0581fd2e16dc5b66f066d70690c895eb9871b512a3adc84b24e74db9f7863e0371968765226d34981a4fde2fbfbf3e10669aaf8cf15ca49b9df93e54129739080366b29765d4793c92d469b520ae3809acef4f14b76eec1d9cdf2140a42dab428b05581e03b1ca458d01246eea6fbe769c335cb7ab3f938c5a8726fc54777b261330040205581e033d616945a7d42cfd2e5310f685d39212557c18ee821c96579e5020555004188d05581e0352507f09d93289f2000854ca21ec6d108c413ec69d69e55501c7272540040105581d0265a919c155a4eee6caa20efae6287f002fb003186271ffb1ad95f7c60c02470b7c2e85dcd80005581d02ca4549cdbff3ad31d60800a5e862e8ef6deb21f722a281579428568f0c1a000a961d489d98cc653885ce0905581d0252594122e76166b01cc01f13d41fb1c926568c2f2a14b8ef66fdc0de0c0c47026c8613727150021903800352fc2d0cdc5601d1f944529012aa66566856c5b49b1600c7b40dc84ebe04a38d03b94106c7f2b6483fd61c1a29dcf684bb89827596178cbe8bacf65fa13b7e02140219879803e1c15b457c4e685ba81d745e72451ecf4e083b3f37fada38b5a143336763da6003302374dcc17553bbdd76e46e72cf5d943c9a36aed332a94c20cfd060d15f8bce031d8282a04508b70abd8003c0ee0d0ccd0f740a9dbc743000bdb4c25f20afe76003c5f7ba145fb83f3ba2cc939c780506dbb1086883fe5c4079306b2109bb0c3d60034ffb0f0ec57ef20be8e62668abb6228c41e87695ef06dcb62bb82776f9c9b8e3039228bb9a0e66b2462d2f3df607e607ea6310ad4765c1a8ac4631af32391efed103e28bb3118baa2978d1ed9b188b54dd80406a8cd46ca427e1d6dc34dedf0c80080219ffff03771d8db16d382d38ef617e8bb782406b1fb13a50bc9febe21e166c5dd29a81c703b77c3400efac675ecdcb59e8178b6854dbb5e9c31b46bbe0e467a0aca54a4a2e030e384599b2ac0292cc22fae825a3d5abcc0f6faff8410d3754ead4993c17973903d2f1288a415c951a8d746bb159a68ad49a4066f4279be61983e2f0539f6d24f303a6f5c5fdfab3ff8722d226912d7c35eca8bae179c3cb6dbd2aa9c1ecd2ddcfdc03865149feefc897cf04771e800c7fb4665bd1cd4fe203686889b2604711f8eb2f0389c452df893aefd649e9d4196439ea08129b9905659943c0c60fc18dad94c2bc035a466b549122fc384c6e7191ae783ca4c9f0b4913cc73d3c9ffb3f689f1f0af303dae896e4927a7ad953cb2c4dbf9b573da71f7c4038ef71302fe280ca1b7354430363693490b2d2d231fda356997cbc728e794e4b8c8767d6e23d54cf17f8b861fa0219ffff03d1b42740a4ca6170c9ba5b6c80267ea519c2f398e0b3071e256212270c76e9d40309ae2f8f1724a042ae130555b06ac7873309397ef80fa07d50404fb86b4e49ac0219ffff03e19200f860799073d841dc262d18b6867a70147a377dc6f4c858882fe915d070035637bc54419e6beb7fe3e91086822c4ee1a1984ec724ba003c2fcd92b132a4920350946476b382df6bebd3ee8bb188b2a161a651f06a7a25b5f5c58128b688ecc103308fe2baa64a823ee555712f6d2f4a2e95f1502f1473659209749ae54f637f0e03b6320bcae493696b76e43172f30f3da2da647a53564bbd66871221cad0d0822b03e65ba1802ffff3227e6ed356c9ae478e1de66d20a8d4ce2d8b030a43e5e49b6d031589a93abaa8a24afc80890cf1698e85850fb2acb4b9b2edd8ae5cb189e584aa034f1d8f35b6750a99e6551b4b2afac052924b9f7302fd7d1f4cbb94369c54087303738002a4e001da2183af4778cfd5d80ed5b0dd4116a276824108e0c9d2566f8d03ce331695f7b71fdb63c75f437111eb811d416425044ef936bbb67c2e1513351703d6987fa412d7b5a2c42b1fb0ac04ce5f318b4e9b94af84a20983f97be7c100be034dc6318143d95df384490475d5f685dcdcacb611c977608633384f1cfa7ab1380329232b7985102061ed0a668cdd2cd36d3853f27c17ddd1fd933b7c23c3f87fce0219ffff0354fd639d867589582ddfab7c86c3ff531dfded260dd3d415f7d9f00485a7f7380307c230ba4e2cab7a05b25cc51eb3d33e5760d0da4dc0e8997cc385f1ab5cd0aa03e14cfbcd7b5f1934c5ac07ea5fb182981b1123461ce7819a16fe73e43d90785c03559cf2ca572db8e189a045baf7e8ac291acbb4791a25ea44c8ba728dbe14e042036ae5fedd41c7339d532280816468c4719b4b84cf5f17d2afc642919e96f0d6b103e955618dc0bb756d8c6652599972db422e4eafccb6327ec3ee959ad6c42d4a0b03a0e17dcda347c4ca3ca50b67306df84f097207ca3ac80636e37e8b06bae6afa3037b3c6eab1337187dc2bf4a37ed2371f787003bb33f630221ace92ad7bf6039b20323ca34b42d86bdb89683152acc69a4c9021c428359cf0a933e91d279d7c6819c03f21a3690f370c848513e4423f67d9551d86562dd18cb75d76eb6cc19d44bc67f032697161076dccdb5bb807daad1c4c2e65781002cf718fd32572e0d0ba353915b0326fe00b928c372b6f8c6d826149f09a4aaa97884c1b426e351f9542475de85b40337d5be143d3b11bc857c8b21f3a8241f04b2ff4d19b629899e2b08163c94892303a2bc49e02fdf2ea64de424a5825421cd93ca0f3c63814745ff6ceab7014caff90312e8764a1cea4bddcdde6f6eac6512cbedb9286c41339e28c1650be164de273f0325f9e620b76a6eb7eedcdc0a061ca60bcde101148ba0cf04241c27bd29f66708033ee075a411eae29a56eff8c7c77a6e6a34e41cc3760a30a44bf8ff34251bdbce038b6924e116b176ee9fe8978e10614a63458ba9f81a60582bb2b3c49c7f1cd20a03e5822aa6ba6ca5b14e505a2b58cdc8943197838faa1fdb526755f45870244182038ee495a8519790aed8b58d90f7b0cd0033ce5a6fbf862076afcb1edc23828731033254dea2db34e2cd37ddfb19b7e66ab81a329c1fe94f3ec2ce18354cebcf885703a99ed0ec8142969be41841e6d0409009562a492a52c8d134e791ad623b06456c037bc7bc83dfbf967f09157306507f44775e29d7a711a4d79b64d87d87b1c4f31e03c44e74d57101475667afe2997499e71b521e22cae34b4595bb7180a90fd8eeb4031adf17b5e0d1ed1f4f09408ac7ee25ac7b89ff3e85c4b9293f943207d2d87059034996fb772acc5279ff91ced11bf308fa12a9777c84fa6c09292b04b1d1a5872e03e853ff9f5dda0e9a9c42117c61530a1bdeffef2ef32eaeb071588072eec83402035dce5e3ef39dbc83cb2079f098100a7018c8d1b1b6067d983edce4d331326b530359fe458f8dbc67f5c68b43badb67d0174ac2b9f286d11906c61506617fc6652903d82b805143693d8d0bd0c068d123152e20ef3147789afb74c8a740f385a6eeaf03f130c410a608922d0b516569c279aa5e4f1675ff4ee9e9701068be76a7144df403bbac346e06b07d560b86b40af45fd01aaea3081e8b5f1ab3d3427f321eaf976e03cb98d9270f284630e965774620e0cd58169f8fbd1334bf09f516c1b1b15efdc003685c3bebf67758c1368aa1d3e5698814ee842eddfb1326c8a8862af4e695ff9f030d07b583b4f1a28444d0d5645eedd17e3c62e9a0993f5b5ce1d8edf3c5563b3d033dcf31cc2f00f81cdbe8086e7a74badff58ebc1f190b3467ef9db96697ac9977036cdf1af1bc927549c2def3e877c510d38687b1f672219d47137d64425c6b037503f68cf71d3952d3b1b82360797e16dbf479d39843d8c8fdabf8b5f65f891505c605581e03b2758878c2c36786d8487c37df8e9a27b11118c4e2fd76181cd4e648f00c03464315072a35c805581e03e7618f47a37803fd7f7e2b610c14ee757ee031b936d1f786bf523885e00c01470643706cbd300005581e03b2849ef417d0962c9e837433d17e174ab6f3a5ddbdd107a60f9af4e2a0040203bcf2e69616dfb6dd55d8fcc3a1195f986c99ab606a7f455c1a96fc05ac992d9903d6fe2da97a0df942a65306743ed8e8e53a6360e23194e2510dee03a983d0a1c603f251e2396575a420bbc3c92454aaaa80408ace11a4e1f25a907d3d954a2e97c301410305581e03345302bcaedd0839e22b5d09d3e7577662b0c24e06a11d1837acd01230040103cb14cd5329e35ccbaedb8234f208b713968485497b3f95490e1c59d86c0203ab05581e03d4d377e6932bb19975bd84c39303eb5efdeeb681f70cbc6cb4916ec480040a05581e034f5e278d32b0c694fce17c7080ab33451d85db74cad7ea4e0a29eaed600c18d54902413032c3c53958f805581e03f98f04a75a099653f017e5f0007aef28962073bdcd9dbb2fc1c3d8fb800403021979e703f0a2d2929cb2b23688087875667533715a4d68329289e44136a5badcca5a613b03909f3d1032da5d9e28a25d8c41fa301b0ba133271cccf57be936f24d6b513a6803949cdd1c87ced27b3a3683a2b241b88acd0faec0f3bfee27146615cc9b18d25303660fdc33311b31df8311594411d70dd79d9579c8ed3be050722ad828809f76d9030147dd41c1751910dd8a44d2100dada36ef20080a496d6243efebeb7dbea675d03a8e1dcaa48019d979abb4a1abe5e41b07eb2a83d24248d0f1f2d4799d54adee003ddf013d8db0002df9ac4e0cb79428bf41829678d9e1e9e43a3c32efa250301650387dc1d609547d808578144a5004409543c7067c89f08a9a4d3c06ab05ea1a664037bca481166d6c2f11f582e64074da688c8f8b48551529035a94002bb65de3c7903579deb1009854973ff53977a90f39390b0394de60cba6346816ac572123e58f1034b8ad5983e8cbea18cccf263fc495aec17d42472337d98b674cc85b28fb0de74036ab5538930d803a1751b375e8d2bb3e91a762683181332fdaca1bab792769d08036febc88624a4a3fda3ea4cd8fc3ea6e544c72aafc2a43ccde4ad89828edb0cac0364b7abd45a833820d491fba95703f1c91f4c310d83373c63cc159e8b99a6672f031d1ea4d795373868a1228ad7fbd197aa9097b46ad5bc73a0fb2221416f54d33d0219ffff03dafac1a4364c19bee0f82282f7d8684be93f26b47b6dd421c48807103860a25603767382e59c8963c11bfa50a7cae10224a62fe242f3d75eb0e24bfa885c79ccfa0303d8445482fde0975642775921eeaab332b8db852f1a66ddd53f52537d8e467f0349cd4d5d42a3b842584f901aa98200482e915f02dd391df23c7185c088912a61037c89f6b25c1abf657c1f7037d97c802dc39f07f519369a0057a3bba306c1df230219ffff03598953842790b7a0c5222c5c0a57b830de41daac0ca960583b35ce2b1aaeab2703d532eeab714a9df7607cf66e5ed785e0e40a4f70ec7fd26d7a786a10959bbf2f03d6b1e8fc636643482cc6569d25c2e08ab08fd50802e076a3dcf394db2551b7ca03caca77e6e00d25ddb1ffd1442c946d4809e6d8f75c3997e723ec456e69e882810219ffff032129bb96b2f23eed5d77fd2a9e68d36dc320d9ac5505179ad5eb80684dfbb5260219ffff038365acc675f29cff433b9f43fb82a33ac7434c040ec57488d5b2379768790fbe036a21363dfce2d504d1343d8b2c92108da021f217347ca1febc66beaa60d24af9038cba605eb9df782b050a3adf9853285100007a5ab2e5aa13e2e26abd0aac74e803f7f24fc9cae29ca46d54d50602a703ce5fab714412f8edc14ee61bd1b3ac25bf030df7d5b4f664e00eb5a17a023bd09e7301b915c05f6296c0383011304a859d2103db9f0e02aed5fbb6e1bd855992df00e0da8b84f3419ec3908c78d9429d3a7b470320ac67890b1f95a634e3410ab5383197e44c61b476859d491ada6a3372ec836703f45468c69b1e5fc5ddc7ff6b2887592c262eee4b6cc6fc72365dcf8f6936011d0333e4f0629bb26e3a3c006a6639d09932935586a1492e2794f419497eab819076036893cb4d59104ec9d84505d1785d519b47edb28e8b4669aa6681bcd6d55cb4fc035857d3a8442906347983db9d6f2d898240d605a4f754198066cf22c0d6c425c60219ffff038cec94690e812e7fb50dff8c81d6211cb04743e5f8b76ec3a0ae059cac47e35903c5d01e47803849da226a02611ef29cb491a21cdc63096268eb51c1a0843c4ed003afe9d0d8fa6e4747ad158ced6b55f01473e75f41d1e7d47adcce27132d7b025c03bc85eae3105a35f82706f6319857a7ac5eebf8610cb2b353a6ed897ab70dcb28033f8fdc957e9a6be57bdafcdce8e717438e528911250703139eced50227b94732038e2700a442df5351298173355c3b6948692a0aa43d0044ec7c86a515bdf00a0b03aa0ec262c412f391b647ab1c28c33bd5793e892053147db4f7ebf0760c25429f034a678e08eef171a227e2c5b85449d0f4edc4a1bf5af18ba3d50b259466fb5edb03dc10b47057d2b48f4e4f2b1158dd54217c501ff16f9317c8d3e0b84a4f30ba010317c739f6fe76b7c7abf9bb10be50efdf902cafe342a502ab30874a0b2af7f14a03fb1afe85865a484dc8bf452c789e5011a1e59903d20972f05924a3e2b6deb85a03669dcc7f9b458db580f119eb416696503d3d31b28b02006cd2a8aee8793ccc740371164d32d2071d367ac6f34d4f75dce044da25150290ee13d769e5582e44371903ff32cdf921656f5171bb158da3402c8cfd140a82cb082e97a038e365fafcc8ee031110365a261d78d3acdd84899925a17832414b7d5ee2dcb16a7e08794143900603f9ee72e47c08060252c92cff490f96258af3c94f91c4b4d84542834fa05871b7033cbeda459afbb6320e196a79432f699b31617792176aaacf13c6d8a1986e954003886c9f36f5ada18e9f6ab067414197c8a3782aef8f8779823e9f2b4ca354ada303a3cef5ad072fd3df16c8693ad4370eaf9fd2e94ce4f912b93dea097d034c78b103cfaac0025f48082bac7d449ce07b8e16aebdfb8d4393e1c2bf0fe18afd53b7990382308d803b12041ee39f1c4bcc77d1fa42ad4cbe9904adf28c80d44a285afde40393ad0a1fdacab9ff29e597772250f84c8eb04a5cbfcf0f37025c412b4e9bfa9f03d1e0219bf0dba4a943bdb2c350e355e231e5e841b553823cc0ed7230c048c0ef03820a6aff14571bb86f6d84a375b7d521c08a08496287215a10cbdae279d2b9ca0334afbb53384b515db917dcca63f9d03d58c5ce2547ad24d4576a8d9d02f5a177036aef2b3501214e8dc59b5bd2805acfcb72df6d0da71f9e639d60f101b347c7710381de9086c125bd22dbb92dcd1fbc97f4d4312d2c26c0706956671676f440f41703aef984fd1b9ad3eda0cb4a142bee3736b43c9527a075a44bfbefc5d232f1f85803a61ca9068d61226a8dfffc2477247b37de32d21b128a2ab35fe460987b07c505034c3a2507f2e7db35027f405b2cd849c5eccd2a1e6bb50a6c84da7249e2db82c4032318b89b50b7f709fa75c443ddb31fc492cb3cf3477b7984c8473059e29c4d74039ba4abd791f8ae056a86ef9042a7899ee877d32b493d5f4749aa10fff32a7f1003ddf112e1fc6b153bcc5ca042ac2ba3155aa74860672801cdb276f86ee57ddeaa033a599055e818613288c41f1bd8fe2a4b4e2b05fd23a3a15bf93f16aebf8016ad038ef61839303015b85e3b16fb1fafa1e328fbbfe1fa320753725f982d957654d8038cfa512313f881fdb9e35572587bf69f18ced08776ce49252737295a305966e003f5b536057aa56871b74c38946aa8e54bc4e7dfa53378a2cd9cbeb74cd62720ff03512e7fd967289262104cdbce4b8bc0529bc3a681e9bd1522398b320f89818bb103f9751ff6409ef2fdea49767eed7d654cc98e85f42df3dc401a32d04271577a7303ee7d6a2b0d6d1bc06fdc15320f90300f0ba7642580502c913ba5cbdcb181b1820331010542bfa65854dcce29889cc98de3c639df67379a3b3b3cf98affe2e74f3103dcb79a64cea3597b43fda68eb4d9b9180c3c5ac3512735a1cedf8454bbae58b8034ae3d75f8427121cdf2477d59c6209b77097f8c87292c1ab449e76639360891003914a40818907e5a93f60b05f39e062761b32d515d00583d3aa46034b1c908fbd030b6aaabb5b08f7f67a0b51d394270b37d22bce2df53899d94a428f4f026e0cac03d500a65e021bcace8afe1b96681b393a03d1403a0091bf471807405f950dafcc034eb68f2c06a6b6c91785f0b6d138c33d758e5ad655c179c88caea797147eccef033c3bb23d53ff8242dac04fc1731d0039eeeced92739e248c5b61a60244c03e7603070ce07d739dde5b920b62d01f256ce5466d56eb21f474757116dddcab87f21b03487bc66bb3e9ceaa6ea1782bd007b206d00b76b2b87c65a4ae83a82575fabe0503d4110432f0e1b72c655394ea770fa57c098cd925bde49fee3fa55c3274c04f3603eb8ddc9bd99dc0ae4003a5f637703be6c885cb30dccd4afee9636ca47a90addc038ac54f5d263ffe0769d2abf5f4b61c121180148b19c72a91011f0d3f8d3d54390330d48c7f9098573d652f0b71ed5f14a03f057dca4576bdf5c516b12aa17947c60605581e0309af0f46d24615c7d9edef73d22cc4390ff5f7167da82a3908fcb2e10007011bffffffffffffffff05581e03aac863645a002d6cd78e5f8a9af3dd879a4df84f17e74984f627c294f00c024686bad161a36003bb6c280d77e6d9ca1259c06dc4f38c59a8b3aab4b5fe6c5d20dc76f3818f438405581e037490de37e2dbfaa1e5da021e21b5a47d6fc60d929a3c39c2058fdd3d500c190654485cac3a41e77d836305581e0393884a96280807b1f28aef6947f8ed40af4aae57dd1a924be89aa731e00c014728e59229efe600030f8135fcb5c0719bb19a119537daee05e6ff0236a3a29a05e54e9ec4fc3bc25f05581e03f62e6e00c763e422f7ea24bd5c0e12f0184127ec8b603839a97dd4a4200c024676638b4d70a005581e03e76af22859b199cc092ad3b4ec3eafd7272e6998b1ad598ee26827b5e00c0146082b01dc616003d5a867d268961668f5797a04462bf5b4471525438ca312d5017d72f177b06e5a05581e0303175de6e25ee85989d4d1322bc974085c6e21b54ca16ec6aadc23d6b0040105581e039fad25174958c685cb6a9dc4f9945a11e2f9f4909a3d0d72b52c51f06004010219e7f103cfb7f60c65280c250ed8b66b63b64da972fe24c6603e6861cef1cb14cd23981a0219ffff034409d069f19218810c8e4b88c61128ae0efb3a56059cf946fe38dba77df0c05b0219ffff03459dbb1d11ed80ccdce6cffb2f541fc3e080c9bafff551b98cbd47224ae2d1de03c642b98ce0ccb2a233b951d05583436549a8497802a9b7e450fd9dd030dd270a037379bb1baa8c19f85dcc404819b82be8fa1d10173e59d5dc35bd67deb32e468d0219ffff03ddfd921ece199fdf9ce07d967cf21f29d6811e08436712c9d0676ed741c05282036f50cb292366eef9d858b3826744b2a41ecd06decace609438f63e0605c7d69e0311f0a7bdb78427132f11be5ad99ed58d019449d18daecea686d6b44a7027815403e44b739b1b2908ec7bc7f9ffd26d8da62b806b8bdeb771bfac7691480e9574e30219ffff03b2fc20b5aeb90cbb2f3c51dae028fb77ab15c165180e7295d58795a30544ef3e03979d76527eb461e0dd8e60369ac29beaf5494f9e27b34b1b682735999732809403d0a37bf5814eff746b6a32ce73e12f8885e688acbff824f2494318adac90de8203def5824947d97bdd038734f86e55bd395009261a1deabae90de5f434c03258820311a4afc85f12ab94373f29e51038721da8d12d4452c776ac89e4942c69d0dcae032410e0b73c01dfbc6d692850566e18ed74c647ef55e2a3d65686319f34d9c77703b1c0023f718a63cb2e1c7c3f02106d0faba37a4c38bddb5c6ba5e5f261b3219c03e10f202981587d0adbb061d8554ac0ce7b8767e69867b33d27f09e3178a87cc303fefb3ec6f8eb7e49ec0dc26bd164508cf7ad526fac485c018a06d78b3c5c61da03f1b021d8786270ffbcb4b12a7b796b1e9a079eeb1ab92ca7572377d05353d6270384ffe12720f1aad8e8505ebb585c100a8efe2ca78cc69a61d2b920eb6e6de25003ab0d481d603da4d7d3d30c2e03ca6ecfa986fd91b1edb1a1e42c2890b0d3ed550385e4a91ef8687739a0496322e9ff9ecdcc5e68167380e963a55ec5997182e8a60219ffff03ae293660abe3cddbc2c4e6817310249595745b8fb1c6c1b4da79e90fd51b235d035ad9172f95726ad772496c05b0bcfbc282260fe9d00ad2c40febc637d8b308a3035c5b7583250a54d367052f3844cfe3221b38ef3d1504503bbd779a881f41919d03bef722a29810d8be278b94808ffd425612a0fd56f0aaf969aa3a27bfd533a7ed03936826abe95e5dfeaf6478e54741a9a01f584e3b1f8b05d176291622f4378d3f0363b39b562a171826db83775ae1f478895fc31f510da32df98092fe62463257e903464a191921272ba4a42fa6db53e551c5bbfe3168de5181509ed51d2eac9810f9035fc2d93a5f27bcf189a50fbeabc574d45d40121b19dd3efeff86696528112f4a0377aa2e8df60c94eae555ea56a1328ff71cacb178ae8824de4ab8534c19f9c26603d9c04efb4ad6661520df6289bf6a4cd744b069c1140e9726f1a00baf8b6150c803786dd9ed4539405d4be63a773f8729f79df8a7a7fb3f70b83e2007bafd4a99ef030834cb96749641492857e5f4d71d47b8136a484058e25b8eeaf8b6dba0e3dcd303a1527dd47896f6d7f847576ef9b4330e2c1cca5653381b4b8b9b0608d7a3a45a03cfd3fa4caa95159f045dd28f2a6bf7cb576e533bfcab8918a56ef1e7d337658c03b01f89d3d73e072e79efdf19f4faf5dccd712bc4cb84119cfc0caea00a0a600e03452ad127705a5b6337f8e610a5c267dc9e6a9f81f0974a689da9795ffe787b7c032085fb3cdac5c4ee5fff92861d0cf965d0e6d0c6a2ec83a8b25aab42a4aac4dc03a551029b1762732d70d18f63fb3316b54252d09161432bf22301e734f813889f032f9904487b58121f4ec788fcda7a55acd495a0868af2760a47ab77875706a504038b199df28300fd77865fc68f88e022e7edde0ba0493f9d60041b5ff9c65c4af403296d3fa78b37ae73c02266ad6f7f21003f3c03abd3c979fa676837348f49dc42038781f363df6dd0ef638edc888e8f3529bc8e63326a4ca25f635214f483bb84020305639796c89edea337f3fc0d18bc6ed0bd006eea7fca668cfba48814b5ef153f03f76c5106240ca3da8dcf0aefa301d62524ac023371f4466e6f28c982d2cee71e03d96bedc83d6489e77fe4fee276088c5d390469868fbeb47c399e3fe115d4c74d034a0285e050b910bbd82ab2f451ca9e712ae0a139402cae99797d772572d4e06e03cf03cd33e89e67a721cdccfda36681ec2b5e6c31cf9f5139c625ce197fd1aa5c031f1ea19f5abc5eff32f2eda8e2c5e55d9b49ff02589779e629a324de60f3bb3e03deebc1ad243622d47ea74c10e94994572aa36ea066fe52ad1402bc2309ee51220331eba3738c7900df164323e31d56fcf16dab78c326d5a72b747368ffe008cc3203abf53e9d639ef7b9d62cc052cd2fca230c5696de26abf4bb3167e20533596ffc05581e03b8971967e2f5e83fd50155e29b0d1e3222134b6de74f48246afa33cda00c014614938f7bc00005581e036488ceb871fe4c94751d347eb0480cbe68f771256414587d625860cee0040105581e030ac604447b7178b395be93b3784feeb389f9dc79c831a14db8ae8412f0040205581e0392ce3266e0617c4a23a635682047f6189cd79f9f2d28bcc949c0b1314004020322685ffd66f4d243d83fac445f4713466e6dce4c46c7744ba4a0afbde5ae7d2203cb2944c6ea13de67d0cad588f3fd4493c2412350076a5c13f39b00f682eb2de70459270460806040526004361061009a5760003560e01c80638da5cb5b11610069578063b1ebddda1161004e578063b1ebddda14611616578063c44de60c14611636578063f2fde38b14611656576100a1565b80638da5cb5b14611592578063ad5c4648146115e9576100a1565b806301e33667146115355780631de3df2c146115555780634782f7791461155d578063715018a61461157d576100a1565b366100a157005b60003560e01c6001811461013057600281146101cb578015610278576006811461031b576003811461043b57600481146104c7576005811461059f576007811461069257600881146108505763fa461e33811461096f576310d1e85c81146109e45761012e60067f55444645727200000000000000000000000000000000000000000000000000006114df565b005b60043560e01c61013e610a24565b8015610182578115824314176101795761017960107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b61018233610a61565b505060083560901c60163560901c60243560f81c60253560601c6101bb848273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611448565b61012e8284600030856000610e5b565b60043560e01c6101d9610a24565b801561021d578115824314176102145761021460107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b61021d33610a61565b60083560901c915060163560901c60243560601c60383560601c610242858284611448565b6102656000823073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28688610e27565b505050801561012e5761012e6000611327565b60043560e01c610286610a24565b60243560f01c81156102d4578215834314176102c7576102c760107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b6102d46000821133610a41565b60263560f81c925060278360140281016001850160140281016102fa8183888688610c6d565b505050811561012e5761030d6001611327565b801561012e5761012e610b50565b60043560e01c610329610a24565b801561036d578115824314176103645761036460107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b61036d33610ada565b60463560f81c604735606090811c90602435811c90605b35901c603835609090811c90606f35901c9650346103aa576103aa81888585888a6110e6565b605b36036103b981605b61151b565b90503086156001811461040d576103d483888489898f610ef3565b848110156104075761040760097f5633414f4572726f7200000000000000000000000000000000000000000000006114df565b5061041b565b61041b838884898989610e27565b5050505050505050801561012e576104336001611327565b61012e610b50565b60043560e01c610449610a24565b801561048d578115824314176104845761048460107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b61048d33610ada565b60163560601c9150602a3560f81c602b3560901c60393560901c6104b683828430896001610e5b565b505050801561012e5761012e610b50565b60043560e01c6104d5610a24565b8015610519578115824314176105105761051060107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b61051933610ada565b60163560601c9150602a3560601c603e3560901c604c3560901c61055781833073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2878a6001610dd8565b94508085101561058c5761058c60097f5633414f4572726f7200000000000000000000000000000000000000000000006114df565b505050801561012e576104336000611327565b60043560e01c6105ad610a24565b60243560f01c81156105fb578215834314176105ee576105ee60107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b6105fb6000821133610a41565b60263560601c9250603a3560601c604e3560f81c604f3560901c605d3560901c606b3560901c6003861634610637576106378385878c85611116565b8061065b5761065b848a73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611448565b610669858486898d86610e5b565b5061067d8460010382600030896000610e5b565b5050505050811561012e5761030d6001611327565b60043560e01c6106a0610a24565b60243560f01c81156106ea578215834314176106e1576106e160107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b6106ea33610ada565b60263560601c9250608a3560901c60038216603a3560601c60623560601c60983560901c346107355761073581868473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28c896110e6565b6003600287901c168381156107475750305b8561076b5761076b878b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611448565b61078e8388838773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28f8c610dd8565b50604e3560601c995060763560601c965060a63560901c95506003600489901c16975089905087156107bd5750305b6107cc8684838a888a88610dd8565b5050505050506107de60b43560901c90565b61080181833073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2878b8a610dd8565b9550831561083c578086101561083c5761083c60097f5633414f4572726f7200000000000000000000000000000000000000000000006114df565b50505050801561012e576104336001611327565b60043560e01c61085e610a24565b60243560f01c81156108ac5782158343141761089f5761089f60107f426c6f636b4e756d6265724572726f72000000000000000000000000000000006114df565b6108ac6000821133610a41565b60263560601c925060653560901c60038216603a3560601c60623560f81c60733560901c346108e2576108e28186848b88611116565b8361090657610906858973c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611448565b610914828287868c89610e5b565b5050604e3560601c955060633560f81c925060813560901c915061093e8383600089856000610e5b565b50505060643560f81c608f3560901c61095d8282600030896000610e5b565b5050811561012e5761030d6001611327565b61097832610ada565b60643580601481146109c35761098d82610bab565b600181146109b75760043560008112156109a657506024355b60843560601c61012e823383611448565b61012e83336084610bbf565b60043560008112156109a6575060243560843560601c61012e823383611448565b6109ed32610ada565b6084356109f981610bab565b60018114610a185760a43560601c60b83560901c61012e813384611448565b61012e823360a4610bbf565b600030331460018114610a3957600191505090565b600091505090565b8160018114610a5857610a5382610a61565b505050565b610a5382610ada565b73de09838eedb3030153524b5a14972e7c9ef6576581147383b4f74296738d8c2e15bd7c1f4a19df122354f582141773744bc1d963e8f54395dfe504e343fc3f2fe8fc8b821417610ad757610ad760087f4e6f7441646d696e0000000000000000000000000000000000000000000000006114df565b50565b7319719e2aa3a47cb0080d7ba10ac3f9651ccd2a7c81147349f18c6370d3235fcc7cf4fd8167b8ca9bed0af882141773e4b35743c2c15760d7551afc9c304ec0dc30ba50821417610ad757610ad760097f4e6f7441646d696e4300000000000000000000000000000000000000000000006114df565b60083560901c610b743073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26112e0565b81811015610ba757610ba760077f42414572726f72000000000000000000000000000000000000000000000000006114df565b5050565b60006058821115610bba575060015b919050565b602281013560f81c6023820135606090811c908335811c906037850135901c6014850135609090811c90604b870135901c60378903610c018160378a0161151b565b87610c51576059821015610c3857610c1a838887611448565b506000610c2b81888c898989610e27565b5050505050505050505050565b610c46818830898989610e27565b610c2b848b88611448565b610c5f81888c898988610ef3565b505050505050505050505050565b60005b83811015610dd05760036002820283901c1660018201606f86821015610c9c57506002810284901c6003165b601484028801803560601c601482013560601c9150601486028801803560601c3085610ccc5750601482013560601c5b878015610d7757600e8a028f013560901c965089610d0357600e88028f013560901c935034610d0357610d0384888888878e6110e6565b6040519350601484528460601b602085015260348401604052610d2a84848489898c610ef3565b96508c8803610d7257600e88028f013560901c935083871015610d7257610d7260097f5633414f4572726f7200000000000000000000000000000000000000000000006114df565b610dbc565b600e88028f013560901c965089610dad578e3560901c935034610da257610da287858888878e6110e6565b610dad848487611448565b610dbc6000848489898c610e27565b505050505050505050600181019050610c70565b505050505050565b60008115610e0d57604051601481528460601b602082015260348101604052610e0581858989898d610ef3565b915050610e1c565b610e1c6000848888888d610e27565b979650505050505050565b610e3183836114b7565b50600082828514610e43575082905060005b610e50898883858c61102f565b505050505050505050565b808015610ecd5760016401000276a488610e8a57506000905073fffd8963efd1fc6a506488495d951d5263988d255b6040516014815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260601b602082015260348101604052610ec38188848b878b610f63565b5050505050610eea565b60008688610edc575086905060005b610e5060008783858961102f565b50505050505050565b6000610eff84846114b7565b5060016401000276a4828614610f2a57506000905073fffd8963efd1fc6a506488495d951d5263988d255b610f388a898388868e610f63565b93509050818015610f4e57836000039450610f55565b8160000394505b505050509695505050505050565b6000806040517f128acb08000000000000000000000000000000000000000000000000000000008152876004820152846024820152856044820152866064820152885160a060848301528060a483015260a482016001820160205b81811015610fd6578c81015183820152602001610fbe565b601f84169150811580610fec57818e0151828501525b505050506000828260c401846000895af190503d806000843e81801561101c578351955060208401519450611020565b8184fd5b50505050965096945050505050565b6040517f022c0d9f00000000000000000000000000000000000000000000000000000000815282600482015283602482015284604482015285516080606483015280608483015260008111156110bd57608482016001820160205b818110156110a257898101518382015260200161108a565b601f841691508115806110b857818b0151828501525b505050505b6000828260a401846000875af1905080806110dc573d806000853e8084fd5b5050505050505050565b6110f084846114b7565b50600084821460018114611107576000915061110c565b600191505b506110dc88888387875b8015600181146111cc57367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec013560601c611150846112a0565b8560018114611191578282111561118c5761118c60037f43453300000000000000000000000000000000000000000000000000000000006114df565b6111c4565b828210156111c4576111c460037f43453200000000000000000000000000000000000000000000000000000000006114df565b505050610dd0565b6111d784868561120a565b86811015610eea57610eea60037f43453100000000000000000000000000000000000000000000000000000000006114df565b60006112168483611238565b6103e585028181029150806103e8840201925050818104925050509392505050565b6000806040517f0902f1ac000000000000000000000000000000000000000000000000000000008152600081600483875afa503d806000833e50805160208201519150856001811461128f57829450819350611296565b8194508293505b5050509250929050565b60006040517f3850c7bd000000000000000000000000000000000000000000000000000000008152600081600483865afa503d806000833e505192915050565b60006040517f70a08231000000000000000000000000000000000000000000000000000000008152836004820152600081602483865afa503d806000833e50519392505050565b346000811160018114611391578215610a535760163560901c91508115610a5357611351826113cb565b60008060008085415af18061138b5761138b60197f7472616e7366657220636f696e62617365206572726f723a32000000000000006114df565b50505050565b60008060008085415af18061138b5761138b60197f7472616e7366657220636f696e62617365206572726f723a31000000000000006114df565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152816004820152600081602483600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af1905080610ba757610ba760137f776974686472617757657468206661696c6564000000000000000000000000006114df565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081528260048201528360248201526000816044836000865af190508061138b5761138b601c7f736166655472616e736665723a7472616e73666572206661696c6564000000006114df565b600080838310600181146114d0578391508492506114d7565b8392508491505b509250929050565b62461bcd60e51b6000527c20000000000000000000000000000000000000000000000000000000006020528160e01b6040528060445260646000fd5b604051828152828260208301379182016020016040525090565b34801561154157600080fd5b5061012e611550366004612278565b611676565b61012e6116ed565b34801561156957600080fd5b5061012e6115783660046122b4565b611762565b34801561158957600080fd5b5061012e6117d3565b34801561159e57600080fd5b506000546115bf9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156115f557600080fd5b506001546115bf9073ffffffffffffffffffffffffffffffffffffffff1681565b6116296116243660046122de565b6118a9565b6040516115e091906123df565b34801561164257600080fd5b5061012e61165136600461246d565b611cc6565b34801561166257600080fd5b5061012e6116713660046124ad565b611e5d565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610a53838383611fda565b6000341161173d5760405162461bcd60e51b815260206004820152600a60248201527f76616c756520697320300000000000000000000000000000000000000000000060448201526064016116d9565b6001546117609073ffffffffffffffffffffffffffffffffffffffff16346120c5565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116d9565b610ba782826120c5565b60005473ffffffffffffffffffffffffffffffffffffffff16331461183a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116d9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60608315806118b757504384145b6119035760405162461bcd60e51b815260206004820152601160248201527f426c6f636b4e756d6265724572726f724d00000000000000000000000000000060448201526064016116d9565b337383b4f74296738d8c2e15bd7c1f4a19df122354f581148061194f575073ffffffffffffffffffffffffffffffffffffffff81167349f18c6370d3235fcc7cf4fd8167b8ca9bed0af8145b80611983575073ffffffffffffffffffffffffffffffffffffffff811673744bc1d963e8f54395dfe504e343fc3f2fe8fc8b145b806119b7575073ffffffffffffffffffffffffffffffffffffffff811673e4b35743c2c15760d7551afc9c304ec0dc30ba50145b806119eb575073ffffffffffffffffffffffffffffffffffffffff811673de09838eedb3030153524b5a14972e7c9ef65765145b80611a1f575073ffffffffffffffffffffffffffffffffffffffff81167319719e2aa3a47cb0080d7ba10ac3f9651ccd2a7c145b611a6b5760405162461bcd60e51b815260206004820152600960248201527f4e6f7441646d696e4d000000000000000000000000000000000000000000000060448201526064016116d9565b8567ffffffffffffffff811115611a8457611a846124cf565b604051908082528060200260200182016040528015611ab757816020015b6060815260200190600190039081611aa25790505b5091503060005b87811015611bc8576000808373ffffffffffffffffffffffffffffffffffffffff168b8b85818110611af257611af26124fe565b9050602002810190611b04919061252d565b604051611b12929190612599565b6000604051808303816000865af19150503d8060008114611b4f576040519150601f19603f3d011682016040523d82523d6000602084013e611b54565b606091505b509150915081611ba057604481511015611b6d57600080fd5b60048101905080806020019051810190611b8791906125a9565b60405162461bcd60e51b81526004016116d99190612669565b80868481518110611bb357611bb36124fe565b60209081029190910101525050600101611abe565b50611bd2856121b5565b8315611cbb576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015611c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c67919061267c565b905084811015611cb95760405162461bcd60e51b815260206004820152600860248201527f42414572726f724d00000000000000000000000000000000000000000000000060448201526064016116d9565b505b505095945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d2d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116d9565b80611dcf576001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015611dab573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b9190612695565b6001546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90602401600060405180830381600087803b158015611e3b57600080fd5b505af1158015611e4f573d6000803e3d6000fd5b50505050610a5383836120c5565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ec45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116d9565b73ffffffffffffffffffffffffffffffffffffffff8116611f4d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016116d9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600060606040517fa9059cbb00000000000000000000000000000000000000000000000000000000815284600482015283602482015260008060448360008a5af192503d806000833e5051905081801561204c57508051158061204c57508080602001905181019061204c9190612695565b6120be5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016116d9565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516120fc91906126b2565b60006040518083038185875af1925050503d8060008114612139576040519150601f19603f3d011682016040523d82523d6000602084013e61213e565b606091505b5050905080610a535760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c656400000000000000000000000060648201526084016116d9565b3480156121c657610ba741826120c5565b8115610ba7576040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810183905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b15801561223257600080fd5b505af1158015612246573d6000803e3d6000fd5b50505050610ba741836120c5565b803573ffffffffffffffffffffffffffffffffffffffff81168114610bba57600080fd5b60008060006060848603121561228d57600080fd5b61229684612254565b92506122a460208501612254565b9150604084013590509250925092565b600080604083850312156122c757600080fd5b6122d083612254565b946020939093013593505050565b6000806000806000608086880312156122f657600080fd5b853567ffffffffffffffff8082111561230e57600080fd5b818801915088601f83011261232257600080fd5b81358181111561233157600080fd5b8960208260051b850101111561234657600080fd5b60209283019a909950918801359760408101359750606001359550909350505050565b60005b8381101561238457818101518382015260200161236c565b8381111561138b5750506000910152565b600081518084526123ad816020860160208601612369565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612452577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612440858351612395565b94509285019290850190600101612406565b5092979650505050505050565b8015158114610ad757600080fd5b60008060006060848603121561248257600080fd5b61248b84612254565b92506020840135915060408401356124a28161245f565b809150509250925092565b6000602082840312156124bf57600080fd5b6124c882612254565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261256257600080fd5b83018035915067ffffffffffffffff82111561257d57600080fd5b60200191503681900382131561259257600080fd5b9250929050565b8183823760009101908152919050565b6000602082840312156125bb57600080fd5b815167ffffffffffffffff808211156125d357600080fd5b818401915084601f8301126125e757600080fd5b8151818111156125f9576125f96124cf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561263f5761263f6124cf565b8160405282815287602084870101111561265857600080fd5b610e1c836020830160208801612369565b6020815260006124c86020830184612395565b60006020828403121561268e57600080fd5b5051919050565b6000602082840312156126a757600080fd5b81516124c88161245f565b600082516126c4818460208701612369565b919091019291505056fea2646970667358221220932e621a318d90d57728b23b6b8ebe354e5199bd783a1acaf86074346a7ae8ba64736f6c634300080e00330058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56305410d943f5633601c7b8c3b372344e6efc81eef8590058210310e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6054c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20219080405581e03d1e36fd391765bbd4a519f884d78455ee5bfdf384736a00e181b3acb100f0147061bd47e8b4f4419270403166cba5acb1a5132ed604d27477f76feb649a56bfeddd965f1cff1f60eb003f905581e038de083c28af92607f637131c37dba4c7b72df805cb584abc910c6ae2400c18a14739b7bb9f2afac705581e036ee6a1d847851f4666bed5c0d3d27784495e23255b85c86710c68cbe500c024702e5972354226c02190dfe037fbcdd3bbd34d9b1721a72138883c1d2d4c619eba0d4899bcc9300ba2c08d90203ec81b54e953804ed8c7b82108f2990ee41f569a9a5cbac888ed9c34418d87677032e75389d74795252e76a0a0910440e1a62c88dab5b799acabf4d78c81ba197d2037fa45a9fe8977e379d4529cd907bec97ede6598301278add040b3c2ea0a407d603a11b78759f6317337167e25e628be5d7bfc9c37ad7dcf9c0ccc77158450380520219ffff03cc0040f8b4fbff51c0ad1b7710242eeff01654763ec33aeb52e2f8a1a3a4f9e503af26dddb3bd264d7db42076334a9d44d72e8130d1147f949eb1a5f4cfb44e52f030bf5636a845cb1e79b67d37e199d98495dd97114aac9533a1c247d2178c0b40d0336d7421ec59a1fc107f3a40c857ef57060af1b683dbbe7e1ae3c277187ba80ea0353d23c8d8191f6bfeb79319f3cbf068a04505486c3ed54e949d9d44ef679d45103331c67b9d15b402274e86815be78462c5be10d3621ab38a0d6ae2ddd7b8baf8e0219ffff031033cf636ce42c22de07cc39d3478b3368bbf3638526fad4927e074a01560239036a22116ed3ac780090ba206b862e044ff0cf2ee389cef93dbc9e4fcc415b90f7035b258a1e6267f6e1fa7e8b6fdf3b69f705527a0817b96205474e3baa43149f3003f09a95e75308449bb78aa85a27c7a4cd7c137fa63a7f79d15bcc09dce3d822e40376e68cb02ba670190c510c3b4392cf7d37e7bf15ae6a8909da54e757ccbe6c5a03907475f8f41ba06e55670725d6a42430f78f584e782f29feb47b5871bb89903703b300a0d103c0557e248b6c3326c75162e578f66d37d48db092184806baeb27dc032057ebd34af07d82d56b0f5ceb2c8e242848f2f14befab412c1b30aafbbefe710219ffff03babe6b515cf2a449471a5015e761c78fbfc4b467e36aeac9e95687b130ee5f51036b9db22a9a878c2087fc8f038e0b56a66a78f83929717819640adb2a1e113fc103f7f2c2f10a8eecf5786704ea87dc6d22ae4f36afb8155b60c1fad8dee4b4712403bad25ff330db4a52a5def2afeb01dcd7575e24c356b1373c1b3e9372a7a8cc4e033853e06919d519c5f38d17d4314470bffef11b68196778e48cae52863f25dea503dc63ac4e2437e738f391eef51d42a951c95e976b05b6d7074cd96474eccb09b203e34dc65c5890e69bbb32a9ef90c57d2ef46a142712ab577f53e3fc06b328f7ed03968c7804351e62726e4ff4693a1e99c81645be8ed49c74e31a96437c416e9bb80360b11412e8a9f294f6e01cf4556b0af7e6b67788af4215dc6e74f0b19bdf1e42034488b2271b1634cdda9c8b32bea9114f04cede3f99afa15436439d583186970e0219ffff0350066cb67c52b9d23d6f6e85c58c2e02d85e7dc9928e0b6a2fa468f2b2ffd4ab03b39e4e5884dac60a8278529349312286331f51e37d0b0747a829b80ad290139e036f862d27e55f213ad069e611d4652601c9e554a0d161140f65276ac2dbdfeaa803fb39494bb9d03c568859c4a168143118335a3c818c5c219a900ef328fd67c301035d5e64342445f410edcc877e67f5241963338cdddcdaedb7d55e5db546517989033b4793ca1456af2e262c56b84ba1f742c23e0b97a585e4752128ed1d27d7c7a903b67230383f3183bf9bcc0f462c724572ad43a9ecec6383ed9a9bdf6d002f61ce0384ae369c8ddc9bad7ccda88e7c9c4798bf62161f3f039b572bce167fb27ecc0f03a8135b3f62177e7a9ae95a7eb2ea4cfd5ba5878b453a4c731d93ff3b6e9daf6903314ff144a7e487cfb5bc452dfbb742fb9c1c7055019723524936aabd00a7b8b1038e4401767f85303e41a6e7f2e51ba885f429056454ec0d36b0da624f41ca8528031264525fa2a269995835d3e83791e40aa57d5fc97c2d08f44de3acf55164ae1003de8be2322451cfc03cae9f799eed95dd44cdb530d178306fa7199616add4253a03ddec68283ccd6e20527e07bf9d2ef5cafd17e805649707987bf5cb6c82c89bb90350968574dc68676695037a86c185ba272c93aa7ff84788c87f0661a2aec449230219ffff0329f5ea03f138654821a56c803f1c8781e95cd37ad57e295fc9a614574390d39403a83733e7a9e8e45397a4f248abf791ddca5a8596579467eba057e2b12d2a6d090363e407ce706f3c4b6dcbcc412ac9faeb063a0f0280d46acaec189b747361cf240316e5616221e0f41071280d2f81ef5c685d140eb7d94a4f172fff4808fa0586dd036adf750f60b31cc5992b96556a44bb210008c0d193aaf86a10b646c345c16b52036a6265623e513be11407ddde45601c989111a620b438420f978e51aa2299a45c031fc06c1559d481fd7751cab8a1a28aa043b09dd6b8a9003c07e99fa232b9d53803e39c343a022e5adb5ddb9de1fb5429380e84fbf2edc958a9fb9235d6a20f6edf035943e330cdc50f5c240ce93e408c8352e1c1860448f590f7ab110c96333a5fc3033cfd59903e9469371629266f4dfe8497fd9d64c0a0d69435ab5ef096717f500803a7bd073efeade7339903c1c84b380c596f6bb03a468435acbb58ad2d55503588033db92409d33e9c5ed24b70b60ccd28cb150cfd080be3dda3dd2ed6864f220d0f036bfa5ec82ad90f847ac7b1204d3722741e9b6fe1e5d627bb9f07245ce98ff12d0364889c57678439f414dad7f20b34e390507d7dfd771178f2b861afd07358973003f311510188e2ada3c74a8af101b9ead4bd3a0504f29daae9edefcfeb6d51a77f031cf4da75e563752699a28a070e83902720798921ef0243233a44cc952b631be803a2b288c3f489f99e9fbc68793de3dd5a602474bed5d41439d90ff45a6d00452c03ac9627b7f877637fcae78668a792401b53347c2c8502ef1a5b850226321e806e03cbe73dd06a125feaab189d1c3fac24a9c20e51f27a43ea82d297a159b179aacc03abb4c0d6016205cbcfcefae5fb5ea50cd2d4b283a3a03c7919bc26329552287a037c2264be4993bf805a7e035a9220f894640846b5409f1a7b6ddac86d093dd12f03ba9b0a4fd0a60166b71ca888cdb209e144a10ea491396661b6d3e01db952d45f03c800fde1d87a58058d05e9a69d513f3ec61751988718de94daec4468d471c5f703334bf048147bc3c8d5eda628fa4e2b7da233137a09e9bd2d0968ae13b021891a03dc8479561c4b58e13eefd0fefae7a2b5943468036a14ecb43f433704645383260303071dbb5906fdd60e3f3793cd0f1c4612019151db0a430c21ba9d5a8ea4282d035aa3d5150785de378a065383c6e99fcaa54d34a18dbf48785bcb3e474161fca1031a6fc96f268cdf8409a5afd3d76950e04b629bd1c14ecdf9e514ce9c4fed6ec1033ed2d7fe66a7bb3d912ecd8e8ef51b79e550d1759f93152a1a8b28f1c647286703a33d3c3ed50965a874d739d252afe0069b6d8353ddf1d4e525967322b8f5a79903fbe4a701c0efe983660ad7caa7cee90a3c1b45ee16a2d5f75e667796f93b6f81038b89d95fcde74215b4cee473bf62ba977832e2ea3c99505e31d637c30694695e05581e0387aafd947848989648f2c48c38ab94d95be2615644b89c5b14cb7f6ae00c044727329e584eb3570314c1811cbbd2b3af2e2399efbbc145d5566e88644f8ad6b48f29b0de6335d3c4031b460c826a854d61dca82f718e088b8b4c4082ffeb93752d7691bc62c51dc0280605581e03a70a818564a13adb6652153ada0fdd5bf1f4f94da63b492dcaf9e428b007011bffffffffffffffff03e25d4f154acb2394ee6c18d64fb5635959ba063d57f83091ec9cf34be16224d703608a02f403f30892b8967da9ac469a8c36335336a69bfcb93089ae791d2c976f05581e035331503212364343f6be717d883932db5da5e03c0c6ce7823efe84e8100f01447807c1dc1bffffffffffffffff031bb9923cd5c240f934d10aa469719216b5085bad3872169ccced536edc22277b03da9a8dc62f6fe7e06cf36272a7824915f0fa67a577b587182bb8eb00ead29d6103ec549f9c6738e97fd8fe16864a50696530be736dbe5b3f828cc38c4201b2fae804592c1d608060405234801561001057600080fd5b50600436106101b95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a7146105da578063d505accf146105e2578063dd62ed3e14610640578063fff6cae91461067b576101b9565b8063ba9a7a5614610597578063bc25cf771461059f578063c45a0155146105d2576101b9565b80637ecebe00116100d35780637ecebe00146104d757806389afcb441461050a57806395d89b4114610556578063a9059cbb1461055e576101b9565b80636a6278421461046957806370a082311461049c5780637464fc3d146104cf576101b9565b806323b872dd116101665780633644e515116101405780633644e51514610416578063485cc9551461041e5780635909c0d5146104595780635a3d549314610461576101b9565b806323b872dd146103ad57806330adf81f146103f0578063313ce567146103f8576101b9565b8063095ea7b311610197578063095ea7b3146103155780630dfe16811461036257806318160ddd14610393576101b9565b8063022c0d9f146101be57806306fdde03146102595780630902f1ac146102d6575b600080fd5b610257600480360360808110156101d457600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff604083013516919081019060808101606082013564010000000081111561021857600080fd5b82018360208201111561022a57600080fd5b8035906020019184600183028401116401000000008311171561024c57600080fd5b509092509050610683565b005b610261610d57565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102de610d90565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b61034e6004803603604081101561032b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610de5565b604080519115158252519081900360200190f35b61036a610dfc565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61039b610e18565b60408051918252519081900360200190f35b61034e600480360360608110156103c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610e1e565b61039b610efd565b610400610f21565b6040805160ff9092168252519081900360200190f35b61039b610f26565b6102576004803603604081101561043457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610f2c565b61039b611005565b61039b61100b565b61039b6004803603602081101561047f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611011565b61039b600480360360208110156104b257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113cb565b61039b6113dd565b61039b600480360360208110156104ed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113e3565b61053d6004803603602081101561052057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113f5565b6040805192835260208301919091528051918290030190f35b610261611892565b61034e6004803603604081101561057457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356118cb565b61039b6118d8565b610257600480360360208110156105b557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118de565b61036a611ad4565b61036a611af0565b610257600480360360e08110156105f857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611b0c565b61039b6004803603604081101561065657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611dd8565b610257611df5565b600c546001146106f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55841515806107075750600084115b61075c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612b2f6025913960400191505060405180910390fd5b600080610767610d90565b5091509150816dffffffffffffffffffffffffffff168710801561079a5750806dffffffffffffffffffffffffffff1686105b6107ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612b786021913960400191505060405180910390fd5b600654600754600091829173ffffffffffffffffffffffffffffffffffffffff91821691908116908916821480159061085457508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b6108bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f556e697377617056323a20494e56414c49445f544f0000000000000000000000604482015290519081900360640190fd5b8a156108d0576108d0828a8d611fdb565b89156108e1576108e1818a8c611fdb565b86156109c3578873ffffffffffffffffffffffffffffffffffffffff166310d1e85c338d8d8c8c6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b1580156109aa57600080fd5b505af11580156109be573d6000803e3d6000fd5b505050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610a2f57600080fd5b505afa158015610a43573d6000803e3d6000fd5b505050506040513d6020811015610a5957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191955073ffffffffffffffffffffffffffffffffffffffff8316916370a0823191602480820192602092909190829003018186803b158015610acb57600080fd5b505afa158015610adf573d6000803e3d6000fd5b505050506040513d6020811015610af557600080fd5b5051925060009150506dffffffffffffffffffffffffffff85168a90038311610b1f576000610b35565b89856dffffffffffffffffffffffffffff160383035b9050600089856dffffffffffffffffffffffffffff16038311610b59576000610b6f565b89856dffffffffffffffffffffffffffff160383035b90506000821180610b805750600081115b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612b546024913960400191505060405180910390fd5b6000610c09610beb84600363ffffffff6121e816565b610bfd876103e863ffffffff6121e816565b9063ffffffff61226e16565b90506000610c21610beb84600363ffffffff6121e816565b9050610c59620f4240610c4d6dffffffffffffffffffffffffffff8b8116908b1663ffffffff6121e816565b9063ffffffff6121e816565b610c69838363ffffffff6121e816565b1015610cd657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e697377617056323a204b0000000000000000000000000000000000000000604482015290519081900360640190fd5b5050610ce4848488886122e0565b60408051838152602081018390528082018d9052606081018c9052905173ffffffffffffffffffffffffffffffffffffffff8b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600a81526020017f556e69737761702056320000000000000000000000000000000000000000000081525081565b6008546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000008304909116917c0100000000000000000000000000000000000000000000000000000000900463ffffffff1690565b6000610df233848461259c565b5060015b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610ee85773ffffffffffffffffffffffffffffffffffffffff84166000908152600260209081526040808320338452909152902054610eb6908363ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610ef384848461260b565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60055473ffffffffffffffffffffffffffffffffffffffff163314610fb257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c5460011461108457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611094610d90565b50600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905193955091935060009273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d602081101561113857600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d60208110156111db57600080fd5b505190506000611201836dffffffffffffffffffffffffffff871663ffffffff61226e16565b90506000611225836dffffffffffffffffffffffffffff871663ffffffff61226e16565b9050600061123387876126ec565b600054909150806112705761125c6103e8610bfd611257878763ffffffff6121e816565b612878565b985061126b60006103e86128ca565b6112cd565b6112ca6dffffffffffffffffffffffffffff8916611294868463ffffffff6121e816565b8161129b57fe5b046dffffffffffffffffffffffffffff89166112bd868563ffffffff6121e816565b816112c457fe5b0461297a565b98505b60008911611326576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612bc16028913960400191505060405180910390fd5b6113308a8a6128ca565b61133c86868a8a6122e0565b811561137e5760085461137a906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c5460011461146957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611479610d90565b50600654600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905194965092945073ffffffffffffffffffffffffffffffffffffffff9182169391169160009184916370a08231916024808301926020929190829003018186803b1580156114fb57600080fd5b505afa15801561150f573d6000803e3d6000fd5b505050506040513d602081101561152557600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8516916370a08231916024808301926020929190829003018186803b15801561159957600080fd5b505afa1580156115ad573d6000803e3d6000fd5b505050506040513d60208110156115c357600080fd5b5051306000908152600160205260408120549192506115e288886126ec565b600054909150806115f9848763ffffffff6121e816565b8161160057fe5b049a5080611614848663ffffffff6121e816565b8161161b57fe5b04995060008b11801561162e575060008a115b611683576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612b996028913960400191505060405180910390fd5b61168d3084612992565b611698878d8d611fdb565b6116a3868d8c611fdb565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8916916370a08231916024808301926020929190829003018186803b15801561170f57600080fd5b505afa158015611723573d6000803e3d6000fd5b505050506040513d602081101561173957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191965073ffffffffffffffffffffffffffffffffffffffff8816916370a0823191602480820192602092909190829003018186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d60208110156117d557600080fd5b505193506117e585858b8b6122e0565b811561182757600854611823906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b604080518c8152602081018c9052815173ffffffffffffffffffffffffffffffffffffffff8f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b6040518060400160405280600681526020017f554e492d5632000000000000000000000000000000000000000000000000000081525081565b6000610df233848461260b565b6103e881565b600c5460011461194f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654600754600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9485169490931692611a2b9285928792611a26926dffffffffffffffffffffffffffff169185916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6020811015611a1857600080fd5b50519063ffffffff61226e16565b611fdb565b600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611aca9284928792611a26926e01000000000000000000000000000090046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff8616916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b50506001600c5550565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b42841015611b7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e697377617056323a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff80891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015611cdc573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611d5757508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611dc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e415455524500000000604482015290519081900360640190fd5b611dcd89898961259c565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c54600114611e6657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611fd49273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015611edd57600080fd5b505afa158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b158015611f7a57600080fd5b505afa158015611f8e573d6000803e3d6000fd5b505050506040513d6020811015611fa457600080fd5b50516008546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166122e0565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b602083106120e157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016120a4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612143576040519150601f19603f3d011682016040523d82523d6000602084013e612148565b606091505b5091509150818015612176575080511580612176575080806020019051602081101561217357600080fd5b50515b6121e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f556e697377617056323a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b60008115806122035750508082028282828161220057fe5b04145b610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820382811115610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6dffffffffffffffffffffffffffff841180159061230c57506dffffffffffffffffffffffffffff8311155b61237757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f556e697377617056323a204f564552464c4f5700000000000000000000000000604482015290519081900360640190fd5b60085463ffffffff428116917c0100000000000000000000000000000000000000000000000000000000900481168203908116158015906123c757506dffffffffffffffffffffffffffff841615155b80156123e257506dffffffffffffffffffffffffffff831615155b15612492578063ffffffff16612425856123fb86612a57565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169063ffffffff612a7b16565b600980547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169290920201905563ffffffff8116612465846123fb87612a57565b600a80547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216929092020190555b600880547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff888116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008883168102919091177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612641908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054612683908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d602081101561278157600080fd5b5051600b5473ffffffffffffffffffffffffffffffffffffffff821615801594509192509061286457801561285f5760006127d86112576dffffffffffffffffffffffffffff88811690881663ffffffff6121e816565b905060006127e583612878565b90508082111561285c576000612813612804848463ffffffff61226e16565b6000549063ffffffff6121e816565b905060006128388361282c86600563ffffffff6121e816565b9063ffffffff612abc16565b9050600081838161284557fe5b04905080156128585761285887826128ca565b5050505b50505b612870565b8015612870576000600b555b505092915050565b600060038211156128bb575080600160028204015b818110156128b5578091506002818285816128a457fe5b0401816128ad57fe5b04905061288d565b506128c5565b81156128c5575060015b919050565b6000546128dd908263ffffffff612abc16565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054612915908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310612989578161298b565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546129c8908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081209190915554612a02908263ffffffff61226e16565b600090815560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6dffffffffffffffffffffffffffff166e0100000000000000000000000000000290565b60006dffffffffffffffffffffffffffff82167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841681612ab457fe5b049392505050565b80820182811015610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe556e697377617056323a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f494e5055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f4c4951554944495459556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4255524e4544556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a723158207dca18479e58487606bf70c79e44d8dee62353c9ee6d01f9a9d70885b8765f2264736f6c634300051000320300ee6158611a510f7de2df7a2c4767d987778493b8e3b80910c7fead461bbe3f0058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56304b0314681367c295c3ff27fc0058200238e9689977d526f580531775c606e5a07c1ff4f40a9ee98e4cca4fe145a2f44106005820021540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af4d1eef57b0bce86debc4dd280c38021942000058210366cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688054c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200582002575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5820215b786e4eba85d363599f0603a96206d9fe3a001a117bd4680bc44156f3ec7f005820025a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85501f3f662916305da19deefd84fdc79e3923b00f41802184400582103f6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70410100582002f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3582065cf607b000000000007d33cd603004aedbf0001838810f254c24ce8a92f56600058200252222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f546d7497751656618fc38cfb5478994a20f7e235df0218480219b44505581e038de1d31fd0732b069ae68190eee17c0c586049e31a87a9de9222e718a00701192c1d0219d3e603704520d9a7f1d0f5ab13beb574fa85de11eb7dcc7aa98226a9ccb5801f75c362034e9df35d5bc61b600725ff1e3b9edc93735eed90a4aab1d0ad00f3616160ad20031176eebd55a02d80dd05460759ea58b48d39d6536b0ac765748a7a44410fc12f039da3c4c4508ecd179fc818cfd6c02b6e5d3d1e3047f69ecd21c37da15cb7d95c03dd42b7dc543187733702e6833e939411b2197a65cb76db423d59b475efae383a0315eb189197451955857f5707b837d7f14410752a1f0df757c7cb5863a9c6693b031aad9b030037232530ffb8b896db838425e0920dc8cdab47a182e2fe28b962c10365767c107ae03dfe02656af65be9ea4c30a65e8f9dfdb46295a452d5d381cdc903849f47f6dc1cc96fbdf17126d21d912c231b751f006d336884ce515a2681f93a032727c37bcf8b59e47634a27e11ee38eff8a05f80189c6c3d26722bc37bba30ce038177696feb2dbf2967cb4103efa2d507430711a197c2a738717c5b5543008abe032508f1a148f02172830fd482ea79cac02271a388af04019d6e49921a8a889c5d03e3b6225311b88e9bb4e2e9fa7a8ca0d03d20ac765b5f7ecdb3b183f7d7cae19303ee1760c7bd18c667ed1ed1d2d7c9bf2fb21df6ec20e0ee2dc9728cce12e9fb1b03d670e0d87c493b8041d362698dafdccc6291b498bfa6d94e5dc5d570c404140f0219ffff039a5d2aa9f89477b40b38a663ee233af208c20c47eaa78bbbabc145f2904fe69103b90caeab462eef9191d70fedb72ccf5a33cfeb057ee0fd17bbc43924a95fd89b03c3311ed3314a1499699434304684b7d306fc6f1358e8cad611a2895ac6e4291803b606ff6b93ae409276455be3f976d773b4336fa3f48cebeec8e7d522e9ffc77d032b6813577f217f060dd7ddfa16d8fd1394f5ac92b0c1b82d1ce3ed2f6e7b54050345aac4665b1fe48e2030bf0b64fa6a30ae1ccafe3dc13205189dfb7f0bf87bc40219ffff03bd2694cb32c5b310f2d4aefb513da5ba5f275c0b27abf93d3bf882a711be69e0030d23013cf35ab6c493b4afe0a730271f0f060b47cd5fbf77c501601a0ee33c0e034fb730c95cb500750ebaaa3c8d558a90071672bcca746ed2947d120c748b257f03a040fa78512205ba6ff18eaa5abdf5ca13d3f9b4e4c429bcc2e21e2c53349e8b0314412893c2f0f840fc03069f58fa267f5e29847a2715a440d21fadc59457ce9203cc8caead566ef34cbb50ddfa940a73e65fb2fa76e866521de5f66c24db31c7fb0219ffff031f58a293556a6886c08f3d6c768f622a47e151b3634f8f27f27d5ac65e5718fb03a101dde72c7df67bc737f261dab0779c02c0b83dc7cc111e94c471bda75630ab03ea33f18eaba3e67e57b55c8dee691f600f5e2a467e8133a6beb172c334b509dd03e50222ce226a8a103d385375f1341bfa321a721b0bdbcc6605fed526cd0821530323170395cb90f96cf5a6bd123f15830fb3e6bf21867d89a4bacc4643cf45d45803b316b8749165960c3c89c6e10d4998e4b40cc00e5a082bb7a07fbf9e679e8d2e0219ffff035542724e0ac64f0a9d2fb2104ed94363a57255f5680ee238de1474bc8486e44f03a6d185bd0e74535b72331e6dc9d2d19f53a4b4997b5c52f926ce79f26862099303f1f1571e19500730c0f62375fa7f8a7a90f6c4742bf538167be72a1432aadfb90310b9f42c477bf95e082653b147bee8737c9739cac14151019627bae2597ec4080370c11e4972fcab13d1050b9e54844ea1ff920d4470cbd2bf4e943b4d7bcde9e603d08c521f7580826bb146e476039ce572c0de596b9575ad6323d5947a0664f066030e7bf139f4acf4e2c3c37b1baced8754bc1ad4d28f6eec46b2afeaa843fb049b03e409a71cf61129f80b21eb96d4065506242fa36959967f5b797f0662a52f6d2603dcd03520ef6cdb737f6db64a695efa661cbcb74ced82a26e42f26cf6c85638ef03c4e66faec72346ccb69262b48aa4bbdd469944760209e8b91affed19198001f503edf450d44e9efc837fae58d704d8e6993a288e8ab19f430b496a6654f4fe4c4a03cd85c534ca4a6372058d36cbc405f13617bb5613c55942a3bbdec1a288797ae80353a0bacd823ddf1d179cb8bfa8e42020d2d6d89dd990ecf999ea42e9ca5b961d036036bdc180b8a1831a3e4376ee2b14fb762ee3b8013677f728cc40c17596c625032e5c4827174c4bf23d8d7782af6d6e69556233276422e18447afe6bc443cea3e03fc3f664a374c6cb7ebbc31143797767eb7f19a549fb18f5a79aee942f7f8a26a038c5ca361caa2475fef718e0a397f8d009e51ac3c6cc4621497fc31630d0ca24c03402e34ef9e39f1497e13e2190876faa9e01bd5a84075750a4d8d23a31527e3620388de86a97156e789845fca62671d0c79ebfadd3bc152e1f2947f9a30550bb58403901ed45ad80716634d8624f033d2070b0846facef7492686119fc2c631a58e9f0343b5ca4ec3c5ce5f4ca7fd15c9e94b832d2760e1519c6449212797fe9f63233a0339b21d7ec373b990bb1c57ce14123ac52ef5c7b88d20f76c1e35f7efcbf7c36003a2704b18c6dc0a318607ac2360f3991a67a92b944f41de6ef5a6e0e05afea94d036f216e7c7b3ea96690e6d0a685db725022227c311f46560481f4f49c094b0d1703abfe3d58af8f75d5d96bc1825a828bf810ab4dcc0c84a26df58228cd2331a20803c324ba644c40d8d6c2d47ae57b229a26e894ae7ea6ff3f9faf8e476f9692f37003433c8f733badd86057cb9a944bbb222eb992c5396a58e0a47f0d275b6e57fe2d038069108ff8e4b9e14c0c6bbbd884df679c273d1118a06e2b0e21eb9c93ecac0103d34a0eed061b8b168ba9abf29add6056d4e619688539cee6fe212dbcb47da6b70459202a608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063c87b56dd11610097578063e0df5b6f11610071578063e0df5b6f14610400578063e985e9c514610413578063f28ca1dd14610441578063f2fde38b1461044957600080fd5b8063c87b56dd146103ba578063d547cfb7146103cd578063dd62ed3e146103d557600080fd5b80639b19251a116100d35780639b19251a1461035e578063a22cb46514610381578063a9059cbb14610394578063b88d4fde146103a757600080fd5b806370a08231146103235780638da5cb5b1461034357806395d89b411461035657600080fd5b80632b968958116101665780634f02c420116101405780634f02c420146102e1578063504334c2146102ea57806353d6fd59146102fd5780636352211e1461031057600080fd5b80632b9689581461028d578063313ce5671461029557806342842e0e146102ce57600080fd5b806306fdde03146101ae578063081812fc146101cc578063095ea7b31461020d57806318160ddd1461023057806318d217c31461026557806323b872dd1461027a575b600080fd5b6101b661045c565b6040516101c3919061172c565b60405180910390f35b6101f56101da36600461175f565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101c3565b61022061021b36600461178f565b6104ea565b60405190151581526020016101c3565b6102577f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b6040519081526020016101c3565b61027861027336600461185c565b61063b565b005b610278610288366004611899565b610675565b6102786109fe565b6102bc7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101c3565b6102786102dc366004611899565b610a64565b61025760035481565b6102786102f83660046118d5565b610b39565b61027861030b366004611939565b610b6d565b6101f561031e36600461175f565b610bc2565b610257610331366004611975565b60046020526000908152604090205481565b6000546101f5906001600160a01b031681565b6101b6610bfd565b61022061036c366004611975565b600b6020526000908152604090205460ff1681565b61027861038f366004611939565b610c0a565b6102206103a236600461178f565b610c76565b6102786103b5366004611990565b610c8a565b6101b66103c836600461175f565b610d4d565b6101b6611085565b6102576103e3366004611a2b565b600560209081526000928352604080842090915290825290205481565b61027861040e36600461185c565b611092565b610220610421366004611a2b565b600760209081526000928352604080842090915290825290205460ff1681565b6101b66110c8565b610278610457366004611975565b6110d5565b6001805461046990611a5e565b80601f016020809104026020016040519081016040528092919081815260200182805461049590611a5e565b80156104e25780601f106104b7576101008083540402835291602001916104e2565b820191906000526020600020905b8154815290600101906020018083116104c557829003601f168201915b505050505081565b600060035482111580156104fe5750600082115b156105d5576000828152600860205260409020546001600160a01b031633811480159061054f57506001600160a01b038116600090815260076020908152604080832033845290915290205460ff16155b1561056c576040516282b42960e81b815260040160405180910390fd5b60008381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610631565b3360008181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b6000546001600160a01b03163314610665576040516282b42960e81b815260040160405180910390fd5b600c6106718282611ae8565b5050565b600354811161098f576000818152600860205260409020546001600160a01b038481169116146106b857604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166106df57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061071c57506001600160a01b038316600090815260076020908152604080832033845290915290205460ff16155b801561073f57506000818152600660205260409020546001600160a01b03163314155b1561075c576040516282b42960e81b815260040160405180910390fd5b610764611171565b6001600160a01b0384166000908152600460205260408120805490919061078c908490611bbe565b9091555061079a9050611171565b6001600160a01b03808416600081815260046020908152604080832080549096019095558582526008815284822080546001600160a01b03199081169094179055600681528482208054909316909255918616825260099052908120805461080490600190611bbe565b8154811061081457610814611bd1565b60009182526020808320909101546001600160a01b0387168352600982526040808420868552600a9093529092205481549293508392811061085857610858611bd1565b60009182526020808320909101929092556001600160a01b038616815260099091526040902080548061088d5761088d611be7565b600082815260208082208301600019908101839055909201909255838252600a8152604080832054848452818420556001600160a01b0386168084526009835290832080546001818101835582865293852001869055925290546108f19190611bbe565b6000838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610978611171565b60405190815260200160405180910390a350505050565b6001600160a01b038316600090815260056020908152604080832033845290915290205460001981146109eb576109c68282611bbe565b6001600160a01b03851660009081526005602090815260408083203384529091529020555b6109f68484846111a3565b50505b505050565b6000546001600160a01b03163314610a28576040516282b42960e81b815260040160405180910390fd5b600080546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610a6f838383610675565b6001600160a01b0382163b15801590610b1b5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0e9190611bfd565b6001600160e01b03191614155b156109f957604051633da6393160e01b815260040160405180910390fd5b6000546001600160a01b03163314610b63576040516282b42960e81b815260040160405180910390fd5b6106718282611351565b6000546001600160a01b03163314610b97576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6000818152600860205260409020546001600160a01b031680610bf85760405163c5723b5160e01b815260040160405180910390fd5b919050565b6002805461046990611a5e565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610c833384846111a3565b9392505050565b610c95858585610675565b6001600160a01b0384163b15801590610d2f5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610cdf9033908a90899089908990600401611c27565b6020604051808303816000875af1158015610cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d229190611bfd565b6001600160e01b03191614155b156109f657604051633da6393160e01b815260040160405180910390fd5b60606000600d8054610d5e90611a5e565b90501115610d9857600d610d718361136a565b604051602001610d82929190611c7b565b6040516020818303038152906040529050919050565b600082604051602001610dad91815260200190565b6040516020818303038152906040528051906020012060f81c905060608060648360ff1611610e1b5760405180604001604052806005815260200164189733b4b360d91b81525091506040518060400160405280600581526020016423b932b2b760d91b8152509050610f56565b60a08360ff1611610e6a5760405180604001604052806005815260200164191733b4b360d91b815250915060405180604001604052806004815260200163426c756560e01b8152509050610f56565b60d28360ff1611610ebb5760405180604001604052806005815260200164199733b4b360d91b815250915060405180604001604052806006815260200165507572706c6560d01b8152509050610f56565b60f08360ff1611610f0c57604051806040016040528060058152602001641a1733b4b360d91b8152509150604051806040016040528060068152602001654f72616e676560d01b8152509050610f56565b60ff8360ff1611610f5657604051806040016040528060058152602001641a9733b4b360d91b81525091506040518060400160405280600381526020016214995960ea1b81525090505b6000610f618661136a565b604051602001610f719190611d02565b60408051601f1981840301815290829052610f8e91602001611d3e565b604051602081830303815290604052600c84604051602001610fb1929190611c7b565b60408051601f1981840301815290829052610fcf9291602001611e17565b6040516020818303038152906040529050600082604051602001610ff39190611e3d565b60408051601f1981840301815282820182526004835263227d5d7d60e01b602084810191909152915190935061102d918591859101611e17565b60408051601f198184030181529082905261104c918390602001611e17565b60408051601f198184030181529082905261106991602001611e9a565b6040516020818303038152906040529650505050505050919050565b600d805461046990611a5e565b6000546001600160a01b031633146110bc576040516282b42960e81b815260040160405180910390fd5b600d6106718282611ae8565b600c805461046990611a5e565b6000546001600160a01b031633146110ff576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611126576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600061119e7f0000000000000000000000000000000000000000000000000000000000000012600a611fc3565b905090565b6000806111ae611171565b6001600160a01b038087166000818152600460205260408082208054948a16835290822054928252939450919290918691906111ea8386611bbe565b90915550506001600160a01b03808716600090815260046020908152604080832080548a019055928a168252600b9052205460ff1661127c576001600160a01b038716600090815260046020526040812054611247908590611fd2565b6112518585611fd2565b61125b9190611bbe565b905060005b8181101561127957611271896113fd565b600101611260565b50505b6001600160a01b0386166000908152600b602052604090205460ff166112f75760006112a88483611fd2565b6001600160a01b0388166000908152600460205260409020546112cc908690611fd2565b6112d69190611bbe565b905060005b818110156112f4576112ec88611525565b6001016112db565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161133c91815260200190565b60405180910390a35060019695505050505050565b600161135d8382611ae8565b5060026109f98282611ae8565b6060600061137783611630565b600101905060008167ffffffffffffffff811115611397576113976117b9565b6040519080825280601f01601f1916602001820160405280156113c1576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846113cb57509392505050565b6001600160a01b03811661142457604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600960205260408120805461144a90600190611bbe565b8154811061145a5761145a611bd1565b9060005260206000200154905060096000836001600160a01b03166001600160a01b0316815260200190815260200160002080548061149b5761149b611be7565b600082815260208082208301600019908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661154c57604051634e46966960e11b815260040160405180910390fd5b60038054600101908190556000818152600860205260409020546001600160a01b03161561158d5760405163119b4fd360e11b815260040160405180910390fd5b600081815260086020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526009835290832080546001818101835582865293852001859055925290546115e59190611bbe565b6000828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061166f5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061169b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106116b957662386f26fc10000830492506010015b6305f5e10083106116d1576305f5e100830492506008015b61271083106116e557612710830492506004015b606483106116f7576064830492506002015b600a83106106355760010192915050565b60005b8381101561172357818101518382015260200161170b565b50506000910152565b602081526000825180602084015261174b816040850160208701611708565b601f01601f19169190910160400192915050565b60006020828403121561177157600080fd5b5035919050565b80356001600160a01b0381168114610bf857600080fd5b600080604083850312156117a257600080fd5b6117ab83611778565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126117e057600080fd5b813567ffffffffffffffff808211156117fb576117fb6117b9565b604051601f8301601f19908116603f01168101908282118183101715611823576118236117b9565b8160405283815286602085880101111561183c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561186e57600080fd5b813567ffffffffffffffff81111561188557600080fd5b611891848285016117cf565b949350505050565b6000806000606084860312156118ae57600080fd5b6118b784611778565b92506118c560208501611778565b9150604084013590509250925092565b600080604083850312156118e857600080fd5b823567ffffffffffffffff8082111561190057600080fd5b61190c868387016117cf565b9350602085013591508082111561192257600080fd5b5061192f858286016117cf565b9150509250929050565b6000806040838503121561194c57600080fd5b61195583611778565b91506020830135801515811461196a57600080fd5b809150509250929050565b60006020828403121561198757600080fd5b610c8382611778565b6000806000806000608086880312156119a857600080fd5b6119b186611778565b94506119bf60208701611778565b935060408601359250606086013567ffffffffffffffff808211156119e357600080fd5b818801915088601f8301126119f757600080fd5b813581811115611a0657600080fd5b896020828501011115611a1857600080fd5b9699959850939650602001949392505050565b60008060408385031215611a3e57600080fd5b611a4783611778565b9150611a5560208401611778565b90509250929050565b600181811c90821680611a7257607f821691505b602082108103611a9257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156109f9576000816000526020600020601f850160051c81016020861015611ac15750805b601f850160051c820191505b81811015611ae057828155600101611acd565b505050505050565b815167ffffffffffffffff811115611b0257611b026117b9565b611b1681611b108454611a5e565b84611a98565b602080601f831160018114611b4b5760008415611b335750858301515b600019600386901b1c1916600185901b178555611ae0565b600085815260208120601f198616915b82811015611b7a57888601518255948401946001909101908401611b5b565b5085821015611b985787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8181038181111561063557610635611ba8565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060208284031215611c0f57600080fd5b81516001600160e01b031981168114610c8357600080fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000808454611c8981611a5e565b60018281168015611ca15760018114611cb657611ce5565b60ff1984168752821515830287019450611ce5565b8860005260208060002060005b85811015611cdc5781548a820152908401908201611cc3565b50505082870194505b505050508351611cf9818360208801611708565b01949350505050565b727b226e616d65223a202250616e646f7261202360681b81528151600090611d31816013850160208701611708565b9190910160130192915050565b60008251611d50818460208701611708565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f669201918252507f2031302c303030205265706c6963616e747320656e61626c656420627920455260208201527f433430342c20616e206578706572696d656e74616c20746f6b656e207374616e60408201527f646172642e222c2265787465726e616c5f75726c223a2268747470733a2f2f7060608201527f616e646f72612e6275696c64222c22696d616765223a220000000000000000006080820152609701919050565b60008351611e29818460208801611708565b835190830190611cf9818360208801611708565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224381526e37b637b91116113b30b63ab2911d1160891b602082015260008251611e8d81602f850160208701611708565b91909101602f0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815260008251611ed281601b850160208701611708565b91909101601b0192915050565b600181815b80851115611f1a578160001904821115611f0057611f00611ba8565b80851615611f0d57918102915b93841c9390800290611ee4565b509250929050565b600082611f3157506001610635565b81611f3e57506000610635565b8160018114611f545760028114611f5e57611f7a565b6001915050610635565b60ff841115611f6f57611f6f611ba8565b50506001821b610635565b5060208310610133831016604e8410600b8410161715611f9d575081810a610635565b611fa78383611edf565b8060001904821115611fbb57611fbb611ba8565b029392505050565b6000610c8360ff841683611f22565b600082611fef57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220d5cf2af665a707cf5fa8553c93e5404fb287bcd41313f3344f32d0bb6a72666664736f6c6343000817003303afb8816c4cbb69d1df7f5059c8646f739bdc1817a86586f82cd4543b55a07783038e056198349b75c9b9a2851928c6671134b3a28d9040008ec86b3da5d838499103aace8e5f96254bf5453630ba6fa4cdc8cde7f86bc2bddb01e42a1b888475ed5d0347c71c1f338cc73e8a463c9f0f2dc851fb8a3d29c9bd6d1529d4c2377c42de2f031f0fb94baff76e5ee7f7d75f27c6e2b6b5c8340d5547ae398d2ed700062d760b03eac10e4e75850fb781f4514a8aaad8f96b1b71d095d550697fcfc9586d75251803c619492583c6a3c872c33839d6f72ac0cc3e2865677e0ea0cb60e65ec9506771039affd3ea0720f53c544f1334f05faf65376d554554281bcca35f5c2871eedc8503cf9022b6c201b40807867336a288444e32df93bc2fddbb202e473e1f2351d44803e2dea544c7acf3c3d68e84ea42b2033de4dce351782729d2b1209df4f5f4ca7b03e002d88c0ff6a423bde25825060a68c1d33224da5da9127b494d663924574e6703d9630c91655bddf13e22545a7e58f1567777df8f64b4de6dbf6fd49b3f6be859038fc5ab4fbec404548cf127d320bbcfaa800874dcab588464dcce52fc8747ff890330d12872a989a652a34dd908b114ef593c53c19ffe34e22a6ffd7504df33d1a2033924eb6d6559eff37eccbcfd94782fe708b7e9b7ea1d4acd6219983c7420683b03fa494b54c69888d3f047882e041269bc44bec96b7c76f2b966858e0e16a13e760339edca7c8391b51d5aff3c834244cad508bddf6e60ce0b3b39c61c544abfd56c03cff8c0c53988ef18c8b769c73491561c34c77d596f18efc3ea65058a65278cce030c41d2f047a84162cd85fd26831453eced5545b17de49416bb5470e8fcc10e5e00581f02e3701882b4f087cfdc78abee4623bb59f835d466dcdb4ff432a8f5d5abc2410c03be77150d048b20b98659ed12f85c28a16f3efcf4a2a45216d3fd1d36f5a5a97700581f02775f66ffeb1f2e550ff9b71f8aa7ca573c9cae553005a0500111bc36fa5c54c43b6ffbb4781c354d7ea7198641ec4cdc4d8f5c00581f027a335fefd9be47e8bc2cb6453050aebe23d537b1768dfdf2010a85abd0af5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f024b576da2277d0f3ef4f31a5e552b21b15014dd98f1dc1af9978fcc4523a648040cbd672250e32d00581f0269bdb3883436bde2846536fbc18fee58d5e21f361a5bfbb28be23834d0d042d10700581f028c6c4d6a2392b5fc8a9938ff0ae2d0f50bd92eca6fa0973e1bdb71eb52f4448a285ef2021930ee03edc7886ccbaadd1de4656b5e27f47268d7ea0b763b1f29ab2643af30499cfdb803f313ee58c42be5fbbeea7beff6bcf262bfb57f190a5507a7513971a343df8f6d0219ffff03df405c9d0d4d3e4fb368796734f23d0496cf38d5ab43bd167de49f437e7078cb035dd55be8715f265612ff3b9aac3207ac0d678528b9e9208eb2df59c8754bc846038b721f87a03cf95a23556c9a2f34025889bb152febebff81273c4a03e418e2fd032b5cc81ec353118fd2abed61ebe006bd0984835c5fd5e4716c8f598c0bd9b4a0033774d2d5872667a66c0e7231d14c7663efdb043f0463244b722003a483b7079603504f211b98470aa50f212213cd973251f0062e64b81b72ce07938279234ba0df03c25d438036663fc363ff53168ad90c44e119ec3ac35fa82a8c396a02fe52bc1303b5f499f58394fe98dcb7fba234c586be11e00084e82664d5ad5675df80c137fa00581f02b0656bc779b3f8000ade5ed2448f370c7a38beda3a9b7876f46cf2d4821754d371519e9789a5bbd84faf18928c80ab243f48c800581f020f83fba0715c7d6d1a6a69df54c8208d059a1c6c5c9fa73ceaff43ac83ed470c26dcc0adf96900581f0207d10a5ff625be797ed60a1524539ef9a27a10f079fe99fdcd3a8f16cdd0411500581f02177e67927941018ff62e60d1fe7d904bc57f4ea49d8304ac3dd63d698d4f54c189aed75a492fc5008e5b007d44b95803382c080219408a03ab2b0580bed43ab8c5465595fda58fb6051853b6f35915afc35307779010c0e1032ebfb925a833fbe9c7546b571c12048455da69c97c57109873443544ee71ab2603f8732bde2803092bcf70124f1fb7d589d3fb94f684f3b20dc9a64b5d21dfb44303087a83d2071bcb4f34d8cd038d6fc539d6b19578bc67289d0b55f0b90201ec35031a2e84f6251ccedae62fb19c2213a1cbfd71b44ff48752d5ee4a7b9761a1ac14030ecbea35a112be72647c6a983894167135d5e64f6a2434549c7d51c41aab8c1703a5a98598ee7877f4a8c462a6e7fcc3cbdd6901b93d9245f25c7e241978409a4a03dd7c568538321815198054b1ebfedbc635588efffb46c6b524a6d412f6c4630f032a3eca7218b391e2d38a67b3091855de846dec0de77086e0b93b4fd0f69668a403921e9848736d339a50ab2ed7d1f2cf1c5dd04f88b002e6ad4b42f3e31daa591f0219ffff0337273a33d5c14715eb8a36b57d93e6b435370d781d8ceae99a0fa41a85944e9a03ca0fd50d59aae1608d8867e01aa7c439f9bf99e7c4b0e7b9c269d4049da6ef9403ba5dd91f613c4882767a640da0752fe850b73b1db8ff62df46f4f8f172d8712b0337133aeaefea3eab255123fb16d3b60f84bb4b9d63eda43be2e1baa430e4ef96036358cea0b0b4693acd10a63674724e5c6257acb7fbe2e8143b5f595e72f70038032bba71886fc0281b091a81e8fa5ff55fc2cbb30c1fbda322bd956bf57f6bb03803f61425b6f4c6413945c685005cc015933b587b38b15feba29c052a88cc7ba1c80219ffff03a2bbb58e792a148022b2c2a0f18e455f1c5ce5b493c75cdb64943643ab97e63403c28957c904d5661cb39916050852b167a2497ba063b485afadbe4e41834760f40333b15d5664ee15356b4d2e32e4cdcf084f99a0a01eb48c3df97efab1220679d103d86fccda022cbf5ae9f722f6c3b9205b8474edd5adcf47a9428b518e325b98d600581f02f37f5113ad1b3ab93b023a19619372c3490a37dddb2b89865ff3b455c314410a00581f039c2658206e3d8ca06c209a6564533a873126c1cc9bc7f3b662a5ca455b60410d00581f03d0f839c327f30fdf0399abd58ea86e01198bcfc3df68c5312c519be877504901a17653070c4e80bb02186000581f0251dc258019cc2c05182012d6231b2b75c0208f04a33aaf6a63c27f2898a9410100581f02921ab63b159e1a70553147d65418610bd3560b6574598f3a967db4fdd62d470e8bc6eda9266d03166ccf211f5efc2b2be57fe8711de296c34285e44b543c280e948b8fe32efe1403e2cab55e7b151d5b94881f5e41dc3f1a2bc11c19db4922c78870a3f7869ac020021988d403b54b05f1d647d21596443934d716a110ebabc1e80f34379f7087e303f6a738dc035b298fb99310ffc24c47f85596f098bd71f75345dd2046010f080bffe26ccd9a0358c5ee1386dc31f6e94476cc0495cf523bff55771a3864388ad21440bb6f390203b0b5c2b2cf157ff56e9e48ed55566a8084c0aa7d2eeb9cfd7f62273af69a1f800300d5008aa75cb1ded85ed0aaf81a90c7237e181bad4db2e6b1d55a1eb8c35d9503693853d5d822664bb142706a4189ec827e044dacd028fae381f62de11d65f32203a65ef28b70438d460341b4ac5a512ece33baebe38c12abba58a52e0b77cb1c92038199399b5ff356d5c5c592c6cd3719420feeea79b59b46cd98eea7e00bfcd3be038c4815b10a894b8f75d913b83d37634a4f8b35f2539ba74e7eb6fb7f4a5a8d9d03ba1bc4d39d018c0bd10c0781dd961583159dc7ef84276ee6fd9cdc521cf90ce403859efdbf4caabc71b69890ee7052b674f646948bbaa91f2791a65cb32ab4c10203625b6ece50986abfa44457400d0c3d7961ed4df500cbe6e55c696170877eb1160219ffff03f7cf60b6233c218f2a71e3128b46f193ab0c1248466620cdae1975e91bb3357c03749cb58f13d374bde7ebc968bf1833bbd8c8fe92adaae6e3ce483f98ebe88439034da425150dcd2daedff75e90efcaec611efdb1bd2e99f809b9a58d368a692b4203920dc456c3e2df9a69b6e7ad1747f1990209ea95dc33d6acf7b6495df02a110003cc2cc9d00280f4d5c622293ce345e9ce0618caa75f61090a0ecd1b229d544c5d03cfada93750f51480f42eeff247eb14d6edd636d7b0869feffab3204c0ec492d1030652ac12a14f7290cfec908d2e9a2b0152585de4344ba1834ab7afb5aaf8f1e403b64e9d6005ad5285568b2c0aaaac2905c6a6617b78c1264727229aae887db265030d4719ebdd6d7aa612c40dcea6128956cb6c99209f2d45b5f530bc63d1c9400a0344378319e138ff3c41e437ca7ce8e0c2f40de06520a5ed7a54e080d7fa1f3ea903f55bed5d6c1f9d57569d0df22cb690f06d535bea2b3c237939f9eae28a1b512403cd42291a3f33a31cb8e34610b20d5065ea09942aebce0ea1d88f54c003824a23035ac76fd77cf8c8f23685059bc043f17a45561970a19cc33daa11293466e7ff1a031d11d4407c2683175b43fca13ac06dcd9fa1fea0d2f969a03955283664df81f80219ffff035e16e3e7296c880fffc1f2622c990b861385a625e68b14817ff04579668956c1030c191f2643e5d978a18cc15222a5d4aee7f57a7a498fa3d5e44effaaa1fb6996037612dcb363277bd094c269fbe84b559439349df8eee1619e5abcfcc11419497703b63a46a9c4e7fc047c0cc06477e6942c8d3049631783eda370a7a804501c4d97033590addf33a8e8a48c62c9e9e85a21e5feca7c83a3be22fa634bb8447e262adb0398ca9159f0806d0179542e8f9878bf66429890ba5571847177d3f2a38463c6b003ec36cf3a6aeae24928e379330dd2314d4bac14b4b7b89076212f2bc960de49f803e720272800c54b61c5a4db96d50e7f2e4393e897e3fa15347607ecb24999ffb200581f0298b4fe25ae4167140e938c162723f8346c7409f06e01f6db9881c16e3210483782ff7e6a51c9d00327b99076e51f6bd3fb3a50400abb068bff0a5f5e8b781d366a16f7f6fcc59e6703c606286ed78f5710d9e437f5d02c550d40e8ae44505b5757ba28e639efc75c2800581f02107c1425e4281608d778ea80f76fd042ffd239fb98d740b4c434a53a9f0d5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f020d1b05d48a98f7719f2a1addbd341f6ccd7433effec725e3c83f2b77326154fafc9af3c0353d95244a53a3fc80e22295bec8a000581f02baabd0d17a2a95c49acf45f875e8b514b37b430c4f2f34c77a6251169f9942bc940219e88e03763d3ee21edcd999ec0622b176aa22b7d37514c5de6fcc7fc3d9ca46ddaa8a08036a965344563bd267ce1f505145690fd6164ff3450cccfc540caeedbd96f1c8d503381f27420f35bfcbabe18d784dbff6148988d9b837286efb368ec64e9c73bcd10387e23fca56d828956dcf7a2b61ad5e5b999fad3b4aab629e816407a3406663250384628f5152345968d622e1c45ad57a379663a47ab4edc533cbc30d1953d1152c03a8f72e7b6b0b85e34490f60dc9d3273c05e12ad774c55cee3694b69d09657bec0335cc4f51155d151f1e46599c1a2dcefe20a0451a268ff2ee5feb18415a473f580343ea4beb5dfd0c53a6a9739dca846aa95887f5ef2bfab660393a07e6ff14641903171dbee9ac0326cc27672fcaec5b976a2c94ec75cb5c6525d44d975115686b59031bb7fa96e90340e546f2701dbc8afbfd3197e2c430f0898ba00d0505cd0cfcd203854367aff76feb0cdd67177fa7a0ad21abe8e76a1df3676ff0d3fdd3d93c131e0317d22336b9f7c3431c7756b7987d497fd5defc3f49964d46c31c96fd9d40281f0219ffff032201a8a1b837cd47617e7dc14b6cd7731f8e2950c6a4bc020eed72252d12b66003bc30c7c319f705fad71e6a466c2ae6ac1ac71e2d0b7808fbdd72f50bd90f534a0385fdcf19a9ca5b30f93392a2c395227e51b1a80359c2c37e2589f1a364db78880318da6a0d3fda19c042cbc76ce033f240bc958db2e6643a18196bd67b77400e2803ca3dd179c84e108d867aecd7f28c61dedb4ab89b86f86dc6a680ddc26ab3bfdc037da3e3d74225ee44bcf9524c3879dcbfd1df63bbc7d6e7c8fb4ad18bf351ae77033a59a1d9b97c354803f3d52346033e570ae2853d0105c6bbad1829974267dff303c8304fd76d42d11501f9b8162149b22912ab4fbb7dbb65bfa3f4d39d18abfbf5034d3a39ef08e7b08d5b1529a2b5a60859b5eb0f1ba233ab0a8a168e44851e1e30005820039d6fe0e65970436430e9e1711f3c282c0a432c08b96520a64dfad2541c4b2042a1f203e093d73123d7f060681dd31ae522d32e5e42a0dd4165e59f9a9714e8cd905a820348a75626080bada971a2760e7e8871d6294ea86dee8578fb4e4f37d2b784d03903e85df9a0fac7374bd4f831f334f656d295544a60574cb9100ae4a070ecdbd3ab03f4c974465e1633fcec498a147d5d04f9dd40120faa3e5f298f2e705ba69629aa00581f024739f602fcf4fa97012237dfbf37a659119753af3fd9492a9b68bca5d75c480de0b6b3a764000000581f0274b3df945fb114e8da79163ab65c1a451d9f255e73dc52aec1fdb351ce135820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f0202980399af25b0455eeba2ce1930f06f1ac19899b9a20e113d18f89e78fe410100581f02d879f1b973c2290ffa2c3f4389f275b409945b0d185e1286b3ce88fd4b6e46450a3af1eaf103bfce1249212996a2567b5d336b332e2ce576e4d03487d451ecf6e243a6b2a40200581f02b81d9d4676d5133fbf925b1d4fcc3fffac9bc1512f6d0c29e52cf20146135820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02192545033e31cffec09dea24100b0f6ea9153289950c71e60d84894d06f6ee7fdc0649a403d5aa0af1d854925923a8181b0d75b504062aedc798c5ffac862fc11e61da0fbd0219ffff0308a95a7ef9c5259a793d23b36e335fe12b53d2b9cd3ec6463953b219726f814f033f80ac88ff26ddef6f0bebce5bd99a549f5bfc6c3dd696f41fd583da523b87430330259520d452087f2ee83166861dc63dc8116c6e15d0e3854cf04bc5dd700dac03ddb4cdbe0b687f874bfb646ec59dec7b26826859355bbced9e35785c9ed97eb700581f034a5de51f88d18f1af48faeda345cbdcb867b58a1ea361f548e70c7c043e04804a3a5ddbfd930dd00581f03e8d68f06979840048e1ea795f7fbe6c3bcbbb7147903dd9a3cb14f2aaf9041010219140000581f026b8f5bfa53fc53eb9188b91438b559361aa21a00d701d692285bab50369442711500581f02b0be825183b1319221a112f63c1029b1dda6ea65cda5de5d6956156eef434103034f2ae74c4e0689fd62d3a920e6e16d3644180616def7cf1757b65b78a00954d10304cc6cb8bdc14233a5987233bc8bb5dd4f2697fd7771072852cb3c0cfb08931400581f0214e59ad87c8048f7684ee76956306564d31b1f4dbb74f98cea8ab3a62dfc54384d0eeeab0b84641e450a4307f6f2de1c027fd00219aa490329ce0b10f31a2ba08d19483215342efe6d338b1ffe8373cf83de1f7931ef06c10369c08547f5884b17d445aedceba0fd85aef66d53f9dcaa34a1c489daf41d8c25037decc8bc8a507371e99df65e28037bc4eef88fa5d461337f43b224b3f8448787034026c6b08d082cc8c1895e74e66a7434773f238ff728131aae7a92d6ceb7b233034e692c473c53f5cf97ade5b1185b1961e7cb28df4a5284be8313e998f8b79baa036e8e4e559ceec00174a1e7dbe072e07d5a3c2ae48e80264b9182f94cc70a19ff03d5f13dfb1d36b00a82cfa7ee0ee2ba1e59e8ea02df31570f5e65891a966ea32c032e05dce72f3948598794e6f447965fcaac61b8c970fc0e8c2af0d170e119adde03ad31f51ce8a764dadd06933bf4e430ab46390621910b60d73b7538ad5acb16e003ede077a6abd29a3724dbd89c2141fd569e5aa17e9b450e3fd1f118798341502d035fdb8cdc1ddf9a277f74f1599f1d5a371f5dc9a3f97626fd161bfc6205f3006a032156617c7afe66029407fb60dcf6d0ec17d2129f6d4851b530f078d390f3357d03c9f166e694f5fd5a6b43392c3eb0060679e9675d16dad25ae254cb1c247033830219ffff03702e8bdc57fa309e34113307c35f18bdf1289dddc4bad770c3ccdbf2194e6fa503e6511465f0e736f839540177875a9cf9515fc419fbc56e4ed92de7518ea2c123037c810178f0cd382f0a76ac216cb3984f06744a9e2d74e1cf23b237ae15f9b887037aa8798f68e4c79e00daa625354cc7f3b5bd9132026f4b2b9ac86eeac4072a9d03965974ebec198d64e6bcad0304fb4f3be663213a6da1ac4469e3461b028645de03b670690b88c714461eab59209c43534525ffe6937ce7684d6ef2a74b4853d90403b8cf59fc88b34cf567751270cd7fa8478aa11a47e8923f03ceae293c87e4081e0368b12b03d54e60878db7959349875dfe93abd5784c31f0ef6da3db8e1c97caf003c12ae862cd4a7a6de7fe0786ebdd6825bd6f22765ae784b8e21063d51650e041031174f47970d79a136996fd196b858a3dbc6e9239fc62c3c600e1aac503eeb3930349df3c530498377c6bea965e07a07b146a3c2915ae788bc8b5d4eca3923b849c03836ac5af568d84f963ff409098f66788b5762b3de9ace549c76fb41ae97a196400581f03712bc8ff09eeaa3fc7e8f720b51e7eb50ca34e7079a470e22169ec338d705820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f0382571082fe6d4fccb3aed4aad7f1c33fda122f1a3db84e1a08c4de6b8e30410400581f032cb7392b06aa80dc060f242a1f6af24d5a5a85dc9c33b99fd974b8017f00411e0219088200581f023a9e9e2d8eb3802fa33c2310af99ac4bc8e5ff708b2e34eef9e0fa4827fb46583afecd5c7700581f022907afac08b8c4ef5c9ecf42041a175c666f601f6db263c3f934b7c5dd93540b5eafba28226aa16b356ce3722a3dd3eadb1f8b00581f02a8ceff34fdcfdbcfbe09fc424cc927db17f73a36b56ad5d0a9b940556d664806f05b59d3b2000000581f0214f9b9cbc4695d32142af07f29f8c626aa2bc00045642174e4dfbe53ca5348023d9f7c59829a0d0219a82403ed6993ba5dd3afb82cac51e135f17332670d2c7884fb89d3938d8ab5aed0869403f85fedca8aeb93ada57f53295cbc0d816f88b06efaab78c761a5c0a3b7354a5803af469372f98350ad34c58ec0aacc8520addca49b0e9089ead503cffc978afe7b035c27fcc3ad9e9a476458397181ebf64619e60e0954ba02e93695e0c2a4bef44a0373cb54787e9349dc9ec388dc69222ad29a0b16890d917dd8ac8f116d38c4b30e0219ffff030f2755207cae01bc1ccb7de999d2da83e6686d92330d39986589d1c033d5f630034a379bdbb3a5adda4c4301e33a23cdfbdc3fb1f2724da3ba6220ab7b89cad4e1036bd0fbaa362c8438beb8c26147815da7d3e3b3b4b7500160a81ff1f99a9abc7d03f5e41438beacb0ce4ec1254eeba247af6b039b923b35dd71e0361882a54e0f7f033ac63c5eb42c6cc8ac40db3272219a4268c7a15eecce43c555bba6cd270ea42f0219ffff03b2f7371f3a0c844b51cb9508fc4ca188e2f0aea6af3112ff7d4a75f6b3365a7503a0b384a67e1181db331e4365ddee6bfcdf0e3a17bbb833e3c7840c709e97ceca03708349fad6e13d97fe2fec4c4f856cc3e107217b79f0a0c97d56d3f2d9178870032384a39db6f9a4b4e2ab79a1e1091fd4fd5c6402604b728c5d947cf5a226c631037f86cae18c5e155d4527fab70de1c1c1c098ad167cbc7ee6d21aab65ff216f2e0328e5a1188ea21207f65b32fa56f36c29f4e3ee5805cf49b948bbd9d06a42f9d8039d252f7bd41a23ee9ef2cf37ad78a20a8288bfeefc2922910c7be67a8dfa53080347fa16a85bc97f9b0d43e502e6f3e3ec13cda5d8843d16f442c482b99ff20d0903021e9fa592e3fdee2bd9845e46d27233ed1c38a16f302fbd4d29928d2ce7f38603ee2279880f7bd5b0a2e82931483fd7694cc454d4ed4818af7ab84356a96b27f3032f4f64680413c87f0c55ca50f9d872571434e32315b394fdece15afb034efdc50312e45334e0fbef194e8c6243b9a64c2c45ec6e26cc21e891cecf574d365bbd03030cb0c92f6ab9cb1334561892bf2dc00a3f769b76102357d28846ca03de8ec5140379695d004af012a3cd39b684fb5b05d3319ec94987fcf283705ec39a0fa02ed703f3b7bcfbd6171a62714e0b7d2751f54de61ee934394279266ba6e2bf5663bc0803183b7a187248818b5f51752ee3baec6b2861baaf52cb458ba47cea5b118c207200581f02f0f49c7293ad3beb83ec054deff24d135b9f305e87d891a0994920ab476a475cb4fa8418a10800581f0283b1befd6746797ebfd927a4eb9162e3af8226113c4dd3eee0caef172b5048014ba3c1f77640d8033ccf9bacd6221f571922150616b3da21fc8ba2070a4de5dc2ef3b9c66390a6d700581f03df1121e732477768a8935edf810bd85f583e05e5e17c6f709523b6e83b50471656943982828800581f03231fe4ea1910c0588f24b6d5273f6fc3c355852c198542bb9322a859304054dc900845732a53ee8df737efa282a6bc56976e6202189000581f02b7ebde36bd70504bec3ce1b84a96558c575fbb1aa096eabdb7bfa2de8434410e00581f028983462ec0e2f1476bb6ef3fe34bac93792310b2970ed70841a610ed283254bdfa4f4492dd7b7cf211209c4791af8d52bf5c500219c426038462a8a555a73182b7eb069d5f241dbc83fd5e2f4f5680ff41c5f45c8aa83708038c6613f8401ea0906d72d6ac9577810d26606d1a20a0d833980eee8f01c3172e03be663469e275d01c1bf217558116ef6134ed2c77b6211e48a05ba49092c12411034e7aaf6ae38920d1bc45df210fe28fc2bf5a7062ae1c74bf131484d86da75f9c036c11eeb819a0d3afccefa5b129b0b2f2bea688eec4316db85ac3da15c8910dc30318ff4560ea62955872a20d9adadd0802ec50cb408e04c8a71f35321d07a9faf503212bdf17083d431325990fbef3139c20a5bb658d10c9da1b63144ae64843a4d60363748a6b18cab29a7ca14c8c866066be0465cfe69272c5ab9f78d469b5155b4403d72b9c6009661b893e632f390daab3bd6535e4e453c469db0dda2d25f9c5c36003607a8bcd48bb2c3ad1da0be18778b447929790c4d7a661a57ff41143e751b74c0219ffff0371ed0eb820a8eaed34df18678e926543b795641a0b0289cd2a63973869d19fb503925d3aeee1ad01fa51bdd9de71d7651e2d133e3c11d815ad5562ae2ec0e0743903cf219322b17b869fab7333ae4dd02106f34101f191945be032e2447049d96b7f032aee989a67858c8aee497440018d63f81f3d2250d88e97465f039c81941f3c8e0219ffff03118fbf223e930225d098284d0639b03f64532a4105ead55ee5b9eb018fa723400377f0e30e2db7c44d70222026b2ec2f0aab18b5b4214c115baa6566029fb2d69e03a580ed20255da47be0bd309a2c93f9e706525bd881d7db50bd21f84aac1b12f103bd87c4e955b9192ba4ba22b82f918eb5815dd14b40711721650121ba51b4838303c4940d7860a939154dc2158cc33a37638445121c8201409f19aa24c7d323028c03b9fb1bcedcab1c6aedbc59a1300c272d271c1a631a39a4c97a68f7bebcda7e7a03966a0bb8adf026a8e8a8fb916fb2ec6e6f35ba43bfa3618aca42ac6f51bb0d5a00581f02f155d219fd4cb07bc1e937732ec8c6c6387f92daaf2ae62c6454838be2d44270260331d6e3bd78022fe8cd35c963ed1b7ea352b700de7d4032e7c591a99b75a84d51036e974adeb05a074e0e160dbac9ab64a155467e787c18c09520000c92831def5e00581f02250d8bde6e707cec3ca8e26fd2ef279ff6d29189ce951898fe724e4bc096546cfdc3643b69b3d8f5c2356be18bdf0d06f8d9540324d7cf05e62f4829531e7a0640fa43599150d3f8985ae3094367fba6f783084d00581f02833afe7fac8f77d2f4d64b177469b60a4c6dc40b5383ffaa1ca5590d2d4054d5c93950d64250c13642833d15627297124f7ec500581f02fa57ae41656b137ec7b116f1bf98790dcbb4dc114f89393931d69a12ffd5410b00581f0266c776a299387fb2fbaf85f852cc1561d90c6ce9f51b8d71517e9dac41755820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02f2752e407ca34f0f47b93026dbf6d90e4e5fe696ef996b921263f280a7e242bf4b00581f028c794db429a75801e58c70650ae08564008d5781be9d48c1d5f24f751f2c420db0021987fc03b88034eb3a4981202e3f0eceef1e6e506b6d48e83117cb8a49ac2cbe6d98125a03cc2a64477822f749da4393ca00ffd6b153b9d68fff411f57bd55354b8624d16303b9d42fa495edb34f56bfc3d348bb9d5b92f13bf1246e70c37c6c6b910b2b47a403fd8aa42599a120709424f668af5e40f6c5e51bd3e705df7962de3b1602c8020503b1c3e59e0ac0e24c2a25fe380502d751dff61500b393d9c056832bfbd63d93db039b95190d075f29355d2fcdc4f6daca871147dd231044e384f564fb2773911eaa033940272b88aa71cc8d76097464f067731a49cbede952bae3e93b04adf868baf003a2af8c9498e016803f4aeda8f748349f9cba8d68912e72763e8052c1021a662903aa635db77c7890c8ac22df7f39ed8599b51b0875e42816da1bee718a1e6af15f03a57d2fc08c3b61c18209462952437bc9474e3091fe18ca84dcb09f08f23c378c034f3edcc6e9b51a2cdfb09a678adf57205505ecf31b6972ba431c66f9ff59b8b70219ffff03bed2cccab6fde693c7c52ec39583be2b59273651df0d81910d512e633c6709260378fe79d7bb1e6fae2ea5c88c9c9bee617de54e2094abda4fc97904ac24d4c32503f53a1323c1703f901f5dfc9bf295206380dfb0140795863220169202ed27923e03e0d4853689f83b358626a612cf1632f9c8445777f1b52118862d132b25acaf6b03ee3c77cba39c299ae4e3bd3b84a4112bc554d035fc7cd0b1edab9667b8779500033b8c2145abda546a1c1ec6def3123ec1d4cccbb0fdaea5de380d3c7af6da263103e45e4e7067e4f6e2926ecd61a3c1460434f719c4051f6f4d7da30d21063d801903892e9555e27457d13310e1e7dc555a1104bda77aeb69da787483ad350e1672a203fc7f37fd3a6a52c6f4a87a3a4057a25f497fa6b7a36bc7c43ece469444ef35d20323188c32f892c0ab4fa5d453a120673387c3bcb8e18307937f96d85e09f4d34303b135344e97a0d4990d24a1d797fc5bd00747c54a5be9aebd321c572a34e7352303ea8aefd73ea2a5a58064fd7d900211e7739849fc20c8227ddb55eb85750cd11b03fb5a9bccbab77beb60ed8e8f0c980e0c5de869f51a14653b4f522e355b3cb8300219ffff034674dadc26eea308d87e34a054a96a8b5c937ed0a0231868452944be38e31231035ee2992cdc0270d1624feedd991c56603564953cc9ebbe09cee1305965b8c26803759e6b50b6949f059baa8c1ec201e861afa7df745edfb45515a70174cef3ad9703776a099bb8a998d883f44c801e422a8eb7fea0d25db49e5f4b55cc67d7896edd00581f02a16f8f5c4ce8a032c38ea410c5076bbc2b242616286df18fb3ab7fd65983413c00581f02f40586af5db5b2825b9814aa3fe912998ee950b34866cd45e3110289aebb54a23f54e0bb57a6114d831c080823f5fe2616cf9800581f027ec23f1723b114ffa5bfbb9a749f0153ce0e174a71205ffd05b96931b9d95820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0333d6caa8deea9b2f0ee819cf89711d6ebf65d3c1fd203f57b795f77a48813deb00581f021b58347d47308a81942270d339c37f0330664428efa82f3f4a26a1765e155820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f029185c71de7e29b62d459e535e9bad37f1bac28ccf2c56e42f975833ed1d6540cc90076d388e260d550b720735d4efc41f98ffe00581f0259239bccf3ee8d122f783fa093c2bad708bea4206321ba11b8a0803f5c4742bd260219e2b203ceb6636ec5c1f8cd99e3df0127f4c8e35fbb060014e3371381ae55bf66ff84d303b3bc396d22cc8a4d156baa52f8822071747cf835db6a95cba92ee5e99ba281690357ad3f6b85aa41062de06393704f8d92b171433c8dda8ec458b23ec46757cada035891fb9799abf86b3cb68b5c38b3254f64d6c9447576f0e933ec4f2b43c9763403cbeb7de3b4df13feb43a216d3d2fc4d870ae96cc626837fe069dbd609d1ad09c03a24824b63af9fdaa3f1c09a664517efa1869855a2953ee5f78c97773917d640203741c6b42856b2bec55b98178ebbf8dfc89977011c442bfc133bb38261ea40beb034cc2c9a7c21448db287fa3ad1afab6885aa3b94bb1b1ab2ce8846e4052a32c3503d07142784f9bee8140a0dc68c99279f9ff791897d1c9132790ae8bd77faeae1203b80aed7c2eae8c75066749a1967b7dd9dac4b802d40d418ccac17bfc35e459ef0306fc68f6979849b8b4b203c2a3af9f6adf1bfa59d71c827a0de1b586cd3d7f81036d519e444b58ed383869fe4dfd26bf6401cd1c2b1cbe029f252fe69d4091067303655254b797175a53e2d47b2bba9773632a050782f43e8cac078ecfcd7fc8894c03811be60fe1a1e86861daa04d48d2f54f107378b0131a20aeb56ddb9c121b2fe8036719741df4f4c1a6db0cde726f01f3273762f65a48ba76d9a0d73d0efe0f87770219ffff03258a99d5b3a4969511367a6c6462e70731e200ccb568a08556bec0e4f361918e037bf5baf7a8b43470cc135827d24d5d73a595dd25fc49af90e91ad1ef60a11f0a03d1a9bc8a4ae584f539c048ef0d3a0bf216ac4dcb0270f3d73b415fcaa085e55303f398125f443d785b00d7d7c57b5ca010c0cc575739e873da70984ec3ddf3da9f00581f026b46ca68208dea7df94f6ff42b6a7917a25ee5b82f5a26a453ca5673bdb842887f03ca083267174b62154d47ae5e97eca25d9b1e77f2613557f81c35566d4f58816300581f020b157d7e836d7a96c737dd8071330dda6e168890bed092b2d7a0252d3a235820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f0227c2ef0e589c72ee1e12cd8ccdb7c91c00d9f81ef9b0cd4606ebf1759e4c494014373fb51a80656100581f0291d5c6733fd326f10f7f0b5b89faddfe45942da8ca98f377d15f7c64d867411c00581f02993e9d715ee1ecc20fd8c6431f4c99ea7231375c30e604af4f0a8bbe0caf42c259035732d56266758cd0e03c22b40a5ebc1ed515f2494bb7f820df2cbd519ee69a9900581f02423e7048f85d775158323249c547213f109039906cd0221a12af83c0a156472c397a286eccbf0219a1d6031c19337622be53fa38765119d33ff225b1b733f17cc20434d88c190dab7ae0ab03db8d67efe33c1bcc95c82bbff11436ec70eeff1e994ffb3f864e8204d2002f750341eac02e036c4e9821420213f2c7c3662eaf13d82552910f6d311a2a31e6dfa103afed3e087ffc5300574b306340dfe64306430703c0d826cc02f992815fb6c9b9032e2c474dffb52ed27c9a74a9100190e84e27c6b10ff33943cc2ef068f1c85c86039030f9108ff8f453540f08e772ac13c91cf76e8d5a9764de8edf28e221e31c8e034deac2c1045ae741076904dda60bb28a99544570b0088a4908769dc7cfff40fc0396b73322795e557990ca8aeec20fad09563d32c7b67bf7bd36ffc4ec5cd8545003ea32b94557992f421d1c6300034b3654c1dbf82cff6a55d55d031e30042b2bba0384da90aed64d3bc5e1708e19e96f13a5d56a4a911f4713ed774478a25db2f0810329270802594a7ac5ec2786f9a2bcd92e3e51dbaddcad1366492cab4b5895e805033b73968f61a1311446a837e4ae5b748329f1ac4c8675f033eb477a3dca088ccf0219ffff03293d3e2ae4a6aaaa5b9c92f9752d1b61626b88c9a8317b70b9461d66e2343fbf03845e1dfec502ee559e9adf8ff5406afc0dc209a7e10b73bc30ac58b84db3af7a039bdcb89b905c1c65d95d544b3d7c72bbf858139ee34752188c7d34357d2f599b031192712c840994c787a1b5a9d75462ee474bc17e9dfce9c49b27b6897fc174ac03a16b8641219b805296aa54e36afed4ca500da6a50442e30d06e18323bb78fa1e036a837aaa66683bb558aba7503b8da10eb4e9de050617f0b940a2ba5821deeb2603f5a5d3c38cb9f184cf7c6a66b6485b4c9d15ea880357b546ff0a43727a30c1d70316f8c10596844901e3033880944d6d1190bc4cde580b04b525da4923b8fb7e9703b41b42f0d50ffa64b710690fe5b58ef200c27a964d2023d84391758120f8e7d603f967e4a50a60035b903cf3e622f3e118988f51ef6d13bd3703c0983583196c2c0219ffff0302933a59585e23139054f3fa361d1b11d9cbd5358ee5d7cbe4ae18533b96bc6303192216ef2ed65e830eb12bcd69618c1339d2d6be4e84cc2af666707a30e3a816033d344c19e758c634365c3a855cb7dbfe13ed9606272cbe05c1a9ac14c0842fe603fe7e4e26d10495c256e41e692afaecec308740ce734ebcbc1c50209827d0ee990305c997ac51e4c8aa54ab622690ce3260f2dde54d2c4f7c0659f14a4ccdcc61a90373c4c5d65460c9f51f7aa0781d1bee033b57b8a3e6f80fb4d7acd37c3044f65a038dcc7222b5ea0a5985462c2960dfbb7bdf4bd11735919348998f4a0397370cc9037c7f78116b96de11ab0c364167da129a45f326577657ceeff782b80b299ba12303b8aef0d4ce6625c3e246a0d6e8b07c9b96e8ee937eded0432039e480a71360870325513fcaa3b81c7e277e01d6076e62bda71015d1792955d25c071e6b5e1260240336f2f0ce2206191fc9bc8adfa0e2f7de71f19ce78407e27437294e4bbd53b82603aa5929dff076e6be0a6f69828ef680ca1b6710e584fb257dfd28cc6ad071edf803b88c409de7c3f8adec5ed90133707f2d939c50e67afb19790bd4ba92e52c85f403bb0929200904f4e637392570ac4d0b4c67defd85b09872d26bb92c462afc5d7100581f025de823c1dc39c190aa6e32946f4490ba05b0d0b35acf48e1ce7ba07e7417480df2fce32d73f59e00581f02a12bf686085fce9fd1e11630b3c0bf8f18a1c4cbaddfe9530b4332b7aab4410800581f0226661afe80cc2626c872a6a88c84ea363fbed12bcb63472ddcc85c3424fb410100581f02726a48a6efd020c3f88195182b90108871b76b7dce663e476db18dfae0a75820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02dbc3b79c8155a4a643fbae2da01400497eeb50354935eb64886b69ce6d4c4723ec720f2ccc1503e90453e222dbd33a1d2c4939faaa0a5062c9099b258528e3bc11a3e4e8cd790e00581f02ef0db8cca8c32d1eb6e6dc7ad3fb87d853bc4cf9588522ad9a4ae36541465820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02810645c871bef6c35f9063f3056846de45de144e8679d768a1cc958b559841030219493d03f20d40c3708deb8ec124f39a207097b97dc5ae8783aeb55e7408d37e85812b5403c4380410b26b2a972dfdcd7b1c5f362675f21052ed3e449e7d7dc079936b804003924169c0f9886d4c4e431c33de6e10ea2ff56ad58071460844d1191acea35d5903bbc1d0e7e902301b1a15f099aa5f4a8991d87d7c5d3724e5f1674747cc4c54b2039710b5fabbba71480375589c52e54e86f2321816761da9fb5e437b0bef107bb003d7a144b52ac453830f777cdcf9748d0b229d5b74b0c0ddd79cd93a83364c0b9b03db82373a20226adf484b6d3049b026f1ed09d83eee2ce7434fb264b011a5ea080336c81b7fa6ed54643656acf3f92c304fe829d77fe006eec9e6a1186374973eb70371d002d04f5d997e9454e8babd6261cb5f09e78c5afb213382eb133171d9e01103ea3625118091588cd6c335a1e3664eb95690f28ff806775bd40b48b5ed2534960309b9a4e69aace230a21b1559218500b79101c78a93f26e6c6032d27337060ec1038f81152e7198e13632ec746377c894f78b3fe3a3c1d75fca03c3c6c66b2d34bc03946ddf5e1eb2acc63c4dfa4cb7a5384449cf6edfcd182a3e9f33e9cf53992d0903d0fee8c7670195cab6fc1060704e9d67bc738775c70960f02d0d5abb6b8410b80219ffff03203d91faa71dde46441405bd1c75365cb6cb112124ff92ae7228f7348c12ad8903fb69c170b99fc9b86342ed9a41a9086cc7bf80d71d9fbcb6dbf67c3ad87179e80219ffff0378ef866aaec9e66e01462f7e7b9dbe97b5248e92e68e39f7d73ac95f3f2a40c10398df71dd6375cf87d05ff5aca21a2b6597c572e0a0c37d3998bf4a0266188613031b3bad7876659e37624cb24383e45a367a42c4893cfbc4ce216b7fcfd3a338a9030d56a78a6c3349ffacfd5f7d8aa74f5ffa89df3f2fa3e19a5723ba7e66adadb5031c3427f11b411ab87f0da47d4ab206d329594bfb6217cffe4f4baba36884c28203e4238e078e3543ae76eaca74224564bbff9af7d3137310a99731618253fc4dac0336dd77ea10955c26d955d385d77e659ba9e896b527090c05fe5ef6f5c5f0379f00581f02471114fcda013a1af0a227617f3ba051df0ff7cde2ebd627de47b676124f428bb100581f02920120bd3ce48da15c85f9fab211b438c13103328e1b64e37ccad45c01484611bca2bd186600581f0266c4d34b1773096e8b60c28a5a7dbe615891e65d40e75f00c83219c0f257410500581f029eb9cabd8f4fc844ee624d041c99d99ae5f36004c2b2560510875919a29a410e03164d17701af5e97dae976a7748bb092df32032a6f33d69f7ef2e7fdf1727868100581f02fb268d27179d99688439bd12006c2354599180462c5fde072e23fef652b4544ce96aacbf4a605084d757141be016de8431b28500581f029a5ad24c7c6ee443bdfa50b5411227414c9acb0e313e317bb256935d3114410d00581f027a4b78e1c32fcf7fdb76163e9eef041cd41e2ddc93982e5efefd47a6970c54e8cffe004c8f5bbed8d4c76ea1519c5105ba51780219df80034bf4559fa42bfd8ba9febe4ef75d0fdec851142c3362a63a639b43e47dfb5d7b03c85d9ecfad1b9f58a91963c946dfc09f1099c1b6ff7c6aced726ef2cbb4ecdd0030634fdd6b7a2339914809f1a1a754d98f2bd1f59ea4b09998ec833bd2f59ccb000582003cf08d88696f6f31f1b5e03a7d47c4cf729ba8bc02c1e9712d96d51f80e4300410103ac99d757812b828f00b90c3065ff53573efd3fc34b9e073b82814a39e6292e1503e75092987b118459d308fb6fa3f7f1a27c7589b521cdf36e7b301147987b1c4a03d59944f30ca2f83f6e68b1e854d8d627ed23c124f11735923c3b7822d50c5f00033c6e9390dd098955847afd5ded49b1c1cee08dbe39c19def81457b3bf198204e039826e46c358736a06cd2bc94fdeee393164953aaa24672f26512e6ae18f82328039b2086dc4ca1e1067b4ea374d80628255b054861f69fbef3142c1bdde875e4e603df2cd6b79510175a7ab97098a53f72c6b9e8e57706db343cb7706e556ece8d000219ffff03678a7664f1ca23c2a35dd1f2e4137e4360ad2ec680ae68da9242699d4336c86703317c64c5c79e227bf439d51af21aebe5b7a0335af76e507c8423db40e24e801703ce39254e8055b184d0e006709fefd0b9ee2e716ff25555f260dc808bf19b256003de13a8cc504dccb5fc7adbe8e2ae5a8aa03832723067e2564482e19b806195a503b4aa6ed6f789d494c6819b094381b1c14ce1f0640d8f6c2edd2dd52d07329450037eb0fe3e2551be914cfcd2b454a9d4cf9ff01a15e57dac03e532954d99307eaf0397b7104f468fe21a20e9238a9c9e050646964a605526fd043b250bd60b18c7de00581f028e2cce6bfffef641ec0f4ac40596c3d9cb95e62e545beb92282a908eceb1423f4503c09279fc2cde9c51f4dcaf1a8f02268073b2bd6a147545626ee18c515ef08fb500581f021b95d1b49bd9faae4c947aedfc52c070c6bc2e49ec3ae3a2ac252928ab6b5468808e7822a54c098fed2265b946013d1020ea6800581f033fb7423fab411702338ec9fedf41f262def894c097f81950fca96b7144f0411d00581f03852beaa7c37a973020369f24e35f45c4eeac0ca0624c94ca8a9eb7895ad0549f41a7e24fcd572079a08af2530ebe7d9bd5c7bb02186000581f021b41a4ae1325a8bac4184e73185bbd78e14c86ef7c3ad4524de1f549defb4501f6eed4eb00581f02f27939b9f512aa77d11bfeca6c9bd3ed457e81c238de9f704030fff23bcf5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02933aff1301c6ae9cf956f585271b0fc1617f32328c069ce83d439a2e5268410200581f02f5f121e21548f67e3e1209b18d2f8ab7fb535c578d3be7c022706a4e23b25820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02194ea60398a309497d5946a149f5f533598132de8a2b7058a9c4f13fdf6e2f488d7bc6d400582003452bf5cf56d19600aebe0985b832f99211bb4c3ba606028ee84632f4126ef0410903f6c6f7afbe8c6056b4809bb5b11546bf039a2b5d7433bc75d0c37ab60520b2d0034d1db10df257dcb9eb1a4a47ed0d75c096bb07fe3a33c189c382dc76733c8f9603aa178b653ef12d90a22a91ad0d15d4826febe1a13d61e182d0251945131ca774035c3da35aebc70d15c460fba5c258b1c8abb97233baee07df984784ebc2ba5b9a03cc2eead7690fcc166a9fb7952924be642ef60309e24502ad4e0a692747a0ed3903688590ba272d3dbf78caafc270c59827a0869d85e31d3f6592d119511b0162140219ffff0371fde0406cb697c922ad82366c249f765c76ad124a817cd48597303c5345f28003fa0b15ba54540f2411156bd151bb9c7ef1cd03d5da76b7cc27158ac9d1bedf2d039e61bb4eb1c55261a5711a31d22b0041a902e0a255cda57c6d5d37c0724619ed03a8e52477b7188726d1808cab1c048d1fd913b7825a52eea04e53056a5b4224f0032e2f48dea5edde817d48684b1ec3d1158c5c2096c2941bbc690c4a96faa746f103bea1f317e45183ffa248a7536deeec904894ef3f8d7f71ba3644b59b53e63fec03656b29a7fc8270d4069eb49ccb1efb264a354d26b1be9af4aae6e0a24594d17303d3dfa42e9b77c4a21a5ccf606604b8f84a4ada1f0172369b7b4dcbfe2b6c85de03fb41ebd264546d5642e8164e2606590a08f7dcc6d84f29088159fea294b7f2ed038e64cc55b0615dc5ad2cc16881a27b2b5050cb08024d816a9d6a42d04c5baa0903e1e6a52cb9a0ac2de6126a5dd4f8b054708b040e30b26d596e1c28b6d0a261700219ffff030f88769df794d68aae3c9e65f8faf90c1a659dbdbeb0dee284061b81d7e10a42030f8a96252108c8c54250ee8b82d5fc2dd63979f65e0c58d1f913f0c87399061f03dd31d35a5d1a5f0ef46d741f73dd5c245d4a4b68ee5fb58dec029b001ff7451e033b445f4377a6f0cda78fc511575c3ee8d0e63607091c20dbbc9521d5ec5d214f03e2fcc5d568ee9e9e5ad2dc31fe4a6df850b0dd086e3b3f05bfa20644d160899b03892f1b22d56f1c8e47280d54bb339213c466bdafbc92076e5ad220140cc3319f03825924f86555e6d63249faf2b9eafed58ea0ab5c04c6fdc940315c596586b2b803c9e8eac7168764c8b70f3915d89a4bfc273b3d4906a1c97ab0b10a0bc61b2dfb03f3f976d291a82350fddd836bac387f77419e307cf9a6f070d7a02f9d425e5a3000581f023f414ceacf32fff17f5fcc778e6279a21c0649f58284d3da5a861f500613482b68ebc3f3ee8d4900581f0212f3b542812514136b611e5a1d7a376eef93210888e340a6d59e5361e153410203929dc327eb39d109b815a5d72455d750fca7e1e25218e12dc5ae3ea5b7076a4e00581f03a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b042d10700581f031ab664960f19d5b04d8bfb265f5d5198f0e55be951138b7c4aa848f378a0472386f26fc1000000581f0320533c2b96b1b0e92f3e0752c706f9db76c59f5964e80e5958483f019e40544554c4e5a971a25af0c29a162761d2a0cb855833021904a000581f023fc8e743015f63fe6838687e26900eef02eb75fe921b9ee91cdf3d54e6465820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02cb8c5ebf5244a0cd88e063d1a883ad7f80025be6be8b490cb2440c6a8d58415800581f0247abfabc9a2e441db9abc070516250e781d8ba5b23749f816ad010d5898b410100581f02298c44899077b2da6d440a94e801f6ec17c7eea5751286bbab864275f7fa42b4a302195ac30374b7ab0b8277e41e96e4e73e572c225d9530d4b2fd8744202f60e7d12d7e82b103e31ccab4d7b8b9cfb7d3bef282b1086c98c4aa9ad9f9aa10707a34935355cf20031215bae646c28eae3a87b45f08927b899b5908ebb8fdee3149be923f4d358e2903d6e681b38125841ddcc9ca52acf2834216ec6fcbb468f5d22743643ff94d3c550300f416e85bb57e13ddd571481dde5ff31bd6181ea0317320b6125d181e17516303c74df4fc939a9ac694bf450914222727fa79469bc6a29b4e76d76ad9a50df9d403052078053b751569426da5355284cec9047dd4c8f51c36f42ec441ec5fc84b1303546d146964a8fbf5598301981a5abf45fb45ff87156f32132f3ac3c90d4bb3f00347182d795dc93aa55bfb9ef642326a1a5a214158e61840fae79d3609cfbf50b003d978e6801113ff17b22363c9a11348724f0685fdf6aa59ff367e98149f6ebc0f0219ffff0335ba58953f823fbda866ab796fcd2e29213eea82f948b3955cec53e7bbe2ef0a03b7a1959c16b07dda158a173cfac837752f5a18a4c481602238760ac5d1680db703c297a0f953a0123a256f34ce8b2897d1abc9acf943ac9a141029ad2632b4fe2303bfc2983512d108dd897f3e10d3f0bb45c6c71005e3946af94372b0d27982406b03931fc5f5cd35d198e232fea9c050bb5f8175342a1a51ce5611d8672a67d3a8a0032b5334fd7c02a9a3e601de7ffd48f90ecaa7edb67423a5feb2a661c59bb33e9203eb2100091f55a28ad8a36fcecb8cb0ff2fba9a55d39c350522591923e92e56cf030ce552ba4994b1aa897b473634dac84a3b20717bfac31998b07ba1a8b1a6362800581f02aa6b03c9fdb1a9a0af933476dc80e79ddd92baf57dab20876398044a95a75820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f026a380b953855c0a06274a60d270e6fd4ab664ccc146ee895f0aee8bcb7f9410100581f029596e8e46152251cddfa894b4b9a969cbfbed09d406a126d0808313090dc42cc53039251acd22588428edcef4679cb4530b08edcf6bf7efe34d6b9c1416f91149aef00581f021d2e572b06395b693c8c36a5a1f7e77a16cd77440d4971a44727436596f44289a700581f026b49f5dac4b6e6e3c9b373c9150ee50578361d0b9f39934c41bfd19597f34111021918ca03e207438db574939f4d2052d1e62e2065a39a281f7c1cabc96bd3bf283fbf79d50381c81df0355763f75a37a8259ffdc2991402216c4568ad5cf2fae32c5f14eb150326504c4300aa1d323a3730c7ddf6d329f2c24e72f83f8e1c4ebbe304e3bd0b270350f58606e3f0f3309d9eeefd22dfbc565809aecaa9d44beb70da2a7df9c0a959034f0b00a25ac2eeab2067919e03870f1b4e677efee5718f3c9ede896bf5e602c303117e28c4dc897753e5af0474835e781a4c9630091b6c34062027f58c1e3a94ce03c15de6cbff9531e383e8b556b4d0b41eedbc2ccfff45d53e865da03188582d0203b1cf1d77144a5f8a4631521ecbc063e2f2fcedc2529547205829e0bd32ab694f00582003a9f5f7871e0eac180e7dfaae3be3a79b447d9809aea2fb2edef79f1eff9d0054b34a45fb62ed69e0066d1b60406463255e1638ca036fe21c01f1b75a380014eb1acc8f453dc737feb18e15286cd6605716b3e922390320b2640ab6d3a746c539c345ab3cf8e48934d498f71be2c2b926294a0fb30731031a2c5e9326602f083b520a5d572e764477faae25f7eed58a44af37e78c5f99f60219ffff035b276b4b1dae3b641c40e00d282530094f89cc291c0ac642b27ab0e190db842b03a2b89fb05df43e24fd25cd6189b5746a20b3c4c25200f499b2c9eae1cfe39fd9031a5a31b4ba343683cc123cb32d09685bb359809f7c59fa267f48bbbdfa2a4923034fff688375db2633a68275992427586fac2c2b8aa0323289ef4d0fdb89476a2403c99c77bc0ef92cc0593e8f7306d086a1b5d0651e5579aadb02e25774918d67d9031e7f1012f881b2c98cfe351fe10cd58943757509490a0e9aa133683917404f6e035e0f7fdf77bfe733a3795766bc08ff71436c7d1bac7d30cc2d39105cd5aa6a7d03b8701fb9ee4c31a0c8d9bf92399701ad2823b901fdf12732672fa526847f2171032a19be148b7373bca4a8d7235b063de5d8ee9c1c8a62c5674a50db2f856f19e50058200328c9fd55ef3f12a282c0cfdcce633a22466ad809913c3c778f600d18968bf047113cd18bfbde4103a6f6d543766a6e9c71d037ce1c91092e85d5fbee4dbd73b38e69aa1f4fe91d020336e782939236d8eae5148113cf84d1275d21db445a03906390d5bceaf8aa45ba031cc0786aa26223ac1c94edc7725bcb495fb881a5040591922b0d3e3e2a09afee035f9d37f32e6f5f1867dd4e9cdcc427262300e26b57fa88489586d8d17e823751039834e2bce97e609e0c3c6abcd82c8abd23aca21bb749a92aec70a45a329f669303664971632b65816cb5123a9d3fb70e8674eacd5a000d2f7033e177b66c6af57403a541c4b03c1eb2072a4630a08c012615622a1f18b9522f26849ee8989e0dad5f03d15ffcf054f1ab4cb4645e6622c5a235541a17160441f939133a861a3930dd1b0345c99075a5163920f1fa2a5a673f56adf8ee78d308acb27b4f73f9e80b0e67750219ffff03ca430210688ea6b3cbc9815ed8894cc526812385feed13bc92b80190f6d0015d03318821af0523ce1620833e15549995ca801607f8e56a0f3867e220d37923ec3303b42c2f794fd6c38f0c285a2ea1ad1a545ec311fe23163829cac7b0f0b93b10880219ffff03cdd05920f2ea207af6c3d6b4b464cf8d1d7181d072c9f7c92712d8ac82e539fc0343b343b1bc2cea4a6c0c394752dce599c6366d20d83909fb6e0df8ae3795746803ca2b002e52273acc4d95ee45753139c65859002dfa31accb0d085586b4ce8fda03c1eb924d3ae51eb84ba16c0695aa352d3b73612e9f285254b6fa5e3fc64e3fcf038a2abcb7aae5cff965958f5715692f55fc41029c1909787b1769207af3af04a3030402245fe71bcc44001ca5ce0003cf345db2ce4ba45fc259b1f82a0da2f7cd2f03551f0395b54db7ef2c626e898e7ac956281b224f5e709b2372db8623073b340d03e56be1509cd275079244afa0c362821535d63ea6fb598abe8dcee3074536d6a6033a67dbfcaf4951fd71bcb4de6b45e755df365e94279e90c21189c4434627481200581f02737ca34fb6114161ec8245c8f7963d6f3bf2325aff8907f1c39a7e4b09ed5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f023035c5f637e60e48eec97565d9f7b4800e071bb4a8625142462bd5f3c2cd5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03a86752199a16be89dd8c24ee324159ff991e26cf3d9d1b1a6cb45ad529e203d400581f02432f9455c9413d8cafd5d037c0158c68c8cc2a32461a8da7ae0b01933f784725803e30d08e8200581f0225328f4395e2bd6130b29f1a30afe77ee6fa43896b75c8be6c9aff9e610a42bf6600581f02c8790e98a22ac767ea0dfcba08f601f9f4e79f806fe9685595249dfbe95d5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03c5a37057cb7ece487c83b4231dda21eca33090b84797e534e584644d06d5ff0200581f025c67a0da73b02161ec58182b7069ab5df22262ffa172657e73ee0d5b6107410102197e8803d0f5c90e13ec4185a4ed416a4d9585e1466f3ac870c5d9b332071ac20d1049ae03329fec4a59c85559b80a67ec4062f70423bbbf54137c39798fa3065469f28c3f03009cd91ec1b7170b14f266e4907ec4e50c2c5c8fb3a47a5a9751f6c111907b4a00582003a97670be2590088a9a35f053bd00b423e5d8bb75be2ee795bbd6b53ef2daa041040314c0d5f541c6e26286712bc292b6a15d9cb8d83cce055a565643e1d27e95e4b203cbc74a078eb9b61921568d33d4c64260c77868141c44f54f6eb97781001bbe18039f244b362efd0eba010950b395f5b1ddb883ac204d7198168b754ebaeb3730430331aa5c8886d84e65e0048f1a8734858f4145e03bd24729f1ba3400fbdb118b0b0307dc5ba55317aebcff776ff29dd7250321b2d1d7fa0af0e43518e44cae952b6f0219ffff03faf6a32d6b702bf715d32a89ae476a9ade02d2dcd1a0a5cd578e1759156ec52b035e8e4345b591afa48a05ab6ae99a96f077fa82d02b7a9be835b3bc79f65c7c9f03c098301c481d6500d17135048e8b5939f4a62121e7b7500b9a61b1538b1d760e038762d7890eebe388425f7caacf61e4b941ab0191339b2c97348a98e7da80aa9103a6cb342487f148240cc96fa001a6dde12ea7e50b0ffa46502824cf53d17b98e803a3a7400685dbacdef3b8a3bc1a4925c068921a81b418031c496d911070cf3ff6038c0efe0212024b039cfb5ca04c7b2efbcc826dbee329a228d289b06eac264bc6032705110ae1a29799af9e5f8a39f1e033b569accc6bb64f762d9a0dec20fabf4d030de8e1687b4d892d2cf423dce37d2147ea8d71f41c1018f0843e54289e1ef331035bbcaa0619f99f84454b4531355c303ce96123c0f28e368889ac786d9c8fa48403c993283391df345dad85d14069bf90a36cbbd3f6965fe2fa1bd42218e5d4be7a03f0a138f3a825a3a10cba22f99ee7969212e22c9814c9e8e1a3f54bec2f13cc9d0219ffff032769143f77282ca6bf636ca33edd955766f55dd262cdcdf43871c412598ddaa603bc8b842beb575bdec8638d912b8671933f18ba7c365d55c2434d5b8163abce260219ffff05581e0369fb3acb688ec0833b76571adb8bec9d01192ee2c5bd41b51438b48280070119202a03a546b9a1f1b5222d221898a193f0546bd684da8b33f4cd85513383e58541461d05581e0375f6be4c94ec8db2ff43d669882ab0eec29bb8c0120b9f49a4dd503b600404030631bbde9b1f984125a7325a2a6a15403bc0250599094a57c034422ba83a62b705581e036bc29aae9ab1d575e9303ec7b8a7bccb66f352e16ffd847c2bbbc899c0040805581e03b241082d2135ac3ccec1e87a7f017ad6bf87934f77beb37a86d534ae700c014702f0b8f7a29b7803e0eda5d3a5480dc8ea5da0c85b538590b93e4d2f1f82da1f0961b8e2a8c7090c05581e03d442289d5db854fe2f45bf72f76ab99e937420745e213d4987526315b00c014677b0c5f2eb1705581e0362dcb6c71d7a63326527116995a809c8321c3d3d9ed190a5793aec0f100c04470be60cf3d5d5da0312595aba11f1bc6a8180d5051a4172b981b77cd82388b4475fea91ae328cdb21021999f6035798401a74e041e5bd23a00f2aca4913759e2bea42b7bb0502a086fc8f8eefe603db6f567a1cd62cbf00e6e4cba0c17eecd53765602f2a696c936c105a526f03fd03106918e83d1fe407b94f655299529fd05d72e273ecfbcc55d7058bace20a5e050376805a0317490cb460b2a955be780450f6836dd1bb05d8a0311534b86e4cbd8b0317e0520ee6cdbdf3000f978386f5e97130e317b013b2e637e52d52e70bba92d10219ffff03d1d4486e2c6bff5bdba36c57111df8161b46035ebe4a7feea12280efb7abadc203622246760650fc1eebadf40c41de6af008af31b75932edf66dd28a42cf6392b9039c80afa31006c3efef2127a7e68bbdce8aec15d88926e61d59c5868790abda2c0370d5462d7404481b04b145698b68aeb2231f6403e2368b89b416a31079713ee303836128bd50abaf5a48059e41f33c1cab36c01b7333b03270b06ce5e261ab630403aba33a9328146b5b64163d5ce01e95744d8b6ac6dcc3f2082bf9453e07fc359903e40e85229f7a4c2ff5f732f0007bb1244e1e4188260ab1abcf9687fdad76d10b03913a4690991815f6940d8befdc7176aa6ad9c18a08ac68e4419dee9b7c97835903a0a5d2719007da830314daa7aea494b3bf501dcf60ba746e3df67aad39d1db0a036cad949b8b70273203501eef9ecb81276415d4d21be66e2bfae218417c1342ad03554eae355e33b0f1ff9f4c04cfd8b0df1964d522cf1ab1a95a90ebb519ca123a034e8da133fbc1c4db5f5ec972e7f6b11a7ba43b57d5f3cbcc25efde12cf4974660327a87037846a9ad140b95de480c902ab097faf89bc4c8b701612cec33f38b6c70219ffff0382a4e2c4dfb758c117096d85533632ff5029373e9d8d952b129a41b1dedead650358d9656141e4dcbdd2f5f54390ea1afc7c5cb98f7766400013be155a5aa13a580356c4b7056fd10e48feb32c2dc3d2feefaee74d0524ad97b7dfec56dbdf0e23d403dbd626ed7b96456a5f896224b117de8b7ddc7b749c6b2d402d21d7438a8a0e3203845f6b71c30077546d85eed620eff91a7f45a2e3e2cf1f60c88e758cbc96315603e6f29ecbd7991b80570a28bb242c63bdd9cb653eb7596a113b99fdf14f97bd4003368c55f1fbf07342d8c323c738fb2ea9f2fabebc8352a279fd997722cb8fe14a03bdebdaa86a254e37a582155fb052c0f855a545e8ee61e91fd663b92dd5c53e1103c5f0447b2994fa864ec0df232eb80dcc384488291643071f774b9747f0ac26710219ffff038b015389fc84cda7709348e85846f4cffd6da02c1adabda10047c9b9da95a9ca03a3f9e82499e7674bb8c2e9f1a781e783a1dab71b19048e230bb58e5df5973a2d03333fb5bf5b23b1f86775a0f27aadcf9e79134ebec02fefff6051f9878c07f7c703692e61deb86e5b65787f5211be79b949ab6add0d6cdc4c81ebabe51f653dcf9703342d16fd6d25eec5f89690848c39f90db48e7630c455ba1822e24fdcefd8dede0357350819032baf0bfcb2089f1476b54cc4c185c32e30d20725b9dd45e6b5c21703dcf2cebccfb2c9b99f315428762e8487713edd7371ef4943d8faf8f81096755403bcd212c35ca52390cb70af312c0a2e8661c82402d9245a68961e28c9b60cfa41033335c588fe2460af946e5e4cf03edd7cd5888ea17c7e9e3955691cd7f6dafdef0219ffff03a163ea031c9ff8e641a73f154c1c71c9ffc513b6493c3f619a6200a0f4b25102035b4df2810be1536437ba2fcf506a03b9ac1ee5626c19f39a61e3f32ecb8b3641035e0f6b0543c94577d36ce472158db75597afe14df9f8725185b3ba9d4a9fa44203d369a2794f66e4bd041bf97e7dab817da7e83c3bd3581cb880bb6347636e5a930308f3158a611f591d497dbcac4462612e0d0f4dd07b14b124f72c0cda941b361a0370b32cdf3563202ae998180d3c1e78d0ac431450f193d88bdf7b4a005ef5a04d0219ffff0368d228a2bb6f501e5114668a22408ffe5bb23ca4abd6287073626b82b0cc7ab803c509156302f3d96b880a8b732eaacbf000f68350ed14f30eb207bcbd91dc33cf03b559b49383b2f2a8513a459b0ffa5039041233820ddb3beda9757fac8075904903827e2fb9c666b4acb2a77a11004e3a3f28e41e256328f1fd2aea356fbf95e284033bd5d1d8bd1bc47e3b0e5364e68b9a339b53d659a5c54f31b84d481441d9b765037c938a52efaf84f440f34c5e7083bc9ff3e10c463172fba369f45a660a44a0e303e8f34aa1a8d07cdf43a1bd3d33825a6db784ab7541a15153416748b70a8d45ff03af5e35086163e702a7babf11037a4edab68ed5818aa1ced9b8ef2e560c7dfb9603deaafd8cf800d4a3d27d08dd80e8b54b4e9cacd05678687cff6cee69798bbfd0030ad896cae91949a85c3e45fe83e99d91007ad9f03a11729d65cac061f583b19a03df17c3e88df7eb66e3bc42a6eff9226ad790b1acaceef30860193a69c371f135035f39e8f8e797cf94ff50c4d3e8612cc29ca20cd4d555bafd647fd750ce907e780328a438af36388cbb7355c4550a338d85fc90c9968ec8942c90047add703c8ba0038496b23088b87f4c247935c2dc0c117b79309cc8b7b429f6eb1d849e892522b10393990e42a7da40102323c7d777de80586e89dceb21cbcb4ebcb6074dc1780e3303f662ad4ac6060f9fa84ddc459c47e98009160b7a9c2a63fdbfd38d66f31072e103a6933d9379f9715caae168708081b65a233a6c2014eb525ee3917539d0f16ecb0355b5838de9624d29b324001d06d9d854210e1bc9b815d3cebb3730fb18da697203e17a5fd5f0258a79a7295fc349c35bcedc07d42f5cb371d822336abb513926190320954c325095c2fefc2201f0293f5f6f5240f85fcc052a5d8a82869a6172aa9a034570173bcc88ea2710d14ba572afa4f318427fea12278a73922298159cc5bcee032e0a36c7ef00d3650e2a628c2db0a90cf6348e8c442b4db3ac29f220276fbacc036e99d8d3ceb6afded473f5bc05e1c7b1c98c3f45222a1ecf01a99b9b4641e64103562d44997323f6b304ed9740a3025214a7afd24c44e13a26dd10ec7401440546030a3dbcac1201260432eaf194827eb27c6192a4884e34b7d8ec500c90a7db10ac0308c28be29d0cfe27ce4dcc22bb798c97692f50db909b2f809d8bbd97d6b95ea203b5f93339cb957efb1a03f248602d638122ff3ec5ab8cc5c9bdbea0ba48e30ae105581e038c0101236e268b917b5c0108f9f8370987816d98284c76b588798f19000c0147021bb96329ba0005581e03a9d5a946af9e33d51d87cee40544ebbfc39c5d3ad52b77e1b30786b1a00c02462155aa030b580459567e608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f4314610800578063f305839914610820578063f30dba9314610828578063f637731d146108aa576101ae565b8063c45a0155146107d1578063d0c93a7c146107d9578063d21220a7146107f8576101ae565b8063883bdbfd116100c8578063883bdbfd14610633578063a34123a71461073c578063a38807f214610776576101ae565b806370cf754a146105c65780638206a4d1146105ce57806385b66729146105f6576101ae565b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146104705780634f1eb3d8146104fc578063514ea4bf1461054d5780635339c296146105a6576101ae565b80633850c7bd1461035b5780633c8a7d8d146103b45780634614131914610456576101ae565b80631ad8b03b1161018c5780631ad8b03b146102aa578063252c09d7146102e157806332148f6714610338576101ae565b80630dfe1681146101b3578063128acb08146101d75780631a68650214610286575b600080fd5b6101bb6108d0565b604080516001600160a01b039092168252519081900360200190f35b61026d600480360360a08110156101ed57600080fd5b6001600160a01b0382358116926020810135151592604082013592606083013516919081019060a08101608082013564010000000081111561022e57600080fd5b82018360208201111561024057600080fd5b8035906020019184600183028401116401000000008311171561026257600080fd5b5090925090506108f4565b6040805192835260208301919091528051918290030190f35b61028e6114ad565b604080516001600160801b039092168252519081900360200190f35b6102b26114bc565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102fe600480360360208110156102f757600080fd5b50356114d6565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091168383015215156060830152519081900360800190f35b6103596004803603602081101561034e57600080fd5b503561ffff1661151c565b005b610363611616565b604080516001600160a01b03909816885260029690960b602088015261ffff9485168787015292841660608701529216608085015260ff90911660a0840152151560c0830152519081900360e00190f35b61026d600480360360a08110156103ca57600080fd5b6001600160a01b03823516916020810135600290810b92604083013590910b916001600160801b036060820135169181019060a08101608082013564010000000081111561041757600080fd5b82018360208201111561042957600080fd5b8035906020019184600183028401116401000000008311171561044b57600080fd5b509092509050611666565b61045e611922565b60408051918252519081900360200190f35b6103596004803603608081101561048657600080fd5b6001600160a01b0382351691602081013591604082013591908101906080810160608201356401000000008111156104bd57600080fd5b8201836020820111156104cf57600080fd5b803590602001918460018302840111640100000000831117156104f157600080fd5b509092509050611928565b6102b2600480360360a081101561051257600080fd5b506001600160a01b03813516906020810135600290810b91604081013590910b906001600160801b0360608201358116916080013516611d83565b61056a6004803603602081101561056357600080fd5b5035611f9d565b604080516001600160801b0396871681526020810195909552848101939093529084166060840152909216608082015290519081900360a00190f35b61045e600480360360208110156105bc57600080fd5b503560010b611fda565b61028e611fec565b610359600480360360408110156105e457600080fd5b5060ff81358116916020013516612010565b6102b26004803603606081101561060c57600080fd5b506001600160a01b03813516906001600160801b036020820135811691604001351661220f565b6106a36004803603602081101561064957600080fd5b81019060208101813564010000000081111561066457600080fd5b82018360208201111561067657600080fd5b8035906020019184602083028401116401000000008311171561069857600080fd5b5090925090506124dc565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156106e75781810151838201526020016106cf565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561072657818101518382015260200161070e565b5050505090500194505050505060405180910390f35b61026d6004803603606081101561075257600080fd5b508035600290810b91602081013590910b90604001356001600160801b0316612569565b6107a06004803603604081101561078c57600080fd5b508035600290810b9160200135900b6126e0565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff1682820152519081900360600190f35b6101bb6128d7565b6107e16128fb565b6040805160029290920b8252519081900360200190f35b6101bb61291f565b610808612943565b6040805162ffffff9092168252519081900360200190f35b61045e612967565b6108486004803603602081101561083e57600080fd5b503560020b61296d565b604080516001600160801b039099168952600f9790970b602089015287870195909552606087019390935260069190910b60808601526001600160a01b031660a085015263ffffffff1660c0840152151560e083015251908190036101000190f35b610359600480360360208110156108c057600080fd5b50356001600160a01b03166129db565b7f0000000000000000000000009e9fbde7c7a83c43913bddc8779158f1368f041381565b6000806108ff612bf0565b85610936576040805162461bcd60e51b8152602060048201526002602482015261415360f01b604482015290519081900360640190fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526109ef576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b87610a3a5780600001516001600160a01b0316866001600160a01b0316118015610a35575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610a6c565b80600001516001600160a01b0316866001600160a01b0316108015610a6c57506401000276a36001600160a01b038716115b610aa3576040805162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015290519081900360640190fd5b6000805460ff60f01b191681556040805160c08101909152808a610ad25760048460a0015160ff16901c610ae5565b60108460a0015160ff1681610ae357fe5b065b60ff1681526004546001600160801b03166020820152604001610b06612c27565b63ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c610b8257600254610b86565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b805115801590610bd55750886001600160a01b031681604001516001600160a01b031614155b15610f9f57610be261560e565b60408201516001600160a01b031681526060820151610c25906006907f00000000000000000000000000000000000000000000000000000000000000c88f612c2b565b15156040830152600290810b810b60208301819052620d89e719910b1215610c5657620d89e7196020820152610c75565b6020810151620d89e860029190910b1315610c7557620d89e860208201525b610c828160200151612d6d565b6001600160a01b031660608201526040820151610d13908d610cbc578b6001600160a01b031683606001516001600160a01b031611610cd6565b8b6001600160a01b031683606001516001600160a01b0316105b610ce4578260600151610ce6565b8b5b60c085015185517f000000000000000000000000000000000000000000000000000000000000271061309f565b60c085015260a084015260808301526001600160a01b031660408301528215610d7557610d498160c00151826080015101613291565b825103825260a0810151610d6b90610d6090613291565b6020840151906132a7565b6020830152610db0565b610d828160a00151613291565b825101825260c08101516080820151610daa91610d9f9101613291565b6020840151906132c3565b60208301525b835160ff1615610df6576000846000015160ff168260c0015181610dd057fe5b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610e3557610e298160c00151600160801b8460c001516001600160801b03166132d9565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610f5e57806040015115610f35578360a00151610ebf57610e9d846040015160008760200151886040015188602001518a606001516008613389909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b6000610f0b82602001518e610ed657600154610edc565b84608001515b8f610eeb578560800151610eef565b6002545b608089015160608a015160408b0151600595949392919061351c565b90508c15610f17576000035b610f258360c00151826135ef565b6001600160801b031660c0840152505b8b610f44578060200151610f4d565b60018160200151035b600290810b900b6060830152610f99565b80600001516001600160a01b031682604001516001600160a01b031614610f9957610f8c82604001516136a5565b600290810b900b60608301525b50610baf565b836020015160020b816060015160020b1461107a57600080610fed86604001518660400151886020015188602001518a606001518b6080015160086139d1909695949392919063ffffffff16565b604085015160608601516000805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b93909316929092029190911773ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116179055506110ac9050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b0316146110f25760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561114257608081015160015560a08101516001600160801b03161561113d5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b611188565b608081015160025560a08101516001600160801b0316156111885760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146111a157602081015181518b036111ae565b80600001518a0381602001515b90965094508a156112e75760008512156111f0576111f07f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28d87600003613b86565b60006111fa613cd4565b9050336001600160a01b031663fa461e3388888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561127e57600080fd5b505af1158015611292573d6000803e3d6000fd5b5050505061129e613cd4565b6112a88289613e0d565b11156112e1576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b50611411565b600086121561131e5761131e7f0000000000000000000000009e9fbde7c7a83c43913bddc8779158f1368f04138d88600003613b86565b6000611328613e1d565b9050336001600160a01b031663fa461e3388888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506113cc613e1d565b6113d68288613e0d565b111561140f576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516818701526001600160801b039093169183019190915260020b60808201529151908e169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679181900360a00190a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b6004546001600160801b031681565b6003546001600160801b0380821691600160801b90041682565b60088161ffff81106114e757600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff16611560576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611575612bf0565b60008054600160d81b900461ffff169061159160088385613eb5565b6000805461ffff808416600160d81b810261ffff60d81b19909316929092179092559192508316146115fe576040805161ffff80851682528316602082015281517fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a929181900390910190a15b50506000805460ff60f01b1916600160f01b17905550565b6000546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b600080548190600160f01b900460ff166116ad576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556001600160801b0385166116cd57600080fd5b60008061171b60405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b81526020016117118a6001600160801b0316613f58565b600f0b9052613f69565b9250925050819350809250600080600086111561173d5761173a613cd4565b91505b841561174e5761174b613e1d565b90505b336001600160a01b031663d348799787878b8b6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156117d057600080fd5b505af11580156117e4573d6000803e3d6000fd5b50505050600086111561183b576117f9613cd4565b6118038388613e0d565b111561183b576040805162461bcd60e51b815260206004820152600260248201526104d360f41b604482015290519081900360640190fd5b841561188b57611849613e1d565b6118538287613e0d565b111561188b576040805162461bcd60e51b81526020600482015260026024820152614d3160f01b604482015290519081900360640190fd5b8960020b8b60020b8d6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde338d8b8b60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60025481565b600054600160f01b900460ff1661196c576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611981612bf0565b6004546001600160801b0316806119c3576040805162461bcd60e51b81526020600482015260016024820152601360fa1b604482015290519081900360640190fd5b60006119f8867f000000000000000000000000000000000000000000000000000000000000271062ffffff16620f42406141a9565b90506000611a2f867f000000000000000000000000000000000000000000000000000000000000271062ffffff16620f42406141a9565b90506000611a3b613cd4565b90506000611a47613e1d565b90508815611a7a57611a7a7f0000000000000000000000009e9fbde7c7a83c43913bddc8779158f1368f04138b8b613b86565b8715611aab57611aab7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b8a613b86565b336001600160a01b031663e9cbafb085858a8a6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015611b2d57600080fd5b505af1158015611b41573d6000803e3d6000fd5b505050506000611b4f613cd4565b90506000611b5b613e1d565b905081611b688588613e0d565b1115611ba0576040805162461bcd60e51b8152602060048201526002602482015261046360f41b604482015290519081900360640190fd5b80611bab8487613e0d565b1115611be3576040805162461bcd60e51b8152602060048201526002602482015261463160f01b604482015290519081900360640190fd5b8382038382038115611c725760008054600160e81b9004600f16908115611c16578160ff168481611c1057fe5b04611c19565b60005b90506001600160801b03811615611c4c57600380546001600160801b038082168401166001600160801b03199091161790555b611c66818503600160801b8d6001600160801b03166132d9565b60018054909101905550505b8015611cfd5760008054600160e81b900460041c600f16908115611ca2578160ff168381611c9c57fe5b04611ca5565b60005b90506001600160801b03811615611cd757600380546001600160801b03600160801b8083048216850182160291161790555b611cf1818403600160801b8d6001600160801b03166132d9565b60028054909101905550505b8d6001600160a01b0316336001600160a01b03167fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6338f8f86866040518085815260200184815260200183815260200182815260200194505050505060405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611dca576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19168155611de460073389896141e3565b60038101549091506001600160801b0390811690861611611e055784611e14565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611e3c5783611e52565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611eb7576003810180546001600160801b031981166001600160801b03918216869003821617909155611eb7907f0000000000000000000000009e9fbde7c7a83c43913bddc8779158f1368f0413908a908616613b86565b6001600160801b03821615611f1d576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611f1d907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2908a908516613b86565b604080516001600160a01b038a1681526001600160801b0380861660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b60066020526000908152604090205481565b7f00000000000000000000000000000000000762d10ef955d55b7d038c7a7231cc81565b600054600160f01b900460ff16612054576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f9841691638da5cb5b916004808301926020929190829003018186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d60208110156120eb57600080fd5b50516001600160a01b0316331461210157600080fd5b60ff82161580612124575060048260ff16101580156121245750600a8260ff1611155b801561214e575060ff8116158061214e575060048160ff161015801561214e5750600a8160ff1611155b61215757600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c16602083015286831682820152918516606082015290519081900360800190a150506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff16612256576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f9841691638da5cb5b916004808301926020929190829003018186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d60208110156122ed57600080fd5b50516001600160a01b0316331461230357600080fd5b6003546001600160801b039081169085161161231f578361232c565b6003546001600160801b03165b6003549092506001600160801b03600160801b9091048116908416116123525782612366565b600354600160801b90046001600160801b03165b90506001600160801b038216156123e7576003546001600160801b038381169116141561239557600019909101905b600380546001600160801b031981166001600160801b039182168590038216179091556123e7907f0000000000000000000000009e9fbde7c7a83c43913bddc8779158f1368f04139087908516613b86565b6001600160801b0381161561246d576003546001600160801b03828116600160801b90920416141561241857600019015b600380546001600160801b03600160801b80830482168590038216029181169190911790915561246d907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29087908416613b86565b604080516001600160801b0380851682528316602082015281516001600160a01b0388169233927f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151929081900390910190a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806124e7612bf0565b61255e6124f2612c27565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b900416614247565b915091509250929050565b600080548190600160f01b900460ff166125b0576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061260990606081016125fc6001600160801b038a16613f58565b600003600f0b9052613f69565b925092509250816000039450806000039350600085118061262a5750600084115b15612669576003830180546001600160801b038082168089018216600160801b93849004831689019092169092029091176001600160801b0319161790555b604080516001600160801b0388168152602081018790528082018690529051600289810b92908b900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006126ed612bf0565b6126f785856143a1565b600285810b810b60009081526005602052604080822087840b90930b825281206003830154600681900b9367010000000000000082046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061275f57600080fd5b6003820154600681900b985067010000000000000081046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806127a457600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e810b91900b1215905061284d575093909403965090039350900390506128d0565b8a60020b816020015160020b12156128c1576000612869612c27565b602083015160408401516004546060860151939450600093849361289f936008938893879392916001600160801b031690613389565b9a9003989098039b5050949096039290920396509091030392506128d0915050565b50949093039650039350900390505b9250925092565b7f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f98481565b7f00000000000000000000000000000000000000000000000000000000000000c881565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7f000000000000000000000000000000000000000000000000000000000000271081565b60015481565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b9067010000000000000081046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b6000546001600160a01b031615612a1e576040805162461bcd60e51b8152602060048201526002602482015261414960f01b604482015290519081900360640190fd5b6000612a29826136a5565b9050600080612a41612a39612c27565b60089061446a565b6040805160e0810182526001600160a01b038816808252600288810b6020808501829052600085870181905261ffff898116606088018190529089166080880181905260a08801839052600160c0909801979097528154600160f01b73ffffffffffffffffffffffffffffffffffffffff19909116871762ffffff60a01b1916600160a01b62ffffff9787900b9790971696909602959095177fffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff16600160c81b9091021761ffff60d81b1916600160d81b909602959095177fff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692909217909355835191825281019190915281519395509193507f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c9592918290030190a150505050565b60008082600281900b620d89e71981612b9957fe5b05029050600083600281900b620d89e881612bb057fe5b0502905060008460020b83830360020b81612bc757fe5b0560010190508062ffffff166001600160801b03801681612be457fe5b0493505050505b919050565b306001600160a01b037f0000000000000000000000001df4c6e36d61416813b42fe32724ef11e363eddc1614612c2557600080fd5b565b4290565b60008060008460020b8660020b81612c3f57fe5b05905060008660020b128015612c6657508460020b8660020b81612c5f57fe5b0760020b15155b15612c7057600019015b8315612ce557600080612c82836144b6565b600182810b810b600090815260208d9052604090205460ff83169190911b80016000190190811680151597509294509092509085612cc757888360ff16860302612cda565b88612cd1826144c8565b840360ff168603025b965050505050612d63565b600080612cf4836001016144b6565b91509150600060018260ff166001901b031990506000818b60008660010b60010b8152602001908152602001600020541690508060001415955085612d4657888360ff0360ff16866001010102612d5c565b8883612d5183614568565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612d84578260020b612d8c565b8260020b6000035b9050620d89e8811115612dca576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216612dde57600160801b612df0565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612e24576ffff97272373d413259a46990580e213a0260801c5b6004821615612e43576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612e62576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612e81576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ea0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612ebf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612ede576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612efe576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612f1e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612f3e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612f5e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612f7e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612f9e576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612fbe576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612fde576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612fff576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561301f576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561303e576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561305b576b048a170391f7dc42444e8fa20260801c5b60008460020b131561307657806000198161307257fe5b0490505b64010000000081061561308a57600161308d565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906131245760006130d88989620f42400362ffffff16620f42406132d9565b9050826130f1576130ec8c8c8c6001614652565b6130fe565b6130fe8b8d8c60016146cd565b955085811061310f578a965061311e565b61311b8c8b838661478a565b96505b5061316e565b8161313b576131368b8b8b60006146cd565b613148565b6131488a8c8b6000614652565b935083886000031061315c5789955061316e565b61316b8b8a8a600003856147d6565b95505b6001600160a01b038a81169087161482156131d15780801561318d5750815b6131a35761319e878d8c60016146cd565b6131a5565b855b95508080156131b2575081155b6131c8576131c3878d8c6000614652565b6131ca565b845b945061321b565b8080156131db5750815b6131f1576131ec8c888c6001614652565b6131f3565b855b9550808015613200575081155b613216576132118c888c60006146cd565b613218565b845b94505b8115801561322b57508860000385115b15613237578860000394505b81801561325657508a6001600160a01b0316876001600160a01b031614155b15613265578589039350613282565b61327f868962ffffff168a620f42400362ffffff166141a9565b93505b50505095509550955095915050565b6000600160ff1b82106132a357600080fd5b5090565b808203828113156000831215146132bd57600080fd5b92915050565b818101828112156000831215146132bd57600080fd5b600080806000198587098686029250828110908390030390508061330f576000841161330457600080fd5b508290049050613382565b80841161331b57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716613430576000898661ffff1661ffff81106133aa57fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461341c57613419818a8988614822565b90505b806020015181604001519250925050613510565b8688036000806134458c8c858c8c8c8c6148d2565b91509150816000015163ffffffff168363ffffffff161415613477578160200151826040015194509450505050613510565b805163ffffffff8481169116141561349f578060200151816040015194509450505050613510565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b816134cd57fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b031602816134ff57fe5b048560400151019650965050505050505b97509795505050505050565b600295860b860b60009081526020979097526040909620600181018054909503909455938301805490920390915560038201805463ffffffff600160d81b6001600160a01b036701000000000000008085048216909603169094027fffffffffff0000000000000000000000000000000000000000ffffffffffffff90921691909117600681810b90960390950b66ffffffffffffff1666ffffffffffffff199095169490941782810485169095039093160263ffffffff60d81b1990931692909217905554600160801b9004600f0b90565b60008082600f0b121561365457826001600160801b03168260000384039150816001600160801b03161061364f576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6132bd565b826001600160801b03168284019150816001600160801b031610156132bd576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b038316108015906136e1575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b613716576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106137b757607f810383901c91506137c1565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146139c257886001600160a01b03166139a682612d6d565b6001600160a01b031611156139bb57816139bd565b805b6139c4565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106139e757fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff161515606083015290925089161415613a575788859250925050613510565b8461ffff168461ffff16118015613a7857506001850361ffff168961ffff16145b15613a8557839150613a89565b8491505b8161ffff168960010161ffff1681613a9d57fe5b069250613aac81898989614822565b8a8461ffff1661ffff8110613abd57fe5b825191018054602084015160408501516060909501511515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16640100000000026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613c025780518252601f199092019160209182019101613be3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c64576040519150601f19603f3d011682016040523d82523d6000602084013e613c69565b606091505b5091509150818015613c97575080511580613c975750808060200190516020811015613c9457600080fd5b50515b613ccd576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b5050505050565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f0000000000000000000000009e9fbde7c7a83c43913bddc8779158f1368f04131693919290918291908083835b60208310613d6d5780518252601f199092019160209182019101613d4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613dcd576040519150601f19603f3d011682016040523d82523d6000602084013e613dd2565b606091505b5091509150818015613de657506020815110155b613def57600080fd5b808060200190516020811015613e0457600080fd5b50519250505090565b808201828110156132bd57600080fd5b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216939192909182919080838360208310613d6d5780518252601f199092019160209182019101613d4e565b6000808361ffff1611613ef3576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b8261ffff168261ffff1611613f09575081613382565b825b8261ffff168161ffff161015613f4f576001858261ffff1661ffff8110613f2e57fe5b01805463ffffffff191663ffffffff92909216919091179055600101613f0b565b50909392505050565b80600f81900b8114612beb57600080fd5b6000806000613f76612bf0565b613f88846020015185604001516143a1565b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c08501528851908901519489015192890151939461402c9491939092909190614acf565b93508460600151600f0b6000146141a157846020015160020b816020015160020b12156140815761407a6140638660200151612d6d565b6140708760400151612d6d565b8760600151614c84565b92506141a1565b846040015160020b816020015160020b12156141775760045460408201516001600160801b03909116906140d3906140b7612c27565b60208501516060860151608087015160089493929187916139d1565b6000805461ffff60c81b1916600160c81b61ffff938416021761ffff60b81b1916600160b81b939092169290920217905581516040870151614123919061411990612d6d565b8860600151614c84565b93506141416141358760200151612d6d565b83516060890151614cc8565b92506141518187606001516135ef565b600480546001600160801b0319166001600160801b0392909216919091179055506141a1565b61419e6141878660200151612d6d565b6141948760400151612d6d565b8760600151614cc8565b91505b509193909250565b60006141b68484846132d9565b9050600082806141c257fe5b84860911156133825760001981106141d957600080fd5b6001019392505050565b6040805160609490941b6bffffffffffffffffffffffff1916602080860191909152600293840b60e890811b60348701529290930b90911b60378401528051808403601a018152603a90930181528251928201929092206000908152929052902090565b60608060008361ffff1611614287576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b865167ffffffffffffffff8111801561429f57600080fd5b506040519080825280602002602001820160405280156142c9578160200160208202803683370190505b509150865167ffffffffffffffff811180156142e457600080fd5b5060405190808252806020026020018201604052801561430e578160200160208202803683370190505b50905060005b87518110156143945761433f8a8a8a848151811061432e57fe5b60200260200101518a8a8a8a613389565b84838151811061434b57fe5b6020026020010184848151811061435e57fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050614314565b5097509795505050505050565b8060020b8260020b126143e1576040805162461bcd60e51b8152602060048201526003602482015262544c5560e81b604482015290519081900360640190fd5b620d89e719600283900b1215614424576040805162461bcd60e51b8152602060048201526003602482015262544c4d60e81b604482015290519081900360640190fd5b620d89e8600282900b1315614466576040805162461bcd60e51b815260206004820152600360248201526254554d60e81b604482015290519081900360640190fd5b5050565b6040805160808101825263ffffffff9283168082526000602083018190529282019290925260016060909101819052835463ffffffff1916909117909116600160f81b17909155908190565b60020b600881901d9161010090910790565b60008082116144d657600080fd5b600160801b82106144e957608091821c91015b68010000000000000000821061450157604091821c91015b640100000000821061451557602091821c91015b62010000821061452757601091821c91015b610100821061453857600891821c91015b6010821061454857600491821c91015b6004821061455857600291821c91015b60028210612beb57600101919050565b600080821161457657600080fd5b5060ff6001600160801b0382161561459157607f1901614599565b608082901c91505b67ffffffffffffffff8216156145b257603f19016145ba565b604082901c91505b63ffffffff8216156145cf57601f19016145d7565b602082901c91505b61ffff8216156145ea57600f19016145f2565b601082901c91505b60ff821615614604576007190161460c565b600882901c91505b600f82161561461e5760031901614626565b600482901c91505b60038216156146385760011901614640565b600282901c91505b6001821615612beb5760001901919050565b6000836001600160a01b0316856001600160a01b03161115614672579293925b8161469f5761469a836001600160801b03168686036001600160a01b0316600160601b6132d9565b6146c2565b6146c2836001600160801b03168686036001600160a01b0316600160601b6141a9565b90505b949350505050565b6000836001600160a01b0316856001600160a01b031611156146ed579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b03868603811690871661472957600080fd5b8361475957866001600160a01b031661474c8383896001600160a01b03166132d9565b8161475357fe5b0461477f565b61477f6147708383896001600160a01b03166141a9565b886001600160a01b0316614cf7565b979650505050505050565b600080856001600160a01b0316116147a157600080fd5b6000846001600160801b0316116147b757600080fd5b816147c95761469a8585856001614d02565b6146c28585856001614de3565b600080856001600160a01b0316116147ed57600080fd5b6000846001600160801b03161161480357600080fd5b816148155761469a8585856000614de3565b6146c28585856000614d02565b61482a61564a565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b03161161487e576001614880565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b16816148ab57fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b6148da61564a565b6148e261564a565b888561ffff1661ffff81106148f357fe5b60408051608081018252919092015463ffffffff81168083526401000000008204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061495890899089614ed8565b15614990578663ffffffff16826000015163ffffffff16141561497a57613510565b8161498783898988614822565b91509150613510565b888361ffff168660010161ffff16816149a557fe5b0661ffff1661ffff81106149b557fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909250614a6c57604080516080810182528a5463ffffffff811682526401000000008104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b614a7b88836000015189614ed8565b614ab2576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b614abf8989898887614f9b565b9150915097509795505050505050565b6000614ade60078787876141e3565b60015460025491925090600080600f87900b15614c24576000614aff612c27565b6000805460045492935090918291614b499160089186918591600160a01b810460020b9161ffff600160b81b83048116926001600160801b0390921691600160c81b900416613389565b9092509050614b8360058d8b8d8b8b87898b60007f00000000000000000000000000000000000762d10ef955d55b7d038c7a7231cc61513b565b9450614bba60058c8b8d8b8b87898b60017f00000000000000000000000000000000000762d10ef955d55b7d038c7a7231cc61513b565b93508415614bee57614bee60068d7f00000000000000000000000000000000000000000000000000000000000000c8615325565b8315614c2057614c2060068c7f00000000000000000000000000000000000000000000000000000000000000c8615325565b5050505b600080614c3660058c8c8b8a8a61538b565b9092509050614c47878a8484615437565b600089600f0b1215614c75578315614c6457614c6460058c6155cc565b8215614c7557614c7560058b6155cc565b50505050505095945050505050565b60008082600f0b12614caa57614ca5614ca085858560016146cd565b613291565b6146c5565b614cbd614ca085858560000360006146cd565b600003949350505050565b60008082600f0b12614ce457614ca5614ca08585856001614652565b614cbd614ca08585856000036000614652565b808204910615150190565b60008115614d755760006001600160a01b03841115614d3857614d3384600160601b876001600160801b03166132d9565b614d50565b6001600160801b038516606085901b81614d4e57fe5b045b9050614d6d614d686001600160a01b03881683613e0d565b6155f8565b9150506146c5565b60006001600160a01b03841115614da357614d9e84600160601b876001600160801b03166141a9565b614dba565b614dba606085901b6001600160801b038716614cf7565b905080866001600160a01b031611614dd157600080fd5b6001600160a01b0386160390506146c5565b600082614df15750836146c5565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614e91576001600160a01b03861684810290858281614e3157fe5b041415614e6257818101828110614e6057614e5683896001600160a01b0316836141a9565b93505050506146c5565b505b614e8882614e83878a6001600160a01b03168681614e7c57fe5b0490613e0d565b614cf7565b925050506146c5565b6001600160a01b03861684810290858281614ea857fe5b04148015614eb557508082115b614ebe57600080fd5b808203614e56614d68846001600160a01b038b16846141a9565b60008363ffffffff168363ffffffff1611158015614f0257508363ffffffff168263ffffffff1611155b15614f1e578163ffffffff168363ffffffff1611159050613382565b60008463ffffffff168463ffffffff1611614f46578363ffffffff1664010000000001614f4e565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614f7f578363ffffffff1664010000000001614f87565b8363ffffffff165b64ffffffffff169091111595945050505050565b614fa361564a565b614fab61564a565b60008361ffff168560010161ffff1681614fc157fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff87168281614fee57fe5b0661ffff8110614ffa57fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061506557806001019250614fd9565b898661ffff16826001018161507657fe5b0661ffff811061508257fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906150ed908b908b614ed8565b905080801561510657506151068a8a8760000151614ed8565b15615111575061512e565b8061512157600182039250615128565b8160010193505b50614fd9565b5050509550959350505050565b60028a810b900b600090815260208c90526040812080546001600160801b031682615166828d6135ef565b9050846001600160801b0316816001600160801b031611156151b4576040805162461bcd60e51b81526020600482015260026024820152614c4f60f01b604482015290519081900360640190fd5b6001600160801b03828116159082161581141594501561528a578c60020b8e60020b1361525a57600183018b9055600283018a90556003830180547fffffffffff0000000000000000000000000000000000000000ffffffffffffff166701000000000000006001600160a01b038c16021766ffffffffffffff191666ffffffffffffff60068b900b161763ffffffff60d81b1916600160d81b63ffffffff8a16021790555b6003830180547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b1790555b82546001600160801b0319166001600160801b038216178355856152d35782546152ce906152c990600160801b9004600f90810b810b908f900b6132c3565b613f58565b6152f4565b82546152f4906152c990600160801b9004600f90810b810b908f900b6132a7565b8354600f9190910b6001600160801b03908116600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b8161533457fe5b0760020b1561534257600080fd5b60008061535d8360020b8560020b8161535757fe5b056144b6565b600191820b820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b80820b60009081526020899052604080822088850b850b83529082209193849391929184918291908a900b126153d1575050600182015460028301546153e4565b8360010154880391508360020154870390505b6000808b60020b8b60020b121561540657505060018301546002840154615419565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b6154d65781516001600160801b03166154ce576040805162461bcd60e51b815260206004820152600260248201526104e560f41b604482015290519081900360640190fd5b5080516154e5565b81516154e290866135ef565b90505b60006155098360200151860384600001516001600160801b0316600160801b6132d9565b9050600061552f8460400151860385600001516001600160801b0316600160801b6132d9565b905086600f0b6000146155565787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b03821615158061558457506000816001600160801b0316115b156155c2576003880180546001600160801b031981166001600160801b039182168501821617808216600160801b9182900483168501909216021790555b5050505050505050565b600290810b810b6000908152602092909252604082208281556001810183905590810182905560030155565b806001600160a01b0381168114612beb57600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040805160808101825260008082526020820181905291810182905260608101919091529056fea164736f6c6343000706000a03d17782c4cd36d05cdd223274e6f11f0bae006ace5dc893fe20d6aa29a4a3803903d1bb547bd6b5cbbea0f2fc3cc2aacbc58aabb8ba8656a4edcade9b7cff7bac7d03338a98e9989d7321d955cb2712ef2b05aef2828ed20e037a1ff05acd11b25d440337c09af6df0572cab700d07a6d4e17094409a90a622762065c74960eef6776ff0386de23cebd3b70eac96010c074dc8c528f7cb6c1925e0ef1d06a376f7bd3659a03c14777cc17916270deb514fee8cc463ff65551890a7c9816b5fe4338b703e6c00361066613e1f94d0d4345de64943b0be36fa2c8eeeef30209a965b84963ca8ff8031b54c9f810cd83202cee9ec361facb891cb4cfe6c08b6c1a77417e0852b03bd4033fb46b08ba86d1852f036d8c589578b66658493ecfc0a0784733a2ac2c610b1f037faa4d4eb9f99114a31dad6303c681191f6c2f22156e3d6d62ed421777380e97037d9f1fe27819233f385f571cb1b7f0df12930c9e9116143d509fb1911768c68b00581f02cb626d87046d8f6ee8ce20a08a646569bc433816e3507aa4385bbed101ae4e37e392663b4284210f7cbc6e8fab00581f02ecd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563581f010000010001000000441d0000000000000002642f000ae0305c97f5ccc3480219202000582003045a568ef3306cfd478deedd5ad151bbd143fdaf9abd51ca5c9bc2910cbcd05820ffffffffffffffffffffffffffffffffffabc8aaaa7faa5075e689c651ee00a9005820035fdd5b26e05594ab7f4573059734bc150752e47a50ac3c87b293ff60884b605004622dfafcdc2afb0d7aba966d2fca53005820039b80675edea1c97981c9ebe0973eb1fad5c785805af8052c3296461b55c4d0502cab60911e85c3d6b0eb5e9d0a1f2cd600582003e0745acaf73ddb5cc0b50544b65d05b21296b9f949a5c57f6839ee35cc7c105016a1f203601b8f04f1af74efd612172200582003f394fd8f898c934a91ee099b20c4220642002a802449a005ec6ecd04e1bae04f100157e1f8f82dd92e4f9c64dbe93803273cbc88dd8f6fef719fdcecb81a354c550cdd80fa750b74a202e9dc195346ad005820038ba7a39de05855ed18b20804f6c109c88c4654881536f73b8780815e9680f04fb3b56ab5d750c9877845ce6de3e93c0219766103a2588a2798a643741f7229005c93d8d7e0378887d7e019180f0671fb7b0daa3603efc27a949a5d727ccc7b4c152371d523f333c3e3c6ec41315b359729b8e77c30037b8984fe467633cc7930279b4952931018aeeb2c03335ef388287ad63b67c1ab039651e9a084d45fe30e8cfe4828a82b675176a58c84ae923e4907b00dc6302528039a2f98d9985f887de8fcafe355f0cb4e8c4737c6ab82be4d61e4fbebed3bc74d032917e09a215b532e77e7f11460834bb236c003d85da1d389208718ce58e81e750219ffff03112c019ac03a479740d3190de2e5786bab7fe86d3a87ec7f0cbb7bfdb37386f303e5d3f5040a637aa060111977bbbb22b1cf0c6c051dc4c99d0f56fae02ea3d98400582003fb44e3814ad2f97c355d30510921889d3b51c59bb2c833fe3f1b8834c989a05001e56d003d951e9f4eec6cefcd2c567800582003787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace050687e96f3eda637b1b9355b3d8a3de8e00058200350e533c0869bb8b21a47620a45b5269e041d538307ced18c6907c4112797605005cba62c28a4c1f716c9e25c1654b42a0058200324de1ff205b1e2e88f2a8b50d7d4b26235466bd23a5e71ea522f6579d988905820fffffffffffffffffffffffffffffffffdd0da2dad5a4673eb52547fb9791f12005820033714666fd6ff655a0ecd1548849423e04708014489371bf1d236d94bf6d3004805cd2318edbd14eb00582003434c8f71a411e0406d20ca91402a2f8017a7d300541032b08acf5de524e4e050021fd8d596112d85211cdc49a52addc20058200302d66bd6c59e40f948d57f037f489a5c9593dc8d50d50335be0622b98720805003005e435cce05767f425575c6c2fa8500582003f6a3a292d84b9b790282e53631d17b65405330585aaaf9ec67ad69f3d90f304f681354b920daf8d920149a09a86d0602199ce303a3e2828797e362aecae7f10515a1b12872e9f9e6f3ad68efb08fa9cdbe49461e030e1ac2a40e1773010a5b1dff658b6d0944134c347159a4f0feacd1dc1d46aba603ba036f38146114b9a61e7ab4f3c9a5118109e5045675f3e8fa1c1d68cb015462037fe35171803c405a480f91c7d2d986657c43f5c08467b049b78e378172b7b193030cccba7b57f509c3cb416c1afcae972b474f0da620aa5110725ad4d1ac4ececf03023508b931c7981574fefc7a77e14f29efb8c2fcb0c3816e53eb8f76c5e6291103a1e5e82f80fcaed0cb0ab828114df618fc6f0d62442f9b845935841646c1dc1d035196e7799facc0c78e231475f707c75dfc9b0e1141d7394d438ad30a31ffd98e036b8b867f824c816767e95b09f2a54763af3b807f387530e950806bf7552145b00303db908b36e289ae7b6f0873c7b0191a56a87668a9242ab2f6d12b2d137bcb3f034b47319eda20016069524f90ec904f3f97a4af2102a329d1769bbc8fdc19007b030822662fd4036dc70dfe7695626dbbd73dcbfe2007579afc6884849d3f6a4c7b0359d60a4ebbcf1f1b9aec2693e4208f9c2b9658f7ce07127d8043bc3ab6a547b603f619032baeb8f496342bd6b9eebb4e5a915de1a8e348f629a36c91bf8db0333c036b4d14477a4f27b352754db65610e600f9c0b4c0b71e3d9d793c238795731c370219ffff031bd47238d8bddcf384ad8566ec0d6b0d74b3450592c2a0982a974456a1e8a0f603f55a996c733d89c68ab21720e0e8180edc292b3d0c65c86357e81f64d2d7ddd803d2d47f1512a8f2d838b3d259e12b64d1ba99450d512642991440182c05aabc64037dcc6ca7e612eae155d5501a9f8d2f07c50f226d93b5ccb49eb0ab1cb3a35e160397fc2f4af53cb44f081df2f58de1ac7bdbf4c68b100dc1c9c2e4715b88cd2990030719f2233b134ea32f14094f33d137a8cdfb281384586ed7b28c128c4d6c4b9f03bca80a83dc94e4b907bc490772c462c6d62ff7c8bb3e6b1d42bc754495d2b16403496d83088e932f9f91cda9726e6a5f2e299bf8dc773a35b1603d948c9c5189850326a9ce54fc6c699cb12bec15ea9211e3206fd0a819cf5dc59f505f4353791896033fc4ad7d6497abfbf2ea5fbeae7c34f202ef965582c361ab8716eb9cd7eb6ad80320adaef509459786c17d48fcbaba1f2dce59d3dc9a229225b131db24a9b55d6303d8073b72e0142845326fec7ff529d7caa30389a009e093c4d9d5a5a81fd38b78033f2d7f373352561557d592b1ff25be725a740e079b79d8d8f723a8fb9f83687a031ab5d62d0d4b544adc462aa3d1e8f954d307cb7fc01147f0a2c5e56a6ce0b1b500582003fd805f52096804894e5a07e68210bceeab84539df9acc559aa8373666a25e04f726038fcdd9f9e0ef4408cd3310bdc005820035acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b049aab081aa14a00c686a005820039f5f0aa038d5e8d2a5704c0956593eb3f091c784484a4231b0fe5dd11cc9d05009c27cb3c2f65b10014179fae2db407c00582003e0fcf3cb208b9648f2f8742498b435f3f4cebca69579418d6ae60deaa7f8f05820fffffffffffffffffffffffffffffffffd2c8cb564e4737c9f1dbef942bed4ed0058200324cf913afe092ac0156af50cf4910626db47dc326445733a6776ff81dbe4305820ffffffffffffffffffffffffffffffffffb9659f3c63cc526d27961af312db0c00582003ddad8ca21662bbaf4b9eea3b3c567b39d6a9843ffe60ca8f5c4d27976042a05820fffffffffffffffffffffffffffffffff87f57bc2a0d4ae30fcfc078ecfbff5800582003a35ec2c8f1db4c0403b1102bd8d17267c562b1524f4ccc233a24959eb92a7050046d115139f7a497c793dcac8c6e8c72021924ee03fd84f52b565e0a75c6a32cff6479409a53b94c534a5c7d4570aa66b813566e9603cc4e859bb275929c9b83792e421a885df29b844f9b4c15d73055485d24a6d68d03c3daa779b945c1d000f5a925e3f09a1f115970cc2b6207b7c5758351382c1f60034f6fc5a0b4648cb2f725e4173c9508c41461f5e57d7e4f7cf8642dbd1474ccb10331c2111911e565873a4caaf841a5d9d3018a598b42e21736ef834a42c25f5abc0219ffff03cf06a6af59aac9ba0400b7c54caef60b3190ed01f63f190576e7f6788ad9976403f935fcdc07af3f5d0e74dc89f7dbfee7bb0b30155395dc3da8c7e992d3b8b079037f7010cfc513aeaaa019f6ac35f1e4390536ed6555caf3edbe7b7083e7870e5703f78e594a9e6c6a5c9cc4c450151e7081a898fc9324027b691ea5c5e06f6dcc0103e72db0dc7229be30cbc045f1fa7a2e1ddf45df55df4a7cbbbd9edcda63657af3038495915d832495e8b0423b8d2d88145f5d715105aee06e60aab1b9ef34ac7bf403fae3b6b0d6e1afb318939237aa7d38555b9bb126bbe89ad2878fbbbe91d92db0005820039b48f25d6245f73a6d02c822f16a3b341b9ee27473e32010a6ab0b428d4de048ab214e0f14da828b00582003198ec01d37a5c120bd4fe5160209d9a3fde2c9346fc768866de6f8715cbe105820fffffffffffffffffffffffffffffffff7bbe8d081ace812456729549b18106c030d10d363b46ce6ee11991d012aac6fa446e899f0f752ba93f7d76d084140570a00582003a0f4808f7f0c52440675894727c9e66265266cd1e1f5015f8b745ca2de5f30581c4000801081042502a1f7f99f57fefffbffefdfd73c80441912002a00005820030410f131d8cddc28b24725376dab161b7915d4683b8e007ea2b615f9850ab050020bad51054d791edbfb0f299cf327740219906403cdf49b5d76105b920232c5f6818018d2560318b3bd72b2e3a38ffddd231d31db005820036668a7514ff38d59f59871e4b6fc175cba51a1f1828673e9e8eb9aaf3e98b04f1a417dbc3160ad6995ebccc0eafbb700582003271299ab0ee12c543b81dbd4b4a3a97053fed5361578e4b11f8a19493bc9505820ffffffffffffffffffffffffffffffffddc99551dcbea3e4fcb0e86e5f1b68b803187d867583a70f83f6688bda2c62c139372760fc02d814dc8e84cceea9a8575e00582003778d56331fe985ae74ac425470f1ff1e13fa167a12a9fc4b0fa065ff2ae6605011757dba76046a475379d62c3def4d11005820035351d8672387b37d86550fdfc0070a44a82d0b6515e3e6fbe4e310bdbe37b04f047406d9e371eba09c51786d4a22cd00582003bc9dcfc21b7bdd18f4eaa4700547a41911ad8607abc59ac8a2935e9ee3ef40500b2e68606443fff717db43d196e13d1c005820030fab288735963648f7a27a02d18ffe056a8396518819d2520bf75923272cb04e48458fe5302ca815e9b7dead40f500581f028e06f13e7919f19acf2a388bbba12c34c25c3edb38325e8c24be4ba318a05006f80e36ca6a5280038bf2e001ebac1e00581f02a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3582001000001b000000000000020406a780e664d939858000003b2fd004065cf60270218c00219ccc5032ad796c18ef05ebb09657ff58fd63a4c451a7c3738f81ccb74cb89777a010dc103948d17c4cbfb5da1876891aa354068d2b2c08803719112bfb8163af00314a7f803413c6b4ce2b493b2250be11e00e7e71807d9b9be73cdd5207ec50634f4eb5991036dafe2c70d779072cc0727d2559c2d7e8b4ea11d52c6e938811e3530d2f7dd9a032e887a24ceca763b439e0ad3e3d6fd2e4b3660acb9e767582369450dfb2ae7f903b0dc4fc9641c999040d29cab56f176b2bcbff1ffe4e486c1518d2722f5198a2e033e6ca7e7cd045ed42b561775aebdcf4267e70991ade486514379a7b7840df7350372c145bebab08c9d89fa49b563aaf715acf9dc0d9e341c1cadf281ad0e22eb62038a6424a48cd52e972e39c994a54d493a69b93a8f7b9d276168d9e521d2f85a58035fe7fd0775b8f8b2f17239e86670fdb0f55714a3f0d7a5b69c123c6df38ca001035d9b3e20327c516ec9381d93ead23870134a1f421f694c991d1f2ce955a7c7df03923193e139a98d3ca0b7997e2777cfe77d67b1d7c6c224e7e912d94dac5155520219ffff0219ffff05581e03c63a2b39d3291db69424bed53d4edb18e94c1ba6115e52cfe72b31f2d0070119567e031b460c826a854d61dca82f718e088b8b4c4082ffeb93752d7691bc62c51dc0280605581e039eb67ea0b38e576078f35745444edb6b6e3e019574e1d2e56b0390fa5007011bffffffffffffffff031d93f60f105899172f7255c030301c3af4564edd4a48577dbdc448aec7ddb0ac0605581e03ccc849355732a0e83ed860e8e920243a9d3ae3e7cdca85673da010c20007011bffffffffffffffff03f2bf302610e990e0039b8b855a5f692932a2a20c6651cc866a1daee56ccbd57d031b460c826a854d61dca82f718e088b8b4c4082ffeb93752d7691bc62c51dc0280605581e037bc189fdf2ef1af5046626b500dce9595590ead4c1076f50d33880adc007011bffffffffffffffff05581e03bf7c22281b5791656fa5dbdc49952c0913dfb009497ad9512ebf4ca2c00c1841471e8e6c4337658d05581e03073bc5ec910e0655b4f432c018ac43cab6cdad628de03eff36f961cde0040102198ec703fe71f6f923c7be6dae9f9d758b69d418ffa1b1377dad2c97ed67c30cd585560c03794ae0c876dacd580e09bb89fdfff9d6d2c2568a3ba3c3d3af6a7e6368c2a3b503a46f94d8422db47f7ba34ade932ea9183ac91f09da501eb965f977b49247146b031c2eeb76b3262bbb0da3cf65cbe9ad22629bb1e32d3f43c6a825300a9155d0e403fcf6008b49a07304e20f4c40d5b0053b8f55a5a113755484fdb8ca5503de8c4a03d6328c614b778654039fa290b4a639307affee8cee4febaccf402920238e2ddd03a481c6eed67d93cc9ba1f3d5047150ea1fd5607fa5473e5eea507d297d3d014a0219ffff03977dc21575479ec24f0498941309561b4211e2548ca4fd6f9ef4864c4f2b99d9033536226bcdb1ef0b4af07084d7b56dfd5e9446fdafbaec7f9869b0674bc0f12a030f18d7c6021382a8d5680fec483b86ee0a1a52444b0c1c00d38f3a8e3fa8b5ee03da1b86ac746e92a6630199116a1482362feb638dbecde99d0ed9b347a3056455031e48c3afbbc5fd1bbfed53563580122c757d9575008fe5efcc4180dfd23c2d2d03b306993e2937c87061b1657d0450ebb66563558e52364b60ffc57593bc48f1f803b8235ff301f6d2dd225fd7019d99d8c71cba1ca725fcfb2b0dc1c5b87c13deec03a28e060988ec47791d2867be167b6f1b69cd5e9d36e073a97a137aa70f0be52503cab803cb75245ba30dce44660d29e707dbdd2009fd313a205358acec342339790396e8ab3c4a77e852f1a070e88de49b736105f02654fb4cc929b76bf11a5d5e670394b182ac301057c49d7dbd072513443ce8ad770ffc4da0a2e67bf1178056d81b0219ffff031dc4ad382a0820474944ecfa57c09d28959aff2c9fe5c6a5b49ebee6f0f1efc7037a67147e1c00ed66c4d1559bae7f02b52f17c7bf41c3c60dbdb1bcb2d39ee5c003d76cad2198d33449990f7477a7492b420bba303bbd871d8e0d4dd5bbea364b7c031c3f9bf2b1cdf9be6124abc2bb1269c25142149dab3ec6b0e9a5897fd67ecac503a0c63d0b3dac49820d4c32d10871dff681d650916d63b5e635c8cec332fb0bd703d25d4ecbe9bc37338b68d39b42418132b99fd3b75c152aa1028861c556c616f90360507ccea9f4d3d41db19c6735cf671dcb95e9bd06babf4937a73f06f9b5b82f038630b0eb1ebb36bbea2cc4342975e087412f7a1b0ecc2abdd8667b93d7d5e33703c734819e0b99baa3e1a0cc561c3a712fd5998956e669869eb84747da9af1cfa70371af6fbb0dc265ebb2c426a93ce71083623d58f72bb01677dc5f3c090f58a1d90219ffff0311685a7370180524cb1df19157a555234792aa4cd7f8640a96bae6ca1ab6070d032bf840fa28d97c3d2c11f351334dd3b1d1e006e27098513cc82df0e95e8162e503f795215251d3961912625390ef0931881a93b79ef83dd76ac120dfb570c7e3b803c7c5553ffb7def0babee9bd6e908ef8a5b0bdec17323c5170cd151ffc208476303b6a88dd2e04093960b267fc15ec2bc7c7098949ebfc5e89aa3379f9e653674c803cfa7e4e5628410de9ded9a94a3bfc0efa92364a66c45364346572ad17e76c14c031224eabf1041a6876d5b159d7bb859849b147e7ce2df27c3cb2b556007f54cfa0219ffff03364b6559c7690ea7a691588295f4f746a03791a95d929abf056a905e62cba94b031767f87c1747bc72bf20749d1630b4d8a6a3f3ec2c5efb0397c8d2b1882f2b9f033640ec5bfd1d31b099f28bf24ee00207681696bb5b5f1686c38d6f51d9c60f2103833873354ef23e5031de39206fd93c894f41e492be5abdc5b50d875b146f94be0368eeeb37450f0ab1647ea98248e195454722ad72924ae1702b76c2e665488e7c034b2504d65afe59cf239935f20ff0cc4d21238e98d56ed8e62ecb23bd9a98d82703b099bb79c2d8139ba62553f8d15b9b91d82dcf44cb9eb0463b1834154ac7cd91039333459f6ef0e57274cb85160033e40afe10fe12e0debeb996e2f2152c755a3e03a54acdca2baf6d193f4d2cdf0e3b1dec7481b7cae3827400d569fab81b236902032dfa9d212b30d11c5f0fe283ea6bb1f96a6ff17c8285094579b3dafc73c19d9303a6e20dad8ee3ac1e603fd82adf0ddf1cb46543a3abcd4e15d9d1b3bb60fd694503579461dc80c5bdd7be4240d7bec05a9118bb71ebdb48b65f41ce800aac27c95503d380579902d6b06bd5a41c9b54bf02048fa108f947d33ac139920c967ec1f0a003a788fdd42968f19b864304838a0be2392a57e18797fbf53a45e51cd417cbe50403b1c82d8c79fd1fae374f7a0253bbce1e08781d1e052f6e1b5258a6999b78e48703ae6e8ae8f84895ecf8923ba1e17a11ede67a0d32c197559b84ce80da1287696903e12082db6e1d9cf3b96e752ea4d505d02338da98d4f410d0cf582fc1f5804d41032002b0b0c2875cbde643ca757693fbaab3824fbd77be1d06e30422b55d031fd103043d0abceb8917e06bac76c366bd55330b2ea4702a9b7f11a73a14d93f2002bb03f797e1b101c4362da9a1b995a34bb4025a1c01bbe55811ed72f9bff2b4c7b4e203f8a3867cf1a6407d98075813b8b6504529dedc2bb0de505153c63f8b302199480316dcc2557c0182f5e5404e880e6c992fa4507896661fa7c541b5ba5b39dd795603de80770a5f69882a420b750e8b8f1ee042d1a71592173a1652bea7327f5d4f2a03d0a0fa4fea3a3b3c5c75aa7850bd3ed496680c327cb1db823d80bd0e42759df50328a148496cccaa374b36e98e88fb5c43e7c0b9ee5b0c7ab5bf6513352ea369e003ebc919b2b16e61d5022bc8502cc057fdf904d86d1312e6ac7dea952855d2c28103c612830f92e60b444d863bf182dba243d9061a2e374ddeba6b967b2cde1ae64d05581e0354746d6a091df4f940a2b869ce99873412140bf1ab5f16dae3b9a5f8900c0247016d70140db4f005581e03d7b4a7cba46d7b5224a93107596bb581653437eef3ef3d56a3c63231100c18394705216b6d7811ee05581e03ef25d3ec4c58ee05f86e4a201af1c17b5872aa69753b5d8fd07e499cd00c01471fd0bb9557655005581e039c5fe0cea5a718c6ac75f30d923843dbbdc140b5f06b6b36de9eaf2410040105581e032569341a494cb9aed9e2db5ce56a022162d0bf4206eef5336c9868ef200c19212a4826d09457b5a35a1305581e03cabe03eed53acf52ce1dc5ba8dfb1cd4fd167db22130bb4e40260f8b300402037cd4f0e9b8cf24b193c82a5b57e2d4b6dc215ba7e1a9a99c02dc35322045360c05581e035d63d992a0085927b0496407f5229bddb79b8dbd20d5fa6df29284b620040405581e03fe3a78cc7ae3c777f68a7c7dd74df344c5fc4952438796029602f33460040105581e0302c3738e36db439ba782af9948ed23f65d580ea8a7f27b424be874c4a0040103476ce0e26df74c8ebad1ab70192f5370e100e91d4e7f6416d50fadd12210723f05581e03f4cf097ad987ae738f3fd87a06b8b7de34b60cca553357313fc8a340700c03466cfe6d0f398d02197b7d039df44fa133f95e83bf4a90bc231aa2384cc41e6b1ff26ff6176e1097d9fd263b0345a5164166d7ca748add83d08a1a4a275e2056c3bef82d07a477ec061d1e040903bad73c92171efac5a520e4b51d7f012bfca64170d6437a3b7472dc63c5ecdee903ecb7f681173349607dfc4f08cce57a4d78cd9f2132ad791a6632ffd4d0efbda60357c7b3e63e9311d7d564e98ba06f83c8d9e9a3764fcc66d30ac569f53bb125bb0336549a7d84b0cca3ea5fe0b786ec3f3cfdc31fe165c9b0640d506caceff3ddda039205c02f90636159c69417e236e213d720a9b993773601fc942a8c8b475a01a8034572550d3f6d1de6860cfd6f02b053c38265704f31bf0566a2467026dcfd8d8c03fb1feec02a7335d3d61800d5532c0fe16ac80d50313a572e32162c78b05acbe00318738d58dff4671d2513a6302d83e20e10cdaf9809261294471b6152b3af023703a3bb603b0685f06e5cd93241339ea86446a92f12019e9949849f1e1928e268f90314f965c748ddfe77998987b77d51593ad96f1cdb6efad907f6a87f1d6f6a1eac03b9ddf8d13b6701c3a0867cae25e04379e96abc55b46e8ad785d5183fe20c20ae0219ffff037be1a9fb687073d612cbe33712871c72def307b689961c7c9bedf18304513a8003ee2b78cb8249a0d4d3055d50fd4eda167eacf9b722628851275e4a61a9efab1b0379db70d0e387d4338503a930c2f3efab6abfe7b1361c3b3504cc4eaf51cbf7610343d34c8c4c4be5723ccd42f61aa9e21339e1d27d0d6c2f76f99394e6a0de72320219ffff038e4f84f6195cc1938876df332e852970ea245127c2e363336da5f9b6a7221f5f0338a6da18e54a7c8cbd7f28dc1e96e6f0e705d0f009eafee982702834c9a3672803e18e5a68ff8c052e14b65ff4cdfc70febafc37246d52c47ea0775b211bc1ac4303a7e8d3c1a03b8b4878b6561de6719acaf9059e0359a7790dce2205d2caa3c83403e37545af314b26ebc1749eefbaa44d553dc183a83c712a06f914e6a0e0a0338e03d2296853913d9824987ebd935db84ce8f41f9ef8b1a78ce7daebafb0a79e296c033a225fa4377ad3d9fb72a61ba1f8c2efd4a2b7d82d469eccdd921047d9dff4030219ffff039777e7d98e1a15a70eb2a1b3c9ee58157c2fdf6e7f009bed4560ca8b11999d8603ab405f879c7e8c28154307d99dc11211264511d6d8c499452fbf477531e4c6de0352325782268b2e879f0ebfb29978df9d64e9f2fee1c3858beed953dee806b666031376ed85e106a7585758f2a7b8f1fc57a6250d8cc05c2b9df7ead9edd2f5b9fb03153dd4a6cb1d67f24e7dae95baa2cd1bf832304b43f7e003647ff365231ee0cc031281da51c1347c69f936229528efb15b1e3f386af7dca5a622d6034917d2543103226bf9a5ff46025a636a99ec1c07c68b3c4ea6e982c2d64fad53197588662486038c420da56d0edf7a84d928d828379e77a9a61d5c9aa22a5fcf9685a82c2bc717037bc4349b8fe5674c2f77ab8cf787da1b544af7dad7c7100a75e2fcacb4d8b0ab03e1a91d6327a510c419bb9eb480a7603f051ff356dcc7370e0700150056d2226f03d402e585d9d671310e9b66c5327f9fcb63c342ae4a5d104c175c933c2f4aa02003fc3922b7dfa2b5a649b771c922df839df68a712bee8806cfefbd14f5952bc358033d2ac8255991c176e9b0aab3c83507a3ecaf083c2e46f26ed04ed98b19787423033e3284ce8ce1108f7cf14b8cee7e235c514b1981dbe6171546585ec7a67d3873034d967638893a1a112568f517f41f15df732a81e1a27815b3c96345c1339240c803b91a1e9482cdca8caff7708ea722ac02cc69675d7cd91e7bd9759f6865a511df05581e035e10ff5e818b9387c9db668b17580ebad2ce2ae40b04a6fa2b318e8e60040105581e0362738fb5147d892c08b0d65b02ff8c3bf028b09c157d98fc6d1a31dff004010328635b9b2ad0413203f351ce87de544b80858f67181e10f894b7eee66f296b71031d93f60f105899172f7255c030301c3af4564edd4a48577dbdc448aec7ddb0ac0605581e03acbb55262039bdb50143383dc5c2c9018815bccf85e42c859557fdd46007011bffffffffffffffff05581e034ed7e7b9290e2366a749c2a65fef417dca73889ce344f53f504a74e5900c01421400036215a63275c53615160db0395ca2e5919c1739a4f0d57e7e64ab3a3dd741b58b05581e03895c3319e9c6c03ae3146c40240ffd65ba105d40f09d1da211efc46e50040205581e036b55ecd060a1b87fff27d57ab897e969059e096cc1a69ffe500d58d260040305581d02fff4f457f33dec751c06c3bad17bd28bbeb00499198355f345d4203c0849152de40539242f9e7e0338ac76c6b894b21842674517d8e9f72ab3926490a188f091e2a96084cd5dac4103bfa6f85242f2d9dd359c732732b53a9b0a9dd82bae0397b59b4120453134ada905581d022ec333acf02cbcdf3d719776a20a66883537123429184eb29f685fbc07011bffffffffffffffff02183005581e031c8ac17bd18c0ac59cd803c7bf2e9819307235169f2503ade3dda4e1c00c01471dde3a765ec20002197f92036ffc24be38d4a7cddefe7b00c6adbc83d818f5125ffc2fb697dda7b7564ff04e03cb50aa8845608636596143b3f6bd78dc603064fa95bcd36aca250673a0ab3373036a4d3d4739cfccd1f95405a2928a565bade9f964f642f4ae051949d6dcf89f6403ad15af9ef2228169ed5e56c37b50ad96b49e845177f5b4d010ff9173807f401103b1815d03175990d53d3bb54a390645a08545ce2ac83213327ff2e7843b49748e0365f047ded3ce3c5e811a51d708037aa9d7ff214ee714898d79664f23e8e67a6b036288f1e2b8c4edc28a00562e8596d9fd8a501d0001cad5303b370470db47f832036ae5ca5112cae34e8eb7dadd64bdd02a6dfd5b3e570618d78ab898552e98413b039c67d015188a13ab81cbc92ef694739f697a78d45e2942186e8726682b876a050316023d1bde4ef10f10d04cb3ab15510446dfc94ffea24f8261fd26513aa7727c035e829f145141b06124f4f46462ccabc8a9fdb1f7855e3a1e346bdfb08f87679503ccfac1f8355676751ff85cbe6ae1703fc2ca4cfcc33a80e466182dd55c3bc01d035327d9a3b8eb6cfdbe26a4c2c78597488139a5386b440be951bb636dfa93d74303c25cfdad9b35441134741eb8aba198ede579324c14da9b8432c30ea9f75caf1903ebdca6964c9d382504be3f2d4aa27104c26dee5f09dbd6fe9e857d62a11b670e0219ffff03b538060ce209273b322661ec5ca2e0b3ceca19678486272438189716899c4ffa03f2ba31e6d6fc83904c4039060bfad864e5034e2729c9c032e37b10e116ef21d9039b756b32a4ff2de285080994c8ce20ef4f8b422fe53686999b9638e42b071fd903c2517c71395213d9757444b81f62f9d648fee471315625a7b71087030fb606940386e87a2ca1342c617712768367f896e17a7dc1f46a66a3028467d6cb0367307803c027d634174a616d51f531d7120d77307ff15d8dfb3858ba6f1c124d06cecc350219ffff0304974c24f184cc3ac6b5c213ae5f2b4e920cb1afbbeb8d56a46505b9ff044ef70330ae87fcd4abd16cbc379495e479111a156c46abb3e53fb973d08fd82088f37203e494c982b7ccae6500cca80e6f09d4f96a5c714baf8e838ff251c099f09fb4fb037cba6bd53998591ad52a21d1bb7219878ad777e6eb2376c357548acb62d0b412039df6eb33d7b1ddd3ecd6a64b6007b5c906f4c6fcef21f6285365b47ace73fe95035a1963c24fcb5a6bc49c50c7743aec2cf59bbf129963040b6f5d3203d00929b3034cfa5eedfac55af9ac406824e5cc6846b0dcb9b62d93336a54c2f6e2bbcf74c003931de92f69c5ed20cba72e577cab4485ae3279432221110236182e4881662d7b03de9256ae3deda6eca5a956c62ec0cde32baf832b3d3622c68568dfe9f361e54803809399dc7754323ad003dab6d6e9c64683de650ace53e5e1c25479e386db6bd703788ad1f6248924a8a45ce462d7507254bcccd3776c96f9ab4d76b34c0294e372030295e531f41304acba79464ae6360ffe5f9af4ac502728c9f0f4fb8e535bb5cf03b8ff8dc28758b91e4df6c0f4b698a090d085ba8f692f4a901a52be54a5ee8d9b03cd062f1e61d91a810f358d89f6f5451e22252f9d9725c8876a33e5ee6dd635c80219ffff03396ac8dfd43ca5d01413bc6f8df65025133f0c01dbd7a0d8a704e089d3a0d2c303e23134108131d7cb0f65f56ab836262fab3c87b6e7cb2d438985093fb9b1aed80219ffff03179d8b1563fa8a5680d0b6c97e173fccb267e66dbc63188f30b42f60d81d02bb035ecb9a9cd095d029e5005fc4c0eea8864c2877668942633a372947380d493255033fa36fc5639c13f1dc4a7a16fb09fd92db8fc4db3f457a2a473a4dbc4735e0de037a5d9023ac6e87ebdad673236f3566589d793577e789b042da2ed5cf83b6581203d20c2d9b5b87923d7fdcf6e244a679a7379272bdab59f43cd173538102253d3a033db8efc8c221fe1f24bca291900adef5d9b32346261bfa1769eea16da75d28b0032640b075d2b6c362828fbf9559d61151e84d2e05dde525cba9cdc7f9aede24ba030011f9dd04d04658217da6f1caf48df20559f5e0b64978a309bd66c62fd258f303ab3ad083e63a3a4af637e0b2f300120071339a46a093fb2af292338e0fccedc003a87f12207f8030b45d1c78b17d2d9a449ee2cc54d1189794ac8797ebdce8a2b50337d5f260ca675994a7f39492b6a62c9ee685e2c7c2dee1f326657bed34d039e2032ad03a5db7b1aa15164a1044c75059f51d79f8b83b7a591e9a8e604e9257d6ff037b952ad125c30efeb0990ec3e9bc65ae6f0eb422490d45d5fc4092d36a967ded03ee5641774d1aa19c0945643c8e828c1063c658cb214e71bdb0d5336d65774d13032fc920942582fe8200b5228d4968f835799c5824659abb316bbb9ea91a066cc003609bfd3984a82f25c2f4faac561f101a4a46ba4b8500e1b5f280c5c2281abc55035fbb8896e284b6215e15e66d7e8ad6d54f4210a7deb2a8a8ac62be969cb017570321b42fc3e00d3c6a7829e0bf6b7016347ee78ec9d7369f7049d4f1d8251c06810303b303ec83ef8a1cbb53c3f9f74c73fbf62405b70a9149b01cb15ecf6a9045f1038509ff8dac14e41b233e39fc3c0736657e20183c42f7744891c06abd8f0652190372276fe284394b92af71a521c89d95949582153046e0be2717fe63d1b27bb8f903be0091b83cce2b6d8d0bc358025ca6a0e07f426205e662490786da5a95ec32cc03d93234ed3a82b09d3cbafa02562b56faa216e786701ebcc09cbdf959bd8a467403b54f1b4131fc4f441424069d2e0cca3321755b5ad1faea1eec21f277541f3ab2034a5d87d6c9ffe713516b77770d4073b02ad7f206f5c426ff93fc9690c54968e603c70a8010104e670988536f7e591355ee3bbb074cd33e5edef03c2c59fd353bdc039580312c4e71785e78736943d44242b373ecacb33ee03677dfeb1bc4fd63006903dee5e17a9d94b4adec65d4c445f8603acfbd99ad4aa9ae8eddfc86144abe979203c484df6afe59c7ea1d3377964d84f771355b1d3301472a1b97044d479f620fb005581e03bd37fd152ca264eb62ca42c9762fe745c21220c74b28a045255cf6d5b00c014709faa779c79000045955b760806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d97565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612105565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b5080359060208101359060400135612525565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612532565b34801561096057600080fd5b50610969612671565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612695565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356126a2565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612882565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612d65565b348015610b3157600080fd5b5061096961306f565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613093945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356130c0565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613218565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356133a7565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356136d3565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b610e86897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a612d65565b9093509150610e96898685613b22565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613cff565b50965096945050505050565b6000610f44848484613e3c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6111207f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140c6565b8560008151811061124a57fe5b60200260200101516141b1565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614381915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613cff565b509695505050505050565b60606113917f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8484614608565b90505b92915050565b60008060006113ca7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8f8f6140c6565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612d65565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6115a87f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61183d7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154986027913960400191505060405180910390fd5b6000806118fa7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26140c6565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d6126a2565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f89896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6141b1565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d6020811015611bf057600080fd5b50516040805160208881028281018201909352888252929350611c32929091899189918291850190849080828437600092019190915250889250614796915050565b86611d368288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b50519063ffffffff614b2916565b1015611d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b5050505050505050565b8042811015611e0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e6c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611f1b85856000818110611a7e57fe5b611f59858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614796915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a0823191602480820192602092909190829003018186803b158015611fe957600080fd5b505afa158015611ffd573d6000803e3d6000fd5b505050506040513d602081101561201357600080fd5b5051905086811015612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050611d8d8482613cff565b6060814281101561217757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16868660008181106121bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6122b87f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f34888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f6092505050565b915086826001845103815181106122cb57fe5b6020026020010151101561232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615508602b913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061237357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61242c7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f89896000818110611acd57fe5b8460008151811061243957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b50516124dc57fe5b61251b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b5095945050505050565b6000610f44848484614b9b565b606081428110156125a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6126027f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150868260008151811061261257fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154986027913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000610f44848484614cbf565b6000814281101561271457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b612743887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28989893089612d65565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519194506127ed92508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051613b22565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506113598483613cff565b80428110156128f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168585600081811061293657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612ac87f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f89896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b505050506040513d6020811015612b5c57600080fd5b5051612b6457fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b9457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6020811015612c5757600080fd5b50516040805160208981028281018201909352898252929350612c999290918a918a918291850190849080828437600092019190915250899250614796915050565b87611d368289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612ccc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b6000808242811015612dd857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6000612e057f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8c8c6140c6565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e8657600080fd5b505af1158015612e9a573d6000803e3d6000fd5b505050506040513d6020811015612eb057600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6040811015612f4d57600080fd5b50805160209091015190925090506000612f678e8e614d9f565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612fa4578183612fa7565b82825b90975095508a871015613005576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154bf6026913960400191505060405180910390fd5b8986101561305e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154256026913960400191505060405180910390fd5b505050505097509795505050505050565b7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b60606113917f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8484613f60565b60008060006131107f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26140c6565b905060008761311f578c613141565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156131dd57600080fd5b505af11580156131f1573d6000803e3d6000fd5b505050506132038e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561328d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61329b8c8c8c8c8c8c614ef2565b909450925060006132cd7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8e8e6140c6565b90506132db8d3383886141b1565b6132e78c3383876141b1565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050506040513d602081101561339057600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561341c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61344a8a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c614ef2565b9094509250600061349c7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26140c6565b90506134aa8b3383886141b1565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561351257600080fd5b505af1158015613526573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d60208110156135fc57600080fd5b505161360457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b50519250348410156136c5576136c533853403613cff565b505096509650969350505050565b6060814281101561374557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168686600081811061378957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461382857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6138867f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061460892505050565b9150348260008151811061389657fe5b602002602001015111156138f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154986027913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061393e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139f77f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f89896000818110611acd57fe5b84600081518110613a0457fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6020811015613a9f57600080fd5b5051613aa757fe5b613ae682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614381915050565b81600081518110613af357fe5b602002602001015134111561251b5761251b3383600081518110613b1357fe5b60200260200101513403613cff565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613bf857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613bbb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5091509150818015613c8d575080511580613c8d5750808060200190516020811015613c8a57600080fd5b50515b613cf857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613d7657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613d39565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613dd8576040519150601f19603f3d011682016040523d82523d6000602084013e613ddd565b606091505b5050905080613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154e56023913960400191505060405180910390fd5b505050565b6000808411613e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615557602b913960400191505060405180910390fd5b600083118015613ea65750600082115b613efb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061544b6028913960400191505060405180910390fd5b6000613f0f856103e563ffffffff6151f316565b90506000613f23828563ffffffff6151f316565b90506000613f4983613f3d886103e863ffffffff6151f316565b9063ffffffff61527916565b9050808281613f5457fe5b04979650505050505050565b6060600282511015613fd357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613feb57600080fd5b50604051908082528060200260200182016040528015614015578160200160208202803683370190505b509050828160008151811061402657fe5b60200260200101818152505060005b60018351038110156140be576000806140788786858151811061405457fe5b602002602001015187866001018151811061406b57fe5b60200260200101516152eb565b9150915061409a84848151811061408b57fe5b60200260200101518383613e3c565b8484600101815181106140a957fe5b60209081029190910101525050600101614035565b509392505050565b60008060006140d58585614d9f565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061428f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614252565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142f1576040519150601f19603f3d011682016040523d82523d6000602084013e6142f6565b606091505b5091509150818015614324575080511580614324575080806020019051602081101561432157600080fd5b50515b614379576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806155336024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156146025760008084838151811061439f57fe5b60200260200101518584600101815181106143b657fe5b60200260200101519150915060006143ce8383614d9f565b50905060008785600101815181106143e257fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461442a5782600061442e565b6000835b91509150600060028a510388106144455788614486565b6144867f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f878c8b6002018151811061447957fe5b60200260200101516140c6565b90506144b37f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f88886140c6565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156144fd576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614588578181015183820152602001614570565b50505050905090810190601f1680156145b55780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156145d757600080fd5b505af11580156145eb573d6000803e3d6000fd5b505060019099019850614384975050505050505050565b50505050565b606060028251101561467b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561469357600080fd5b506040519080825280602002602001820160405280156146bd578160200160208202803683370190505b50905082816001835103815181106146d157fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156140be576000806147318786600186038151811061471d57fe5b602002602001015187868151811061406b57fe5b9150915061475384848151811061474457fe5b60200260200101518383614b9b565b84600185038151811061476257fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614701565b60005b6001835103811015613e37576000808483815181106147b457fe5b60200260200101518584600101815181106147cb57fe5b60200260200101519150915060006147e38383614d9f565b50905060006148137f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f85856140c6565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561486157600080fd5b505afa158015614875573d6000803e3d6000fd5b505050506040513d606081101561488b57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146148d55782846148d8565b83835b9150915061495d828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b955061496a868383613e3c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146149ae578260006149b2565b6000835b91509150600060028c51038a106149c9578a6149fd565b6149fd7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f898e8d6002018151811061447957fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614aad578181015183820152602001614a95565b50505050905090810190601f168015614ada5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614afc57600080fd5b505af1158015614b10573d6000803e3d6000fd5b50506001909b019a506147999950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806153d4602c913960400191505060405180910390fd5b600083118015614c055750600082115b614c5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061544b6028913960400191505060405180910390fd5b6000614c7e6103e8614c72868863ffffffff6151f316565b9063ffffffff6151f316565b90506000614c986103e5614c72868963ffffffff614b2916565b9050614cb56001828481614ca857fe5b049063ffffffff61527916565b9695505050505050565b6000808411614d19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154736025913960400191505060405180910390fd5b600083118015614d295750600082115b614d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061544b6028913960400191505060405180910390fd5b82614d8f858463ffffffff6151f316565b81614d9657fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614e27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154006025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614e61578284614e64565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614eeb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9092169163e6a4390591604480820192602092909190829003018186803b158015614f9257600080fd5b505afa158015614fa6573d6000803e3d6000fd5b505050506040513d6020811015614fbc57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156150a257604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9092169163c9c65396916044808201926020929091908290030181600087803b15801561507557600080fd5b505af1158015615089573d6000803e3d6000fd5b505050506040513d602081101561509f57600080fd5b50505b6000806150d07f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f8b8b6152eb565b915091508160001480156150e2575080155b156150f2578793508692506151e6565b60006150ff898484614cbf565b905087811161516c5785811015615161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154256026913960400191505060405180910390fd5b8894509250826151e4565b6000615179898486614cbf565b90508981111561518557fe5b878110156151de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154bf6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061520e5750508082028282828161520b57fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006152fa8585614d9f565b50905060008061530b8888886140c6565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561535057600080fd5b505afa158015615364573d6000803e3d6000fd5b505050506040513d606081101561537a57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146153c15780826153c4565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a26469706673582212206dd6e03c4b2c0a8e55214926227ae9e2d6f9fec2ce74a6446d615afa355c84f364736f6c634300060600330605581d02a7e8b8234a7992da2173c0d9eb404853fe85a65a0881149522e12b2a0f014758d15e176280001955b705581d024ace4a9cf9849185c4b4cd9d2d43e5360f36d915f743ac51fcc9c7f80c02450135f1b4000219042005581e03dc8fc5260164a847b23d38a881b05ec9e601d397d1188021168d7c0da00c024701923a550aa0c803fe15c6a27562a27ae904cb1b828dd828705d1507183fdaa98bcdd0bb1025ee5305581e03f23857a9fa3d0da9ae7310c160afcf49158a232640406bae60c29650500c01472296500eeb160005581e037f46e0bb2789267d0a30b8d43a6d3e2a2e289f0fcb20ea1bc8ee7216a00c024744d7c56d940be603da1a91bd88ab16e57730db064e35880953edf7a3e2f40ec22e887166b95f4b18032be8a5093959bbacdaa2d02b061939a3a07681b5a5351eef8de8b286f8df80ba0399cc8746fb4acef4aa25ad53d2d12e8af29520040e86729cf0fe867839a233a005581e031d2088553eaa5823aa330be942a76137ea4d7416fda40c5c72917239f00c0147028114c7f49fc0034277b3bbc296a60f66b308aceaf2f9ad4e766e1984e39f2bb1256df0c51448a70219cbde03821c17b99606f4ef0404c1e66f9b5847282857f6d43c1d1e2282e3e20358c1a203db467c50e815cada5a92eff2a2eacd9ea814c7a9ef7e9360b114df767836e0da03454a7715e43a8f5665f3175574c0f374cd68bdd08d8d39beda757efe065a1d01031b6cddd0884a393f6d5bcfee003d6dc52eca04e3674b628c1218c9df32da11c00319e2bf440d2b4f680aaafa688da47d7a6bb06838e97a74e1417448325e4dc2160353551a267211a18f437178d0c23472dbe9821cf53390b4846f5824c4479362ee03bd0a711bff7996b670c2882e6431d8feede57819c03c580eaa092d1a8f5351940380cbe31fb0e2a43ba18c77d189091732df11cdeae4b9271100d3c69cdaf18eb40219ffff03b903cc550db702ad3a61ba3345dc7be08f65f036ca37eb75de4257af49f2a5b50310081833d47de439dc5ca64722ddbe5b89d19154c69209fc433bc3f9be784edf0219ffff03574964b9c2c92f0c167e483ad13048a696603f618fe6161ff49526562d063c0b0398d864f93383e440938855e216914a7657f791096683dc5e1a95247526b21b7c030aa0afd682a694188ba1e959debc39df4164c06fb62c972b1efc58a37e5e34f30355696aeaa907d644a62566418115cff57fdbe7ea48ac28e27f4869a444b1dbe7036175a74384427131cd1f76af4f6acbaf7394eaf522902cc13990da252fce6c8c0309968c0b60d1a2dbc7fb50a199f6b0429722075e6b0899f82013e64c4990cf780367ea5b99fc8b8a0bc5441573d9f1e554e9ca7c73adbd4a0da858b344f296e887039bb8ef7a73bff7718ddfeec785fb40a054c0f139e1b4c27f9e005be644e7ae2503bb48e7ccccf38660763a13aee09fb1204a1d92f7eb889acd039aa2c639980e49031d0bc64efa9a6be7279538de3feb0257ccc453be6dc0bec1c82b6d02a71be63f03d1411b2200827453b7ecda10c407e4c2c75923be1eff4b5e2228c1a86027edbd0219ffff030c1697859a1f4f97a4a721f5db02c8071bb9db7ad42cfde08cf094475c85612b03497e80dbb9deb11a709e2012232d0d7be9790369fc329796a5a59b1884918c68039f3db4a2d6621cda2c5d7e47febac283f043f4c0050ce4de6e89c13e4f5a5b54036f6ad3356f4cabefd72b78e447397678dcac34b0372490dc9221ff9e4a99b8540302984fb9591a0315eab425106659d397b387d8b60cd55acb8c12d79c56aa095e03f4b9f2b1fd6f197d24401fc0cc88c43c80852e52262958dc28dd6baf71c5d5b60344316f26f6f472f93d4e822166523fa45b86896bdd678adebbce04734a9d458703c786754dfe02834ef85e4e92c4e1d8d8544c46577c2f635542f68713d591757e03f7fe46ee0cc93b9bbc66dafc8b1f953c5ce3b9ad93da258f962aa09cdc2c500b03dae4f6257c9870f274c2266fc3378b1335876eaf8c33d10a25a77918ba5e454b0219ffff03d56fdb0840a81c81618896f260607fd182de84071cf2c9c8a2e735b96020bff6031da5779b3491195e5b9bb6e453b2ae41e6335528aecbd9b2fe471334208aec260399b64342fb9a5620bfe08d6489b86a459469230ea6080730e64eb3fcad2381f60367f82a624ee855d72b7b5872c86d5d5bae35536e35f822fa3c77e72077d54e8903fd50202e175f774fb9d80e165c751df97702a69fbbcf8492007960e8e7cd83d003a3c387ed6e3b746e8a9a9f2cebc1de1745be32be6672fc7c633968a4cc848afc03c11c527aa48f8261cadb4cb77bd7decc6ec5b645073f5311f8a71489be3ded8703506b75f394ee75ea319cb6ce7833f057a59f044f02f3fe041ca6bac480f1bae903e694a6aa98d9326a2f6b852e10d16d017ebe1b4cd86eac0e32f5ededfa0ba6410314c24cee32e96a03e014c92582b9b06b1fdf7965d25d6991ba95c3cafb5d28cd0322628c54fe449f70317d8c59a87ccc316d72fbda30d91450e1965c0d53a4d39f031ea382ccac791c7ed22c500eabe92324592932054ebf167c7a68a9fa7e4c241303883f75505a8bf0feaba512d0273c135fae4c2296a998431c18806a701ca74c7003034536bafb25eb4772c1a534a41e122dac9db06e10c5b344064a858331dad01c037da1892aa2eddb9456e97acec022a46a4b9b25345e8ec3ea9adf4b57e0795d99036d6213a34cf76219b071fb27b4b8a223f354f9bf61afe9a59eb581d35fbf56b9035c35211ce01a56f4a4df3acc2d8352f400caaa2b8add891e0ab14b1dbffcb33a0367601633f60d748bc186c6a51094178512173ae94bdf88c57f1a2068c8ef41c403c23385e32ba4b204bb7a44de616b087c2fa9b145556a05a1cac7a53905a1458f03718c8a3151f1d369163217db26a6bf96c8554bfc20a42de18244dd4aa78d700e03348e158e9e1d18d0c341b7a84f07b9c569d32e557d28cadb8d493eff1a35daf303bcee5953df5b754319c5e5b9e7420a5ddfa0bdc966a818d96a76c72adac85ff2036b9c76d773a53fe0f704f73faa589e4c9e0f594082439a6aa92e87c3d7f5bf5f032c3fafda76b41c6cd2cd8698d986b6eb1e9cbbd1d60ae2132ccdfbf78f948364032d2517993d3478f3fd26bcaaedf64ac715a758ab75cccc3d743af3224a33e1b503a87c4e7c0a3a06211fca303ebd71048a6a0583ff27458f26783e8eb408d3070d03c79a87da9666b2ac91a5aff7f5c2a1ef6e2d5581942929201acc44e50fbfd13403a2cc83b1c270a01e2ba337c6986d590af10e1b8e5fb7a83ef89b78234ec4b2ae0333eec8a9f11f30c552fe67c43769813a16b6ce89171bba2273886fcbb6b1e43003a535da2c835bc890aa629151771ee140e34ba540272882365130815f6215f04205581e03419307bbc38dafaec9d5a761fc2f6c63052591bc312213f6e73ba3d4a00c181c4701341065474000031d93f60f105899172f7255c030301c3af4564edd4a48577dbdc448aec7ddb0ac0605581e033e3d3d31cd7e38553f13806a7892506a5e8227c3ca736cde5fe6f04a4007011bffffffffffffffff05581e035ac5be7033a1b22852896cedd2815b74dc857fc3347364818d356fee700c024734a9467026ad8003feeba8c0dc8c17c9e5b8ef65192d9895aa6f9cea2784f0c91da8ffef94e861b701410a038438e76d30c9789d7bd66d5b07f0025d57003dd9561e5d04b18888148450017405581e033d9438c9a7425c7bf95be9c6d056c4849318b3fb13a4020516c244a60004010323481efecfc7ea5580455535ac2aba13cebe77f80ced15bc908b7e870a13378105581d0200861828887e89d9886d049a802c915a7dd4bde40f01e1b2677ab5140c1901d04819d059fa26efcc5205581d028a1edf8919783af87cb5df1282e89f7b084fca90eb8bf743647eabce0c01470433d6a6128cf70219022005581e03591c0c07edb44b3526d4d5e83a87429b7e768410120ed4a5456fbfa6f00401021973cf03157473ac6d46081b1e902a660187f2837c417be9bba14455562c146ac5c0512403528cfd81a298da6f87441c44503f8854d9f1229add613b0e003d3ee679c032250219ffff031e7dad53c0835eb2f5fe2025f4854cd284851c812681835191bf08be0597a867034d526cb6e4ab3f77102fbcb0a268edd8563573d417ba6257a31b22c413e5e8260348f9f87edd58a4bc7c4bccbb1ace39acf93e487a6e1b9f09c120cf5ec9c7b82d030fc42acb6988c001cbc747fb060ffa2315e2a7e9f3858aacccc6045196670c6d038ede8ca57d89a0a97313c0815cb3241b7efe2bef8d7192f8976d0a0249518c0d032997bca7fa388de1fc5093059489071c5b1a28f1d45386a533b4fef71c7e4d4d0331c0b59f27ad21f521bf37738b4f6cb7e505aa79294696871680d98ad7a7cd8d03e999f11a6f5a89a542bec94951106e13561d791c54f714417c57ed04cf15c220030d725e38a69fe8015dde8be5f41bd45bad1da682ed126c6c2fca3d1654c076500330929c4223b2bf5852f3c69108b61e594dd2155e5993f260ff092724986ef40403ddad99eb8da0d6e498a11312d7539a3a36ddef8ea4da8f1dd83902d2f98a4d8703c393af2ceb55007ff36919cfd1adc9c792521940399b3cdff94c80a3a49d032303f061a7fee8cda1bada88835ea5a2b5f63b57c862fc31524d578da0d9f72466020219ffff03e950be9bf95656c93c6ae66ab70ee0c598a851d713b58ddaf9a37e34c60d14b503539afecaae32ec02c7df84f22d916f1d3a8f956a5bb374d41825c30214032425031ab3e13120968b7c89ec3f8dbd92117a2b9c7391645a3a1e25e9288ff7f464f20393da1487b94e19943ff6796aa3e9a1ae02e824297080bca3944fa2e6d7c7ca36039f1b09aa41c736693ef8a9f90d85cd15c9b651ca086781b534d4e04e9d2950e803229153fc868c8249c724b09f003e12043cb6c2d72b509cdbfe3c4b571ab8d57003a5336fc45d92838893ac2873a0b8432b69c360e04e50851ff7686ce353c7c84103259a41555d11c7e98e5eb5c59482f6c8e703a999adebd1b78f01d143b074f7ab031b88251269605bca25915c2f0cfe0ff60ac06609b9ad04a261ebb132f44a6f2b03b1ca108b6a1b156938c59e8d7f7e08037ac060a54045bca05b9b1786c60e477903e03318c169afd3b31fcaf79907b35760a71114e70388d5b451b267dbdec5cfd6038c41dcd5ee1c89bbe4ad2c4bf73361bf0f620f8f3a2c0244a5fba44c50eee65b0397e258045b6a8c10cea2b5e1e77463ed432c801aaa3e2b8b59f9ce60c37a4a33032a244bd691c84ca1237008e7039c6a388d80cb0dd59c6b8b172a4be206b6a0940219ffff036cf790a1cc2af37b416c6ced67e1b54bcfeb1a8358a10ed1ddb917a966c448c7036737d67f986616f7045e96a75fe283f5783109b962920c3fdd7698e65e661f020379906848b81a9b245590a1d6d4930cee0acfdc6a8f5825d6c39c32029f765ded03530cd52fab10018d5873fe6d6b24eb327e3c5f2c583ec52f9ae179aa69d8e7ad0328fde01e3d9c0a81bbb45c67013d9deae840204b0c90de4fa7052d94b62ffca30219ffff0392828d0673719a493348d3f7ac791e8653b99e6e031901d07ae0c57c1ac8d77603960708659d4b82694dfe60de7152b336e6572190548bd386c0b928fff1fe4bcc03d3bd095b5713f6e6c15bd53d3c4494cca0a204b3c413cd00e7b679e82e580ee2036113bcd717855633f80d58c72a8bc2ffe9cd03701279d3271bde31c3194e98c903f26e130f1e43f4cad27ed07ca29f6858979f910da41d87e7992bb0020a3d5a49032593d5f99161e1d3bb3aea12b8194d6f317fad4576418bd30df04c5cd3bc7d91036356c8d669a925ad3a0cc47d990a6f7c1f305d4ffa0b1e51a8ad7f6fa52b272803fff56f4887fbdc44e04e0048f3208e3f59835171e6881f513c1f76367ce5149103fa753ef40632f08297aa7b2531eb58b131919ce804459515b410296dd9dccb0f03071795b6907aecb9192c1cd1cbdc5a38513a4e99e195491598658ace0c96c54a0394aab02b7c592620eb85d1c78770192dba63070b8edfc7cb9231e597f66f6e62035f131f2046a50e16124ee7a82e8bd400b780da480924e680d88589a47ba5995303746c60068bceb5e847b8d807399debf9e20ca096dd7616d83b6c9c76f7df624203196cdd63eb142a5e4a30941888ac1bfd4aa55f338e4e7fcae71c3b157dae6af303a03240d602e94981102988a51ac0ad251d33e4eb64a118f2f4d2c694de7aa00f035c0598d574729d2d5ff70fb4df61f6cfc873139bf72155cbd90178302a00547f033c70d85319fac84a8ec0d1c665a785afd4bd13a1f1ecde4b8081f58171bb8d2c03c34ef342310f5630cdbe147fa1b48b48961fe134927a80f7c7e71e53156658e30364491870a4b733deceade048efca43e5267a3c4c296f4bc31d4d68a7c8b1659803f4af757870e6d965532386fe3bed87fef39c3ab113271733efac9a2729bbb40e035daadbbc20f1348650139be122db61e3e51785934a77b201a94ac930d68ad16603ec75c771a0e9f56ac875d8dd2f4838dd7251644e7431f9725e563992ca201a0e034c09ac2a11815e3fb42072b4508b313d3a9c5eab342833bbc9ba1848893a0fa1038388c5291c1969ccf1d6ff774ab9fec7286ec83b989a2e5d63d57e123c585d8403590cc9f8da2fead06f74d6d1bcd43b7a07ecfedbcf0d2a30124f575da1a586ed036018ecfb7ab41f5680184a29cf60f4107b11ffd7b5a7b99b7656c2dcb43c265903422610b6b652ab5dad44612a758aa7cd7b1109f8245293a66cb647f1143793380327817f61bd8fbae8cc0c6b912e9ccdefc11d1826a6180ee24271f3b712f44df003e3bfcdcd9f142fb6b051af72650b128b0b097d5a9bb6e61da36126933191296905581e036d484e86de5e03dcba47f4dc308188c37142acb756dab33ba0b59af050040a05581e03cb1c3c5d37502d0aa13d62b6424910ab952978d0b11fec6ccc3004c7e0040103d10c50a8f35a113076846ce372a64d64408d9bbc8a21f8c5de5b93a1ec720cb003eab6d090ba3fbe9d3b561c6f50e146a8465834dcc21748f143244185f48fc56003562d59a51820d47f520c975e0b2bcffac644a509749a3161f481f57b6e826d210605581e031979e8fff074daaad04439623f1b536865bdfaac7f39c16055f50143c007011bffffffffffffffff03d8be73740597e0432b0d60ad70443a41237ea3e32666f8b7a16b7e242f10dee205581e0317bbf8ba657e39871ab5852bb5d8ace9de7fe3ac599410ee2d50d0a040040104590795608060405234801561001057600080fd5b50600436106100a95760003560e01c80638129fc1c116100715780638129fc1c1461014a5780638da5cb5b14610152578063be116c3b14610163578063cc5183a114610176578063ef921f8f14610189578063f2fde38b146101ac57600080fd5b80630a5ea466146100ae5780631c6eced5146100c357806323b11d8d146100f357806348a4f99314610106578063715018a614610142575b600080fd5b6100c16100bc366004610694565b6101bf565b005b6066546100d6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100c1610101366004610672565b61029f565b610132610114366004610672565b6001600160a01b031660009081526065602052604090205460ff1690565b60405190151581526020016100ea565b6100c1610324565b6100c161035a565b6033546001600160a01b03166100d6565b6100c1610171366004610672565b61041b565b6100c1610184366004610672565b610496565b610132610197366004610672565b60656020526000908152604090205460ff1681565b6100c16101ba366004610672565b6104e2565b3360009081526065602052604090205460ff166102235760405162461bcd60e51b815260206004820152601f60248201527f417070726f766550726f78793a2041636365737320726573747269637465640060448201526064015b60405180910390fd5b60665460405163052f523360e11b81526001600160a01b038681166004830152858116602483015284811660448301526064820184905290911690630a5ea46690608401600060405180830381600087803b15801561028157600080fd5b505af1158015610295573d6000803e3d6000fd5b5050505050505050565b6033546001600160a01b031633146102c95760405162461bcd60e51b815260040161021a906106df565b6001600160a01b038116600081815260656020908152604091829020805460ff1916600117905590519182527f102d162d8690811b17006e6e7529e0e7ec6c7f357d1d74d3d7ceff35fd75ce0f91015b60405180910390a150565b6033546001600160a01b0316331461034e5760405162461bcd60e51b815260040161021a906106df565b6103586000610576565b565b600054610100900460ff166103755760005460ff1615610379565b303b155b6103dc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161021a565b600054610100900460ff161580156103fe576000805461ffff19166101011790555b6104066105c8565b8015610418576000805461ff00191690555b50565b6033546001600160a01b031633146104455760405162461bcd60e51b815260040161021a906106df565b6001600160a01b038116600081815260656020908152604091829020805460ff1916905590519182527fb24cbb8005827c88afc2851884e834493cae4ef0d1302bf939281696bd6ae7599101610319565b6033546001600160a01b031633146104c05760405162461bcd60e51b815260040161021a906106df565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461050c5760405162461bcd60e51b815260040161021a906106df565b6001600160a01b0381166105715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161021a565b610418815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166105ef5760405162461bcd60e51b815260040161021a90610714565b6105f76105ff565b610358610626565b600054610100900460ff166103585760405162461bcd60e51b815260040161021a90610714565b600054610100900460ff1661064d5760405162461bcd60e51b815260040161021a90610714565b61035833610576565b80356001600160a01b038116811461066d57600080fd5b919050565b60006020828403121561068457600080fd5b61068d82610656565b9392505050565b600080600080608085870312156106aa57600080fd5b6106b385610656565b93506106c160208601610656565b92506106cf60408601610656565b9396929550929360600135925050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220cef0361026d143789d3a650723c24c713525ee432d868f9508fc5fe410faf15464736f6c6343000806003300582103164135aff1c548a9982cce22ebb8a532443ff7b3b6e3a417c5234f7974c9c46041010058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630410100582002501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545440aa958dd87fc8305b97f2ba922cddca374bcd7f00582003e5af7989af34160053c740614b9ddb3802b3053daf83245a1bb265a8bcafe0410100582003b2639b17bef0515027b53aeaf7e6afe7d7e132e00c9abd9bbdd0f1be746cc0410102190420021901400058210345c78e6cce5cffdec145e73ecd97300c6fd3c324449c80fc66d92f4c6bfbad704101031dacac7dec919df3e6de7ac4aacd07fad0b2afb26a93a66596e35672d9e4ec20005821032a75bdeeae8604d839476ae9efd8b0e15aa447e21bfd7f41283bb54e22c9a82054f2f0829018452a00435edb9cf6fd5158d2e92bf500582103fd6c600593df7046d05407c1e5011ba9e7b831a4becdfc4e22a3f9c313d38a00410100582103a012d18e3ab1ec8e0601d9139d23395f6626362a923c5a7c2e6839fe7f5f18c04101021945b605581e03f4984e1d911878a0ddd7f3a4c56797a98c41c9e65626fb4ae0becc9cf0070119079505581e0321f22ad905c506331d7f77323648114d3988003fbbf8da25af93037a700c0245236fd3b2000360f9c8120dca62dd1c723fbfad26b16f48c0799c1bea1205b363df3d8802aefd03e341c22cc41099ee3c0f967a9d5e94af7bc906464204782df8baa1259de0a4b80219b56f03fc39247169d68387fe8f2d369c8e98607eb364efc82e1033596d18048b7527d203e2a45e68759e1dd926792be7bf83dcd856d4dd670f974ae206ee6a4d5627dcfa032abc13497d9fc711f804b073617b9d21a594d4d5a4deb876e540b80929ea18a7031f94b1d7576f2582eb0191ef837530d6d1feebda22f870d136988de0a07412a403694aa123047e9ad525f9cdbcbb674b941e25772c1134d00eff1caaf9b1392fa503ca626fc94f8c99d78e79d3ea497f11cded8aa614a1ecbda86f398e8b4848e94103edd82fef0870913fd1d73b5e14b6950a8e0bcbf06097f4b3f5c435f45537135903e81381385db7a7dc530dea9fbc6c59e9d3f51ec69a9c654302d8379db9738a2d03c562a9d42afccb384670f065e0287167d809b1e537db57badc0ca1fd6e12a872031dcaf274ffbd3cc4c5096eb427a1bac8e71053d33979ee4983374ac5674c99c8031b25881fe51e16803e7fbfcbac12d3b25fdba9d8c3b5c7cd658da84c4276bbc303486a41219b6cbf03e815837fc2ce7bc2bb3f0c65e8cad72ef944cb95715b6fc60219ffff030122934164aa33fe3986851a13a079c54fdb7da9a63e1a4e4bf3e8ec74a8214a03bd0a2e4e1439ab57fd37c24cd33ce6837d5e254d54c7e88062da31c446417a3c0372c7689d8cedf4a68726f7c43c731eae4eba6a89495ea932a7ff09d94949f1f30383bb030500655869f5f7af9b038c9470630b34936e655e29360fae48fc12cc9f034f2c8ba7ae6bf8f4d46a780ca64de3c373922d2de3d4e32435dfd4bb84d930d3038fd0f00991c5137af676688421187712405e0fe4b657dfbd5d36c41658ec5f2b035c880e7a33da2550cfab9b40c9084cf944cf023e58221c8b0dd07fa12bec108b038d0f10a1ff8bad2c3289702a41d7c15ef442880ecc11ec84636181148cde56d303ecc19cc255272f7651cce2a83b6d9f7c3188b41145c0113c32c2a42d6dfd113a031090949f42ac5df0b0288574e3cb2ebc34d436e05466670a8c673161764590840219ffff033b5ea417612b816eb2e27559a01f474d4dcea6c4c0137512737e10ca86e576dd03fe78149b5346621279469911874510ecb529124dc198a00e8f6dab4ab98827b8030a642e46989b438621e525efd2b5c91a131099482c267894b34ac282678d2de70219ffff03cc7aa690272741c06dd2c0bacb46b20d8593c038e93027fd87aacf1dc60bd9a803e1eacde9ab111632be6d099fdd45c32e2e8d7e9b6bbbc5cfcae3d7800f1ed8a1032b1bdd7e77fa5eaf49c31e69d6297a85a27e0ba7f5f1653f2f4d77fa6feaf9b3030c1f30f385e6e7fadd3c080452bb1830f3fccb6d51943c7e3c39cbdaa3d900ad039b0a33545680a03e132c49b5199567c54ee3fe3d23664579b0a668e41f9f3701033cf2a552666499ad3ebb1ead95a3386987f48069de5c6114faa72b11a09b997b03eb0a5196b9046119dcace0cc0a671452b3710a48affbddbd9cc980df9e245913033a36ff92ceccefd9b136cf851f7dce6a8981528939559b0e6ada61f5a3806c040300f671dbc968f94cb7624a7b3f688337e4fdb64744c353dcd7f51955b9a8afde0344a6993e44ef397a4ac783cdd411cb5c00c55a3a5cd69490f455fe707b2d9b1f03933a1ae386027c9473af7e55dd034f21a22feeb8664f9aacda8cd5ab1b60d44c0354fcbb11430f75ee96323e498f115c41fc8c58f7ce10cc459252118b8362d8630219ffff0317f1d75f02289bedbd7e2ffa92e0039284fcaa96ddf79ecb0ebc6a28fe03eb5603b79d2e7990e83d1114544c8be30a90e55551b5c35105c36f8099ce20c78948660344143267c6955ea84b69da894b6ca6d4b17ddd34f4ba7ed9227f650cd971a5c103bc3a2d2a12d22ebbfc8a69081264ce6e61dcca60a707902192c588b70773df970392201e7e8bd2b81302184730c351bbe303f33a9bf27cf88555775ce043dd1a8803063cdd4d4c96dde3fc359f1c3b7e3f0761c696a8bad14aea7421313f02c0aee803031fa4d408dd95a87b9662357866e4efc80dfefb86d5aa95a3cca16c1ce405e0031279a24f16b3850bd07dad54754dd7d0953b4aec2cacb4825213514eb1c0f91303660a2dee8752fec8f33d533082034fd1749b9a15f76abb3f0220518dc751396903ae71c41f58f26059e0d50b96e4c9e4ec83e1d3ab71d862c1456edca4da109f0503bfbd33f5057c0832a2d28e2220088c52c8908954bf87e5f81391ec80faec1e8803ec86ff64b1bfe6f7775c4a8a00fb1b4e0a05f6c6db7d1804881c3b746e2861970385eac1ef69d9e4da96773c544852a23e718bae08410e6593475ecb17a490f89e03bb7e2f288fcdad39ea8e7c608daed81b75e920e60b5f74ccd4d7b4d6027a42d303df2beaaad1babcbaf35e8f59ab771434c9610487d2a36805b8b02e4e3523d2f803c5bf6a07fbcd88232a42444c59816b8672fa6a5916fd0493e7bfb2fd2ee28b1503b4274c7e527ede63c995a7d176506bf6b1fe929358d9d6aeea3b2fe5d72826cf03a1e2b7b4f627ce1ab92d777f4670f56bad48bd52ac39ff9eb9b309aeaefd2a7103f327f4c25afc8b4f7bd4ea1aef52ff8917ae1276c9e907b9f603e06d49a7afa003d5b607c3c91a574a6438fba7aa8e7a1a2a953e271ed0124f3c2f03c80fcf89540362f1ac5b1d016fbc7835544300b6244bde1d81326c511630202f877e2689a0f00381e4af3edeef59f2cf3f571a01f6129d634cc60f7f1a2a547ae426146bd401aa03168037d5caafe3a9373312d47bdc227c1a63aee2e150ad4d595c7c884ea042f403a57e9c016b928802d57b3e57db76ead5d41df4c3ab36321a3eb9d0ae76629ad20351f15bae1b2ee7dc7bb14e2b3908d42de86fe3a26089ec7bbaf502843d582ef7031068bb0daf30ab05600da7d3f48becf8aa5fb09531fda6121f578119f489decc0362ea0a8e481ea3c55adcf86f4ae5e7c4367eac629c3cd25f075d3eb62704c2d503981e91f1495425f666003a83d85b5afb13de3220618ea60decd6391e1166c8a103ac51e311939faccbdf933980b6bcbd99705caba9b4fe8059f726cf4888d49e17036635764f91aa7cf1eeb192af4b9457e95ffbd8eab658e87b880ac73e6a9e5c9a039087e809d48b949d64615b72346d874b97471298c26e2de2803017d9207d9f5c03da8cd7368a3e7fb6969cce2da56b0b68a87b970b68675b2c7c9371f762625baa03fa9e62c69d7b5ff3e8a02df2ef9f0f5f38e107edef839219d17179cf252287f203c585ed2e2c0bb6ca73cc8c2248b67bf0f1664b860180c5ec3cdddca9bb77db830382338bb913050382a0bc7737cd5046bffc95024c5add048b62594ab94facb47803d29ede6626dceb566c13b2b1e40f9acf41bd6e6cedeed721aa1e0e94b962723c03351997ef5bc48f6be427b910116d139c78c546919f03fe2eb7f2cb3b3cf05804039b9a8efdb4595f983b753d75024c79f3e31d9d112f0e9e95966cd548d19e4bc803a9702d2cde95a500901b6b6da8c3a9f50771690838daa6535beebb735451bacd03d5840232c74158a9a14d7b58b06c1550bd36b5151bca68561e6e0013f3b5a60a03135dc465a2a361eff7c35ca34dea3aaf1584077fe45cafbae059bc43c1d529490398149f677be4362234d2ea63618757368bd5ea43fd6b07de04d79b7a70318c7e03f345f29b2db301ee1067f97494dfd2efcdd41d67b0e4271eee9ff9afcab78875031a0821df0b458874072c96dc30a461eb5d92ea8225485cec4636953606da0d9003d81304c77a7d80401c94548ef364333dc271b14b103a6884651033eb0c2da97105581e038871115f4aa4f77693f19eb9849d4a71a2f6a0f7158b75a5da530f44c0040105581e03dd440cefb41d4fe7be24b1055857af4e4d7ce5284b20fe1eca0cfa0d000c014664459416240005581e03884211d834de3d11a80cd0aa7dcb1723d6569780353b2b8706c0a6c3900847025014bfbfb00005581e03fbef4edc995dfcdfe1c4be1ae4ed0a33fd4dd67096a5b898369ec92d00040105581d02cf56e7b9ab0f0368bcd6c9c91aed6b3d9d4ec1971397fe5c378ae83f0402045902e0608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063199f72601461003857806341c0e1b51461004d575b5f80fd5b61004b610046366004610262565b610055565b005b61004b6100e9565b33733328f7f4a1d1c57c35df56bbf0c9dcafca309c49146100d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f41646472657373206973206e6f742077686974656c697374656400000000000060448201526064015b60405180910390fd5b6100e3848484846101a3565b50505050565b337337aab97476ba8dc785476611006fd5dda4eed66b1461018c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f6e6c792074686520636f6e7472616374206f776e65722063616e2063616c6c60448201527f20746869732066756e6374696f6e00000000000000000000000000000000000060648201526084016100ce565b7337aab97476ba8dc785476611006fd5dda4eed66bff5b5f6323b872dd60e01b90505f60405182815285600482015284602482015283604482015260205f6064835f8b5af191505080156101fb573d80156101f25760015f5114601f3d111691506101f9565b5f873b1191505b505b80610232576040517ff405907100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461025d575f80fd5b919050565b5f805f8060808587031215610275575f80fd5b61027e8561023a565b935061028c6020860161023a565b925061029a6040860161023a565b939692955092936060013592505056fea2646970667358221220e1e0e24429d1e60a36a247a324ced67999a9e96a064cd7f127808cf22be29fcb64736f6c634300081700330605581d0255ac7c678e81a913bf853f5551a6bb0741a5c148c177e38869e6a92607011902e00219200805581e03ee7d86dc28e98a1a94067f177aee63e0e3603c812938bd0ca60a188df00c034504e3b2920002193a8b031f4ea396c544385575f7317f648795e8b46c58c88e63286b6d7cdb49c9c3c1a803db3f1a5be8536c50a796471cd3a45ceacd91a027c35246b92ef2ca358cd2deae0219ffff0367abee778da185894018330a9b993a0ced9075e19716f2a2c8fdd0faba4b4cea035d2f73bd1a95d8e49533b2724d3e36a4eb9fdb3d5175f4cec1c786199b939fab03387bd806613062fa40a63b9353022d151739c49a2b55e1686779f7fb302ec2c303891f81da2b6c93837993aad9b3232dfe4f93d64c9552c8bf3f1af806d93abcca0326f15b650c43cd2e0456972566f002d04b55f640f7e4867ed95aa9daffac4e2e0219ffff0380cdfb4f3c718d06c88d0f2895a92c79e5a88067189476166dffa0b73a4bd0a603f858f5432ee3ba1a47f0cacd00dc9bab165ededc3035f375b276b6a5ccfe71cb039d3c061db293c93958f66cf82a08b00cdaa7865a29c0a68a028e049519c5274d034d867d9c19d067babc065f20726ff1e9c6e05805149e519c6016f07894a09fc003115e2a8560bf1cdf5d5481770e927a28ba860dc1888e432a9e5ba3b5582c428f0379cc7a92c9810d6c8289fcd81323357b5c4304d58aca6c4b8c68fbdbfd06d68703e098c63d5f20b1b33cf5d02c6f88b5fab96fca2f5ae310c144b7e882b0177a7f03e581ff362d772c5b4405136673b1d49b973726b6605335c9171006ebb0b233e30219ffff036d100c89da2e31cc4d3042e3ca24cab018e80207ae34641ccdf590aa3e8e9e4f03e1dbfe9780d374748ffc030cd2d9d1492008d95e182a20b71955a2f308ef21660219ffff0219ffff0397dfa101fde59d7a873fd990067871a26228726da88ed82217e3082ae0de9d8a034c6330889e479e0437ec18ad4221495ce093fe8604ff53615a54fbea804c051203c5b2f63f9a5a5cd66618806c193ca68fda574c5a2acce1ed016e8e80111b1fe5032d204460a4f390bb930344eca9cb78f197f1d73a30cff59173fc4c9118776c1b03ce3b8e21738ec00090bab67c0e56aba701f1ffc91ddd75971e8d05dd66804dad03ec7b3addeff25a874d06a1823987b7e739f53b8f18dc7cd09854084f7c4a480c034e5b05d9793394f441511084b00cd7ccff4f9207d8f7be27350b6b51c4b9834503ff61f62f38c0852b0c058ae5a37e5d6b4528add10bceddc6ed38bc2ff6b1f17403b05058f7de824628c4ecc041b3b1c502f92ec252850c58da6be29dfbe4bc405703be0b479b2cbf58363b88356f31d1067cfc06ed036a05a4f25aa29a2e73128e37032fe6479680414852100ea1896a2a1a31b538828412971c0944e9ed52ee9110150397b83d111a61768b3a7487748d8fcd3cb37bafa09bd88bc052e03b49e02e7dec0317605621ec49fe11b49d03a0fcb10f835fe7d288078be6b914d4565f9a114bea0356f99e41ed032708486527a36e3c998b9f42fc60f1c6a0f9c17b0a302a16537f03f4eebbeab1524ef7bcb20a30ce700431bfd8fbfa7aa09d472c10d704bd3e4967038d0e099a44f7f94546d79cf2bc08f9624998397189445f243f46332f84f0603f03d05250ea90479b253866120e5392b2b2d868e340657627c07bf99a10a5f65cca03050921a1e651703ca31b8579a026e9156270ae517c8249a1c185d861e75d5794039778ab010a0c170994e2568b7a74323405413c121da2146dfcd06854b976d95003af2edf1c12a65a6a5653a836da344214334fc18125b1e63bb65d7471d8c90ed903e17e89808bbbe14f5d187c548b09996169580f5a86b3e8e76ca051a12be8d2f603172a2b898855b435c0138b47ff7b835c7ea32d144f279af470e0d48eff8fb46c03e000d2ad2e91a07ad7fb1c40401ee7ac59c21d4bbde16c36cc05b0a1b0fd39ff032e0291f83f615fc2ac9ab68d158a2293bdc9338d4809ee467f8df0f1c112859a03bcd5bf62f604e285404479e944ade8ea7d3b9c2d21eb70a4c1571e15b0e86b8b0398a30a8778f0ded40305ff797aca464ce00a3f9f9f1bd2297e14ac40d335171403a41ff41dd7940030fda9502f8b9a53a3defafb850ab91965a9e3f49e1fb7e5e403774102fbd2afc19911bbdb4ba13dafcefc8e32f587a39acda10619fa3bf38c8303b82abff063c918fd489a5f382932ac32fbc683ecdbe87a5194521b697c0bc35903d6d462a3c91aca34f28e8b63fdcbc28b529b2ce8372da43b6af554565e08540703a79cd05a1f27dc92c6e4320d86987c4cd923f0f6b7170081eadee52096da34fd0330118fa5d8f20113dcf45f6e6e4ee9bc57511caac6ad6e5bb21f2f6331cfbb8e0330a5490d0d74cdafc07896ad493593c24c3a83af3764ab2ac45c7dc3f2780c300321018bba01709f429872107909c38efef0e53e71816b05edeb20af661d0191e30332ac4c48ca2b7ea7bef1df4cdd25d3369565fa6c33677e5aa4254c7289da87a60317f64686f9e80b29c5e086d6650879d2e10b03e76f1909dab35c065f74b1e18103ff4188c921d9b6f1bee6dfed6f7a49bfccabccc6bcdb8b58d1499eefd6c2a028033046c8c8a219c4c65d33095a44510122196a261ddca5f310d7c30c660070c4f603307ed868f1a796746f0a45d2c164bf06618ff25eca391c4bb92ea3d11d11b33003509d73eae7e6b8a705afad9c8c08b58e8013349667835aa89602cbec28c468080376131808cf1f70f19ffb7034be1db0ee00656912fa99de431ff955106f6e298f038d5c83f672a553c76c6d3b8fb64113dcf651c5b0172fb0fb6de6385306e2999b03265f87ebf0f1e77f65743101e01179f2b651258e7e671a023fbb3a154a40a8d703337c29fd9976d67b66b28034c1414c04861ce13b19a267c6e01d66f2cdb6bfba03387d1af7fb6734d678da59d1d8eb7aa81f851120b36bed51bdd5ea46b2a2d62e05581e0374a9d461b6a9d2c0b4b8eec628b533d580ac7a40dcb6d6d1d9e2c0e8f007011bffffffffffffffff031b460c826a854d61dca82f718e088b8b4c4082ffeb93752d7691bc62c51dc0280605581e03aea6a37014af491452adb5d70fa3a144f2893d475b7d03d22a07b08dc007011bffffffffffffffff05581e039009f9fb7f3600a0fd6cce71411b0b2fc393098cf0f18c99ed4c3fdcf00418280372a061fe6d5ad391d8e81fccdd10fa823507f7b7728bfb7810690b10aae2e44f05581e03468b1bad7d17d14b3da7bf86b7ac6239887e52714e679390842b97d0b00401034c45c04bbc4da5675b38332226f2ebc2b47b1e0c09e31f5e33c98c37eae7b14404592c1d608060405234801561001057600080fd5b50600436106101b95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a7146105da578063d505accf146105e2578063dd62ed3e14610640578063fff6cae91461067b576101b9565b8063ba9a7a5614610597578063bc25cf771461059f578063c45a0155146105d2576101b9565b80637ecebe00116100d35780637ecebe00146104d757806389afcb441461050a57806395d89b4114610556578063a9059cbb1461055e576101b9565b80636a6278421461046957806370a082311461049c5780637464fc3d146104cf576101b9565b806323b872dd116101665780633644e515116101405780633644e51514610416578063485cc9551461041e5780635909c0d5146104595780635a3d549314610461576101b9565b806323b872dd146103ad57806330adf81f146103f0578063313ce567146103f8576101b9565b8063095ea7b311610197578063095ea7b3146103155780630dfe16811461036257806318160ddd14610393576101b9565b8063022c0d9f146101be57806306fdde03146102595780630902f1ac146102d6575b600080fd5b610257600480360360808110156101d457600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff604083013516919081019060808101606082013564010000000081111561021857600080fd5b82018360208201111561022a57600080fd5b8035906020019184600183028401116401000000008311171561024c57600080fd5b509092509050610683565b005b610261610d57565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102de610d90565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b61034e6004803603604081101561032b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610de5565b604080519115158252519081900360200190f35b61036a610dfc565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61039b610e18565b60408051918252519081900360200190f35b61034e600480360360608110156103c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610e1e565b61039b610efd565b610400610f21565b6040805160ff9092168252519081900360200190f35b61039b610f26565b6102576004803603604081101561043457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610f2c565b61039b611005565b61039b61100b565b61039b6004803603602081101561047f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611011565b61039b600480360360208110156104b257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113cb565b61039b6113dd565b61039b600480360360208110156104ed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113e3565b61053d6004803603602081101561052057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113f5565b6040805192835260208301919091528051918290030190f35b610261611892565b61034e6004803603604081101561057457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356118cb565b61039b6118d8565b610257600480360360208110156105b557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118de565b61036a611ad4565b61036a611af0565b610257600480360360e08110156105f857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611b0c565b61039b6004803603604081101561065657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611dd8565b610257611df5565b600c546001146106f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55841515806107075750600084115b61075c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612b2f6025913960400191505060405180910390fd5b600080610767610d90565b5091509150816dffffffffffffffffffffffffffff168710801561079a5750806dffffffffffffffffffffffffffff1686105b6107ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612b786021913960400191505060405180910390fd5b600654600754600091829173ffffffffffffffffffffffffffffffffffffffff91821691908116908916821480159061085457508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b6108bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f556e697377617056323a20494e56414c49445f544f0000000000000000000000604482015290519081900360640190fd5b8a156108d0576108d0828a8d611fdb565b89156108e1576108e1818a8c611fdb565b86156109c3578873ffffffffffffffffffffffffffffffffffffffff166310d1e85c338d8d8c8c6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b1580156109aa57600080fd5b505af11580156109be573d6000803e3d6000fd5b505050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610a2f57600080fd5b505afa158015610a43573d6000803e3d6000fd5b505050506040513d6020811015610a5957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191955073ffffffffffffffffffffffffffffffffffffffff8316916370a0823191602480820192602092909190829003018186803b158015610acb57600080fd5b505afa158015610adf573d6000803e3d6000fd5b505050506040513d6020811015610af557600080fd5b5051925060009150506dffffffffffffffffffffffffffff85168a90038311610b1f576000610b35565b89856dffffffffffffffffffffffffffff160383035b9050600089856dffffffffffffffffffffffffffff16038311610b59576000610b6f565b89856dffffffffffffffffffffffffffff160383035b90506000821180610b805750600081115b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612b546024913960400191505060405180910390fd5b6000610c09610beb84600363ffffffff6121e816565b610bfd876103e863ffffffff6121e816565b9063ffffffff61226e16565b90506000610c21610beb84600363ffffffff6121e816565b9050610c59620f4240610c4d6dffffffffffffffffffffffffffff8b8116908b1663ffffffff6121e816565b9063ffffffff6121e816565b610c69838363ffffffff6121e816565b1015610cd657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e697377617056323a204b0000000000000000000000000000000000000000604482015290519081900360640190fd5b5050610ce4848488886122e0565b60408051838152602081018390528082018d9052606081018c9052905173ffffffffffffffffffffffffffffffffffffffff8b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600a81526020017f556e69737761702056320000000000000000000000000000000000000000000081525081565b6008546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000008304909116917c0100000000000000000000000000000000000000000000000000000000900463ffffffff1690565b6000610df233848461259c565b5060015b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610ee85773ffffffffffffffffffffffffffffffffffffffff84166000908152600260209081526040808320338452909152902054610eb6908363ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610ef384848461260b565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60055473ffffffffffffffffffffffffffffffffffffffff163314610fb257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c5460011461108457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611094610d90565b50600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905193955091935060009273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d602081101561113857600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d60208110156111db57600080fd5b505190506000611201836dffffffffffffffffffffffffffff871663ffffffff61226e16565b90506000611225836dffffffffffffffffffffffffffff871663ffffffff61226e16565b9050600061123387876126ec565b600054909150806112705761125c6103e8610bfd611257878763ffffffff6121e816565b612878565b985061126b60006103e86128ca565b6112cd565b6112ca6dffffffffffffffffffffffffffff8916611294868463ffffffff6121e816565b8161129b57fe5b046dffffffffffffffffffffffffffff89166112bd868563ffffffff6121e816565b816112c457fe5b0461297a565b98505b60008911611326576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612bc16028913960400191505060405180910390fd5b6113308a8a6128ca565b61133c86868a8a6122e0565b811561137e5760085461137a906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c5460011461146957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611479610d90565b50600654600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905194965092945073ffffffffffffffffffffffffffffffffffffffff9182169391169160009184916370a08231916024808301926020929190829003018186803b1580156114fb57600080fd5b505afa15801561150f573d6000803e3d6000fd5b505050506040513d602081101561152557600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8516916370a08231916024808301926020929190829003018186803b15801561159957600080fd5b505afa1580156115ad573d6000803e3d6000fd5b505050506040513d60208110156115c357600080fd5b5051306000908152600160205260408120549192506115e288886126ec565b600054909150806115f9848763ffffffff6121e816565b8161160057fe5b049a5080611614848663ffffffff6121e816565b8161161b57fe5b04995060008b11801561162e575060008a115b611683576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612b996028913960400191505060405180910390fd5b61168d3084612992565b611698878d8d611fdb565b6116a3868d8c611fdb565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8916916370a08231916024808301926020929190829003018186803b15801561170f57600080fd5b505afa158015611723573d6000803e3d6000fd5b505050506040513d602081101561173957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191965073ffffffffffffffffffffffffffffffffffffffff8816916370a0823191602480820192602092909190829003018186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d60208110156117d557600080fd5b505193506117e585858b8b6122e0565b811561182757600854611823906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b604080518c8152602081018c9052815173ffffffffffffffffffffffffffffffffffffffff8f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b6040518060400160405280600681526020017f554e492d5632000000000000000000000000000000000000000000000000000081525081565b6000610df233848461260b565b6103e881565b600c5460011461194f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654600754600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9485169490931692611a2b9285928792611a26926dffffffffffffffffffffffffffff169185916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6020811015611a1857600080fd5b50519063ffffffff61226e16565b611fdb565b600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611aca9284928792611a26926e01000000000000000000000000000090046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff8616916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b50506001600c5550565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b42841015611b7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e697377617056323a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff80891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015611cdc573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611d5757508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611dc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e415455524500000000604482015290519081900360640190fd5b611dcd89898961259c565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c54600114611e6657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611fd49273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015611edd57600080fd5b505afa158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b158015611f7a57600080fd5b505afa158015611f8e573d6000803e3d6000fd5b505050506040513d6020811015611fa457600080fd5b50516008546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166122e0565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b602083106120e157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016120a4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612143576040519150601f19603f3d011682016040523d82523d6000602084013e612148565b606091505b5091509150818015612176575080511580612176575080806020019051602081101561217357600080fd5b50515b6121e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f556e697377617056323a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b60008115806122035750508082028282828161220057fe5b04145b610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820382811115610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6dffffffffffffffffffffffffffff841180159061230c57506dffffffffffffffffffffffffffff8311155b61237757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f556e697377617056323a204f564552464c4f5700000000000000000000000000604482015290519081900360640190fd5b60085463ffffffff428116917c0100000000000000000000000000000000000000000000000000000000900481168203908116158015906123c757506dffffffffffffffffffffffffffff841615155b80156123e257506dffffffffffffffffffffffffffff831615155b15612492578063ffffffff16612425856123fb86612a57565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169063ffffffff612a7b16565b600980547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169290920201905563ffffffff8116612465846123fb87612a57565b600a80547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216929092020190555b600880547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff888116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008883168102919091177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612641908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054612683908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d602081101561278157600080fd5b5051600b5473ffffffffffffffffffffffffffffffffffffffff821615801594509192509061286457801561285f5760006127d86112576dffffffffffffffffffffffffffff88811690881663ffffffff6121e816565b905060006127e583612878565b90508082111561285c576000612813612804848463ffffffff61226e16565b6000549063ffffffff6121e816565b905060006128388361282c86600563ffffffff6121e816565b9063ffffffff612abc16565b9050600081838161284557fe5b04905080156128585761285887826128ca565b5050505b50505b612870565b8015612870576000600b555b505092915050565b600060038211156128bb575080600160028204015b818110156128b5578091506002818285816128a457fe5b0401816128ad57fe5b04905061288d565b506128c5565b81156128c5575060015b919050565b6000546128dd908263ffffffff612abc16565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054612915908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310612989578161298b565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546129c8908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081209190915554612a02908263ffffffff61226e16565b600090815560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6dffffffffffffffffffffffffffff166e0100000000000000000000000000000290565b60006dffffffffffffffffffffffffffff82167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841681612ab457fe5b049392505050565b80820182811015610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe556e697377617056323a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f494e5055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f4c4951554944495459556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4255524e4544556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a723158207dca18479e58487606bf70c79e44d8dee62353c9ee6d01f9a9d70885b8765f2264736f6c63430005100032032e2bc0c0ff22609eac8f10e1c8736f3e780dcb85055451e7ac674e2667ce4b570058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56304501db03ecf300582103e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0552bc82346b125e21af9685fa629b9bd9d56348d32440058210366cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688054c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200582002575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5820b73002977f7a921d00ea2ceae62e84aa6c739ed1af5d2e827341affa6f651e99005820025a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85502ef738cbf907356636685fa416c08696ac5c309b402184400581f02e257e98749920f079c806953e0129df22aca1b5060fd814f8b684a2728b3410100581f0266c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7410102190204014200f600582103432903a0d939005005c35d6b3c91f991de7aaab2b261dabdd70424fcc29326004501db03e90b00582002f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3582065cf5fa30000000000093dafbfc84712a218000000000001a17653070c4e80bb0058200252222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f549e9fbde7c7a83c43913bddc8779158f1368f04130218480219f44505581e0376d2eac2897b11b32dac81b81fcb6fa245e571f0c1c23e6d28e7ed00500701192c1d05581e03e3596cca07971bee28d4f7363be4d8e6c720a382a8292af73ded53fdb0040105581e03366941e9597fc49d153609a888bdc75e5450deea087c5f0611f91827300c1821471485b42652f89e05581e0349b55ace9b37869628798c01d3a6cf4accfa2ced1c83e8ae740820c89004110373efca8acfbe544c8ecb7016b28cc776fd50a99ff19b848bc15cf31b5dc8ed0d02195f9e03e8c46238406f0d1b98ef136d648c28e2e8b8263391c554e9880c161fff165cbc0219ffff0219ffff03c47d5275fe855b7d46701da078bec769e285a35a64d77d91b25bb4bf251ef7bb03297c29d0f390b5b65f6ae34cd85557acd49def0190974947409845cb46a105b003d600f6b67ffb988d6770719115ac25d166a5618f731c2941b05c46257f0f765503ae450d3a7931a3c1a2d797fecb8b532b2a416b011c5b66eac4c7a83c5ae15daf03733ac70afb68cedd7251f39375e8dc794165c34d8992a28c1a6e5a01cb42f41803ffbb9d63f88897c6ffbe2aa9fda8b87dffec04851e6d8d3e0775d7b396c584130311d88e5c395d975fbe216255c16ca42c588a712276c49586d4ff3cf9fae1688a0219ffff033ef8ae4cd7a240131254d9907625ad2d3616109d08815fbbfd5aee912acab2b2036aa54ca1e4f12f7f0207d3e512b4ce190bc18ccae85dd73565d9242eb5e7c6c103319913649e465932fc2243ed0047dfea864723fcf47b7de527bc4e974e9f1d6e03cfbd4d08fd9e1de875ff093bb45e8a218788f5970a14a1e90c80b02c4e854aa803100eb15c41005be0b31fdd22d44d97c2377cd4f1c8d95741532724c06be01905036417964ffa371c57e6f395e400bed05db58f626794555697abaf5e16745ff885030831b0dbf4d1c827c664a972dd16c58cc551f8874c30ab70fefdc66525cea43e031ad2f3f9d09fe09f04845ed7ad6b8e1a4fc5647dd25b8b8304fcb7668938d37203bcae8b659ce47717542c4c1749f0a2c34be0d5fe9c46d103cdd66852fff07ba703cbc536abb71f20e84af17bea2cc3ab6eac3c2fe56962d098c942b1b1578616960362649e2b63c97826ba896d600683c001438d9b10adb8436c8e91073570fb444f03c5577f2182fa52a3b43ce239d0d5af1dd880d26d8175d0a8525c0732d8b96610033f7c3082081fbe4203fd093095d9ff976f09a8346eb87e2afb5c33ed617007c20219ffff03263e78c2c2ecb01c326d913ec44010a5949ec8d8e2b0483cd67d11d7b93e991d03cf8f99b839001afd8fca3d13b0bed66b9c96375bea0cc5ec0a1344c88ed421e703c03d2180f03d00062beee405ebab84c5be230cd8100f0de54866251f12157a9603d7ebd4ca0460d8102685c92e5d03bc95a785a25c63e2bc34a8886ff642ff10a5035a366cb6a84f62aef78724cb22841a25098531cef93c0dfbc987eab478aa8e040314f43643e29c03c21c20958f4db255d2b3a2f1888708ce8be6fc00256de8862003808f5b817c9ef3c39a4f17c1871432671bead67a2f433934348aa261ac0be77603f8a6aae111f30d1f0ed6666bcdb9f835266685113bc61459b35127d6887ba4c40316c1b019f7cd665ce6b3252c67a0858b88a147a7a8291870d780585b7a92847d03094265900c976454fe42db08b4d728fc462700183a2b3d446d195c55f4c7251103209b8c33ca4f1acfb8fa7091164c40b38a03a24510c24832ea0d7f8ba37467f603ff1422c5fce899621581ef95eab73efb46e5fd530f4c0cf0447d81a30956df6c03e2f6538d24ae024739b843d26699c7df0947549b27b8f2380d8cf0e55dca58ee031dd09da6c3f2c1e38b6f91f10f829c61a759e62bb9aa3b6d8f1de7ea08db46060398589bf5bd087a3fa0c0b2dec3a1089336cb7846696a0a392fee264ddba1cea003a735abd8fc0586fbceac1ac1a7472a2f4898b4c601a9a9b3f1590a3f69f4a1e903396ef29935567ea809496029d14d2027e8ec312ecf7499f280a203f4aac7014d03ea7f236df86cb2aabb31337600179807caef5bdea8c405ed8676f1d4bfedee0403623cbf159197c45f809d7167e876912c42640aa6629fdcad4cda3a0de803905d033d60fca5c0df5a9d9a70427488679edceeff74b88fb4a71e5256ca89b36011af03c1159efe6b581dd8726a3f5a892cf99a681662bafdb5432442537be893bef21c033e3f138dfd37ea5fda09897df32334d848ab83d9f95a5f305cf15b4ce1f90e25033f20574ac973dc6157547709cbac0cb7c31baa2da17dfab35e9c8da6b92134cc031c6bf571f4a6d789d4be859c7bf5d2a0ebb03f319b10b04496d622391d9d2632031fc1badfee7a6b662a27e0b182a3362d8dc0dffccb42eb4c827911c156482ebf03b8defcbc8f20b79fdce12b4f0c3a2e13ed8aeb9c4ee0621a411c8717cb50505803ed4ae5fa47b5e981e3c4d006dfe2170de7fca39862936d8910a2142ef0500fc203f339b60b343ff744c8f79351ab7b107230b38a99680343d862ec0d9f7429b9350373945e16f1ea6b13c393411c087e6d69571ff68e9578c5f2ebb0a3d8cee01b9403eb1dc98b4de131e954727735765515f50b9438fc94b08ef5a7c815e70a903a5103b3da505310032b1cef8b5f2292a85cc526e7f85e1ed1d195ad081dd85468e2d203f88cc9e4a2338b6b02e694b1e4056b464444eaf1d445175e6b4625ca0798cb21034c7a79fd5fa2bd35628d79c6a2f03c8535b634f4d74081f4ab6af320c412f59603a7a293a1699408e03be2f671049d440b8437a643fa20be6066fb5dbc0cc7b3ff05581e03db6fa8971ad16c5dff0df61c983a6c5735b13dc7d2ef55a5dff37dc6100c0147012ef35e16650005581e03829b8b434022a63cba8fe236649a2f2cc1c1569878795dc6ccc39487b0040103562d59a51820d47f520c975e0b2bcffac644a509749a3161f481f57b6e826d210605581e031cc3c1014051f7421eb11f39d4bdfafd216f161720ceaf06e74cda37f007011bffffffffffffffff03d9341e9a79236fcf78e02523d3655b8297ec4328c6f1577d949e7d07765db30205581e03d87c983935083aaf8af636694de96453713cee0fc83260aed3eb33b4a00c01470124efdd56e98b0459258f3460ff164360ff161473ae2fc483527b8ef99eb5d9b44875f005ba1fae13331416602857612418565b5f355f1a60061b5600000000000000000000000000000000000000000000000000000000000000000000000000000000022c0d9f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000005b00005b5f5f60a45f5f60246101825f393460415260023560601c806024525f5f60645f5f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af150608460595f396004601646355f1a375af160fd575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b0023b872dd0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60246101825f393460415260023560601c806024525f5f60645f5f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af150608460595f396004601646355f1a375af1601a9081355f1a60061b575f5ffd0000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60646101825f39600486601b0187601a01355f1a37856002013560601c806024525f5f60645f5f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af15060a460595f39600487601601884601355f1a375af190601f019081355f1a60061b575f5ffd0000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f393460255260023560601c806004525f5f60445f5f73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb485af150608460595f396004601646355f1a375af160fd575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f393460255260023560601c806004525f5f60445f5f73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb485af150608460595f396004601646355f1a375af1601a9081355f1a60061b575f5ffd0000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60446101e65f39600486601b0187601a01355f1a37856002013560601c806004525f5f60445f5f73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb485af15060a460595f39600487601601884601355f1a375af190601f019081355f1a60061b575f5ffd0000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f393460255260023560601c806004525f5f60445f5f73dac17f958d2ee523a2206206994597c13d831ec75af150608460595f396004601646355f1a375af160fd575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f393460255260023560601c806004525f5f60445f5f73dac17f958d2ee523a2206206994597c13d831ec75af150608460595f396004601646355f1a375af1601a9081355f1a60061b575f5ffd0000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60446101e65f39600486601b0187601a01355f1a37856002013560601c806004525f5f60445f5f73dac17f958d2ee523a2206206994597c13d831ec75af15060a460595f39600487601601884601355f1a375af190601f019081355f1a60061b575f5ffd0000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f396004602a46355f1a3760023560601c806004525f5f60445f5f60163560601c5af150608460595f39346021525af160fd575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f396004602a46355f1a3760023560601c806004525f5f60445f5f60163560601c5af1506080605d600439344652600460595f395af160fd575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f396004602a46355f1a3760023560601c806004525f5f60445f5f60163560601c5af150608460595f39346021525af1602e9081355f1a60061b575f5ffd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f396004602a46355f1a3760023560601c806004525f5f60445f5f60163560601c5af1506080605d600439344652600460595f395af1602e9081355f1a60061b575f5ffd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60446101e65f39600486602a01874601355f1a37856002013560601c806004525f5f60445f5f8b6016013560601c5af15060a460595f39600487602f0188602e01355f1a375af1906033019081355f1a60061b575f5ffd000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f396004602a46355f1a3760023560601c806004525f5f60445f5f60163560601c5af150608460595f39346025525af160fd575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f396004602a46355f1a3760023560601c806004525f5f60445f5f60163560601c5af150608460595f39346025525af1602e9081355f1a60061b575f5ffd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f396004602a46355f1a3760023560601c806004525f5f60445f5f60163560601c5af150608460595f393460081c6004525af160fd575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60046101e65f396004602a46355f1a3760023560601c806004525f5f60445f5f60163560601c5af150608460595f393460081c6004525af1602e9081355f1a60061b575f5ffd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b4646355f1a60061b562e1a7d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b60446101e65f39600481601601824601355f1a37601481601c016010375f5f60445f5f856002013560601c5af190601a019081355f1a60061b575f5ffd00005b3446526004610aca5f395f5f60245f5f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af15f5f5f5f47335af11660fd575f5ffd0000000000000000005b33ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b60646101825f39601481600801603037600481600201824601355f1a375f5f60645f5f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af1906006019081355f1a60061b575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b60446101e65f39601481600801601037600481600201824601355f1a375f5f60445f5f73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb485af1906006019081355f1a60061b575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b60446101e65f39601481600801601037600481600201824601355f1a375f5f60445f5f73dac17f958d2ee523a2206206994597c13d831ec75af1906006019081355f1a60061b575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b60a460595f39600481601601824601355f1a375f5f60a45f5f856002013560601c5af190601a019081355f1a60061b575f5ffd0000000000000000000000005b60a460595f39600481601601824601355f1a37601481601c016050375f5f60a45f5f856002013560601c5af190601a019081355f1a60061b575f5ffd095ea7b3000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff52bbbe2900000000000000000000000000000000000000000000000000000000000000e00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b6044610dbd5f395f5f60445f5f856022013560601c5af19046019081355f1a60061b575f5ffd000000000000000000000000000000000000000000000000005b6004610dbd5f39806015013560601c6004525f6024525f5f60445f5f8546013560601c5af1906029019081355f1a60061b575f5ffd000000000000000000005b6101c4610e015f398046013560e4526014816021016101303760148160350161015037600481604a0182604901355f1a60a40137600481604f0182604e01355f1a61016401375f5f6101c45f5f73ba12222222228d8ba445958a75a0704d566bf2c85af1906053019081355f1a60061b575f5ffd00000000000000000000005b6101c4610e015f398046013560e4526014816021016101303760148160350161015037600481604a0182604901355f1a60a40137600481604f0182604e01355f1a61016401376014816055016070375f5f6101c45f5f73ba12222222228d8ba445958a75a0704d566bf2c85af1906053019081355f1a60061b575f5ffd00005b6044610dbd5f396014816002016010375f5f60445f5f856016013560601c5af19046019081355f1a60061b575f5ffd7c5e9ea40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b60a46111b05f39601481601501601037601481602e01605037600481602a0182602901355f1a3760048160430182604201355f1a375f5f60a45f5f8546013560601c5af1906047019081355f1a60061b575f5ffd128acb080000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffd8963efd1fc6a506488495d951d5263988d2500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000062000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000128acb080000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a800000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000001000276a400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000062000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000005b60246101825f39336024526004356044525f5f60645f5f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af100005b60246101825f39336024526024356044525f5f60645f5f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b60e46113fb5f39600460166015355f1a376014601a60f037602e357d152100000000000000000000000000000000000000000000000000000000016101225260405f6101265f5f463560601c5af15f513460181b1160205160445114161660fd575f5ffd0000000000000000000000000000000000000000000000000000005b6101046112d55f393460181b6044526014601a60d037602e357d155200000000000000000000000000000000000000000000000000000000016101225260405f6101265f5f463560601c5af15f515f036016356015355f1a1c101660fd575f5ffd5b60046101e65f39336004526004356024525f5f60445f5f6084355af100005b60046101e65f39336004526024356024525f5f60445f5f60a4355af1000000000000000000000000000000000000000000000000000000000000000000005b6100e46112d55f39600460166015355f1a376014601a60f037602e357d16c100000000000000000000000000000000000000000000000000000000016101225260405f6101265f5f463560601c5af15f515f033460181b101660fd575f5ffd00000000000000000000000000000000000000000000000000000000000000005b6101046113fb5f393460181b5f036044526014601a60d037602e357d16a200000000000000000000000000000000000000000000000000000000016101225260405f6101265f5f463560601c5af160205160445114165f516016356015355f1a1c111660fd575f5ffd000000000000000000000000000000000000000000005b6101246113fb5f39600481601b01468103355f1a37601481601f0160d03760148160330160f03780604701357fffff000000000000000000000000000000000000000000000000000000000000167d16a200000000000000000000000000000000000000000000000000000000016101225260405f6101265f5f8546013560601c5af15f51826016013583601501355f1a1c11166020516044511416906049019081355f1a60061b575f5ffd000000000000000000000000000000000000005b6101246113fb5f39601481604b01601037600481601b01468103355f1a37601481601f0160d03760148160330160f03780604701357fffff000000000000000000000000000000000000000000000000000000000000167d16a200000000000000000000000000000000000000000000000000000000016101225260405f6101265f5f8546013560601c5af15f51826016013583601501355f1a1c11166020516044511416906049019081355f1a60061b575f5ffd000000000000000000005b6101246112d55f39600481601601468103355f1a37601481601f0160d03760148160330160f03780604701357fffff000000000000000000000000000000000000000000000000000000000000167d16c100000000000000000000000000000000000000000000000000000000016101225260405f6101265f5f8546013560601c5af15f515f0382601b013583601a01355f1a1c1016906049019081355f1a60061b575f5ffd000000000000000000000000000000000000000000000000005b6101246112d55f39601481604b01601037600481601601468103355f1a37601481601f0160d03760148160330160f03780604701357fffff000000000000000000000000000000000000000000000000000000000000167d16c100000000000000000000000000000000000000000000000000000000016101225260405f6101265f5f8546013560601c5af15f515f0382601b013583601a01355f1a1c1016906049019081355f1a60061b575f5ffd5b60046101e65f39336004526004358015611b13576024525f5f60445f5f6084355af15b602435801560fd576024525f5f60445f5f60a4355af1003c8a7d8d0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001af000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b6084611b2b5f398046013560e81c60020b602452806004013560e81c60020b604452600481600801468103355f1a377f1af00000000000000000000000000000000000000000000000000000000000006101245260405f6101265f5f604886033560601c5af15f5182600d013583600c01355f1a1c11602051836012013584601101355f1a1c111616906016019081355f1a60061b575f5ffda34123a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000004f1eb3d80000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a800000000000000000000000000000000000000000000000000000000000005b6084611d1a602039806015013560e81c60020b602452806018013560e81c60020b604452600481601c01468103355f1a378046013560601c60405f60a45f5f5f5f606460205f8a5af1956024611dbe5f396fffffffffffffffffffffffffffffffff6064525af1165f51826021013583602001355f1a1c801591111716602051826026013583602501355f1a1c80159111171690602a019081355f1a60061b575f5ffdff5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f000000000000000000000000000000000000000000000000000000000000000096e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f000000000000005b5f5f60a45f5f60605f5f60445f5f600235805f527fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000060145260285f206055611ea45f3960155260555f2073ffffffffffffffffffffffffffffffffffffffff1660446101e65f3980600452961c6004601646355f1a375af150608460595f39346021525af160fd575f5ffd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60605f5f60445f5f600235805f527fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000060145260285f206055611ea45f3960155260555f2073ffffffffffffffffffffffffffffffffffffffff1660446101e65f3980600452961c6004601646355f1a375af150608460595f39346021525af1601a9081355f1a60061b575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60605f5f60445f5f600235807fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005f5260145260285f206055611ea45f3960155260555f2073ffffffffffffffffffffffffffffffffffffffff1660446101e65f3980600452961c6004601646355f1a375af1506080605d600439344652600460595f395af160fd575f5ffd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60605f5f60445f5f600235807fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005f5260145260285f206055611ea45f3960155260555f2073ffffffffffffffffffffffffffffffffffffffff1660446101e65f3980600452961c6004601646355f1a375af1506080605d600439344652600460595f395af1601a9081355f1a60061b575f5ffd00000000000000000000000000000000000000000000000000000000000000000000000000005b5f5f60a45f5f60605f5f60445f5f8b60020135807fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005f5260145260285f206055611ea45f3960155260555f2073ffffffffffffffffffffffffffffffffffffffff1660446101e65f3980600452961c60048d6016018e4601355f1a375af15060a460595f39600487601b0188601a01355f1a375af190601f019081355f1a60061b575f5ffd00000000000000000000000000000000000000000000000000005b5f5f60a45f5f60605f5f60445f5f8b60020135805f527fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000060145260285f206055611ea45f3960155260555f2073ffffffffffffffffffffffffffffffffffffffff1660446101e65f3980600452961c60048d6016018e4601355f1a375af15060a460595f39600487601b0188601a01355f1a375af190601f019081355f1a60061b575f5ffd00000000000000000000000000000000000000000000000000005b610126611b2b5f39806015013560601c60c452806029013560601c60e45280603d013560f01c6101045280603f013560e81c60020b602452806042013560e81c60020b604452600481604601468103355f1a3760405f6101265f5f8546013560601c5af15f5182604b013583604a01355f1a1c1116602051826050013583604f01355f1a1c1116906054019081355f1a60061b575f5ffd5b3273ae2fc483527b8ef99eb5d9b44875f005ba1fae1314606060845f3760605f2074ff1f98431c8ad98523631ae4a59f267346ea31f9845f526020527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b546040526055600b2073ffffffffffffffffffffffffffffffffffffffff1633141660e43560f01c5774ff41ff9aa7e16b8b1a8a8dc4f0efacd93d02d071c95f527f6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e26040526055600b2073ffffffffffffffffffffffffffffffffffffffff1633143273ae2fc483527b8ef99eb5d9b44875f005ba1fae13141660e43560f01c5774ffbaceb8ec6b9355dfc0269c18bac9d6e2bdc29c4f5f527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b546040526055600b2073ffffffffffffffffffffffffffffffffffffffff16331473ae2fc483527b8ef99eb5d9b44875f005ba1fae1332141660e43560f01c57000605581e0301f6c3949c69f9617d8cada9fa07b6fda3ca62cbb047761f4b81f57f500f014701539d60bab84819258f05581e039d23217cc1d0e25898a08368730ce1c3b413b7c4726dac94a5bb635c300c01461319718a50000219b7960344f69efc96b5d710a1abbd3de340aa0c5b19f185f5f5af0aafc63564c49470ae037f71f69d7ffe6eae84c543710b1e63632992124d6efa05b9c9eea1cecde51c3803d30be93feae6122c5c83fcee4ade19d8593dc0e77a70a1352fbb785c9bf740e303408ff80ceb10dfee2c5172ac2b00b97725e08b421f8afbfa60eb18f29dfb64380300254560b9f93c0ae534fc8ef874e98b7bd17b8fbb1ff4749952add33408696503d16f183da84481cfbd79c3b6c17a2a7640a29d64af2305d38bded0603756548903afbbd44d1035934b2a5e002b0a9d4da379ca6bf12a26733a4a21b72bf308688d03d9904ae3e52c3563d7f895ec9d4c69693cbd56916be499561bea193442a13db30393eb3d942ea02eb0b8981a284886f44b6a1f2ca9529f288a0afe64f20925809b0346ca8f23a3aa58be5e6f8b317d0e816294011f3e17463ed636aaea1ea255f3fe035290850ee2daa65453f3c475815e68b6d6d7fc8cfe02ab05ce6a365b55f7e5580219ffff0308bcbe1e77152c55aeb289421609c72d4840c442f4814f04e70dc7562d1bf9db039d81891c5d2f490c3476628bd0dee50f0b2c59b04936e14b6504d3bc38de6ea5037e36898afbf03a5b22da3a7a344dab864c5197cc41f6fa21d21bd9b0bf1396150396767989914d58a550d23b6f74deaea46038390f3dbc86b11d27d8aaadeb38370219ffff0219ffff03e02e7a625c1d2b58c584c3faaa9d8d9a805a86cba7348de8f107045a566dfbe0038a21425582d206c56c0299fb1ec2ce460d7efc93c74782c4f0ddb8d4759b92d003ce0381cef54e33fd2879682803e2b3b61820073ad8267542b8f95dbfead60a0c0339c2ff07b8adb3428f1b927a455d7f08f8d18ea6bed4425fefb7b2ac5857393403a93670b3765ce75c4b84af1b1ee8dbf50a097a54cd03d7f2a0bc1170a21b458e03b15e47487a3e6b993f6eab695f5cec6d04e49eded15e09cdfa03eba94ab16dcc03b65efcb505f6da7cfca1ccc4547383e15462e2a415db205862d41658143a475e035fba676c58b437a5a5a64249fdb3fa7dbec751f54f167e240ded0a2324ce38880395973bb87b5d88ab4778580f0cd48d7698cb5bad10d3a72504e1fec61dd24da403405649a7a763314cd97968b58df25cdafd75a746478baa157bc483bbe3c7a1df03bb9920ebae59b43b3bccd50d7d160e8fb7f06ea9eff1c3c979f7c5a49153b43c03e5129ef9780100869a9faaf43d334c19b45707ef34c914834667d1ac03eece33031f359bfad93710c88f17c4170fdbcc623277b952dbd4d62748c6fc268f9047980381afdfa7774209fcb4bc07f91ec04ebfe1b89c69a9ae1ebe2bc43536e45d46030314ec32550afaeab1ed605a3a72100325cb76c0e8fa24e3c69438aa77a1a4f74d03c76fc44ec84125b9611cfe7b65ae97a94e4c3be48cc6d956ab81073e3ed5d0fa030bbf75bf642c80da34b73dc943a30c7f1b3be348bcb6d1e2529fdd51449e08a103cf160104d02da84a41724719c27da09ceb1a51b00928fefcda317edcf309825903430344155e34189a33e11dc4c8ad6a9404df9870a2e18ad0865721f7c1f1147a03bce449afc50e44019e3aeb75e9f2d6c72042d0a20464b69d61eb2d3f2ad96843030531eb4a0afef3cb404d7675870c3c49efd29b9a4b859ddaae94c36310b7ae0603e752d314fe049bd7c6ed39c67d2f1f639c45eabfeb257b9147fdd57481857e3c03cb64018e30deabc41ab7512bd25329679bec782bc7628f4f0a116407316e648303894b6c455abd1c361917145aa5eec85d66b43da4327f92f9abe6b738ba9323c1037231449890315a74a2d29846f6c25d573b12d5c1222989c4588d400044406d2e0368ebaf5ceb22e2bc333432b76718d6c36166d1444ea4dbb2dd5d53b77494290c030207bd1b438590dc2ea4773092ff6840b379c1206859eb63b419a18280273513034c42088bd69508dc161cf6548f23a976f09ba9bec3c446d4a2cb7bdbc95a323203c286dab82a74c887eb5d2eb399eb414c81f1083efb4af7d185086646598e62fc035b9e9801cb4418702c6b8d3be24d9ee539bee1721f92fe233a0d95ba588e81db033661a6bd0c24511a05b40f8ae74c737f47d0df70bbf3c7a0816810ed90a8442603d6b82b5896be46433e7349f5005e0d5958dbc3747435483d956149bf9a41740b036af61ac19cd4496fb6d376dc38a8165a2561022866ce6fef41f8ade0fd2a407b031d942c5f793bd295e61894015b65c2a0b772da5420e868784603db7d45fc38ab034f96708c335dd6364f8c5b4fc62edf32f5fd9a7107a99be1e9f6914b4093b88c03e3981f17dbc1a00258432c0e34232f267d05e271590ee7a9783a51870f9873c8033a7c4e1b76aa60dc9d631272c2ce6a72e82914e0cd8ffc759889d5f24cdedeeb03ca06c2b4c97d9941e56c3c752abe4c2b0b2cd162e22a5d25f61774dc453deedf05581e03da7d3b581a6515e83a053ac10dee614e37c74397b0001f77359de74100040305581e03e08b15e58c41c3c9db35bc5268e123e5e61f633bd60f8dd66ce320d4d0040105581e03961ea71a2092ede541a5313d58a72b669c614b45d7c9e73ab7f40b85d0040105581e036be6c90bff6b129f08f2d3732f40a37dbc9a95e1c60843ed138e4969d00c1836470135ec955aed3303235db60b9fecfc721d53cb6624da22433e765569a8312e86a6f0b47faf4a2a2305581d024eee85039fc9d8260336899b904d35911f52859f57c1e664281186f20c0147a7a5422d062ab804590c346060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029036aaeb1e0dd249b087cd1c940635994a67018a3efc2936343a1d5683dfb2222a003148c0f2304aec3353cf5ed7568766ce494a21fe011985cddb407f939e9e3784603b1a4e93c311e947a63c609299e2ba2d7c4366b66b7ff9f76a47a9f664e12ae8803977ff6ee86449fd9ebac8463ff545fdb4a38e11385e958bf6277974047b1d236036c4c151180a39edb4fc33f328395429f008873fbfb4e59af8b3efd262acb84e103089710c7a16e171320a10b6bfa611bcca0d1c600363d8b0e93026e86ccf00eb303f43a6e3544d2c39c8401dabf9a56c3833b0a6f076bb84531f56a458fc067e2af039c1e0323f514f23b03257afde58fa72cbe2b64f4b1fbc02ba92903634d4af557033c9ce9384b1306ecaf25eafd1ac442076e44ee9e517bb0309557f1dbbaebcdcd030a66e92eeaf801092919fe5c726811e2e2afc96552fc69f880d0375d795c2c070364e28106c325c81a6deef5895ded24763fa571f68be656b87c26f0ef0e73bd89035e65546b978b0a40324014c9c99e4c5cc66ede9d8c6f06a52b76da37e2dff7a403e6d2a3cf8466027d8ce6c3fd8b8137fcb5d3dc34221837a3c0052493d6d6aea003bc60844ba0c0f950e431ba1ae8f48914bd3615b148b2be4f0b205c62218dd5e603a0ad1e2e5f67d5d490f8de1a408c30dca01085e318971df5c131e63df2a836e403cb985a6e5f969d91cd70fd13601a14e12389fd9838cc92d23bc36973e136359003b24bba13c7f0dd576eebbd075439e3c822e4f06a125e1d43b71197e098555374032daa3bb00175af3b8e2990396fff10297352bd5469719dc25d3919f285399978030b91957a4270f52c4bef2a9148d90d5d7ac07d2edf289a0bb1187768c942a92e0384c1c153254938bcf5833e3266c69d11863f01beebc2172ef140895ab5e8137f036c73c87058593f7a4c5f34ed7a844533bf2ae21f0dcc75be2305cb26502e27d803a7116b013767ee61d04cfc7ee0ef0fa6eb0c6e0b7d9b21b78302c7452509581003a0555fa89a6ac0d1f753c5bc430ca1bd74595c40928b8eb150567bdc1a85892403a2f2c2f85b117e77fbfee593bc7f1a87d965760ab4ceb77e2bdc085c22b2c46403e87a120a0a27451b6271d538a807bb0085c31bfcf491f46298bf79e07f1561b1039504a9cb5fc23525872531ecc2f65ab0bb5b29115c62bc024a8912f1fba1cc4c03202d28845054f6fe6a50978ee6537cc8f29ea9d08a2b9d1c560a3a044f9e8be603ab12089e9f6f349abbebe4f7498455ee8410c5cf24aa2586edea6446e9593ab3036d7c1259ed661bf224d1f6954d7a13a9112f7eac5ea9541142fc8327142c1185034302512bd497d6c6691c4c6d78fdf99b51252c4cf34b284987001796c063680d00581f031843a5260f50654be60454888c12e1df9a8f5beca305d3643235bb2410105820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0314ac2a4037bb9c454b5ff1d341e61930d98f8bbf8d3879fb16bd9c75c9b180540391d0c3f554b53449edcce8701fb7941e35a59dc2ec26b8d30a92a204b5e6f6df03d3da91b634b1a7274b216a230bbcba5e24d92dcb0acdd9600e61d9d3e6a0e6ce034453e289c78c92dd80619ded94bf85359c38c30b8ccfbad693f38d7b6762751003a648a3a6eb8bd75eb1e2494b42f22a94eca6d6f608b5b7aa2ee9b5c0e9ca547d030feb2f389db71094872ccb0acb1ccff2f1aec23fe78ff388eccfd0000edba3ac0306c41f230bca0bff2ef0f2eee1e9f31dc74fdb942d2744b67227fac91ceee0ba03d05faf394c9234ac4e98e507310fdbd59c2580cd987c354cc84105e56caeaea5038101d8390f58e6e7da14d23c8005b95989c7ebde1a3c6982158464c2aaae60a5032e72b7f4dce792eaeeab1c5033624a348c0511b1cc58e47802ebc95995d428db038c233253a52c8d290c1cc6d7784cbcb618436a5b351f4d65c5ec53e05c7b2abb00581e02e45fa4a838b134c920a70c634c9ca44bca01a924b0040860770d1aed8947726d75c93f880000581e02920e6cbb93e03175c156b6576e7c589a7b95ec4418551adbe64a3944845820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0218280393d772a69697218f224549a9e49fe5d9bc8b9c7fd49e7ea79f9713960c9076380219fdff03125272869e4a25821c1cfbea8c449006295201c8a3b3dc92aa3406d39104c8a90349d115a4a345f8a268d6aee0628a37f606c4cd02adc99bee0d669911de16ff68031cac3ecf09fdfd75a2d143901f6954071b1174b117f8f904143cf0421911a13b0398a46da7dd993981a9a8dcaf22ade3299be2a26ef780714b027d49f654e022850219ffff03df92241811a831787efcac462fd390fe5b43ba9dff23ff8a7c31535e602b6ddf03132b10049085bc9411c024dcf21327de2162f0af350e374686035cd48fd66e540315d16c487ef535d0f173a49c98dee30280d70f178dcab63c169934921b6a88fb0340fb1c046cffa79a46c8dfd65d13fe4b7734d4f0de8e5db9b56e0a3c74e0f3ce03ccab9c6c1f535a5c35a33a1cf64e366963750b0fca755702b3b5c1417dbb2dfa03cbb86d45dd9af8dbb00aceafcc979fc30e5aa0cd791c9d803edf2c899c3ffbae031285699058db64b8b3582b409e3336dbbfdc4d9c652586f8071df03934d17e7903982f0f8eaf23a1e6644fd286aa80994e30b4776d9673217bfe49330d9430d6c40219ffff03148ce59153c3b6d3a51adff6fed05e04856b41a1b213cf618eb02a0464013c6003907445856d4e7bd1e631857782665c201d5eaf44a89e6dcc56cb91f6710699a9039b08d40fbd4f420c2c9ce0bc56f0bb68851bed1077a3ef9a09227b4d52e7f34303b079f07a552409694a69868e97b41a31d05b058048fc2b22c31afda30a32e4d2032def77a99f3cea53463e061361a4a5c2a6ebd51b4bce0183b47a2487bed4b9dc03c2b80bb8433cb5be1729135b7cd381feca3c71ee3f8d3081dd78e395521f43b103ec922eb0dd7dddd163f9662050404d3f517b59359c4e488a1ade52b41beb8b290219ffff03f9b1a3de1ddf51fcd02852b050cd82a44af42a31e4ca0431201232bab87fb2b903d662475b9dd7bc4fb29a113d47688b1610d5ca1d97cbe41a09e3c45d776e13c103e43ce858d3bb97be3f11d30381e4b0b5b5d495d4b60a720c4c76977075740a230342b92a6a02d43f2969169120f474850868a376a6f3baeee2b8ef27d72d00d5a70314f0018f0ea7622f10c9c16904d69aa082d2e697bf910dd5bd22c11e4343da810390fb0cdb6d73176293d1bd512a8eea879edc3f7761cfe65860cd54d5eb05da360323bc64835d47eba09af91d3d699dcdfc662f646e18e27614efa1cda0d15a885003d44a7b9d01e902fb5cea241748244a1ca359cd7b01b2c93c3561c6b8d715812a031d5dcc5bec9cee90eb95da8c3e5ae9554113c5620a4042832dc2f2a0d38bf7ff0393b1047e44528ddf116e8ed492a6c212860705c19664cdc6a239ac6bd165999a034b78d73443410fe7e26a2651584ebfd40f664016e64de6eb1ee5512ce60b8ab9035f58b8d1c6795c7d004b3a0d7d66693db1d42470826e7904aa11ac26ba5be1d903ada595f73bd0c03b8674369a0b872da7a416403a407fcaba17b7cccf8c441f0a035147c2b7234b7f98df9b329bffdef77beaed68d805393270b0bca31c0974e20b0341f585d1afa7058de9c4ff75e578cfee0547740d52761109429e1a500048b8cc036e000c659ba7400fa969a30b46bc8456a87ea85d4e8dde9a6d0a9f2b362220de033a4e8dae42372574bb9b956bed5599265ca7f77ef6ebc02fa4422734dd492e22036eee0803e5c6cdcdfcfe2d5d87413d3da3a75b981e35cee98f1b116321f6696c03432cbd7efbaa89401c5517539e8d5fba8caa121bc6bdcbd305cc8caefa1d05580345f92df33a0fd133c2dfc6d1d13eb684f07677d672c5f645508a620d143bd26e0323d9ebad29e4e7895ad2185bac3cbc7ce6fed69f4c9145fe7f2c7b25009789b903519e65d019ed3c6cef529cadefbebb066c1290e7d2ce262e11daf1fddcb1beca03c5bfea76dd60de9c0c9c74275e1780cf1803d2c1432e214659eceaa9ccd8fe3103f6ed084f430bffa399efad0fec00183805450aa056dbfdadc0101fac40bfcf33037b812d3d2422b715d9011dd10dc45cfb80de8d0e2d036c8a985d695bf236f88003730022e3f37dabd44ebae9f0b8ba59d9e9bf5d9557641ee8813b57f57b312d2b03b9cc9bb14776136d03fcb066764e3d75df42bed1fc4c2618fc0db7e3f472c0bb03268e78e75296e051471665ff51a2c6ee66688091ce14d4e4962d238cf183556403c161d822f7e345d1a803ecec4dee41f647129dd2e4b3e121b41eacbc90334e93039fdcf29c144697781256d8c58c8d5a4647f379da8b38c80046ab5e613452d68503563c67c676cbb02b118096b4986ba589cc4a0c80776bb11d0946f42769e815ad03adfef6aa619a9c61fafc73488a137b2b9067ef7f3084b589a2c36d7d85088a9b03192fb8d2fd62532e258d48a708c613ab0d6f749dec3a705ebb70f0980bffd6d5036ce7b69c284e4d5ff7aa7591172bad92c5ab6539ca0a7cf8bd5bab695707badd03cf71e2f66aaa87e44b06737375fdf40912da232d600f267924e7adeaef734d4e037fe6aa9028fcb17c4218228fa2205bad1d1265207801557f6b71143937908f0a031fce0e35b7afb0734361df0242ee908a9e77ac2e6eb64313dd6123339c4726d6035f95eec9ac279db4f8cbd8c6d73591e534db823119bf835b09e6dc0f91df7eed039a0640a47039e93a2cfda190fd8a488905fcf7bed4c9409e6ffb3ab864ae05ec03de3c56e17f75a7134788e2b302612a64e9cbdfcf2f6b80f576da8eb48e6c92fb034dbebd109c98fafc3ceccfd8d2f5a1620f174b97c667b83a89937ca04f9e0e6603a0a5fe05a71f0bf6cf1ea4b15415e886df2db11aba30e57a1d7a9cffb1d360f000581f03c0989249a6e0cc82ed453bf7ef7c1dc3d5a2f80aaf8ae6c92eb1e4b275304b4a817c417bd859b65ba95600581e020e15399fd39d541ab913f704b29f2ac5a0a1d7c8de1df5fc284ad5bc8e491df6e71091139771710375c66964d75b3c09922d520522ccc74fed954a49cce59678beffd1d6219548ae0219804003897b04fee6fa11c85ccc358e065296b5167fc4f1f98dd3f441739a1bf4f31a9a03df6e21134b4f253174b754122369e4a968a58a80ab8cd11a3ef309b19c4f13d103de9555841e4d38f19a907cef279ed0305a3b40f31b94bc562044c603f21c86bd03d282d00380b4627f3343a7bd6b304f79e9d11e4f2ffa6d682ac37eea2157144803f581a7918745d765bdd33da58b8352443b12956c816c6615b6bf5d46f973968d031c2ac99060a723d5528838eb2bd045c0f26dc8d79db971353ccc45e0c1cdfede00581f03a54502883d504147946f04c0bb6f530de60ef10da9c004d4d863c9e7f5805820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f03d43c201d1d6d4b455cc27e248ac5edf9245e40430e0454431678796079e05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03689ed8ccdb1d6c4d4f631a5783a46562d2ea4b506e0457329cb7e9e29ac7f24203748330133ace753c29d8bd2f4ac82b0a5dab4921cc373a94f99abe6554caddba0219f7ff03b9d58c6d54102f5afbd5ea3a11c75bfb789610fb1e0abd8759f55da391b2588c0219ffff033d0a0631da22140d9980b77198f93966c465732de1316f8e2079845add63833c03308f161e020fdd7549f9640621f1e75125002a27384c8cdd8e272d369acef5b60336f600d07000daed56ae4c73defe117b1a1c408e3ffda727d5120f2d1bac1b98035e7e8b146d15f0d9d5fe1866172ec6ab12738733364add3b5fec64932efbe69a034d3ad34130edbbd33810686af87380324b01411066c8b5bce9caf44aafe16a080219ffff0391753630219fa061da2f5bbe0ef5c8349f57b3babd94191807e262f1f828502a0359bd38fd590136438472abd7c29a908fa9661f015ce766de74144aa903fcb2790219ffff031b4f97035b883df174e26857227b2e9129fdb24b36deaa5a40eca236f51a94d603a732c44b4dc3a649b48836843a6198adaed7c237ffc671eafc13d7e64fe505fa03ba8d847864e282a991307f028f9b7281a7d7c586f4d165dcb09f56f77cfe78f6035c9e8f32e0b80f324d127c1758218bea79b6eeb81118e4188ffdcd3a81af3f7c032a0a0f882de87cddba79fabc4d0ba428d42f81d84b0b8a1a55fbd0ae63c5ecd303c2229cc1619df92fbc32dbdff9f0bf6dd4f0dd22208f9b05f5a7ef3c26467015037aae15e597f24850cd76419f4d056cd60790f99bc9e4f85c0a1082c850e065ca034a14ba77c23dffaf345269dfacaa6ef720cd9639d0850089be0cfb8a5c4ea70503b93a185db5df4e8a695fa9a15cc14bdf440116e6ec9e102adcc9bee22b93dec8032b6079aea46d6c438bb050bf5963f870e0dd4c28e9a43d877e623ac77e68a11a0310c1d6d60eaf244100f27a39d49930133dc409eb9258daa3ee72fb956ecfb57b037a8c38e90a9d3084f29661f023194abd5e179f7ac382372d4181fd11d6248b52033a7472560c188f46db9f91529eabccb22c24b91a87c8bdb67cbb2020f044ed5f031c92c2de4f649c5eb7fef1f2dd4a07b967ab986d7812f88eb85aef63ba7e60cd031ddaf463cc5cd0afd40d8405313b3841df1b66bcd27f84ad3d83a9765c44ca24036b30f6fb68ee486958d2908882abbaeec2e8215b507a05dadb0203df41b2e65703628c77db566123d1c06e8c8e61064897b53b6cea5c92bfc6b0590a83e78d17dd03e6a08caae2e5a19a6534699eaa45126089718006fadd56f2d9a00d729cf59e6b0367a2335b37fe2c18ab910b5192609091f4cf83bea3a3eff7aa1c8f65ae7710d303f39a7571154bce8d4066e6a8ade370697e1647a658257511b21a6133b6e6d3b00315d2e9a20cfbe215473da0212f0c12369a1f33a4108da61c7fea3ff06db3c7a70394afd1fa51d4b995f81c07c01c85fdcac96aa2a9ddec53ebe795e833c35e992903ac1cc00f3fe79ffe8d00762c41c60e76267e271fcc53f0238cf3559aadc86dbb038e184234b198d6818c586664b1e53c1e6d0fda0e337d14955a1fa07eb268a50d03fbd188de5e001d9973e5e272e8dcc3ed3186e90800b0776d3130ace932690fb003bc6dba6372569631c952556be8ca7cde85f5b5e9de0108b890be17ae8cc2c2e800581f03294f295afb1fb36ed7571fe230a68b51c5c3c4c821457dcc320532d1a5005820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03e0613854285ed12abaaf7127ff70f49a63802daac845d4557be198856d9ea9b90378cc22eee8530d3b50daa2823cfad4b4e5acfed898b9c28f95947beb99872ca800581f034b9a6da6cd1bcd3a9de67e96d96524297c2e634e18f3d3c1e138eabd25c05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03c3eb294e14a1bd5ad7baf12d63c1ad76056b46288afd261e3d8eae3a491d5e2a03d70c61dd6483b5bc2e54aeee9617f7cf1ca628305bfc238521ee56875f1713560384646eb05e060a331358a63f775212368d63e5a3985ab960a1f97443eaa99f0f036ad2d024007efbe9dcedf1b8458628baae16bb17b309b264cca6bad64217adb703bd15489bcef2e9989ef1298d9bcf70d3fcbc829f5718932d6d541d70cf373d8400581f0341e2803d7e5d925debf58dea57c47b45d238828f50f5a4d818f8ea3eb6104723bc46c94c540e00581f037b894c13efe501d77927ffae71a82cac6051a36300e9aaf3cf22b1b2ea005820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03b3eefa67d5ec7a16ae007f84831c4808e90ecec458a93473b25d75fc06da8ded00581f037a0bf43238cbbbcb4003c84bd021dc80e136a57d38690daa4456ddb1e2105820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03f4d344b699fc1351d2d5f811ab43e2955f8083919dc072cabd0f73a546b4036b03c38d53019c4c8a58fd13f428b88ebcc41669a692369557a1885c3bd4969e16c800581e02c1ffff3533ff4434a3aa1ff6351a7237cb7d56a977c7f3c5fc6096621e5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e022d362f510f31d6a1c57f07a71fec7b413c9eee230b8a1631f1d21b9ffb5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02b9a1bf707ee90667e23724f818453bc614d7e73dbd09ae8188c15214f44718de76816d800000581e0260c7e41aefd4f58ccebd698a2a4697a60d7dd9f37aa82afc17df08d6124a010eb8ff5c6ec42160fa0219c4480219ffff0381395b5b5fbc64d007974cbb411f14107821e0e4557d1fa9d1f15f6f11838f0703041892c1a86f45af727708f25863a0f5eb4cbecb7e4e4d5481db08c1e91573b0038d1f618fd079e76b67453db30ca563a9dc8ce7d42a6e4696cc5b906b83ce867703535c5bf3fe78626f07f85b8cc4f8236f1e4605de32a4b4b0f1459aa1f2395d90039f16b03bf2313e5fdc28dc859bae6824a6a1ebb609333d02b57c947de0c2762303d735b32cd1ab8993546a9f1c2da70b5d2f4758e9d580edfdab69545d12642bd2035f0c20453cab9d341d43604d67cb307569de9d9a45db2da03f696b8c3a8779df032689569be474a9a0f3d3313569234152f66c72a070261385e34865ee7eb16d7b032c07a96120fe4b00dc4f9a37b591a4fbc868352fa8880ec26d7fb7e8e725318c0219ffff0328d5997a2f8a381f43c2416233c7ad8e701fe7585a4ee9db2eafbc7619377bdb035308063446ca37dfee4ca6ecdd2b8a34b32bdf9d3c619468c7616ccb2446719b0312808edbcf03cdf71ba104c290b2222267b6437808b56e622e7f04fcf7f2781d035fbb6b7da7674abd79ec91a54337ce3cc8dd56a9920aac8f2d5862e36c46bda3032df05b3184fdfccfe950c5ca598b7870485656088fffc039590ec179bbe65abc03fa8568eb7a92fb2ec1396a3db34e28cab406031a411255321561a951f79574aa0312b0ba806aaf97816ba1107c8145a89294b4231cb48c88ea01562550a20e5c380318a7ac9e45ea8b80cafcc027831be415e6a219d0d055dac81f909378ddbc17f20219ffff03868664f06f2a5d68459163e168ad49abcd02ff97c45aaf00f6f93f6d61fc10c703a64769496f3f7f7a8d57a4626fdeaa73ba07c90aa25a878625e9f1ce63cd85b103d5a703cac1cf5dd5a81ad74e710bc8f48f66505b61bb20f361ce141fa53bbd0b0219ffff03f30f1db5d3a12552bba64d6e65873c89bf66da484742888fb4962ff4b97db4720341ac2d2df50f3196b691e14c3419de2c89e7f6b9da7be46e5d231de653b87ba403143e864aefa356946424dfffbcaa3c8a34d7552df001d2f93acb23ffcdb736a4032df267b1c58f1f13f86e0a84c4c1ed96731f853f4d58b835a55e930ee8d6e552038a696f36cc00865896affc2d7319a996c92d0b1ff29492868b8b5165f8d497d403a4c9a4448576278e481da8a55ce80cc8623adafff302276e0dc2fae9f02206fe0349609864e05a84269fe86659ebed5d97f831a8dc1b59567b64fbccb0206e18e8030cd72b209304f0e48b7460a1f3085bcaad25729efdfafb492e6efcfcb28de82103e218ec85a367b38d2e76111a1fab3d5ec3e8331ed48f6569af25528b9007675003fc6d8918df4e4caf8adff445099aff73c359e079f7f404db3804b5f6f1d1a64603b8b94dfa9bbd3c7ef07f6c604a1732afec013f501239155eba01de2a1bac14060397d0dca58d635f5296cfdf2547f135a3eb2484fee07345a431d7cd55e7255eba00581e02857cce08c663c4b566cb624ed8465aaa43a6829c5d385696eac1ba1ec25820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02001ba58aca587e5115aaf3ad7cc007018ff8061fbd30a715b71ef8959c5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e024ea07105559d27a7c0a085be03577d0b3be26521e7977b65a6a1e730765820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02c93de13262b30376bdeff424384505a1328e1f2f1ef28ebe40b171ee13491e35893f50e01f680702193804032eb60713a2a32f49d6f54454eafaeb9f270bed84de8501cbe10c76bf412508420312ae8a6ec23cfe12fb64c0445d566e763cf7e5a5ed89fcd52d51dc61d3b76e3f0345e0abb791a9203ea0ad1f00a6448bd2ff06de439bf15095873b93a7a4b48fc003c87edc3b1e07399a45c4e89c9ecaecb87bf107a408dfe5ec144c2d83a640fe1c03d74dd26e53e94e3b49548464fe1798b6704a9e5ad10b00069d67932385bd48c60358727b9aaed8c8de68b1483c2beefe7d50a67e12cb7dc93ca895afeb0cbcd1b20388ee36f1f7d375bfd12bc53efa34b34ae3f2012277ffd71b2e708795f8c2fd93038c0c39bafcf14b6468a868ebb540a2a32b05280295cc64c2998c0d1c9283848203a304a13714ed4c6c39ca2b649e1491da3ea0f09b9f069b06425707ef114e128003bbbe9f5fb48a04275c333683e1e2c859d52f17e0a4c8fa11f07060b47febab7902197fff038eb5d79437ae4753f3a6f7bd8f8dd625067bc48d0a30bce56863841d36e7e2c003ac5ecbb13e65cdaa794f562f372c4f03f2a1fc3a96ab47b2ac4a67757599d82e03e593b2132975c139cb7a3f15b1424dbc1dd432236a98e92a3541aae7e9e7924403fd39061f3e76fee5ac39908af4631359e0ada38938f2a91b01e5eeb04e7fa866030c279ed1d48a4dcc65f1117aef611aaa1371b26441abc123dace170716f263bd03759161ae64aef9ea7243d45a3d1c92c895172be221cc472760dd89c20a0d5a99036c6d8d4068c06c7be7676f2251004a09ef858d748dadd6a600105cc4d989a025030bee7369420d4df0b42b12cb91ea4390067c646b1fae232b4f5cbf62b7c31d0c03358259513b499facbbd32ac6a5a57a5191722d02cdc0c4aa38dcc07a1901272103d3d5dfd8b648bde2fc5c7708510de7acf7f81d687ba25930f752ff3c2889c90b031b45f6115b837e012a5b447d135ebdd153e893d0d3fb414262f6dfe598d14202037e6b8c0389015943d7a640799ef029e67dd93bef918d028b5e2708d1b36297550345ca8a38666165313ee4c99bddbcebc8315f2b23d44863e5b3c55eda4e00471d03e2dae0de86bef66aaf65c03259a46ef89afbe2ee582a6e69cf7819db0fb43bee0219ffff038225ea9e703d8bbb4f6b14051225fd3c46f2cda48d988e792d7cd6544ddc5bd20388c1e701504e631c9504100c66ee5f907fbd37691eadd5e0cce51a670e0835f10331e7fa9afe57fddb017453c3462c3b33f2876d7f488560d6df71913cbbcf2b2203ccfdc1bea81f23ff6f66f6ce7d1877991888b624cb9693e0f8a553f3987d17b60316193561c88dff80996927c305b461f0abb824513f57aa7d44b5efe2236dbf9903d89dc04c7a6fdec1db6068838377ef94533b1ea6d92e96eb15f874253020ebe80382a265fde8df439f535d8580d21215af31265f916867b8a9ea940af81d2fd094037871ef639c7c31c92357bc2e9b234cb80df700511f8765348c4f1808a052334a030c55f471f23d2a26e81a6d49f0ed32558417990024fde3b2609355e0dccc0146030afb0a3715f3b2372999d28054589bbb3c776f65c3498a8d5ba26b018a8b08e903b6a16df56eb6c2f25c244b1805554ecd417bb79f67c4723ad68a1d584e0a6bad0219ffff03abdc40a40d74c909d6c5969ca704a2c47de796e6eb989dbce5fb87abc8d48249036fd93fd4698121574a30b52e86d91cbe42f240cbc117e259f8f0311839e7032b03515ac5697ce3707644b69cf4206246c5517669520f654377275ea49bc4b2a8d103d0adb200f169d166e9e5e9d81af4e093b9041f3d0d1a958a01b0ee569b9dbf6703f94f2d084434d37ddeef352707684367afb4d47958181cfe051740bccbabe8bb03f0fbb7dd9b53dd7723dd25af7ab3de673e600ec3fe173d89367e5815ef07460f036c249ff03bedbe861f0739826cf58c51b2aa49d585abc685db16830172d2bcd9031af8f3406d416763f5a454c3badd4f2a46c6718ff1dbbf88c6236dc087f6a8e7033121a3e0234e42053ab25224b4542b6b0acd3747df58d5847fbb17449c67e845034326716a338902c7a9ab2fc3ea2f3246d127c3f93c431d9f131c813db570fc4b03ec0ae9cd3838fe503bc1b95f4ef6bceb787b61af6c35acaf17985ba22f10f23a035602f7ac1b3624f8a4ad0e267bde5d93cffa770f7692b569fce9041fb0aa5c8a0342346751f6e3da33637657399f21e36b01589b73c0892c5fa47d0cb8021bd7ea0219ffff03d1b98a2af1109990035484b831c6ac45c0fd5984d9d2f521ae969ff0a6a185fa032cac2a24829b353773ed48630305f361398623dda70988310944477c00b8cc5a036a8174032b088afd567906821b0d552929a62cd6abf5867a05c71f543cb25bfa032985f35ac048b808bafb691c38e0be54a43dddd59bca0e7b90cb3fb9d59c6c7b0329870c783a7db76ba69910b51b8824b8d3883cf91c777660dad478359bf9f3ae03b96f9cf6ef94a0ccc8559b5b1d07563d2b1e7b5c997eb4a2c1ddcaad242ee7c5038e5dc4cee2719f0ff12479753f2cb032bfe96eeed75edb399fa8aba6b32eef33036b085a429ae07a3324cb8a84c786b761d95206dd466ce3c8a9b24c03db04596703bc85b450a89aedd07d872bd64a380f41ac8c7d3b4b078b859e2ea6aeaa82338803539c4a0eb0d06a1e7265dd47029b1040de0df55af1c0d03203844500a09853dc03c34dbdbf1534b851000ed8704a263c51393a28f9d7236e2e29d5318b91726eec03631710005e4c266415ae96480ed91265996ca3f9db83de0537a72740a12f6b0c0317f5d82c586888f62692345f5c0a19daa9d6282a2f7e5b70d5e6405d61cf6c9b03965d7be8ecec83fb96be522c9977c8bdba99bd3122184808e3a69d2327f668190360320d27bb5fa06d28e1a1444c3fc79127232fcf89751968d304b01afe50605d037eeba4a194af59c1a397969be20fca14151ccbe8671110426680268276f4475b030ffa72f516be0d7c246c938e08b62f3029b22eb5bc2470e509364b0aa98167f9034af6aa1143bd52da01a5f674d6fd056eb3d64c4404c799da32aecc45d6a1daa0034db9dfc6c07be23ec3bacbbb30bd65da8b4c3375ebf67143a3f78efa8b6838ca0355b89c799b7367a12e3f36916c580a7c05c692c2d7454081332e73c1fa57fba203f426007ed69b6c7184c35c5a09961ea52c877882752c20e696713c89d3863b22038a046a9a03e046600ef64d62c4347fb174190cc68eb5c81d8680aaf6caa4e96b03e14da8e677d7bf1367cf4f82affb1d08dde4beae34d0d521989560196042014103b651ec2c50ab012c0ae178bcf78d72bd621eb995a4223a82cce3a2b37efe3d6d038c40aa81e345d742ac16f1847b9e923d01ba1071da92df0aa577accd62f2ce8e03cbbd81ab6eaafe10f46f41d716a332e8735dc6e282d130cbae6b2696c1f827fa0365e3c2140950f1882fa2861c42442ec159616b1c650b4201b9c5116ed271263d0384457af785b22b9927ed644b78e149e88d3e2f07c2665584210f69625824c1830323854148a2abec26ab9ea4ae470f21ceb558744f45ea8ec4c2190a97a08c13ff00581f034775b60761b266b809fe7d7ad099f545463806f29558e5339d6f60fd39b05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03dba806f7854e36e2d5a172bdad964f8c2ebe8494897a7f9201dc9d9617861f4900581f03369df2687b35cba76c7755753e5601d4bba7cffa868a0b7d5192914dd6405820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02379ca9937fcd73b8cbb154d52f12bb04c1c24981a6281db4d50dbf4d684755c19bc993344800581e02cdc6f4fbaf1017b1c49cf6308a872edbd711870c25826a213a8280fb015820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e0263462a3822bf8e70995fa3e5afb487c6ab731941329426ec54703d35395820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e022d20f4b110ec13d9092915f0bed4a9dfb442bdaf885300b5a183287b85485c318124cef2ce8b0219121803f17e745ef63ebd72f822d01488cc0904536de816367dc56f0876d6922a783633038b5469cc0b44d2e9db0b955f797446486be8fdcd9394e3774a948e833e7d24bb03072cdc30ac11e9c80b5de8e4abdf9bd36f24346bc6b2d15be33af85d85559065032ba8750770e5a4c551c4c1837bacc16df16f760c54f83e6d434955ef84379b3203860222e57f686c9ab066d727165c4dc48c74360fb76329bab343bfc0fd0f65eb036c3dae84239b7b12d856e7639b4f5919c4366fae4112938ef721bf8fb063b0f60380fa2331e74be8763f9943e30785578e8d6fb354db499af617ac315e2b08830a0219ffff030a6ce6fe02bff1b75de7cf089b9f07ec04fea3806600549d7a97b932ba71988803af8bde051d20c605930c1a02adaa96e2e050a242c72bd6052b313473dbca192f0390328e18d1816b34757e05be47f31b577730daeab53124da1113016c3d68a487036fa977c74341cce882febd2520aa642944b59395cb70de209cfcb125beb7984703477c7c06b93d5abe9f95777186600364782a600215f11c343dcc1816c609b3df033f0ff1dc59fc71313d4b6d3b01a04dbdd2d54ed5da0da9f348c0c06fcf3fe941036d9bc80807c8076b4414bc4a5af1d61ebbc018e182f5f515dcd2ebd0a14a78540339999a2010055e3a757800b6093475ecc0f408e01b671f3cbd0ba2dfe27e6a2a0219ffff036fd3ef41defb086eec251560fe6d9be4c6a2c5d85c4acc43818bcae23678b3e103f0464b03cccf064b6ba7c78abb1a444cae24d5b091069e8f82fc8e68387c6d20037746cda5e593d69d211fad2607a3701eb1b500a88b6e157f9ae8a43686e2bc000309e12e8ee728c66e0adf1545fa238afe1778136d7451b9719534e2f9abe1a90f0219ffff0334798a85a8a4acacd23dc115fc06d5bfccbf9f4c4fee0c2fa2daec26d2feeb910306b56e43eec239a9e51c0383d0862f74e379f437edbe1711e021dece3b101c76032e48ab5d19f621487d5aa22c8c3267c68284a97b8e631475d322d8e7b017789f03b2df841d181768846614ade1ced23ee1da3a820cb4950862d5d1883281a32c37030f610584c8d33201e59983875f6efc4b83531cd9df633c0b2e6a8ac20f9790e203c5ae38c7e72bb0d5d0b37e61e6608969ba0323a70bbf3ee8d78f5ad3c3531a6103161f940fa3be226289aa4c980589ed25620077f6f43de6c7ff780ef18edbd1bf039adee46b226a029846ead94999b4b8099f5e94fa01fbb5355ccdefb5efb14e090319ca36df4724f0c8caf8f31cdd13612e952dedd6418803ea9b4e011be5026d2a032c55c2dc1036b12f076fa6b992ec236feca41f26b30b05bd0f5d3b2c010e7a8003caefafc905c6482552d526f390e7fd7614e59c2ee750f25c381909a60c58547203fe247c1a6b28cff79a5b68288d61f141fdac830f8a108b512276310d37bf720d0319cb78c3c056be4a2ee7714342e0c2802779aee2f99757f0de6eac341918695403c18f7a552ea135f4f2554039ada3c883666a490247390699969e59f2bfbf592603e64d8444d9e807adac51cce58f39114762f56b7ed5d30cb7421198055576e90a00581f038b4aa533fabde72e405fe4adbf787c0d19b3136008a570a3edd8fdce05c0412a031429e6c8bfc0bf939d05c76e4948bb5f5576e5e53d58f301b747d8474d62a2ea01410a03cfa54c9c989a9d371dd8c0bdbae19816d7962a56cf291e9f75bd2abbeb88d8a203087cd2d74d19cd5b71bbdad6da34ba1a9d6bf232d331debfeb8ee8d8048fa90800581e022a00d6dd8fbf187cdac84c31a747540b69c14d0dd18e2cbc14a7ddb8b95820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02b530d6bb8fda542e57acc1c11c8ba1ed193508f93eb9e9da973e35c3245820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02edb846397b821658f7d758560f1cae33066b31cf7fde36d3692a5d26434907d33cd603004aedbf0219800603f1a4b63ad4ce62990d7e586e28918b0ae63876053e4a51a6e90c6519ad76dc160322fb464ca8582b6992a768ee706e9c97bbcd8ff9dc49e3811d34ea9925ce64fc032f0bcb70e1abe5ca44d6334625fed63282e90c091387b54cf011a0baecce7f7a03b699d748b04b3f8cd87ea98f4682176bc632756e1ce6df20d1c35ce77881ed97039fdfe7653b043f4a2b30896d98115586432b94c93c4d9058efd8797325dc91ce03e46ae2235f88f4559b28ebd9111d0544ed99e50570536a364d9be10063c2e4770374350f3cb77409d14b21070871db39e8bca8ce30fab0180e4edd2fe71e5771b9030c989f5f7329323ba31e737984c3ad1842b90acfcb292683abf228277a2d2e720219ffff03440341ebd49a41b3750e6fadad6b0111fd88987b5edf1c2a43701ece64995107038689b35440dbdf37d4c24931e4ee7f70729753d6d06fd72e286fd81e92b420ea034aa624ae3efe87cea4a0d70b5c994036de97c7a69c420085397af86c94c99a0503b103e0260c3aa0cb520906bbe7578e2a12201c715fa148b44d8499d3a47dd8fe03e466152c67b4fa77498bc599f85adacba8b17da66c9cb05e2bf7afc9b890588f0398c42f9ab9199b3acdf4d71d9315d5910366673e521a4b126c912f1fcabec6160219ffff034e6da7d288848fc9f0692e238c79442524c8629cc91db5e381dd2a3cc825dc6a03e75ee3343719d4eb14454785e4932fbc2ce32b6f56ccf5037ccc4cc9787863bc038b49c4fb5938072372edc3f07597e7625d0431c54927da065e66b6ece6d9bdf803f7f23f0b0dd52cb4ac90f64a78e7028d6f129c27f47a20f45315e57e2edb976b033ac46e89ed5ed4700af778961404aaa4f5fe9154a5969a42843ef43115a1be220311bc23d116d66567a018fe812f7ec1244541ace448316b670fcbf90d719f46e703058ec124a8ba88e15a4642e3d04f5c966eea80304cdc0064a04f87e5fde9de0c03a5f01eccc6c7d153e5815a603e3bfe5876dd2ed0cbaca481ba9d603cc05d202f035b9c5728daa8e3034b4987036eea0b66b4cbc5155fe6beda6e7b61bc6347fb7e037eaef7433e560ded6e234b96831cb8a299f6bfe0aa1672eb3f98510e523e0bb40307b626f0dde902ca6f074828cdd814064deddf6b0d575edf91a288f6c9488aa30395736d062244ae5f7341a95a209c2407e5fe9fdf5d867573288c38018277355203be7e31be9fdda6357c98c7f4853921cfaffbee74c23cfaafb375a05b1e15a9650219ffff0376ad06843397ef66cf3051ffbd895348e4f119285be382c7b0d57346056d5b100300f08fa889f8efd51a5a1861eaa865c32843ec0dbb99a2c467d59a2608466d1f034aeb2b91e2bed2cc16e45e894e4106c38d6ff4ad1e59a1866cf141df2a6cc25803a58eae89c1246c442ff5ed99d911fa33774c6456c77ad9a975a34cb266350bd50399360b1090000d036fc06eb0241d65ede1e22ed53e30b5f64d5911839b3f4f19039ed380b1fb30fdebe37e745e30ae555fa301efd04511798a2d64e5f9d806a5f4039e47b993b882c5284a354aa688abc1ac03780dcc06a00da2f93d16caeb5782d10219ffff03ac87e36e5319e1c55ea222d8bbc3cfd6d61b3fca4204db19becb37bcc451fd530315cf47f0538aca517ea532be21790318a2497f25330fe1fc2a4c0510eb2763a103d005574b8cecaa1e4d9020ed2be3bf92e3963ca43bf7f9085fa1c26f27d34b9d03c95110d5ede1b68fd2d86286ac891c691432ad13e85f22aab18faa1eb107d4bb03e3cc69ac2c2c22fbe8e9d77b32c9d75ac06bc9e83ed5c550af8111565d42c2ff03bbd0f4bba80ad8bcea192f20928ae6552fc48ec518ab9ede4b641e3f100ff8d10300f698b4cae7fc2b75b02c76adad4746ddec09d9afbda9aa690daf90112a130403986eb4f22080b9280bb83c62024c12c97cfb3a2e6a5526c9b6e498ba7c071a78039a8f171c4e5c11deebfe5ad3508f46a68424ca0d2616ac3df12355765bc7b631034989925510847f56bd09c145707380adce35187415f5e105e560b4b2aaca51a803cf3fd5ede6d1db43437bc4ac094848b2e2a34b90af4ba42da5c08117d351a59a03128bb3bccaffdbaa5ffda65658b5b08d7f774bc8ff81ff8e8e28e4d3aac7b03b03307fda99e8f58c120c563c670fe7c2f0ad101bf7f5d6a89aaf22053442b8778503aac1c3818b00e9abaff21a0112744c16198572117a018e20bd10859cfa9e5ddd03ca4a7d4366cc6abe4f706fd6455bde9278d37b59fc261eda35551b61520897d60330603e90563fc3e07272ce5c3871380a177c3082e0aa127caed87991b83af45a0333e96424605cafb689b3f0254626ee94a3e32d41c100effdf034643a4ed0809c03d73bc4af1f2c30dec11c4f2127f93d82b2a3f115be149655964f1be54c4b7add032c2d59312df5b0c914656274a3b45dd0fa4a1b36189db319dab2eb78d11bd790033934a79507275815e8afec659a1e59385809f95687728da50d63ef2ba60d1f7603ef44482550df95fc65f1337ec178e490dce4d0abee7856b472263a89006069fa034665419d82307b0978a6b7eabcd95a085e7cf9340312d414658ad93ab115ae010325d48c247517f7ff07647921f64636164cfd36fd0628cac68452edd1f6c92867030baa45aea7db304b53ac53851ee1dd6ef1106b8faf5519e468c5823e8ec7afda03d4e7a777adaca7a7033905e4cc9919712165bdc232d0779b1a0069ded4a53ffa039c4f9c6946a2018e67d459586519108179557da575955c41a9116acd4babd92c03a74d51eada7cc555f32e6d06f2b6b65462f63eceda9446d6b489a5e84f15bd3003ded394ca4fb7425ab85f2b64f4a9a1ad50e769ad160b6c4abb242fe2302125b3030b2feb92c8f89d1fd4025b93577577106b6b1cbe33a4ac2378d36ed96e7cd3d400581e02bd9d4728554bcbd11ee64fef531a3622b099953d0d71ee541aa1d878a64706c00a3912c00000581e0262b8218fc769b3ee83f01d809e12a5d65ebfd8369ea90806c48057a93c49093dafbfc84712a218021982020335db81c736691f8496a34dd621e525a010ec7ad11ac9fcaef2dbd3725c05328b035743b9e11402254c87ec03f9ef1db818f8b03b57bb76e536c8d6aee2b37f8aa403154c167ea3200785ec18df7f3761c5f0196bc4e179dcf7e95868a21785ae831f03b25db63b38b7932b8b081cd68e356792a24ce23cb4f8fbc179155b3931cac1610219ffff03da750471e3ba4d760089ba23cf7c57f3a37d74fd20a0c8617f6faa45674c0b450374045cb59a5cce2c414144522708a6b01d53bfdd7c9a143604129552e0af2cc0039732be93edb7e1468d085a5086e922dd56790acec23c5633b628f4c91122484e03d6cde307dd180285b82bd662e39a9057f864540394342e0c7a3de2c57a60f73e03df00b2d3cc9aaf7cf3878464cc9d7a14f61c7a8666481f18f7b355860f06f83503ebbba500edd5e0d799f678b7a28e42873e7c4ce400273b68d26c4680f24dff8c03f06cf93cece3769a3f458ce042494d2d7563c69a10575fba35a0355531463c520219ffff03605369d2326789307d9e9cbe34a0447ac06d1bd8cd7e290d08cdb06ab043f4550330057cd576f23de643915f853f1a956809ba703fd7e1ddd8ac2b8522b0aee3ab03a408f882d2b589b5ebed914d522c7f2644a96b0ad3f1492c5747d615ff3aed9e03581a9f6c9a9ffebf499a5a737e8c6e3751cded1a3fa4923a92aace00405b375c034596194b49e83ffa76a715aa8cf195918294c338ba5984f5c572001e9c2c5ee2031f7cfa7f83d6841a7e1fc616342945564fa285b9798d2cd433ee8d3ba53a9f6e03c9ad4200354ef9cbbaf9d937bfafc89d1c70bd64b57feac214797ef494a45d1e03ea93fcb2ab53463f68ea1aaae813d9694a878c8831f38e708986aef73c5717520345c2a4341ca212fa64da70bd29bb1bade3359622257d90cbee46f95d2bd65c6b0219ffff032a0b3467f188c5dc257b3f5027762867ea0c8e22f456b834bd0e8d41c32ee09b038cfc902c1f9952b277fbb430bc80c0a4b35df7b073f854b49355b17fbfe36edc03ddd7e926707a0b7ee5115a82668cc7e2ad8e1aec8752d80b6e840e0ecc57c1f703b9284afa5f001baf4c6829083ce0527f19c3875ed1b0b2cda94e4c62ec04bdb0035f4f3b66f94d1daec51651e5b9a33eb8dbc0ea90f0a88f23dfe36005236a47510305de4330bf407d7e333d22cb367cc9e40da789b71d74ebbb906ac5272e110c3403ca26f3f2134469b7c3e0b4c71a4befdda217bdc6da8a2331e9c72bd85959fb4503b35005e34eccc3d639b90785263ea33d9e02e8634c70b5d76f3f8f9c37b91cfa03f09490d56b9721f7e5cf1b817de0388ae73814bb8ad975cda7525f207c7ae0ff03d2f0691e78eaac4302c7dcb1aa81e997941d8d7a121a37d7c0be91bf03d46ac3039b2b8e335cdde04f21804cb124b7a3269680fca8294e6fca53fa74b729b6efc50383fc3cab9e24b99e91b3e98105e29975ad7deb3712756c02a08cbcedb519f562030019d418897f88c1b72bbcfb3b156a2c5d9e9601a3fdd927241f2a20dd9a73fc03b4fb4ac48971e0c21a1e4e77602697b4c8add96964e4984cde5d0ed8cb2caf440301a7af6d4770b9591cdb9115fce837f1c32a6d1a1ac2df8ccb5fb634299fb7ac038122973066dbc6f3b8d5266f5b1e0d71c669f766e43d67dd021c53b2e81ab7d803512346813a9fab291dc9c87125b0b84c905ad7779f9e6b1fcc00ffa91a5e5bcd03c3964da07c5d9a5f441c5c4ea3fa85458a9de17a4377a733c0bf350ca313a1ca0302f48797c0b0df1a974a9aa027d4f5715c1d3f14d9a1f584d3d3b025a5ee5bae0333f8a1b6bb14d23cc94fc8dddb95e10002f1db6066132372a666406ab5e20f8103490e8879fc4f8a90265b865d5dd58f7fd5a5b8650793beeeee1d822fc9d7985803f2fe190efffb9379d26227926c6b843388580ada0b1ac97707073b8590ab9d1503197557c84c324d352229b51fc3490f858bc0118ed0333fbcd5dd23d1e4072f9103ca80b505aa62463c9182cfa3e9f0c28292112664d8fd3ea753896c79f6626d4203ef540ba75184e69b0cc004d495f23b89ee474939fee3f25b105c5b04f7a2127a03c75bf5c5e7fe7ca77a153124fbb30a4f0747251a934f89942b0b6007e7429e0703c83fe45ca5c6bbfae8e8f08f2dd2764fbc69afa3add4f1982b3e1b746963a21603cc7b26e623070ec97b3e645d4a4e32258bff6b0597b13923dba3450501a1e1ba03a72571c1a7548f7e4d279cb5673acc2ce560f0e49b4474e6fc250813a33df499034a589c1ff7c954c05f7551736df580c4e5c1813679fef8b09e13bc2028e6826b037c522072578d99241a8cc402e952bd4bf4e70dcf7f7a30d8eace2f084eac40e403a68d56d07484a77a04ffde6195121db303e2733c6296aad526784d1fb73d01db00581e023c8e0285cf1900e405e4bd465e219a261ce68dfc8bb46bae3a7ec61bb25820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02a8075e9efe61170e277642bc016106cb05fbbf530bb940c05351b2d9e95820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02030340c3eaa78234b5a8d7b6984550b7aef4dcddf380f80fd41bdd8f57c7a34bccb903f066e73a5ab76f356582aeb52015e96dda876e378db9b82a07ee3c11c925852203d528008d14b0ea68d1459f570ef0f1e2e6cf1ae4fd51ef8249636dd9dc2b8cd6038f2e37593761dcd15cda6c816d6491084b2d00ad3c1fdf1deb2abab4522ce3ed0361d9e735c3026a7766ebf912d3aebee68b957be15a2ca91ef96781cd527d0a320219ffbf038435cac3808c37786c5115fa740d8f4559645332fb324bfcfa5a0a2eea6e64090327cf05b796df0db9d7d45f3b0170992c4fbd32069fe722cc894340ecae0280080346c6ca1fc27c397199c13cd957220a4d2617afebb773ff19d6f36486b76c0d5c0369c03bdc9c9541c21db422d9fe988e3bc61936555787ddfaef8dff6648b2bf220219ffff03e75c34280a1e1a0130e7aca3e8672d1a3bbcee1d77d44b1fd22a72974ca9e40703f0a73deab7990a4ef86a318cc01a26746704d936b0b0dc140ffb3e195bef06a703c4f3db34293882bbd4c735c48ac39a4e2585a61e323d8e6f71e4394ff863917103f6f723d8186b7ca6cd8f7b552bd18ca43b70dbffa812da9692845a9d484d833203f406e06e559bba217b95d19a281dad191745d1f36baed4c23c7ff8d4e82aade003871cad120c9f525378edf9a628a263c745a78bd4157a599beb30808a69bed50d0219ffff0371a332e4e5fcba54eb9513711d6e5685c0bc49580912c50d8a0a329621f2fb4d0385c456d6052bafb3bf7819655386ba3d910f492c2910a5111f90a0d19d25c6540339308781ad8bba05feb2fa8448d8ce898fb892e3a48cd020fca1a5b914b8c0890373385fdf1d4cf0db13bd7b90b8de76d16225ddac8c8b5a2c7f587c271125df9d03d057cf424f960ff9ff7100981f9e78d44c4eed75c72691814fe7655ceab1e5cf03ed7fc30365b94dc3117660dc1ff1b6789d6d5f69c783e607e2d4cd5847c812f00377fdeb53cb20bbb58cbeabd6ae9dd945425e031379426655fdbec582d2552e8403e9d17e85f6f306f1a2cb53589f236a9010da57697a22055661a069ac9c23bdd60219ffff03de55e752f85277160ca0c958b626d215dda2b2212d932a332ae210d513f420220393420ee59f9e46e777f22f2358d112c200fbb0f857c38cd49ca1743f67c8e11703098d5cb8af66482cbd329f87a5d36a565123ea86e1b84c053b7da2f8a3df91560387a34ccc7a808911c771e3c6e0f5ce337c532a15f33acb467e187759b488a9ab03b2bf7e8e41c5ebc14f6bb25502940f7602f6401d83008ea5c632284b1b2ab51703a5e5608821359e2dd7899f2ccebc5996a15104708b6d0c176432961944d5d98a033a2a07a4149f7abcc62ccc216d108236eaa6ca25d8995492d3df2c9393e2464a0366cbf45c2030fc6292e3e3ff8d284ddf14dd52877d8b70e993377084239cb60d037d8d41815206c5f0cad4c7efa74b25b017fe4e5dbb78602a2ac33ec1f6506f830310bff45f08d6a3e5fd85c78e86f91ceed9e687c6b1caefba6c9822d98d37581b030e9e87024dfe942f3b54c682455583cde6a346774e0f5cf51d6d4b3a847374fe0319841636fd348885958e3098a09a95a190606045a882596044c74916b03cd757034b5ce9ea738066a055dfdb67fe913c40460dcbbad771a4c817de558bdb93693503ac86b5dd4c37b7cbb4174d27ae198c911eb843f2efaf8471d9c751bda4ca4e6a03fafb58f2da9159118ca12d3fa5e548ed08a3b97dddb0d0a23ca28abd9c825235039d01197a47fb946a137122d34dba1f2088bd3a645c0f25bea9d91f9979f451fa03af32d65d8776aa64f530b288a53827ad0a68b6b8157f1a823c6d23976baf863a031f6c3c8629190b2e0c674bc3526e5bc6ec2953df6d69b81276b88a5c6914949403c0d57044b0fcd1b905d766f8c4a370225a9c0cf1dbea99831bdaa530f0ef998c03fe67c8924abbba53dc3fd138e374dae4bd48c787de1e3c458f8180b4d99bbdb103fb9584fcee4828d57051389fd7b0f858d3a384e1d1ea2708d3dfdaf5f2b80ea203b1f0e0252caf7e384e90ec52e8c1088183cac7417ad0b3e28c0e044a5bc14f6303fb41e91bbdcc5e1aaae8df9700c1c4e7819a4746b2c96370b9ad4c2eb73b1f1f03a9170a06029ee85bbfa1a4425671ba86df9ffac37e893f852610d2f1e9d0b82b033aee03ea2757fd5fb1c6b2be9a825a13e9964d77d39faea9e74fadf47da10bd30302a018df65c3e244c004f44dfb8f6a437edad43b9d07ae320d798459dedf70b900581e03113852dee74ad8febfa99ddea6af9ad2796f28f1631cbf4791ee4b4ef05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e03f1a75bcbe79e3098dc1337e44ab01ae65d8210ebf501375c1c9014b3304878f317b5af08a25d02188400581e022ed51b8a614df515870318e87c7f683fa5cca9037b05d7b8f57e449c835820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02caf77d292916f019559fa894479f878f9f7fae27bcfc38a5954a7ed69c47366144e47e735e0219020900581f03d1c48fb50e219353cfb47172db25c0c309d78b14d3ba912ff01fffb798d05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03d29663957ee0dae4aa956da6ed2655e5edbed1c8a415ea18992553ffbe0c0eec03cb5c06ca8a269e346691a9a5b5903b3521bf2b08cb0e6661b7406a2953e1c13f039f66cb897dd12ce94dc946ee9277c9609d94911a5dda51adbe78d4ed46694b1e03532dea9a2d486a38e9238aa125fa46ee5cc58beb6d7a140f930f915112d6c0db031f1ece742481bae0698023fd5886cf5be8b7efc86b6f3fa1c8b78c04f9abf6ac038622397967cf62d43a0bc5a799a1c0a160d875cb0c63c2246d45fe0e9dead2840328dad53e94e600e16331fba00fa2e30a45d764f3fe65ce9a537955d5c327dab1033ecea7ac7af0166e5acab7f99de2092ae2ed28d4015a6bc72b73dcae4572e6d30351dbed0078607a2932fb8fac6b051c9c4150a861b920f6e3e2bdaa7a41905f1903e99f98c6f3057b4118a9fa16b370da882c431a6b5d86a02c96cd040604240c550219bf6f0379670dcb9e05d5abb8f0ff91dd92591197c03b8f3050666e87a62e6b06f763ed03b2af213d7f943824d7745f371bfd477c502954958fcdb432e90768b73e6eda980342776febfff8238bea4a5d07080bd59e7dc2920558b4f034c2d3b5e1b190cc9e03b2ee05bf74b2778eb42aa92c2684dfd96ceef1c13945e2ee25f7892ddf580e97034887b53329e1649f98c8ee08051065ea3b6c3208996b9cd777f604e6f28d51fe03a2fcdc451317b41a57f41c642f5707440bd1f6cd382a34679d78575c5213ccac03c4ec75b0dc750b522c5c275a92615aae28a91c304bcea4166118519bde6e0dd203aed03054438d58d9df8ec7379daa953507733b8588edc30ba8218a53a2941b110346a749e9c085bdae32057a23737e9ed4a2920181c86b095a77b8fece6bfc3a180219ffff035ec2a3bdefc77a6e28a5a9c9e0cd2f44e4dad8541a45dd7b19eaabfd059da102039781c273b709f60c5e002faf2f2e575086140368fff0d5a78e55e875551e406b0219ffff03f6505eec45a3333e967dd07a2fca6c4c46022ce3ef7f1f8284c48c2b2f652af6036fec3b9b8e8424b1f5b734a10d70b5c57bf279903ae7d6fa809c9945f7384ad0030dab9bfa75821e67f2d346e5fef4f99c9ff4fb9ebd9f3a2fa96e54116c72ce03039d99969e57379077a76ac460eaf793d3ae5dca1a363d0fc6ae9943faed37aada03af2c278a9c2a5f9faad7fabb5118899aeba061c7496d5004b5f992d8ed99c4b70373f9e7ce8f604e3cfd98b6450327c48fc4e21e0723fe24cb36f307bfe1d6f7c403e9ce92ccebae7e91013a85b5f9e5d9c214b8b10458e506b444763e41888079d3034abc70ae670a98f36b74e3270a7d835d2062a8c808475c9556f6d587af86519d03ea39af5155a5e6756def4154244450d0b92db15ce575eb8a374e0c64d03d9e6203e0fb998c3862acdc676f1b2894ead0ac1c3806268a0223751c26aa528fbf7eff03f162f10c99b896604049cb0ccb2ea774a6c2f3076348a00166c18541fb8e851d03798160a5346fef9a5a70373c7f67f81224e0471e9b86ed337d38ede03bc6dd0f03a8a267999fcb620a60c89fc18cb70c8703e0ce206065f37dcc94e99d44d71f810337a13ff13fd898079357e9bfbfc3da1969b18da365c250fbccd565cb97ca34e700581f03ce7b1f7a132ac95b7202aabb486604ad8af10d8d747dcc1dce47302965105820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03c60801b4048bc95de2b37eff6b641d56a07b4ab863938759f922b53be9677be200581e02988ed9ca2b0ba1f0c0d9f294b947e56f4ee65613fa7c968917f01d51c448019e2e804b251b3a00581e026cc869e4f53917c40b9bc6711be7923f6b86e5538f1a6ac40f8b0e28a05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e028ea50b7964fc041a4159fa03658732c3b4a06d3b2aeeda165050c706655820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02cfda133e13b02bd74fbdd9dfde0c7f9494d88c6ab54613416b0ecaa9925820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff021908700219ffff0353e1e00ae1dd51e6ab3a5fde1ea00a8ff2b0994c2a745397ab9fcae937a1fd5903a30c74e204c070ca575e639e41212a182219513cd6dce7ad60874b5e6fad2b07033f0437d0ebb7a6a456fdd7db2df487a65c79e0c91ea0e7fb519b2ac25e204b49031cbd5a1a4732ef718f81684227017c2b4a7ce3ad3b2bd20fdd5091a7906d303503c93000deb024f09068d8a9463ed48ff7a096f648f1e62e2455cf16be94d3f75603f53525a2b0f99fc11945e3c1d81053b2d33c70f0e631877a8a52be10b348718a0348b75a5f195d3c23748bc35234850ba86d51e1def297fac3fae5605d05b891b9038aa1b95eb47dd925991ed5fd636394c36fcb697700a51b45ff314bb721d7de110310fddb29756d0105eafa0e69e6d351f111a5cfad8c16ec9f796e654cc01a32db03f0060441275f6fdd158cad5d7e817b4d02de140251b437260052a94854d41e3103dba02deea77fef3f1b7a6835c27cf1e3a81b573de948b52246f68577a16c889903fb6b7e10d8c011e0393959dff2c1abcfa3ffe6dc464f3b7a924176163010f01e03866aee14e2ad5db877be4c4351a929d4d9a5dfa6cb9c808c5f00c28268f5938e035c111587844d5280e8c28f1e91380e48707b766df0e2c7e4bcb5724d9e2020280219ffff03b562d57b698138248caad5fe7d788f137086bbb7e702f65f8cc0b6da6cf9f7f8033b83220e9a4fe0fe402aa51973f429f72c4e3b953e953effc69d8d1a9c1cc0dd03e0033db505862409002f07627372b672d3b457dd4d86009318e2285f7f43280a036f6a677a6c0e41718528e36f72fd7b664921d5e5d22668156a67d31646da7c80036c3d735c842d0135fad8c3e1219ee373442eb6914893883715fa0522a9b3c759036b5838c406ae0ef2ff13983ef1deefa05bd67408bc8cc80ac33f2d82008cc1660368a400940a558d6d57b4b7f290d0b4669f3653c7c470d86e5d7ffdc351a58901034efba55309c9c3002d965639e077fd37b9398b4e07637b6b490479279043167703f91e8b11ea7761c23ca9b96640f9981bf2b2dd055a1e8948d591b1d1b4b72b4f034cedb855c749a35ae794e2adc0defc755b377f9562ed9826fe753b8b96dcf76603102d61ef180da5d8db7935707a75cadad9201ad415eb3a6815d204736e6acab5035fc353e2cc24154b48ae2993ca7726fad24c813a0005b02d69bd49b622a95a2b03f755c3b5f5a853db34fe9a5c31d752203d9a644a76221de7f4e433edb1a77aab031fdcb4556e393069eb4f7aae10f491ee67a3c89958a49b5308ee1be3894174b8031096cbeb607394ec2434509c8b42e35ca9644f553924415077e307811c61850c0219ffff039c2395aa57704810c6bd7ea9100be41361e694277785d873815628627e2d5c000304dd5145b61bf1f675c1fc74aedfb1aae39d1830195aac4770d141a5fabe1b1b036034608003c389afd9e1b7e398ed580417eaf7e873e6df88d3061fe2441cfe6903edc737da248f5341e69dfab21930ce0a771192006622408e7da9b0762d078a53032ae50479991369f968359a1df049a4cd1b03283f2c90a2be9addda0f36f37f0003da02bac192c1ed52df9220552db01501bf269f350f724e728bab0d6dc8f0b3ab035191ae25e23d4de6345142ce1e195a474bbe11f9e31cf4a74c284a0f3c2ee233038ad125d0706137c066c450f6d4404f86f009b4d6f753a0e6d9e4e894e69c89d303d09c7a0985eeebf3f9027155156efa71aa0cdfed7ff11a35165cae6f75b14acb03f69dc43cd31b14202764670122d65e612917f6c5900cb46bd91d6725bcee27c703148bbb8d4258920138ed95efb7a12a2bbc03efb059d37bda0adbdcadd14bf7b603188b308f812d3f0672ebc7bc63c3f53bbec09a1dc319bee573194d3a543cbe150350db007108a5880682fd05bcbcd3af967afc8192c59cd2d4a96d7baa5149c3a10322ac04c0ff22460f8a6ef7d1b6604a53a2f688724023ba23ad882978f16cd6c9032e5faef295dfd37a99fd1b71078697e66a0b10d8c7cf7d4faf4dd81235315f6a0390043452ebec4718702e627de30bade7e35a106b5834c9de26de64ebcd41270a03ef86792dcac18b4e4c020bce4c0ea5987ed54d16bf66dc38196be5e8d95d6853034535f06eb1130ac507e8810ef9a9a092f4b9acfc52a67cd20d4579f19cc1bc6a038d2834e8e8a9cec36e516e62b90071707408df491f37e9244a28e2108c44db7c037c7ca4181c617674a7c655ecd186078c969798ca2fe9039b92460d0930680f77038713b7a825a71321dcf7c292f2c40be7414c7ec024e286ea3d0d116ffc509e90030736740e39e719e21361c3c2e3f81dccbc4ecff17565a1bd66dd3ae483c3f8d2032c231475bbb652d4f007b0bee4293963a50a478924fee75be1d20f98697826a603acfd551c78ae25cc2fd9c455124950709a62368fe8f90081b4477ac83080cd6f03988162eeb7c20d15a4c8757ab1a942c89f19e600aaff9140e87f22bca2b0882d00581f03bd2e8969365b59e138a43bd6028aebb6e1ae6c1bf688b47f5690eca068405820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03cd2cdbdd277317f0879de0e587972741b1d5ea30cbdb41922dbebb8dcd8ca9ba0394fc8ddd4575c57ef2f26e86ddb0da30663f2e3f9439fd25edf36ebf1116522f03abd03e0c212f185e288982fede0707be506c43ed17f8025345c507b2456f9058037db57be4d023741d7ec4c9f988abcdfd47e9f7f71ee39f0658cfc508aef7c57e03a5b3a9fdeb39ca6dccf0273e45af7eb7b1702712feb305c26f1c8a6d3b387362033d4894abd5c32c34694f0bd84f6c73a35b96b8436241bacafb1c03a9fd998fc900581e0217e0c219b58f64a42415630cf12d88372e03bc059c78d09e53929164ce5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e0276792580cc0a0d0d92d8bfddd4b046a897d146dd1c3ed2adf47ee91219410103b4ca22451d6cebb0403e28af7e0d10f8e1a4c586cbf72b3aec3fb58e22ea5eb601410500581e0209c41b130d387db64e89c263f03fc31592b58296965f22926c6e65e7205820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e02477dfb476be7a7b7076f810f756bc4a4ca1428cb07b43fb00fc96b66225820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02196c01038a7f2ea0249ef9d9932004ca6ae817d60dcef0de7a5b779b5e18fa3b261fa64d031c5b9a77c3a56ea1a7c67fc85a6c459acc694e21f656a6ccfb4ae23aa93fabb9038cd47fc87a17d1053b17e8d16337624a8b4f7a365baca77e7c7e1a53ae000f2b03b2b714554ab9a03fe0ab43171830c8e70062ee9ea5afb293b930255ca075074003ee242a4525c914fd13a36f9f74cac20134639aee171169323ab143f8b50642ca0219ffff0366358a9127e5e31cbdcdb9728077c4745a895fd9ea393a1b61e977f963a8222b03f727cb9c56f63545e244a546199ccde51b1048210d2ee77ede7fb497f641d12e035795e1fa4a049bd2d272fae96e6ff6f62961bbe0a7f7001673602dafb20d454003e479f1b45a2243143459afcb42fad806c42ee7207bb69c6229cfc12d38b874a003dc27c605cf69616e2768afab44a8b68e8ce8e6b1e3664de3076be1a161c6e44703db17c079d690656965851ba06985243b71d9abb8f579b0c7dd489eb1694dc4fc0320c3042795c65620661ed9cb43b2e002222bd6f48d90002b24c6c093e5b8c8940303d55cbb7723636f728f64a3baccb17ed429b0f2f4fbb610a159f808e099a59803c0ac67952593fb4325ea46fe54e3b06624fe55f3aae0b301ee25fc22907fff1c031137dc6a2c2e4be039123610f21f16baf855c5d96b16da4cb61100bc5413593e03df213d5d4d8b5190cbc8b1f4b174c00d94687e58f1faaa75a75a29f71d293eb903746467d98eeee27c6b363904c85ed02406963503b32e2265976dac34ad03539703e69113cd7a565a6e46ace0d88d15d6d6893538bd734b909160ac6a6cc29223ea03df988bdb52b7ca0f8f22bac490b8e717a40eb6979cba13397401956ace3c85910219ffff0219ffff039c91d5ba33ffbb5d6718d31eff358060eb8b6a8c8f4ad666117293e0e01fc6f8030c4c048d99e777514ec10b6ecba5558a5152e67b92da4e8189eac88059c4456a0219ffff039e731799f3d5234faecbacbc47b76fd3541b8cd20f05e9b08188b85248cc284803d4467e5aed6b9be8da472b53710151e59f8ee6d0fb89dbe2cf0369a7c7b6e9b40348de182ea2c070654bc20284b1f8444c8c521890e389e3d3cbd18f7849e1721c0389e7a6bca3cba67abcf573d394d98e7b7a854ae30a28cb3ab57f7aa611a0356303d8389a7c55e94c40782429c1eb1f233dcd9974c17b809cf8ea4b850fc78e28ff035bc900f5ae94420e9cfa583aa6baa555aa0e5f04905905f625936adba2497a3e03b8cc707f5d3552363afd64c3756e3f6c6a23cc827bfc524e9d546c68d7ce5c2c030e78ca90708bcd69efb3c822d7dffa9a02d0b66aee417a5c05e441874a2307520378e0baceaebdf2b11d212f273d1f31b4ea9a0db34276bc291915166e3a76f66f03b096515a642d0422bb3e675280674692800833ba308f6175a3c3a5f511a7c9660393a8b74d9af3c2eb2ba928c3f09ff0199f44274fe1b8bbf80e6b00bd2e0bb28303cef340e78e55fe909ab1cfc7a0392b09dd51f54c3d79e6194ad8880fef0541b603b72ff83fa705f04ec1b81dd4554f64a3e33f1d4004007d23b978466f9a36b4830364f72fa1c2622a567c0d3831526e42ded6c4a6f2344d604a5dba80d6a181fd4003cffed49459425b0d2da7f272441098c41282ee65b532143924353989cde8d1ea037e0be922c58d532e35b8cb330c97cd2c028be4cc65a66628df8f663dc5dbd81b03e0d4dc333d4ffea0224bc146974cebefd76edbe6ac28c2cff2e6367b936780d103240529d170cff5d9d4c54fe762757d24d0cb8aee37f756e31b7865f8ffd59588035b6f1e49eac2a2e0f25a23ceed3427eedd124ad8117e2a0508aef9b7138515f103b52155e3c1ea78517da7f0d3844e824db72df6e5a01e1d2518ff6a02845d55660379f983383f08c8dd59cd430952e40476e95ea6a23e19dc2fa9e81a397973718003172d0eda34b35f60a6d5395fea8760c024d2ae393f58cb782f67aa2d05bd4cb00371812d80ed0ea3f04f8f2843a0b140a15a8934864fd740bc0f8881ab77875e97034f7116037000ea9230be83925d5edb323c31b48868f9679d80c98bf6092a81d30385aa49c12cdad808fbd9a2d1692cced2e17984f731edee63ce7d6649c3cdf016033330cc1dff7e05f7b6ee23c730968fd49674c20d3982e99ad6be3f62c4fe1b0b034e77ce884ffc656c434d2299effd3e211499df5c963d9121c4dcab6a153285b900581e020b1755f3810eea0ab86fb07ec9cdb847e45e49803dc72c82a7d66f3afc5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0342d061d07c0396c02cab4f74cd41f448c48c43434582c32fa002b229b105692400581e02ee713f4e03e4a0d7f2a90ae4834f72106e1e65e42f3b2ec4f517d6b367470e35fa931a006400581e0238d98e4c3b9cbcc40eef1ee76986b6877984a0e7b6956830dd2f3455af410100581e027ebfd882c0b8a8b5c05eef33dfd0345ca219820a3cd0af31450dc691f15820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581e0238a5bda3c70246f0914c50983e21f20a805be98e6276310dee8b8495c14b4a817c7f2a2bf142ec876b0219160b03c8e521e04254386e003f7bbd99556ba574c609b0e200d359604b0cff7866af3103237f5a097edad31f1d89d2cbaafbf83169f6eeb404e7905b712930d926270bf803ecffbdae71e859f97752b3d56e3c39565782f8bc17b669aa3ed61efbfb5161d003b5022cdda3df9bc44253c9bad5ebb86c3e3160898cf0416a98136e59dc7f7c380219ffff03d5e1b77ddebb082898e4e23a96213d93e1eb466fc26a6fde217b80525b2dc1c1032112e772020f83d545a62ceec7a1168c695f36325b9c3039812afd53d43b5bba03f0368e6ab233f0e7ce6aa4cf462e55df6998b01f54015d2079dd8ede97bb816a03c0a8c690ec681fc2e26239bf1a1047f52326a3b8315dfa726039ef901a3cd074036d35208b96ff5be93018275342e980f6bbd89ccad3d048f824f5cdd625df1ffd033d865cc0f302bd91d0e0ce07d0af72c0e2e107bb2de7538216fa025e9d83e8b103c82c48fcabdc7541207d54fffbf2cc608a0fd984551c05c188651757081fbe0c0309e04c9e6909ad7dd039762f4e30c83f7f20e0dd5d98d9b9c91dc0cc984572c2032a62254e826db842766950715f6c93927e4b49d055802d6396f613c00091623c033778ef8d23a6da68967ac5470a395c4e26d3de8eb442f511693d302f4a3cacbf0219ffff03ce89a44639931f8f1fb8962782ad52d56c979306c090d5043e04192320888e5503f17e89d8d1202c099d84a67fa39c4fb07af2de100ba4e4ec1949532582b54c2b03724e93400753ee59606ec1f83c8b3838f76180391db0df52d98161e2ac91272603b8872eee1c1c88f0b890e9d1804673547b13bc750b60acb2a10349d38ae22a750219ffff03539ea2fd00723098869d28018a3b05fd4a7fa5693296792c4294a7524e39a4bb0398cbb06ff100e9ea192dcb248c1e4e9cd44dda37370e9d94aa039cad5158a0ba038fc6c323e79dc6ffa32384532ca8df63d366d203852aef524efc5b0b1f2fdc2b034216bd61b4676f39a50e9abe414960ed3b79daee20398525467e6489cd0f29b003b6c58b078bdb68dd95486753aebbd418e8ee8bbc65fec3756d1c25e23b49e457036b6ad326b5def7225704c129d9af40f4642951813d1507e319fa727ace71a05803e6c42ebc271bcae4d7c8cfa012cc434d0ac312b27c4a0df426270393e89136b0035e4082705a1fd46fae9698c01fa449b296acaf29118af7cb109b2ff5e135322b03bd26937e13ce92f3911d1d5e1fac601b933e0a2a6a57e95434010807b867f340034cb41f2bff31b91eac04c1a4c2a3f84f8978b1e803eb859993bdd96187653a510356ae8434c3df25974936e160002949712d0b8dbab2d5850ec750bf490c779417036ad1a806b81b3d7b46f13bde63547d8f5a828ab8ea7a616066982f14761aee6c03ff0ab0fbb69bbfbe938fd7de76f40774049d1c379882a13193f944456cf6cdef0372b29bf841025a0ff6e03499ba81204a17fa79a70a325227d6b7937d45ab8f6903e4821aa975f63f622a5beea12e61130e06144114d296c6de21b81a1f426db4fa0219ffff03d7c6b3fa4aae186f4d4be482827cf8d5334f21f7113b6fe392414c7b8fa1b9ea0219ffff05581d02a65bd257638cf8cf09b8238888947cc3c0bea2aa2cc3f1c4ac7a30020f014b02987192535af43b35a8e0190c34021920020219702b03c07c4048481c07b118748b2a30e851cf5c6c87af6212257f8845eb9ce07a02e403012fab999f402d6b302a07d3f7973ee8c357d5db8c7991903bd54d54d507cc23035923155adc8cd3aceaf27c07858d290a3b85fc378fdd98e9f4f7f70d157f28ba03c55b2981a6fe08260cb6a076c76858d56aafdf255d0a12a2c50abe35d468c7e7037975ea5712162b9b7339943572a7180adc20238024a429eb2e0928128e39556d033909e6c87be78bf54588e521ebdded1d467e8104d18958f7dd079010ee22155703867f6119f66c88787520dc8899d07d0e49598fa8dde1f33e611871eff6cd04960219ffff033307aa27831bf49ba78f1d47a092c180664e709902579fa9b13f147523cb8d0b0219ffff0329d6f7d3c1260b8be12e0e506b6f090a20038b4006ff80babc6c798e50891df503e9c47c8bccfa7364ec6c3d5dd71ec05a15da0ac8111ec3a218a963843ca4f44e03c26d4fc6efabc1fa16b6b91e18f6ad576e156cc6506af88d5858488a5d4546eb0346df579e8e01b9f5eabcf5a8fb9ab122c02677630ebb8b718ce561efff51cf770375030fc96c9b2aaac9c3270ba8b807966d58e1033d6bc3636bdb330f148cd22e0395ca7850aa3c51492680ccc0d0847a4ef39d48df817e4e66b6fd64c35ca4485a0219ffff036c9c5ea6492f79beb757ba4a5a86cc21ecb10dfec704dbc42196f01fc3bd8a18037e2386574bdde6a6241ac226e77aed7fa0d3af0e85efaf721dd0f7e1703307a703fa3f5df803d4b34d35d641a4dc7c594006e285e44e7016fb963ffe7a5af1e7bb03649cb983132917b142baa50fb45b8bbcc6a3bf860fb669d86262ecafdfb6151a03dcf8be433f6f3140ba294e13c78baa869b70ebf53b5665dc0af407d111b87fde038f61eddde7c18e54c27deea077463181fc47c571d2fcd0a3a3c880a576f5dcaa034791d02f3d4ed75e8c1322183b29a62125ba1ae9b7b95a81632c0368b454158503076e3c62327fc9058e9af74bc1503790e7f5b23487c9b243bbc76cf2185dc21e0219ffff0386070c501d2dedfd5854e6b427ebd511b9ec12864f64ad25f5724bac6070a7a103005aef95f8f141a39d5a05154e82c0fddcae72797c4f2b3d538a444e6d86edaa030bcd7829abca6ca5289405b6be80fb7528e08fa8a499119869499f3fc466ea04035650135745bcd57372655370d488d77a0656a86c0527a839dca211dce4c7157e032705742db4d13cb35652dd66f6824dd9e5571040af9f1f93df3d0a4a6642b51b03a8dad6fd934641950fcd0ba0a94794ee6018e4e7be54a39694c761e765589348030214f4c71b42e0fd99a2c5a0530ef0283ac350b6601e9ad3a1eb33757971c34803a8d69241ee74452bba003dcd989c8d8d4a17c7ff876cfcc980636b1f8b8e30fd038979a102cc529bf29218092a80e58205585d7c61f3e4c76095516589e5cfd81d038ed46910ce68c811cfd436c73d73e42bb83751a732f9ec608119772b78e311a803ab19ce157de5de4ea44218001dcc7edd121a4b61a2f01154bbe5ef646fcd9ec403ae323f944161990d516b671c169b34454c56c0dc2895baf6b8843d6d6e5b5abe03cecc35068fde6bca3cb34be29161ac3dfcac8cf6c528d92017792da172e94a7e030d6bd1e0b89ffc54168f8cea45193aa51279799a2ac9ff58917fdda65e71ff3803b2091aba4f213da33a192510c2d17984526962bb7ad1560b8dab9e3cd5eb1a87030c35f6d742e4ac57da4e8698f5672e14809faf4c4fb9afae45b146cbc41dce80030afd0d577712361808587052750e5ab6e1bcb666c02b5d9c2d6fcf566b6ce02c0308a98f938a979d6532460fca9bedabd238df73a3abde35f5d6fc67055d8efd1e039c67fe8d25b4b72281cef0dfb313edb0627b653cd7d1700059e09d118f5877bc0341b53daa2cdec4abbe38794b75882c81df0e2bdb4c5aae9d2aa86db9e1822523032cd8f70d4281067697a228979f4055c5aae3bc5d42b61192cd88352ead70bf6903bb13dd1706c920f0d825dbb556b595d3c6bf1bf06c1b455b8522cd1c81ec36b803a3f11fa7542504a039690a679d4051556f3996ac796a0953180c2b110c7205d4030b28257e7aad2fe8ac5a0dd60bfaff0466b4a33d635d7d312aafab1205e90c5a03c11239c2c578f6366d46479fd0aaf7e0933bb97898d6f278bd378df9f58b6f74033fa79b6f6e5d3296eccddd86063f7dc84503f1761aa618448e5c4303c244568c03c256e8ad5ec9824e212ebbaaaf50e3793df293f71b97881eb947294e1b85becf03ec4d1da50900fcbdd12bb5dc83fa1dd4c8c623a12695587ac68540a72b3e9c0803b3c6cfd25f6d37c228028a9ec88dc3f9ecb98f7a776202355fcfcaf46e0f8679039ff2ab8d80bd7110f4f88109deec8d5fb382c8dc4aeb48a3659173bd670249cd0327e3795bc5d6c5c106bd17fb530630f081282c18727149ffbeeb67037b6499f903b0dd521afa67087841f751fd06a91792fc2e7fa10a8b25c0434a11fd6c95c77f031aa2715fc3749ff71e27d28322d4e9ebe587dfb722332a2d2fc48d654a34ae3a05581e035c606158f0440c668481a4c457cff85703e1e117cb3d6c3f07c19855400c11479f2c230a85174905581e03aa9705b369190b5183f2b073797e29cc07766928dff9c307e9ec9994300401035713eea1764d8f2464447ba59fba61e15f1a5c4fc8cd610f8fdb3af4505a1a5a0141080300ead19e58881221cf02e877c91f01944607fa694ec5d1b2b5d1ef280c9acde103c07be3267e504d3a12fee2d6d54cee3a2fd10362112fd1e965df3b27e1e320ce05581e036bcc20594481b8d81021bef54a7c6be4b7ddd6913563d0127fe99d6ab00c0f4701af438415655f05581e03248da3b8720a2784a17616c093aba16d03ef0ee6535979bab7e32c4cd00848047e4d4c9d366cef05581e034a1b12a03d5a86cb2528dcc8f7fe3dbef88565541101273545612d5a400c1901d448511d91f23b36f55e0308a77a72a67a37a2f70a706ddb1fafbe055a13a156d9967ad677da6dd1aeaf3a05581e03122e75bb2c083f1d2d69d81675788d63efeaa7e70484159369c5f76ed004010219dd5a03a2396a9ed6f1c26f33f287eff0b756e1c4b994aafd76e682c3b2a3591c382ad003ee08a098b615eb35befb53490f2e05a48eea3d0b79878be9e07fe72f119c7a03035fa10b9debfc6b215c5d850b2637b12bf01758c6f468f6de3efb6b5235518198036354dd74770a90b0d36cbbb832b80408fb6a1a3a95aed95705a71c4004ee0c5d0391f07bde9b9b713dec0892f777b4171ab5d79550fcaa3f727ce371a579fbfa0803d9be28a4b11068c97e32cb61b4689e9b53027c142b734b29e86c44f1a717f798039014a6aa6ef1f464bfcfcd7e5e69d23d6fdb70a7c59b82b427994389859a137d034b7136d8b9196da29a931889357bca83dc5024a19980b3a823609e027a7d28cd032bf1c60f958a3208e625e38b99c425ef423d2d7e6fd0ad28ae077290d064590503af42f0784bc62c055ba67eeb07d6e2803bdabdacdbdb587fc41d024053b299c203081ec485bf3270f85c3f65fb49ec4a39420946da7614eb7c2109341b49b2df0303850504463e8d8be67556790cf187db8dc166db818c2f622b532f4402eeafc13f039995ac4e35f0c738509c2e3a662cf588bf3532cb3b4c3b57b2252f2bcbb8133c0219ffff03a0dd053e237402631c1143d2b091ffe2cf8976c51ecfd5f3a4ee9ffb1fd492090307b915372335d8d439892834230eab0a74e5c2827bb6eb9a79cbd84b3e126369039a105c4238c5da6415135af7116574a5b00d0e2867b3275ceef2805350da77a303aa054982670793e2e90bd8e74dc603327b9c0f10b8f203385cb270105cf983ae03238821def48781961b4813b105941038ecee6859a6ff51e71adb08e529d4124b0321a15b14aa1d0922ca24e3e859d45b187674666180ccf4bf3f23278f6ffabea803815cf9d7ee19e93844c2d8bc2ab65392e26328a99c052bf932e423006bbb78fb03366d5a9588612a223872ec3a857dfdcd6eef3931c5a1df39671940984a8c402403ca3ab1de8fcc41d12a6f1164d49e77969d0862d7f81924fe6aaf920c0b3a384d0219ffff03c0c27676d2bdf8a48899317c9bf382ab7e493c966646ddac1ab7713c3ac146950353c5e32a2498ca30da94de8c49896e0f01156ee9b1058165a41f2caf07faf450035b3dfa50f1cb4ff47add88abbda3f85342cb0eed97d094ff357a562a0c479a69039a8417bb2e45e35071b139b3545afed10937c9a7078a6708fa30b9c8e2238426032543d287d0df869ff2ebd4a0b7e3d1a777bc9b2c297d072f6b428325c1757dfc03223030562cbbf3dcd031da9a069ee99aacac77615f929eb6921174149680b27503bed7f41065fb7c01a4e94ad082f3d1258f36540b42e577950c6d1f9992cbb7d60219ffff038783f41b3afdf0834e6a42d4c4ee38346b12998e6b243ac58d1fca79eaa149b903eda5fb657335a57ed988a60795f3216d92542d298d68de9d5f66a011532e7d0e03e903bd445461327baa0859bd0adabdd1f2dda510fd398dec055ae0b41757fdf903a5f5a931db46cc393e56f3469dd46c6543554eaad090d400478dc19a3d3dbb1703dc3a394c7d9680788c8d952bc714676fdd073f1bbfd42957decb5147a35dfea80219ffff03e74b1af12d32d6625b6e9af4f108418707cef62d83099fccbbb77a12fbd553d10219ffff03117181bdd1994c779539c2ccf1d27bb08dd7508d23b4915ee591310e0070a25d03abee9fa26290e923ce0bc1dafa074085b5eae1d5bb8effca8ff89de5ae704945039c84c4f87921f21e03bacbcfeb05c06b99de3e380a9c5ec7d8c8496048419215030cb0e65e7d1e87bd15a2a912fbd6771cea78c87c087fe73a89912fad93803727036df5a4f057289010386d89611b6ca8c655a8c8f78edf787727f867059ee2c39f03af4d4fc041a2b67e93e67f442db79ec8bee16442cb66ea516f8f82466fa49e79037fa0f837c9938e7ff15a5306e65560961f1ac260ac91680af1e4f0ee1911c2a4037740d45f62bfaf1c66da3d3a07222f3f622c0d2e7a925307ed728ecdd91aedc203727b28ea80c0ada3ab2c35d8a40ea053fbac57ef7a6a8a6709ebc2def29b78f6036891cf8a17095faaeee8445712dbd95e1759044a1a30748ca820bc33478807090307c2247f223e3931da22f0611b887e3ac718c1043564e6af6839069253ccd4dc03dc7cc1c5ce71194bd006b743b09df24f69ca172a082e7a45e51973f6b72ef68703db4fa5455b0496bdea4b760e7fcfbec45a997dcdd6130e93f9fa80000573713103b6a0772933ec89fc42f219ca5a43c929a582ddf2afde8555ce60169533959097039c86eed3ec1498d68b170b938357713d93da8b9b472d49f746603980b657824403ff8d64d37a029eeb37a76a4306b670a63819ee6917678b83569baf2be3faa09d03dc194815f6d22cf0ba77425bddf4259fffb92c5801e90249fb833ffdf00bae5103bd92dbe09bd257b339440f07a0ff827546e6402ca152a9fc38b2f871a8652e7d033bd217dea5a41592a72c511bac28c0ec5846214e05dd0d18330af19aba067b4d038aa6239758091c9df09d3afa7af3adfdb3c39d85e99fe19bc680f10b474c33720318f9563305fb9ed27279b34d068f8a9bcf557895cccd3c8a61a8b3077fec99740325117ad1f37de8a2f85959655b16eed70d9b58735e22beeb113f192030258c90039c2a3950f0065d88a122be2a64186b3598fdf5927995c1185be74765a3c434b10315ce924bd41bec9366e0e121f751cc6986f3954d3146b667c6e9375d54c95e0d03d00ef616504882a2e0afa8d87b056cc18f658a799d3a62481b22a66a6f5d246903579be1a5816ff5940887ac3cc29986ccb9f46712b6b7d3894c137b8a4d80405e03e06f96fc5f9617497abe22fc13fc3f561521fb8c70be3100cf6a44b47e54f6d8031110c4a2cc01357891418fd9548aa4a1ec5ec1a46b26569cc7a2f8f6949e6039031e3f4c3898c6c6a72f51ba78478928b33799f08a33f4632e03b5ec16ebaf017a03c3ad48b1fd0bda8c5d6680bb2921da7fde7fa49b8ca2dbb556bfd50173ddaa410335f0ef42cd0a70dcdffe95b132101256a5c5f23c8d2118fcf8c6d07cb191327603040ea67430a4d66e71add4552c4582eca4ea957ec08e628cde7869041ab9b6ce0359b871c2c8f973525863f18c2f6f18a44eb2f8840fd6a1bb919905b4f01e421d03be833adcfeeb21b1c9649a72411a8f3433f3a15c6c4d9d1a0117cae337ba000603c56db9c25ca86dd976de4d2ac3ca14db6b8281bc197cbb57d8e487330fc885060354bbade28616422c37385e189a28fba5409bee41180fa08089d58145e9f4d7c20302b5f2df1cd36888b2cfa5ff5c19a2c210f0d1472073efc437fefe9493c2c9cc0313581fa11ad687397d4912c381a6dc0ea10ea7cdc13c29e29a0a1a0dce53bc9103dcffdc07401d5fadd7506f43499428f144476c02796d82fa09344dce86d660fe0332dafcd2dc2d255c7ca2c926ac6fbd0e91a7e9ed1e0822e8b285058d97a013e003264c9e0ff37d87df9a6155c0e1551697e3d3674db6cfb3ef341df887bc6d75a903696bdd89d8801a173361a0c73a96198e7c43ff939323719910dd788f2693597303f1d900423b5b8f5c83c62d8b7c5c8ac90337d4ca82a44e36151a42a391dd0a31033b89c27479ecffb8887c2b739e31b8723a3001b740bb2ffe7d26379e90be9a0404595a8860806040526004361061021e5760003560e01c80639871efa411610123578063d1b260d4116100ab578063f3dced3c1161006f578063f3dced3c1461061f578063f3e144b61461063f578063f6932b0d1461065f578063f851a4401461067f578063fa461e331461069f57600080fd5b8063d1b260d4146105a4578063d8837daf146105b7578063e0af3616146105ca578063e99bfa95146105ec578063f2fde38b146105ff57600080fd5b8063b07482d2116100f2578063b07482d214610528578063b3ab15fb1461053b578063b80c2f091461055b578063ca68d8f61461056e578063d13a35e61461058457600080fd5b80639871efa4146104ac5780639989d481146104bf5780639a09b285146104d25780639a307391146104f257600080fd5b80633ba7cadf116101a657806373679b6b1161017557806373679b6b146103f3578063779e45fc1461041b5780638575654f1461043b578063869c6b4b1461044e5780638da5cb5b1461048e57600080fd5b80633ba7cadf1461035257806341f4a9591461037e5780636aa476451461039e578063715018a6146103de57600080fd5b80630d5f0e3b116101ed5780630d5f0e3b146102e157806312a0ddc7146102f45780631afca626146103075780631bb943fd1461031d578063355b97181461033257600080fd5b806301617fab1461027557806303b87e5f1461028857806308298b5a146102ae5780630c00e013146102c157600080fd5b366102705732330361026e5760405162461bcd60e51b81526020600482015260146024820152731155120819195c1bdcda5d081c995a9958dd195960621b60448201526064015b60405180910390fd5b005b600080fd5b61026e610283366004614c00565b6106bf565b61029b610296366004614caa565b610a5c565b6040519081526020015b60405180910390f35b61029b6102bc366004614d76565b610b6d565b3480156102cd57600080fd5b5061026e6102dc366004614de8565b610c30565b61029b6102ef366004614e29565b610e5a565b61029b610302366004614e9c565b610eb4565b34801561031357600080fd5b5061029b60215481565b34801561032957600080fd5b5061026e610f01565b34801561033e57600080fd5b5061026e61034d366004614ef3565b610f35565b34801561035e57600080fd5b5061029b61036d366004614ef3565b602080526000908152604090205481565b34801561038a57600080fd5b5061026e610399366004614f0c565b610f49565b3480156103aa57600080fd5b506103c67370cbb871e8f30fc8ce23609e9e0ea87b6b222f5881565b6040516001600160a01b0390911681526020016102a5565b3480156103ea57600080fd5b5061026e611006565b3480156103ff57600080fd5b506103c6735703b683c7f928b721ca95da988d73a3299d475781565b34801561042757600080fd5b5061026e610436366004614f5d565b61101a565b61029b610449366004614e29565b6110d1565b34801561045a57600080fd5b5061047e610469366004614f92565b60046020526000908152604090205460ff1681565b60405190151581526020016102a5565b34801561049a57600080fd5b506000546001600160a01b03166103c6565b61029b6104ba366004614e29565b6111dd565b61029b6104cd366004614e9c565b611241565b3480156104de57600080fd5b5061026e6104ed366004614f92565b61132e565b3480156104fe57600080fd5b506103c661050d366004614f92565b601f602052600090815260409020546001600160a01b031681565b61029b610536366004615050565b6113d6565b34801561054757600080fd5b5061026e610556366004614f92565b6114e5565b61029b61056936600461507f565b611547565b34801561057a57600080fd5b5061029b61012c81565b34801561059057600080fd5b506003546103c6906001600160a01b031681565b61029b6105b236600461507f565b611611565b61029b6105c5366004614e29565b611784565b3480156105d657600080fd5b506103c66000805160206159f383398151915281565b61029b6105fa366004615135565b61187a565b34801561060b57600080fd5b5061026e61061a366004614f92565b611a9a565b34801561062b57600080fd5b506002546103c6906001600160a01b031681565b34801561064b57600080fd5b5061029b61065a366004615236565b611b10565b34801561066b57600080fd5b5061026e61067a366004614ef3565b611b5a565b34801561068b57600080fd5b506018546103c6906001600160a01b031681565b3480156106ab57600080fd5b5061026e6106ba3660046152c0565b611b6b565b600160ff1b81166001600160801b038216806107125760405162461bcd60e51b81526020600482015260126024820152710616d6f756e74206d757374206265203e20360741b6044820152606401610265565b81156108aa5760405163052f523360e11b81526000805160206159f383398151915260048201523360248201523060448201526001600160801b03821660648201527370cbb871e8f30fc8ce23609e9e0ea87b6b222f5890630a5ea46690608401600060405180830381600087803b15801561078d57600080fd5b505af11580156107a1573d6000803e3d6000fd5b5050604051632e1a7d4d60e01b81526001600160801b03841660048201526000805160206159f38339815191529250632e1a7d4d9150602401600060405180830381600087803b1580156107f457600080fd5b505af1158015610808573d6000803e3d6000fd5b50506040516000925033915047908381818185875af1925050503d806000811461084e576040519150601f19603f3d011682016040523d82523d6000602084013e610853565b606091505b50509050806108a45760405162461bcd60e51b815260206004820152601c60248201527f7472616e73666572206e617469766520746f6b656e206661696c6564000000006044820152606401610265565b50610988565b806001600160801b031634146108fb5760405162461bcd60e51b81526020600482015260166024820152751d985b1d59481b9bdd08195c5d585b08185b5bdd5b9d60521b6044820152606401610265565b6000805160206159f38339815191526001600160a01b031663d0e30db0826001600160801b03166040518263ffffffff1660e01b81526004016000604051808303818588803b15801561094d57600080fd5b505af1158015610961573d6000803e3d6000fd5b50505050506109886000805160206159f383398151915233836001600160801b0316611d53565b604051848152600080516020615a338339815191529060200160405180910390a1600080516020615a13833981519152826109d75773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6109e7565b6000805160206159f38339815191525b83610a00576000805160206159f3833981519152610a16565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b604080516001600160a01b03938416815292909116602083015233908201526001600160801b03831660608201819052608082015260a00160405180910390a150505050565b6000876080013542811015610a835760405162461bcd60e51b815260040161026590615312565b610a8b611d83565b6040518b8152600080516020615a338339815191529060200160405180910390a16001600160a01b038a16610af05760405162461bcd60e51b815260206004820152600b60248201526a6e6f74206164647228302960a81b6044820152606401610265565b89610b44610b03368c90038c018c61533a565b8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c92508b91508a9050893388611ddc565b9250610b5560408b01358b3561216a565b50610b5f60018055565b509998505050505050505050565b60405160a087901c8152600090600080516020615a338339815191529060200160405180910390a16001600160a01b038416610bd95760405162461bcd60e51b815260206004820152600b60248201526a6e6f74206164647228302960a81b6044820152606401610265565b610bf16001600160a01b03881687878686338a612390565b9050610c26866001600160a01b03891615610c0c578861216a565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61216a565b9695505050505050565b806000816001600160401b03811115610c4b57610c4b614faf565b604051908082528060200260200182016040528015610c74578160200160208202803683370190505b50905060005b82811015610e0e57601f6000868684818110610c9857610c986153c0565b9050602002810190610caa91906153d6565b610cbb906040810190602001614f92565b6001600160a01b039081168252602082019290925260400160002054163314801590610d2d5750848482818110610cf457610cf46153c0565b9050602002810190610d0691906153d6565b610d17906040810190602001614f92565b6001600160a01b0316336001600160a01b031614155b15610d4b5760405163203b1cdd60e21b815260040160405180910390fd5b6000610d81610d7c878785818110610d6557610d656153c0565b9050602002810190610d7791906153d6565b612b73565b612baf565b90506020600082815260200190815260200160002054838381518110610da957610da96153c0565b602002602001018181525050600160ff1b838381518110610dcc57610dcc6153c0565b602002602001015103610df2576040516311b18c4b60e11b815260040160405180910390fd5b60009081526020805260409020600160ff1b9055600101610c7a565b50336001600160a01b03167f2d978b051248279fa3127485450ca814a26b9b0938be9f714eda15eaec5ca881858584604051610e4c939291906154a0565b60405180910390a250505050565b60405160a086901c8152600090600080516020615a338339815191529060200160405180910390a16000610e9b336001600160a01b03891688888888612be2565b9092509050610eaa868261216a565b5095945050505050565b6000600080516020615a3383398151915284604051610ed591815260200190565b60405180910390a1610ef73380610ef1368790038701876155c4565b8561307b565b90505b9392505050565b610f096133f2565b6040517f0b3b40bc6027444e59029877c53be6734ca3724242753ffe5aa1a6066635211f90600090a132ff5b610f3d6133f2565b610f468161344c565b50565b610f516133f2565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b03841601610ff657600080836001600160a01b03168360405160006040518083038185875af1925050503d8060008114610fc4576040519150601f19603f3d011682016040523d82523d6000602084013e610fc9565b606091505b5091509150818190610fee5760405162461bcd60e51b81526004016102659190615604565b505050505050565b611001838383611d53565b505050565b61100e6133f2565b61101860006134e4565b565b6018546001600160a01b031633148061103d57506000546001600160a01b031633145b61106e5760405162461bcd60e51b81526020600482015260026024820152616e6160f01b6044820152606401610265565b6001600160a01b038216600081815260046020908152604091829020805460ff19168515159081179091558251938452908301527fede97de789011d2becb9fba8441864c3b17f4a20f7ebf0a77e93f30adc30e207910160405180910390a15050565b3360009081526004602052604081205460ff1615156001146111055760405162461bcd60e51b815260040161026590615637565b60405160a087901c8152600080516020615a338339815191529060200160405180910390a1600080336001600160a01b031663534015b36040518163ffffffff1660e01b81526004016040805180830381865afa15801561116a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118e919061565e565b90925090506001600160a01b0381166111b95760405162461bcd60e51b815260040161026590615698565b6111d16001600160a01b038916888888888787612390565b98975050505050505050565b60405160a086901c8152600090600080516020615a338339815191529060200160405180910390a161121d6001600160a01b038716868686863333612390565b9050611238856001600160a01b03881615610c0c578761216a565b95945050505050565b3360009081526004602052604081205460ff1615156001146112755760405162461bcd60e51b815260040161026590615637565b61127d611d83565b604051848152600080516020615a338339815191529060200160405180910390a1600080336001600160a01b031663534015b36040518163ffffffff1660e01b81526004016040805180830381865afa1580156112de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611302919061565e565b9092509050611321828261131b368990038901896155c4565b8761307b565b92505050610efa60018055565b6018546001600160a01b031633148061135157506000546001600160a01b031633145b6113825760405162461bcd60e51b81526020600482015260026024820152616e6160f01b6044820152606401610265565b601880546001600160a01b0319166001600160a01b0383169081179091556040519081527f7ce7ec0b50378fb6c0186ffb5f48325f6593fcb4ca4386f21861af3129188f5c9060200160405180910390a150565b60006113e0611d83565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6114056060840160408501614f92565b6001600160a01b0316036114525760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21039b7bab931b2903a37b5b2b760611b6044820152606401610265565b6114626060830160408401614f92565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156114a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114cc91906156c0565b83526114da3085858561307b565b9050610efa60018055565b336000818152601f602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915591519182527fd58299b712891143e76310d5e664c4203c940a67db37cf856bdaa3c5c76a802c910160405180910390a250565b600087608001354281101561156e5760405162461bcd60e51b815260040161026590615312565b611576611d83565b6040518a8152600080516020615a338339815191529060200160405180910390a16115ea6115a9368b90038b018b61533a565b8989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b92508a9150899050883380611ddc565b91506115fb60408a01358a3561216a565b61160460018055565b5098975050505050505050565b60008760800135428110156116385760405162461bcd60e51b815260040161026590615312565b611640611d83565b3360009081526004602052604090205460ff1615156001146116745760405162461bcd60e51b815260040161026590615637565b6040518a8152600080516020615a338339815191529060200160405180910390a1600080336001600160a01b031663534015b36040518163ffffffff1660e01b81526004016040805180830381865afa1580156116d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f9919061565e565b90925090506001600160a01b0381166117245760405162461bcd60e51b815260040161026590615698565b611777611736368d90038d018d61533a565b8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d92508c91508b90508a8888611ddc565b9350505061160460018055565b3360009081526004602052604081205460ff1615156001146117b85760405162461bcd60e51b815260040161026590615637565b60405160a087901c8152600080516020615a338339815191529060200160405180910390a1600080336001600160a01b031663534015b36040518163ffffffff1660e01b81526004016040805180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611841919061565e565b90925090506001600160a01b03811661186c5760405162461bcd60e51b815260040161026590615698565b611604828289898989612be2565b60008860800135428110156118a15760405162461bcd60e51b815260040161026590615312565b6118a9611d83565b89356001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed19810161190f5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21039b7bab931b2903a37b5b2b760611b6044820152606401610265565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197a91906156c0565b905060006040518060a001604052808e6000013581526020018e60200160208101906119a69190614f92565b6001600160a01b031681526020018381526020018e6060013581526020018e60800135815250905060008c8c90506001600160401b038111156119eb576119eb614faf565b604051908082528060200260200182016040528015611a14578160200160208202803683370190505b50905060005b8c811015611a7a578e60400135848f8f84818110611a3a57611a3a6153c0565b90506020020135611a4b91906156ef565b611a559190615706565b828281518110611a6757611a676153c0565b6020908102919091010152600101611a1a565b50611a8b82828d8d8d8d308e611ddc565b95505050505061160460018055565b611aa26133f2565b6001600160a01b038116611b075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610265565b610f46816134e4565b60405160a089901c8152600090600080516020615a338339815191529060200160405180910390a1611b43888484613534565b610b5f336001600160a01b038b1689898989612be2565b611b626133f2565b610f4681610f3d565b611baf565b3d6000803e3d6000fd5b80611b8757611b87611b70565b600160005114601f3d11163d151780611bab57633c9fd93960e21b60005260046000fd5b5050565b604051601581017306ff0b40e9091053eee51fa1d482ce5d852f523360611b825260206000600484335afa611be657611be6611b70565b6020806004808501335afa611bfd57611bfd611b70565b60206040600460088501335afa611c1657611c16611b70565b6000806000881360018114611c32576020519250879150611c3b565b60005192508891505b507fff1f98431c8ad98523631ae4a59f267346ea31f98400000000000000000000008452606060002083527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460208401526001600160a01b0360558520169250338314611cb357635960139160e11b60005260046000fd5b60843592507306ff0b40e9091053eee51fa1d482ce5d852f523360611b845230831460018114611d2557826014860152836034860152336054860152816074860152611d206020600060846010890160007370cbb871e8f30fc8ce23609e9e0ea87b6b222f585af1611b7a565b611d48565b336010860152816030860152611d48602060006044600c89016000885af1611b7a565b505050505050505050565b611d668363a9059cbb60e01b848461369a565b6110015760405163fb7f507960e01b815260040160405180910390fd5b600260015403611dd55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610265565b6002600155565b60408801516000908990611e3d5760405162461bcd60e51b815260206004820152602260248201527f526f7574653a2066726f6d546f6b656e416d6f756e74206d757374206265203e604482015261020360f41b6064820152608401610265565b805160208201516001600160a01b0391821691611e5b9116856136ed565b9250611e6681613778565b15611ed5576000805160206159f38339815191526001600160a01b031663d0e30db083604001516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611eb857600080fd5b505af1158015611ecc573d6000803e3d6000fd5b50505050503094505b6000805b8b51811015611f11578b8181518110611ef457611ef46153c0565b602002602001015182611f079190615728565b9150600101611ed9565b508260400151811115611f845760405162461bcd60e51b815260206004820152603560248201527f526f7574653a206e756d626572206f6620626174636865732073686f756c64206044820152741899480f0f48199c9bdb551bdad95b905b5bdd5b9d605a1b6064820152608401610265565b508515611fd35760405162461bcd60e51b815260206004820152601b60248201527f74686520706172616d65746572206973206465707265636174656400000000006044820152606401610265565b895188146120155760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610265565b60005b888110156120865761207e868661203b86602001516001600160a01b0316613778565b8e858151811061204d5761204d6153c0565b60200260200101518e8e87818110612067576120676153c0565b9050602002810190612079919061573b565b61379a565b600101612018565b50612095826020015185613954565b602082015183906120af906001600160a01b0316866136ed565b6120b99190615784565b925081606001518310156121085760405162461bcd60e51b8152602060048201526016602482015275135a5b881c995d1d5c9b881b9bdd081c995858da195960521b6044820152606401610265565b60208083015160408085015181516001600160a01b038087168252909316938301939093523290820152606081019190915260808101849052600080516020615a138339815191529060a00160405180910390a1505098975050505050505050565b601f193601356561aefa81eaab60d11b6001600160d01b0319821601611001576001600160a01b03811665ffffffffffff60a083901c1661012c8111156121f35760405162461bcd60e51b815260206004820152601b60248201527f6572726f7220636f6d6d697373696f6e2072617465206c696d697400000000006044820152606401610265565b600061220182612710615784565b61220b83886156ef565b6122159190615706565b9050612229856001600160a01b0316613778565b156122d7576000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461227b576040519150601f19603f3d011682016040523d82523d6000602084013e612280565b606091505b50509050806122d15760405162461bcd60e51b815260206004820152601b60248201527f636f6d6d697373696f6e2077697468206574686572206572726f7200000000006044820152606401610265565b50612347565b60405163052f523360e11b81527370cbb871e8f30fc8ce23609e9e0ea87b6b222f5890630a5ea46690612314908890339088908790600401615797565b600060405180830381600087803b15801561232e57600080fd5b505af1158015612342573d6000803e3d6000fd5b505050505b604080518281526001600160a01b03851660208201527fffc60ee157a42f4d8edbd1897e6581a96d9ed04e44fb2ab53a47ce1eb8f2775b910160405180910390a1505050505050565b60006125dc565b62461bcd60e51b600052600160e51b6020528060405250806000fd5b828152600060206000600484600401865afa6123e8576123e86054700419d95d081d1bdad95b8819985a5b195960621b612397565b505060005192915050565b6770a082310dfe168160c01b815260008060206000600485600401875afa61243657612436605672049d1bdad95b8c0818d85b1b0819985a5b195960521b612397565b600051915083836004015260206000602485855afa6124775761247760597c1562616c616e63654f662063616c6c206661696c656400000000000000612397565b60005190509250929050565b6770a08231d21220a760c01b815260008060206000600485600401875afa61243657612436605672049d1bdad95b8c4818d85b1b0819985a5b195960521b612397565b668b0367c240bc6b60c21b8152600060406000600484600401875afa61250e5761250e60587c1472657365727665732063616c6c206661696c65640000000000000000612397565b60005160205186801561253a5789156125325761252b8786612483565b8390039650505b909190612551565b88156125515761254a87866123f3565b8490039650505b50668b0367c240bc6b60c21b8452898502633b9aca00929092028201910204905084801561258b5781600484015260006024840152612599565b600060048401528160248401525b50886044830152608060648301526000608483015260008060a4846000885af16111d1576111d1605470041cddd85c0818d85b1b0819985a5b195960621b612397565b84602085028101858061260357612603604e6b0b656d70747920706f6f6c7360901b612397565b5060405182358b15600181146126ad5734156126395761263960557111696e76616c6964206d73672e76616c756560581b612397565b63052f523360e11b83528c60048401528760248401526001600160a01b03821660448401528b606484015260008060848560007370cbb871e8f30fc8ce23609e9e0ea87b6b222f585af16126a8576126a86056720498db185a5b481d1bdad95b8819985a5b195960521b612397565b61277f565b60018c3410036126d7576126d760557111696e76616c6964206d73672e76616c756560581b612397565b670a9059cbbd0e30db60c41b835260008060048086018f6000805160206159f38339815191525af1612724576127246056720499195c1bdcda5d081155120819985a5b195960521b612397565b6001600160a01b03821683600401528b83602401526020600060448560006000805160206159f38339815191525af161277f5761277f60587c147472616e736665722057455448206661696c65640000000000000000612397565b508a9450602084015b838110156127de5780356127d26001600160a01b03821663ffffffff60a01b851660a01c600160fd1b8616600160fc1b8716600160ff1b88166001600160a01b0389168d8b6124c6565b96509150602001612788565b5060009350600160fe1b811680156128c2576000945061282b3063ffffffff60a01b841660a01c600160fd1b8516600160fc1b8616600160ff1b87166001600160a01b0388168c8a6124c6565b9550672e1a7d4da9059cbb60c01b83528560048401526020600060248560006000805160206159f38339815191525af16128875761288760577c13776974686472617720455448206661696c6564000000000000000000612397565b600080600080898b5af16128bd576128bd60577c137472616e7366657220455448206661696c6564000000000000000000612397565b612b05565b60009350600160ff1b8216801561297457600160fc1b83161561296f576770a082310dfe168160c01b8452602060006004866004016001600160a01b0387165afa61292857612928605672049d1bdad95b8c0818d85b1b0819985a5b195960521b612397565b600051955087846004015260206000602486895afa6129695761296960567c15746f6b656e302062616c616e6365206661696c656400000000000000612397565b60005194505b612a10565b600160fd1b831615612a10576770a08231d21220a760c01b8452602060006004866004016001600160a01b0387165afa6129c9576129c9605672049d1bdad95b8c4818d85b1b0819985a5b195960521b612397565b600051955087846004015260206000602486895afa612a0a57612a0a60597c15746f6b656e312062616c616e6365206661696c656400000000000000612397565b60005194505b50612a488763ffffffff60a01b841660a01c600160fd1b8516600160fc1b8616600160ff1b87166001600160a01b0388168c8a6124c6565b95508460001060018114612ab157600160ff1b83168015612a8957612a826770a082310dfe168160c01b6001600160a01b038616876123b3565b9650612aab565b612aa86770a08231d21220a760c01b6001600160a01b038616876123b3565b96505b50612b03565b6770a082310dfe168160c01b845287846004015260206000602486895afa612afb57612afb60587c146765742062616c616e63654f66206661696c65640000000000000000612397565b846000510396505b505b505088841015612b3757612b37605a7c164d696e2072657475726e206e6f742072656163686564000000000000612397565b8a8152826020820152326040820152896060820152836080820152600080516020615a1383398151915260a082a1505050979650505050505050565b60006040517f5d068ce469dcf41137bcb6c3e1894e076ad915392f28fda19ba41601d33c32a68152610120836020830137610140902092915050565b6000612bdc612bbc613b71565b8360405161190160f01b8152600281019290925260228201526042902090565b92915050565b600080612f7c565b6000846001600160ff1b031015612c0c57630b3f79fd60e41b60005260046000fd5b604051600160ff1b8516156001600160a01b0386168160018114612c9957630251596160e31b8452600484018681526000602082015289604082015273fffd8963efd1fc6a506488495d951d5263988d25606082015260a06080820152602060a08201528760c08201525060008060e4866000865af180612c8d5760206000fd5b5060206000803e612cf5565b630251596160e31b845260048401868152600160208201528960408201526401000276a4606082015260a06080820152602060a08201528760c08201525060008060e4866000865af180612ced5760206000fd5b5060208060003e5b505050506000519050600160ff1b811015612d1b576322323ba760e21b60005260046000fd5b19600101949350505050565b600181341003612d4257631841b4e160e01b60005260046000fd5b600080600080846000805160206159f38339815191525af180611bab57611bab60577c1357455448206465706f736974206661696c6564000000000000000000612397565b604051672e1a7d4da9059cbb60c01b815282600482015260008060248360006000805160206159f38339815191525af1905080612de657612de660587c1477697468647261772077657468206661696c65640000000000000000612397565b60008060008086865af190508061100157611001605571045cd95b9908195d1a195c8819985a5b1959605a1b612397565b60006040517306ff0b40e9091053eee51fa1d482ce5d852f523360611b8152600080600483865afa905080612e6657612e666055710459d95d081d1bdad95b8c0819985a5b1959605a1b612397565b5060206000803e505060005190565b60006040517306ff0b40e9091053eee51fa1d482ce5d852f523360611b81526000806004808401865afa905080612e6657612e666054710459d95d081d1bdad95b8c4819985a5b1959605a1b612397565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8085612f12578235600160ff1b81161560018114612f0357612efc82612e75565b9350612f0f565b612f0c82612e17565b93505b50505b86612f48578335600160ff1b81161560018114612f3957612f3282612e17565b9250612f45565b612f4282612e75565b92505b50505b60405182600052816020523260405285608052600080516020615a1383398151915260a06000a16040525095945050505050565b83601f19602085028201018480612f9e576333f3e07b60e11b60005260046000fd5b50600034118015612fb657612fb289612d27565b309a505b88606052825b82811015612fde57612fd18a82358e30612bea565b309c509950602001612fbc565b506000600160fd1b833516118060018114612ffe57801561301c5761302c565b61300b8b85358f30612bea565b9650613017878d612d87565b61302c565b6130298b85358f8f612bea565b96505b508886101561305d5761305d605a7c164d696e2072657475726e206e6f742072656163686564000000000000612397565b61306a8183888688612ec6565b945050505050965096945050505050565b8151600090810361309f576040516387741f3360e01b815260040160405180910390fd5b826060015180156130b1575082513414155b80156130e357506000805160206159f38339815191526130d76060840160408501614f92565b6001600160a01b031614155b15613101576040516387741f3360e01b815260040160405180910390fd5b8260800151801561313857506000805160206159f383398151915261312c6080840160608501614f92565b6001600160a01b031614155b156131565760405163591c75ef60e01b815260040160405180910390fd5b428360400151101561317b57604051632b32713d60e01b815260040160405180910390fd5b8260800151613205576131946080830160608401614f92565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa1580156131dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320091906156c0565b613211565b836001600160a01b0316315b9050600061322f846000015187878688606001518960800151613c64565b905080156132535760405163f70b432d60e01b815260048101829052602401610265565b83608001516132e8578161326d6080850160608601614f92565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a0823190602401602060405180830381865afa1580156132b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d991906156c0565b6132e39190615784565b6132fc565b6132fc826001600160a01b03871631615784565b915083602001518210156133235760405163a7c6745960e01b815260040160405180910390fd5b6040805184358152610180850135602082018190529181018390527f5018f79d04d45a1d0ef7df4f8a02c44c1b0b59cd11983e44f1e9dfaf071db2199060600160405180910390a1600080516020615a1383398151915261338a6060860160408701614f92565b61339a6080870160608801614f92565b6133aa6040880160208901614f92565b8851604080516001600160a01b0395861681529385166020850152919093169082015260608101919091526080810185905260a00160405180910390a150505b949350505050565b6000546001600160a01b031633146110185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610265565b60f081901c6001600160a01b03821661271082111561347e57604051634bd934b560e01b815260040160405180910390fd5b6001600160a01b0381166134a557604051633480121760e21b815260040160405180910390fd5b602183905560405183815233907f04e0c6a722afc105ccf81d8792757f388d3dad9bc137b2e269cfd6ee99faba999060200160405180910390a2505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8015611001576000606060e08390036135d5576040516001600160a01b0386169061356e9063d505accf60e01b90879087906020016157c1565b60408051601f1981840301815290829052613588916157e5565b6000604051808303816000865af19150503d80600081146135c5576040519150601f19603f3d011682016040523d82523d6000602084013e6135ca565b606091505b509092509050613644565b610100839003613606576040516001600160a01b0386169061356e906323f2ebc360e21b90879087906020016157c1565b60405162461bcd60e51b81526020600482015260136024820152720aee4dedcce40e0cae4dad2e840d8cadccee8d606b1b6044820152606401610265565b816136935761367a816040518060400160405280600f81526020016e02832b936b4ba103330b4b632b21d1608d1b815250614102565b60405162461bcd60e51b81526004016102659190615604565b5050505050565b60006040518481528360048201528260248201526020600060448360008a5af191505080156133ea573d80156136dc57600160005114601f3d111691506136e4565b6000863b1191505b50949350505050565b60006136f883613778565b1561370e57506001600160a01b03811631612bdc565b6040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015613754573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efa91906156c0565b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b60006137d4838360008181106137b2576137b26153c0565b90506020028101906137c491906157f7565b608001356001600160a01b031690565b905060008083815b8181101561394757801561381a576137ff8787838181106137b2576137b26153c0565b94506138146001600160a01b038616306136ed565b9750309a505b30613826600184615784565b82148015613832575089155b1561383e57508961390b565b613849600184615784565b821080156138945750878761385f846001615728565b81811061386e5761386e6153c0565b905060200281019061388091906157f7565b61388e90602081019061573b565b90506001145b156139065787876138a6846001615728565b8181106138b5576138b56153c0565b90506020028101906138c791906157f7565b6138d590602081019061573b565b60008181106138e6576138e66153c0565b90506020020160208101906138fb9190614f92565b90506001945061390b565b600094505b61393b8c828b8b8b87818110613923576139236153c0565b905060200281019061393591906157f7565b88614265565b508392506001016137dc565b5050505050505050505050565b613966826001600160a01b0316613778565b15613af3576040516370a0823160e01b81523060048201526000906000805160206159f3833981519152906370a0823190602401602060405180830381865afa1580156139b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139db91906156c0565b90508015613a4357604051632e1a7d4d60e01b8152600481018290526000805160206159f383398151915290632e1a7d4d90602401600060405180830381600087803b158015613a2a57600080fd5b505af1158015613a3e573d6000803e3d6000fd5b505050505b478015613aed576000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114613a97576040519150601f19603f3d011682016040523d82523d6000602084013e613a9c565b606091505b50509050806136935760405162461bcd60e51b815260206004820152601c60248201527f7472616e73666572206e617469766520746f6b656e206661696c6564000000006044820152606401610265565b50505050565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015613b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5e91906156c0565b9050801561100157611001838383611d53565b600030733b3ae790df4f312e745d270119c6052904fb6790148015613b965750600146145b15613bc057507f568575351b1514757989de9c786c66097e2ae26e38a5fd1b885ac2dd02b8b0bc90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f9569cad29571f225e7f2c73ecd677d78be383da74efd13f4af2bade05dc1a8de828401527fe6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b360608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000428460e001351015613c7a57506002610c26565b60006080850135613c8f60a08701358a6156ef565b613c999190615706565b90506102208501356000613ccd8a83613cb860608b0160408c01614f92565b613cc860808c0160608d01614f92565b6145a1565b905080831115613d1657604080518281526020810183905291935083917facd4baa7803154e33bc54ca36afe61420bf31d5f1bf3587746c146d2f3a76e50910160405180910390a15b6000613d24610d7c89612b73565b9050613d8281613d3a60408b0160208c01614f92565b613d486101208c018c61580d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147cf92505050565b94508415613d935750505050610c26565b613da284828a60a0013561480c565b94508415613db35750505050610c26565b8515613efb577370cbb871e8f30fc8ce23609e9e0ea87b6b222f58630a5ea466613de360808b0160608c01614f92565b613df360408c0160208d01614f92565b735703b683c7f928b721ca95da988d73a3299d4757886040518563ffffffff1660e01b8152600401613e289493929190615797565b600060405180830381600087803b158015613e4257600080fd5b505af1158015613e56573d6000803e3d6000fd5b5050604051632e1a7d4d60e01b815260048101879052735703b683c7f928b721ca95da988d73a3299d47579250632e1a7d4d9150602401600060405180830381600087803b158015613ea757600080fd5b505af1158015613ebb573d6000803e3d6000fd5b50506040516001600160a01b038c16925086156108fc02915086906000818181858888f19350505050158015613ef5573d6000803e3d6000fd5b50613f89565b7370cbb871e8f30fc8ce23609e9e0ea87b6b222f58630a5ea466613f2560808b0160608c01614f92565b613f3560408c0160208d01614f92565b8c886040518563ffffffff1660e01b8152600401613f569493929190615797565b600060405180830381600087803b158015613f7057600080fd5b505af1158015613f84573d6000803e3d6000fd5b505050505b8615614022576000805160206159f38339815191526001600160a01b031663d0e30db08c6040518263ffffffff1660e01b81526004016000604051808303818588803b158015613fd857600080fd5b505af1158015613fec573d6000803e3d6000fd5b505050505061401d8860200160208101906140079190614f92565b6000805160206159f3833981519152908d611d53565b6140f4565b306001600160a01b038b16036140665761401d61404560408a0160208b01614f92565b8c61405660608c0160408d01614f92565b6001600160a01b03169190611d53565b7370cbb871e8f30fc8ce23609e9e0ea87b6b222f58630a5ea46661409060608b0160408c01614f92565b8c6140a160408d0160208e01614f92565b8f6040518563ffffffff1660e01b81526004016140c19493929190615797565b600060405180830381600087803b1580156140db57600080fd5b505af11580156140ef573d6000803e3d6000fd5b505050505b505050509695505050505050565b606060048351106142335760208301516001600160e01b0319811662461bcd60e51b14801561413357506044845110155b156141d357602484810151808601820180519192909190614155908490615728565b61415f9190615728565b865110156141a75760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103932bb32b93a103932b0b9b7b760591b6044820152606401610265565b84816040516020016141ba929190615853565b6040516020818303038152906040529350505050612bdc565b6001600160e01b03198116634e487b7160e01b1480156141f4575083516024145b156142315760248401518361420882614899565b6040516020016142199291906158a2565b60405160208183030381529060405292505050612bdc565b505b8161423d846148c1565b60405160200161424e9291906158d7565b604051602081830303815290604052905092915050565b60808201356001600160a01b0316600080614280858061573b565b9050905060005b81811015611d4857600061429e604088018861573b565b838181106142ae576142ae6153c0565b60200291909101359150506001600160a01b038116600160ff1b821661ffff60a084901c1661271081111561431b5760405162461bcd60e51b8152602060048201526013602482015272776569676874206f7574206f662072616e676560681b6044820152606401610265565b6143258188615728565b9650614332600187615784565b8503614399576127108711156143995760405162461bcd60e51b815260206004820152602660248201527f746f74616c5765696768742063616e206e6f7420657863656564203130303030604482015265081b1a5b5a5d60d21b6064820152608401610265565b8861440857600081612710146143c5576127106143b6838e6156ef565b6143c09190615706565b6143c7565b8b5b90506144068e6143da60208e018e61573b565b898181106143ea576143ea6153c0565b90506020020160208101906143ff9190614f92565b8b84614aa8565b505b81156144d2576144188a8061573b565b86818110614428576144286153c0565b905060200201602081019061443d9190614f92565b6001600160a01b0316636f7929f28d8561445a60608f018f61573b565b8a81811061446a5761446a6153c0565b905060200281019061447c919061580d565b6040518563ffffffff1660e01b815260040161449b9493929190615928565b600060405180830381600087803b1580156144b557600080fd5b505af11580156144c9573d6000803e3d6000fd5b50505050614592565b6144dc8a8061573b565b868181106144ec576144ec6153c0565b90506020020160208101906145019190614f92565b6001600160a01b03166330e6ae318d8561451e60608f018f61573b565b8a81811061452e5761452e6153c0565b9050602002810190614540919061580d565b6040518563ffffffff1660e01b815260040161455f9493929190615928565b600060405180830381600087803b15801561457957600080fd5b505af115801561458d573d6000803e3d6000fd5b505050505b84600101945050505050614287565b600060f084901c6001600160a01b038516806146c35760405163e6a4390560e01b81526001600160a01b03808716600483015285166024820152735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9063e6a4390590604401602060405180830381865afa158015614617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061463b9190615955565b90506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561467d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146a19190615955565b9050846001600160a01b0316816001600160a01b0316036146c157600192505b505b600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147289190615989565b5091509150816001600160701b03166000148061474c57506001600160701b038116155b1561475f576000199450505050506133ea565b8360010361479757806001600160701b0316826001600160701b03168a61478691906156ef565b6147909190615706565b94506147c3565b816001600160701b0316816001600160701b03168a6147b691906156ef565b6147c09190615706565b94505b50505050949350505050565b60608101516080820151600091906147f1856147ec888585614b3d565b614bac565b61480057600192505050610efa565b60009695505050505050565b6000828152602080526040812054600160ff1b81016148305760035b915050610efa565b8015801561483e5750600083115b156148465750815b80851115614855576004614828565b8085036148755760008481526020805260409020600160ff1b905561488e565b61487f8582615784565b60008581526020805260409020555b600095945050505050565b6060612bdc826040516020016148b191815260200190565b6040516020818303038152906040525b80516060906f181899199a1a9b1b9c1cb0b131b232b360811b906000906148e99060026156ef565b6148f4906002615728565b6001600160401b0381111561490b5761490b614faf565b6040519080825280601f01601f191660200182016040528015614935576020820181803683370190505b509050600360fc1b81600081518110614950576149506153c0565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061497f5761497f6153c0565b60200101906001600160f81b031916908160001a90535060005b8451811015614aa0578260048683815181106149b7576149b76153c0565b01602001516001600160f81b031916901c60f81c601081106149db576149db6153c0565b1a60f81b826149eb8360026156ef565b6149f6906002615728565b81518110614a0657614a066153c0565b60200101906001600160f81b031916908160001a90535082858281518110614a3057614a306153c0565b60209101015160f81c600f1660108110614a4c57614a4c6153c0565b1a60f81b82614a5c8360026156ef565b614a67906003615728565b81518110614a7757614a776153c0565b60200101906001600160f81b031916908160001a90535080614a98816159d9565b915050614999565b509392505050565b306001600160a01b03851603614ac857614ac3828483611d53565b613aed565b60405163052f523360e11b81527370cbb871e8f30fc8ce23609e9e0ea87b6b222f5890630a5ea46690614b05908590889088908790600401615797565b600060405180830381600087803b158015614b1f57600080fd5b505af1158015614b33573d6000803e3d6000fd5b5050505050505050565b60006001600160ff1b0382167f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1811015614aa0576040518581528360ff1c601b016020820152846040820152816060820152600080526020600060808360015afa505060005195945050505050565b6000826001600160a01b0316826001600160a01b03161480614bea57506001600160a01b038084166000908152601f60205260409020548382169116145b15614bf757506001612bdc565b50600092915050565b60008060408385031215614c1357600080fd5b50508035926020909101359150565b6001600160a01b0381168114610f4657600080fd5b8035614c4281614c22565b919050565b600060a08284031215614c5957600080fd5b50919050565b60008083601f840112614c7157600080fd5b5081356001600160401b03811115614c8857600080fd5b6020830191508360208260051b8501011115614ca357600080fd5b9250929050565b60008060008060008060008060006101408a8c031215614cc957600080fd5b8935985060208a0135614cdb81614c22565b9750614cea8b60408c01614c47565b965060e08a01356001600160401b0380821115614d0657600080fd5b614d128d838e01614c5f565b90985096506101008c0135915080821115614d2c57600080fd5b614d388d838e01614c5f565b90965094506101208c0135915080821115614d5257600080fd5b50614d5f8c828d01614c5f565b915080935050809150509295985092959850929598565b60008060008060008060a08789031215614d8f57600080fd5b8635955060208701359450604087013593506060870135614daf81614c22565b925060808701356001600160401b03811115614dca57600080fd5b614dd689828a01614c5f565b979a9699509497509295939492505050565b60008060208385031215614dfb57600080fd5b82356001600160401b03811115614e1157600080fd5b614e1d85828601614c5f565b90969095509350505050565b600080600080600060808688031215614e4157600080fd5b85359450602086013593506040860135925060608601356001600160401b03811115614e6c57600080fd5b614e7888828901614c5f565b969995985093965092949392505050565b60006101408284031215614c5957600080fd5b600080600060e08486031215614eb157600080fd5b83359250614ec28560208601614c47565b915060c08401356001600160401b03811115614edd57600080fd5b614ee986828701614e89565b9150509250925092565b600060208284031215614f0557600080fd5b5035919050565b600080600060608486031215614f2157600080fd5b8335614f2c81614c22565b92506020840135614f3c81614c22565b929592945050506040919091013590565b80358015158114614c4257600080fd5b60008060408385031215614f7057600080fd5b8235614f7b81614c22565b9150614f8960208401614f4d565b90509250929050565b600060208284031215614fa457600080fd5b8135610efa81614c22565b634e487b7160e01b600052604160045260246000fd5b600060a08284031215614fd757600080fd5b60405160a081018181106001600160401b038211171561500757634e487b7160e01b600052604160045260246000fd5b806040525080915082358152602083013560208201526040830135604082015261503360608401614f4d565b606082015261504460808401614f4d565b60808201525092915050565b600080600060e0848603121561506557600080fd5b833561507081614c22565b9250614ec28560208601614fc5565b600080600080600080600080610120898b03121561509c57600080fd5b883597506150ad8a60208b01614c47565b965060c08901356001600160401b03808211156150c957600080fd5b6150d58c838d01614c5f565b909850965060e08b01359150808211156150ee57600080fd5b6150fa8c838d01614c5f565b90965094506101008b013591508082111561511457600080fd5b506151218b828c01614c5f565b999c989b5096995094979396929594505050565b600080600080600080600080610120898b03121561515257600080fd5b61515c8a8a614c47565b975060a08901356001600160401b038082111561517857600080fd5b6151848c838d01614c5f565b909950975060c08b013591508082111561519d57600080fd5b6151a98c838d01614c5f565b909750955060e08b01359150808211156151c257600080fd5b506151cf8b828c01614c5f565b9094509250506101008901356151e481614c22565b809150509295985092959890939650565b60008083601f84011261520757600080fd5b5081356001600160401b0381111561521e57600080fd5b602083019150836020828501011115614ca357600080fd5b60008060008060008060008060c0898b03121561525257600080fd5b88359750602089013561526481614c22565b9650604089013595506060890135945060808901356001600160401b038082111561528e57600080fd5b61529a8c838d01614c5f565b909650945060a08b01359150808211156152b357600080fd5b506151218b828c016151f5565b600080600080606085870312156152d657600080fd5b843593506020850135925060408501356001600160401b038111156152fa57600080fd5b615306878288016151f5565b95989497509550505050565b6020808252600e908201526d149bdd5d194e88195e1c1a5c995960921b604082015260600190565b600060a0828403121561534c57600080fd5b60405160a081018181106001600160401b038211171561537c57634e487b7160e01b600052604160045260246000fd5b60405282358152602083013561539181614c22565b806020830152506040830135604082015260608301356060820152608083013560808201528091505092915050565b634e487b7160e01b600052603260045260246000fd5b6000823561013e198336030181126153ed57600080fd5b9190910192915050565b6000808335601e1984360301811261540e57600080fd5b83016020810192503590506001600160401b0381111561542d57600080fd5b803603821315614ca357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526020808501945080840160005b8381101561549557815187529582019590820190600101615479565b509495945050505050565b60408082528181018490526000906060808401600587901b850182018885805b8a8110156155af57888403605f190185528235368d900361013e190181126154e6578283fd5b8c018035855261014060206154fc818401614c37565b6001600160a01b031681880152615514838b01614c37565b6001600160a01b03168a88015261552c838a01614c37565b6001600160a01b0316898801526080838101359088015260a0808401359088015260c0808401359088015260e0808401359088015261010061556f818501614f4d565b151590880152610120615584848201856153f7565b945083828a0152615598848a01868361543c565b9983019998505050949094019350506001016154c0565b50505085810360208701526147c08188615465565b600060a082840312156155d657600080fd5b610efa8383614fc5565b60005b838110156155fb5781810151838201526020016155e3565b50506000910152565b60208152600082518060208401526156238160408501602087016155e0565b601f01601f19169190910160400192915050565b6020808252600d908201526c6f6e6c79207072696f7269747960981b604082015260600190565b6000806040838503121561567157600080fd5b825161567c81614c22565b602084015190925061568d81614c22565b809150509250929050565b6020808252600e908201526d6e6f74206164647265737328302960901b604082015260600190565b6000602082840312156156d257600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417612bdc57612bdc6156d9565b60008261572357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115612bdc57612bdc6156d9565b6000808335601e1984360301811261575257600080fd5b8301803591506001600160401b0382111561576c57600080fd5b6020019150600581901b3603821315614ca357600080fd5b81810381811115612bdc57612bdc6156d9565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160e01b031984168152818360048301376000910160040190815292915050565b600082516153ed8184602087016155e0565b60008235609e198336030181126153ed57600080fd5b6000808335601e1984360301811261582457600080fd5b8301803591506001600160401b0382111561583e57600080fd5b602001915036819003821315614ca357600080fd5b600083516158658184602088016155e0565b6508ae4e4dee4560d31b90830190815283516158888160068401602088016155e0565b602960f81b60069290910191820152600701949350505050565b600083516158b48184602088016155e0565b650a0c2dcd2c6560d31b90830190815283516158888160068401602088016155e0565b600083516158e98184602088016155e0565b670aadcd6dcdeeedc560c31b908301908152835161590e8160088401602088016155e0565b602960f81b60089290910191820152600901949350505050565b6001600160a01b03858116825284166020820152606060408201819052600090610c26908301848661543c565b60006020828403121561596757600080fd5b8151610efa81614c22565b80516001600160701b0381168114614c4257600080fd5b60008060006060848603121561599e57600080fd5b6159a784615972565b92506159b560208501615972565b9150604084015163ffffffff811681146159ce57600080fd5b809150509250925092565b6000600182016159eb576159eb6156d9565b506001019056fe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21bb43f2da90e35f7b0cf38521ca95a49e68eb42fac49924930a5bd73cdf7576c7724394874fdd8ad13292ec739b441f85c6559f10dc4141b8d4c0fa4cbf55bdba264697066735822122086de79ead0fb270f5ba155e53602dfc8ed82c71fdd9d09db0688152e77f6d3ff64736f6c634300081100330058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563054d01b673cfc6441b0ab383327afaf3ad1019455170058210310e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6041010219080405581d0222a6136796a4543993032dac350fd03a38b21b9171733dc96a647ab90701195a8805581d02213db77e19bf46a10eac2cc934eb93da061b24922305d34507e19ee704010219040105581e03bba256d6d66ad6a711d3b9d82772be67a8ae407e1ef7a71ac166da7fe00c0147024d62d7fa523b03c29ba103680f2a5969c810900a54d65ba114eed252f3ae79dfc831b53274327b039e570bb9c762292ffd1b2f83ea25d6e68fe1bbb49af4b1150d02da3b75be4a5c03ccbc414f180ccbae836c4938ca3a85fbd0d4e397e809418d8f7cc83090b1293e0219e70e03602be9dd1fac2a83b31fba97e30e5b2a5a50938e05d7481aca2b31bc07b7892203709c2e28c97713ea6148c8e927c4722871ffd908dac25a47d178dafa57d663a3039b5ba9e59aa720b27edbc05b9fa3e64efbdb55af554492526bcda64782150e65030d51868fa67dee90cf565fa6c40af4d7158076f082e1bedf7e945875a6ee141903266159f6836de0ad1682089250b2bbc8e74dc1cf6cd35b400b4b1c9c62e76e5703cbc34d9bf51c51134a309f40826de0df7032c45eb8b284b0834c98b5f1d5bd450219ffff0392d8e422ecb7684fc0a26c8435b32b7ac8ddbbaf7fe98e791574fc0a903de0a203d6f67c08eb0c6a50267b76d5462de5a980dd1f3e2f57d19626b502a2ce0c2ef10219ffff03232c4dbea54b335fb249e78d8e339ee85b5b27e73593ebb863e5651b0e7bb755032ca38a9db335d0c2c4ed2548cd13f6c82ab82a3091244015576d92565b9f7cf203aa476c3c11097a9f3b1f966d4de9099ba3f12116d1c3ccd06de020aa1c2bae110329c2bdb46590464736286542b8ebc13d6f0bfa783e014cc0e5ea0f4d87790a4c03a3f3ec44330da199cc9aee219147025a467019432243870c18c5ee3a0a9da9a50391c7829d9771305fbfb77ece2bf188feaeffe9f6f198c7a4517f4636034e19190350e1a621487b30bb20f5e7bd90109c9157056e364528f3d1b16a315ed83ad6b20383dc8af67a6a9fb6f4c8c203391c79253cad71f068f42fde63ac37c162e5014c038081a43121e0d7b60a3152555f57f301c2c5f57656bace9338c310a2e86c78ae03574da74d6a833d7768a0699f1f2da04ef8d8719b3625097d1b78feab812d2f6a03f547d3c32ba3662ae6e98ba4c148ef9796f6086256b59d4536d2e3f3182249cd0352fccf30626acff42e3942ff6c08910f20d6e0c332bf16a59455a3c6f2bba4f40219ffff03257f83834752baa02f3f0cb8a3c127ce5990bb64efe47f5876edfaec654fd5ce036ec5c147d9e3ea880d313758aeaefd7c14bc5cf3a0735744eb03c0b79829338f03b0878c3343b0ea28fabda80e52b8a60185ae44167f2413d43d60def3d092da7f0356b562989d209ee78cef362c80528dd149be50b28f83915d23ce8df6d49a5ebe0219ffff0349ce97e9c2b02020f71de457b4fd73bf80676d90249dde7c38fa347917973cd203154fbe70ddf0efa59c72a9c305741f33914e799eb71984f2590c8d0c9b40625a03cd3c0bbd7b429a7fd430c125504797013a14d24156388a797958bb66eddfa55a039e6aed648d2d6c2ac8bd1eae86119a674e5186f7e5046042d5eecf015f42addc03518c12343b8ce2f24450df0350faee263c805d516ed72cbf2b02d0ac48619312036e729dd98f05ed4b1fa191fb7b6c402fc70538e1868b08d47a5b042d8ec9ddb303cfe7605319cb8c5f88ef238690a169e2edf5b10a4c6727b1324b6b2d3c411eca038838c5e639b37254066a4ce06c6459fba5c21b4020330439b95aef88948cd6250379628250c9072cd159158f8e51d42319612854bdea7608694adb730e09d52fa203ae4a8761d78258107512f30a2038c37858c50c59f07f74a749c8f5a48f100a8303c6b21bad4fb2594c31f5db1d16b8f056089fd1a43bafb6c32018580c2c5f691e039a42a31278925aaab12da31f2fe2e0bfe38fd576e3c3cd12bc48b8d756baadcf031fdfba3891b08eee159846009c73163245e8e6f732ff819e16f612beb3ac7166035ce9ed1903b425c597ba87be016cc317017822098755e8cb8ab07d79b039270803727cae139dce2cdcf0e2d49f929e06ccbfad5ece5241525246e471f015c60a8503f7d2c336ddebd273185925765dab08951b9fd55635b55a8a5c2f75315e0fcdcc032ce120e4ce4c254f358fe3ad34db1b6c566870d8a1dd0cca3a72faa2813c230803b88cd32743aeb99106a87a77fc3b9a821015233292573cde2a4659c02368610803fc92c7bfc1671932a11b81e7c44c059986429415e7f9fcc249dcebb8bc59fa2203d6698ad8ba52a3106b99fb545526633e05ffc5c406f25c040c8b37b3386281f303629c5990bf3764aeb1768b8a1f8b71d1e4720c81f00ae4dcfecfb7b4bff1fd81033b453516a9ba5391419658b076b9b1092f4819ececbff53cec68060254c08b68036adc78301061192388d0ba67258acb37867d27e1c9a664ee93117ebd90e8e09603d5d9983329836384c7deaf218ac2f73894ee0a81a4eb63952cd14425827d7120033da8de781a274bd61312c7586c666e2d1c889276b29deb1dc7969ef35de2365103f0863f63f355d774c34cbb4a245511f79fac3f32ee99a2aa71b2ce440d7016f6038d8a5628e350b5118482dc6b2d351ec67b0a76266094520b7d750ca2eeff938003f0bd82a1cd66dbe912fc4a096ab0c83777201a4d6b9ace21dbce76afccb7ad2505581e03742b224a6edcb0a9f129ed15434b0b7b5408f082172deed7dc98e207b0040405581e03e4ca577fa2ceec4a0e2749e1067e15e86f5663f9e98c8145b75299eb200c05470162271a39f47805581e03b19f14fc0fc0ea8e5f25219a175153b2f664f557172f1784203f51e0f00412030a4c1f9f9eef03f672308acf0a75b362600c8ab4c7fc4658adec29bc3e161a1103d25ede967d060a280ad631b35ff60a7fc955602ac67a8349dfe7bb97e2ad09be03303931f8ef9df9270c30e0ac139957f2641beba9374ab0f098cd92ffad96d5cc039b742f21ee655c278b19615fdd86646d780cb6ee8868d9f74ec47eefdfdfc99205581e039069a7bd827b1274fe127505b670752269dad387fa9dd70f294014367007011bffffffffffffffff05581e0387fa54e0b582e59e4f9e1b6732c83d747ddb4c8034997c058c92da15c00c01470bbbaa940efbbd05581e03634ec721d2f5bbc50cff2667067a75ea2c52ce0b48947f42ce740e19b00847b1a2bc2ec5000005581e0350aa6615051b1f0e68f9dff8f78b938b489f07ffcc35acf0883fd4ad600c0146f87a35f5cdc0031659de68e6a279da28599e113109376d848bf72a54b56d945750294b8c97e773030657e508cc6d404d8cc89513d451fab06b3288013a5753906560d9cbed22571f05581e037ea481148d8073f5fd85415b3199575687070ac2add9de08b0550ba57007011bffffffffffffffff05581d0234b476ab74923dfbb6d9f870185bc95b906637066cbe90ef926995fd0c014711dd178485ea4405581d028e66375e8296cf37782b3f6253b0d09f95d8e941dddb38d66cf4a54a0c1825480abaf0a0561af54c0219480002195fab036214cc2422b5238d998607365f6ba91c81041b1b1594798bbe2c40b88e6065d3038161b27953d99ac839e6dec507d3a54643fc5fdd7d55bb14f66b53ce2be7279503a683dd096527ead19dd5097f3f5f171b3f3e5ae41c38900d2d641ccf0ca5ef3d03d73f1917f1afdc3d6b8c7be40146d3c6b9202e953eb1a7b965c03c8a49a2477403217e20e54f67c98f1b3685e7135ad86cadde7182b87f23c3db1a26445f5fcfeb0300b5e71df20a3fad30060a835062aa03cb56d6a8f37d05020345a548ca34e42103be2841aab895ca6de6f1a8027195a3470d8ca776ab1ea3b2049ac3451a7f4a0d0219ffff03f619dfca387897d0cc58cf42ebff0919a83dbb7792e77f004f0f69a549b3f228034edef06c66a69b4d26433a008c58f6815086323fed87e6d970271d7cbbbc1ce903c36b426ed13b2175a2718139841b8f93d50e4a59f04bc4cc5b83d745bd9aa50403a29d8a0054b4ba9c9dcaf39040bb5e0b75ba65679cbde316722c1719b404db5c03b0822101606180f9b736f72a8b509eb72e6d03de220dd4d8a9ee04c91dff9ea703f110526b7cbff2ab1b18e41d13d77d8340444851bc0e3881dc82cb3542b0ee91036ad4e077c3790da5135c678eac503a4ba998fbdfb3c868bccf5d8d38af5e4a9f03ee9d74c2977e644a27d084e82379a24210e5f25bbd899676a9516b5c805663d603f431f9e9c1b51abfa3ae4297e108efb5a2659a471276403c92bf39ac3f0c877f0219ffff0376345ae39eead2478f982585513e5e1d3ec046667a3ecb7125f021af070634280380ade4c28985b1a4d643f0ad055e38875d78857f0c37d7286010fd9c71b94b1803f93fbb74647c68b924d3646a382287da851a215f2b23384859fbe69ae00d8e53038b629f5765d9bde88284fe11a5d2093a999c3e50121d2a6a14d0c7c639874db20359565e3c218af56fa85b5386ba9d2d82d0bb4612a9be37c4d4dff6ec2eafbfd103f9154e2b7fe7ca97a80ced229c533c2a5557c99a25ff5eaf93603b9558444164031180b35c7bd750a709897a1652b8b3245be6ab2cc56fabc5d8219c24b391f8320361d9250b4872c1050da3945662e41a90a4af1d332b434b89164e005945470c57039882f0851f2f693e63987b84049a8b0feb09fb13cfe9d0548270d8ccb0dc839003986e9c704eac18a88b1a61dd5b2d69a6c1bef7bfedf9a4afb0470471a648329d038e116b8bf6289bce1d0fdc2e153f4257bda89f163e52b39cf11e499b5a2fa9e30346fcf93affeb9a54246f56918c7ec7830f668e1c02d8895be615399f4f1de5c903cf1f9544a9fd15022b6e6fa9c19ce328b05d04c094fcf478ee7c69ad12a8507403c2068113db16d9add34b850a02da9f2f1825b5c0ffe522fdaa4aae533aa761490219ffff03d6e440812ff7521a1cdc4db57d5daa75f7474f7a30d6d523d06bf2716d914013031ffc65b58502f0f29d80e56074e90e194dc3f3466269fa4e85dcd92e4926bb9903da7ed97ce37b93329ecf410f40bc4c42f125be5b51a3bd4e74649854ff1be5310371b29916e622ab02a09862e73312899b7436a21d1b187ef305262cd36951285103db26966e425cceecede9e760a41fe08e2aa19924fe20dbdd8b2c0649a1f2dd75036951be3a029c12811c8cf4a5c435d0ca0cb751fbe98c1ad35d31fff00c41a68303361af053e1aac4677ae269ce65b9762b28a84eb85eeb089ac3bd93c2a089df3803f2b2c8fe553497f6caf0ee03cd1b8e20063c87119bee941f51c724ad59eec2f803921f49412261702f3e24801557774fc1c0de3226e51a2da3b90b56db171a7c140314339afa49561622f3a222ca2060b173d46ca618e0f1ef1f7638b56445c453d703832d72c0852c2b424c737865182109ef00e4e4adc8f4e80789ebef7bf2a9eda403d55279bce2eef5a1ff56c08b8cf79b34d129c2f2b654a48b46de529c46ee3c950219ffff0219ffff0323e9399d30b73eefed7059d98eb2a883d525ab0f400a0b7fedc801117b00cbdb03a8423c0aa3924b34931b35f5153e0f26c2f63549484b78075badc5133173c103039068d569aa9f5b035b9d960999fee29f6174dedddfd9ea528b7f02f545921ee9035dd93f54e96e3319a9b679afedcfb96171cc269301334688fd068f6eb44766970321786df8391fbc0105cae1b1bea6e8d57d7631e87ab87ceacf6cf8ad8818c24c0313465819dea42d0d17ffcf44850c6196412ce9aa17226e149baecf43d0dc86c103b10ac732b3621366730ee74840659b5ec6c067b4543e51fd5d02e9fd4239804503f1d891b68ce222bf8ece9d28aedf2b86412bd5afede74d74d61c62d0f79603c4030b0fed4ecf9edd189f63fb3c58bcf9eaa818b14853e4b41e4a14306eafae9c7b033ee47e9f4db8e86a475bf0e50febfbd9686f58cdcb677f7ec2bfc55f8f80205503eaa17d33a872a4a0262c6227e9b96f1c219c8fb834531b5a9e0f43a7f26aea14032c28915b8bc9af66c7ac778b85ec27d69bd4ee1e52d98f7dec2bac3bb79a6bf503da64b91fd87b3d7a3747ea0bfc4022236d20fba7da1c5f0837a6158d75927c22037c6578681cf86c872ca1eb809b50139d91f642c59eb4b2628297b3cf3c724fa003b18f54015abcefb3ce1f273d5adefcc1482bf9722841544f2f600c7b0b23e1bc03af00583ecf31d24a169f26061d68808fbfb4cd16f170b3444933f0ba58a7cf2a0353806ce8bb7f52271afbe0b1b7a8020655b4239bbe37f7f92e189ef1fdd19ddc03044f14c3e292b6afbab7343c4f4b0c6df56e0a17e5fac6132e7f068e0df93bf303cd822db56b3ccc0172e6eb0b4a8746026937afaff23afb59585fbe61f3df04da0381b633ab987db860eb2400ada1d7ee5ac92d39e37819ed4f50a426df4791d8510303a057b36a5455eeffa44c26dcfaaa4e999db79c12b0db9d20831bcad7c9cd38039852b8665d2a1e54578448c498eacccd15209b3ad8502c5160ae6655a4e4dd3a03f979a240acd281a7d1b3fa8c270ca3e196b307d6ef5d7340e73d6594e9ca79c30365e5952232f1399cd5f18a2a5863994ad529a0781b96eb41910c554ad021b666030fe28cc9031498cfe367d9e4a5337390ddc9815242bcfcad7494e5101443de010391d46d87a15aa9288ca0299d65048b2a752523a5146cc1f10195dced776620b803625b2c5a8f0e05e2123897ece5a951f8a5fe4e8afa822e935d265982cb09958a03855a93f294bd1325d5bf38f68a9bfb9a651f2749cc54b3fdd9bb58e0095d9936032b13b5d4b69480325b9d0358b71d027767816ca0b64354a271b1778bf43f806303fcc90e4ae3d374e2b9311e2ea551c2f610d26d1f3897694d16e81aeff5301edb037f8c9057fc832a2298bd992b22b7f5ef238b46d521751b81de5fb3105dbd58250355f1996e75df98cfb8ab9c4505a49944be23d45c3e4f9e2621285f3debbe96cf032f9a959730ce118a9ca97f8f98ce9d1b5f125dd13a332d3166911a48906f0f7803248cf22050293cd74a31cd77bcbc615fc48780e5127e4db90f561c2fe5ade88c036f5c0728eda9f97cbbc16a6115586eaed85dbcbed48390c4f2c607b1946133e803f930756eab0a581728fcaf851943828e16798fc52107aa6407e16ee43509d2d0034e31bbf7855bacb924329ec5e58c715559ba6aa408702a73ac850a2e9410c7d205581e0312036d9faa424ceab1ca58eb6d82293145300d480bd295e609f9d40000040105581e030d144d1690a0587d192755c76f7226e0c103d0d777191cdb9d68233c200c02477cdd42821dc0d105581e03537c5035b8dc527f66b8c82f050460805b210bf9637652831df5f70f700c01468a4f3539580005581e03565b4df2c5957476d2006aac2d1c5c41e343b98ef339abc02c4098fcd0040a0399c99f1a6d65a9097e0f8ca61683878ed26099e347359f5cdc600bd194dbe908039188efad72c6747c1e7f1e19036c430f6c4291fece213788dcd97857028c1b5e05581e039c512f91e21f13ebca1e24419617e8054943a56245eb3ee3ba050d533007011bffffffffffffffff05581e03058602b1552e19ad96578f935466a24f25fc14b8709982b7e8cc1e09700402031b460c826a854d61dca82f718e088b8b4c4082ffeb93752d7691bc62c51dc0280605581e03f69d4cd590481a229ffea933ae23c87ffd52e58dab86e024a8beb852d007011bffffffffffffffff03ce33220d5c7f0d09d75ceff76c05863c5e7d6e801c70dfe7d5d45d4c44e806540306b487d15c028b6df56c3ebb9b7086965eba3a240857a647faece2ff13269f2b05581e03fa7069cd405b5b8c7800fff1718aa9a388c02157288dfba2776a26ab1007011bffffffffffffffff03224ac66d1d1839d1b253d6323595fe5dedb6dc1cee7e965d8d5a6e0ecc207fcf045904cd6080604052600436106100225760003560e01c8063972fdd261461013e57610029565b3661002957005b6000610075600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610174169050565b90506000610082826101c0565b905073ffffffffffffffffffffffffffffffffffffffff81166100b0576100b06100ab83610219565b6102c4565b600060608273ffffffffffffffffffffffffffffffffffffffff166000366040516100dc9291906103ee565b600060405180830381855af49150503d8060008114610117576040519150601f19603f3d011682016040523d82523d6000602084013e61011c565b606091505b50915091508161012f5761012f816102c4565b610138816102cc565b50505050005b34801561014a57600080fd5b5061015e6101593660046103a7565b6101c0565b60405161016b9190610427565b60405180910390f35b60008160040183511015610195576101956100ab6003855185600401610302565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60006101ca6102d4565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216600090815260209290925250604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6060604051610227906103fe565b6040518091039020826040516024016102409190610448565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b805160208201f35b6000806102e160006102e7565b92915050565b600060808260048111156102f757fe5b600101901b92915050565b6060632800659560e01b84848460405160240161032193929190610475565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b6000602082840312156103b8578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103e7578182fd5b9392505050565b6000828483379101908152919050565b7f4e6f74496d706c656d656e7465644572726f72286279746573342900000000008152601b0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b606081016008851061048357fe5b93815260208101929092526040909101529056fea2646970667358221220266f45dcc0f640b86b617d19d2affc31f4b5547fd56bc2761d8eddc74675491564736f6c6343000608003303b0ce7aa66408c3e7c3cb5ad2b76775e06bec75a1b6d5386510071db70eb0437a036a3f3d9ba908faf011efee911b9495d4403d775e868f6e4b4b5348c7d5c0d06e03fea5236bcdfdfc14af4f01ca11cc002f5651d11990cde1c39f2587c0dfa06f4703e7d7d230b79241501de03646b5a613ea9c978ad5840e616ccb707a3950c4de0d03764aad7aca29b0b2b32170434f282b68bb95f1f16d44c395bf689604cef9360f033fade95b5922dcfca63297218058b9c75281c0b11e471fb585b9cf5364810914034e581e3ae3e2a0586ae6aef7ea845857b7dd6847d7275063b1a9c7aac271cd2003fb9a67888c547e81c8337bac148c4a1271d5648f5e168e281a3ee0e8ccca2a21033e4751e3a41b77ddfa5a1d15fd330853739815e3ebd264af468b8c628121236203fe1a116115b375e9c9f8b2afe20a07290d8946cf6366b22a7c159304c2fdbead0340a140437e792074fc9e1cb7e999def3022b9573c545c106d7198c74dacc6998034d3593c3d462a09128e25203f283583e0325860b6cbdf6a51ad8dc956ad833dc0377ce61b0981afdc148ecd4e2d070bee088cfbae1dd2af355e003e92b7cb9ef4e037710344a6afba5117bca6533ce620550625bc0796ea7190fb6860f59746aa41503d34eb08b660b2bd524ce8d3ab784790d90ab0a918335098becb59fb3ff9f025e00581f03ef48a3fb52a11df1c03ea5c7051fb734ebebb68fcdd31deca84afb9a658044651d86930370dba42a7fe66539f010324b2f313a19edf4cd799d08ef9b6ebf4a41bdbd948700581f037bf2db81923b8f5b02dd0daf5927e9d9080e51874aa01594f6f09c31181044650f01270323ca7cf3546296a9ab2571400d830b382f7c1b60b409b70817f04d0f9896786500581f0311ae6b56fd6e9b2f627611bb223f25a2b60883eab900f7d0086ef7b9a410478000000000000000581f034db5135beadada975c08ba9087c860849f9385f41ef363afceccdafb77804904d9cc0dcc16ae42d00394fa14a6e5c3e25d76597089442f9a56955b9a4a0099041eb5e9a82821147fc600581f03e9e3f2883729911d62e713a21e677a2e3735a59e24490a5eb3f7a73229804464d8b8bf00581f033a817c3e25e3a65a760c8a4281bc1be71818c9b025564ef05408cc3d7ca0450129bbcfa503469612a97156b3c3a9e00fb050f1f2a9598f8abfb1bb1098c5863f5c9f6c5dac00581f032e3768645bad16ed4f9c612df5f874db229ec7803c44b347d6791306cd904915af1d78b58c40000000581f0370f9d7c131062107c4f9a83b02773a52294fd54e2b7eac591579cb9adbe04803da0e412568e000037e8f9280a145199c0b08889b13de9ff893850de6667ed0fe4401c3c5f7ee8ab900581f0306208e5be2d375302728d7c1b7b0b07da01ef1c8c7bae4ded935b76fe770540e992c001e375785846eeb9cd69411b53f30f24b0219febf0309501aa967736a5c0b37887b0ca835b7d9be92538669ae6caf195dace5a893a9033d6086c99427fe19e85de8782c3723f97b7d5f6f5712a3055f5dc2d2bcd7c1e8039be4ec0b15f32f121f6b347e0730ab0ab1aadba74e246f9450ca9daf24499d3803ebdc2a749844963f78344065362320f763efa87cbfcff0c5a5ffa647bd7647f30315092680895a68050316717f2fa31af0feb15b385321a6df73ffc25e166edf7203ef587a81463cc6ad7befa70bae1a566ac5833f5282cb71b8e5a0d5fcd4189c5603a53956cafec2d4c319c7a30c5a55b30f7e0013c7d39cbf3a85808575d2720f3503da52aed619e5934bc3ea0c6ca4fcbfef2f2af2830355c348da5059fad4024eda035326791fb2c6a73c6423dc5960dfb8e168c8f6fef2b8c805c44ae912ac98f5cc03fa236c4645da7d2747ce04befa6986d171dde3afa9e3e9d470da986218907b240219ffff03935b913becd96efcdb38b965666c2f507106373f5b2fbb4d8f7d477957f6b8da0337d0f8bd289ac087fa9f78ba720886b8217879fcbc60223f151ead6203f4585d036940e73578730a5078b3c98db6c9a6b316f5596ad7f9d398b3ef458b234f2acf03a2fedab75a7d89211c801a559c98044113e493eb11bc60dd286e5ddf5a6eab2203bff6bf01af5b424ca85f58424fa607212a10c82455f79079f3f0dfd1074fa3de03e2a67fc965767aee64d5496d389c3bc5f6398e609cec95bca7078ef9b8958c3903b9aaaf64b71b370a82b79174d57bb0aa4c8076a9c5619e23c25933f06fbdeee803fb04c5b408521c5c5e2ca0376b7d6974058bde92eb13f60c0676a263f553b87c0338fb7e5e12ded506211f8c670e4c1b52476051ba1a9a33a03bc9de8ab921c53f03b08ce4a6d966ab2f78fa16791aaad71cfbac083ac853fa572fcb227a001f8aab0219ffff036691c7380cd6b4c48eb70c9a20f73dc82e8a116f5368173145f6984b870b9f3403639ccab01467513cf5ac3bd0e7568b6869d4be6516fa97b47c244f802e914332037bb429e3b830c49c9ec71284eb611ca557d16cfdf2f0b8a1f435842163c268790308c62167dac8e1d6a35d4fce8b31a2860f32f40ef94ced1a48d6b9d171ee415e03250301ae6a8055b15b5513e3222a78a64c3adf5b45273c96f7adf0a3ed6eb24103968c38445fe34521242de5c0beaa6226780a4a06c4ec681af4f541580a969310031ac86c0f0d51abe16d33b74bdf374247c70dbb30eaf329f7e1652a6eaa5adbcb03ef4f5bbdd303df6a8ae454912eca5b8bf0cd48a8164861c0a46934cb2c21976d03a686bd137bcf4fdd06b47b9855d2dd7563dab07c154e35fa5648d1b621bcc4cb03f90b13a07201d96a03850a1d9b0d0e261cdba9a8689d6c0b6cc7c54cdab68fc103ed976c5386acbe7ff4ce6b7fbf98f35718c698aebab41bf2ecae23e7d05c45dd0219ffff0382ffe01ff71d2f482d053c3b4a04328e398f13ac820250a050529c079de34cf40325e587640dcbe55ee70a48e35d923b19890b7f770f5869474032981159fefa600375cd4b16bf931ef16a9eeb86b1cf0c187ec70d4d6df990d234d62dde7497aba603746e02d9144955ff6031c708770c4ca0ac5a227345154a47c083aac1fe4df26a0314d111b847141a125fe83ee3c2c4683a6ce355fad8a6b736b9a0139910b6b20203ca4b784c21ec8ea78d95c07e063165aab1827c385003575330458c930835ffc8032fee87bb5bef0335bd9673be6a30c090c7809ddff527b63bf52b13bd7df762bf034bf125a75ce551e89859c492021d8bb0fc21acf3a0e71658cb63707e92cc48aa03e0b4af1c012469191b6e4527ed435ff166dcf0a18188a797a0a573cc6adf55a3036d4b9d07fe6e1faeba3f963553cc5f3edfce90b8f1d44671a3077c88c3fe47be030078ab74644281326df8fbfb042134616ba46b2bd415eea8050dffbed288eda203302cd5879977d39371dbaf9b63c1134d4ed847e98bd3253b509cd4254d0500ae03838de2ae1baf946091f7178d4dd5c229c299e3fb4a518716394a5e00b7e225b9033e91f0a7357fa3b16ce59e13851da289f6f957a1aac19092cc2dea3e9ce282bc0343ef56c10b89611752452c9d0e6eb47e22259faed6dfe85f0f80d0fa80be7ae6034174cca3fb7056b58a09531db1e2eaf8078cef843dc1d906e2e119386114f08f0383e6c2c18f3788b74b7ce38a011127b0205015db2d8f4932b55a91c0245e082e0307038aad54071664dcf1905d50ec04e0f39c249e6063ae950c8332afdcd35616037d75f916da953425db4f36a311c9fe999cd29474de591edcd692876287d59bb20392666def05af80478a07277c32eb9b0528c0ee847e189fd65b3f068a4921faee0359a6b7facee3e4fb70ddbccc1ce142d6171fe55ae4cbf204419869eb964c7d84031a62c74fd653731a52f9e927033b5379d36877033d98fcc9d52d927ab3c717db0355b3559bd8a26f1d5c51e17894b3883c2590dbff4b4530a6511309b9a11486fe03633b4fe4206fd81e661cf112844e48856de446033e8144b23368abe9a7946aa2032529c989a41cbbeceba4847c601bc84d6ca0cab9910fcfd684c88ec21bd125ed039463ce90a8f70cbdabc4e3ec1a4d38a3f209aec2d3b6525e79fcccf40b93f31a035d3dab3bbdb4a5884db37c747cdf27d15110a542d50db8933e73883600eca22203c995099d916a943b6e190ca082d50ddf6aac3494af7a1e454d5732a6f9f79b0203eb88687f58295ac3ca65828c179424443dc8737398a283e3bf251af101f699f00388fc8f3ed60085dd651eebac041347788bd91e8d694184d1dc3797dd7145be4d03c04cf7fe8a0382d34a5ed517e8567177c7597dc3dc129c33e7a32a6afb78977f03ccbef0ff94b8039c1ef95f5a779c52c65545b98cd5aea65e082d702a368647a903ceeee71c9636aed7ea0eae407563d4ac6a0aae332442fb2353edf0d4f9519fbf03d1dbb275ba6cb7847f0b2623b1435a35eac5b75d28f00a58a7c42dff523a7acc03121bdf8dfcc2d5ba70cf575785f5f72cb8324fd06919510c2ae257b377f1d0ed03e151c21d3d092120380d3353dee89e9e2c93e29b781b554c74363de9e7c656e6038f67d49ee74e465e309e3bfd6da15543b1f2aee598077604d9ec8af38cc8fc0b03e94d98f37b2095a469af358578365f0a56b997bb7303dd0e42cba247f59ffa6703d396137cd4d892ce8dac00d33e02c6cca3e65eb5f573b710cb4b54b0d1558db303ec9cf0df3dfe42a5de0a4357709ffed25311ed0e010281ce1bbfb8403c5e3f3f00581f0354be5236b9fac774814b48ede6d10fdeeba4bf92e0505d2af4541d57f7f0482447c78effe6720000581f0371681d4b4dc0b85ad0d65eb3f72ca54ee9cd025fb17670ea469877cf9540488ac7230489e8000003081cd9eaad2e17f42b9093bfbee07362be69a76a0e9074ffb6664f51a5935f8300581f03585f6099e8d1fd8b63b2f60c29aee197ab900e201f27ca4cf063bd99bd904464310c2f0371a230fcaa184372107e8c14b23b8b0c2afa378c33c1b072a00a90d88eed7cb0033bf5e5f8f27c256c19e6697ee09f9907b709816eb2112cc087570e5936f1802c00581f032ed27c54b87de968e370534783582e249679e93fa7ad68b3f79be12ed3e045694fb3456d00581e028618dae0befd3457f6aaba9e53df1861ec7833ae7ef9409e2468a303d3540e992c001e375785846eeb9cd69411b53f30f24b00581e02fcccb0219c51184bae6d7605cbced62226204abce5fd1e67807f7efcc848c39a3a66a988664c021908400347840a15429732620a2f50feed7b6a75c929594cd0a9a4336fd7526867cd311f02197cee034b15000bfb3753651013aad17ecf138ce71112c9ad8dacd3d69155edde5d225803f9a574498ed90510981724e50853a5fc8a27a81847abfdfad66db1e1899d4e0b03e7d6daf5644fab0c80b70d1b168699e391884ac64cd03c918b9bc95bbd15eb8d03abd9c5830e69719bfdf089af61be70241a4cac54a4587bd2955896185c59fc7703253aeb97303f761c6d5e6baa695bc7766d65f457604ee6a69ea0f6595a1e05070352a7bfc93ce4ddff689b6cf7a84f06a6612bfcadaa04dcb80d22807c28d2b46503934f7bc4fc38980c98259b6afd7263bc8ff3de945fe148069ffbcf83ccfc0762039b3f9cf6bab7ff6af7c282f7fb39e8f81473a8a8dc5ad86ff9bf794ce085bf870219ffff03b2e89a7983e51892267dc0706b4d8bc50a7427b3405f202b01058fd4d6a71a3e032d8b1450309f2dd2ead1d92d5ad3dff017023cd948ba9e1013b943d4994bd908035a1976fe882aa4438566a528be1e4c5f11a0e2a73efcc9623d1bea6a317e2dfe0219ffff03acee623287562deb59489922493adbb5917b5fbc6027bc84bb55f43df7f0eabb03e6ace9270deb37b6338a2a011dc674b37b27c4736a3906b5c943cc9f5be15e870302b795b684a11dfe1eb4a375e4241e1d990580a0f8397113f177543a60251f1f03feda25294423f4db79e8ce8e274770649eb2cf89186aae275c29d0f93da76f870219ffff0355ff479beb067a17a188b8e1e95c680cba012f02e60a063fdb994e62345f63a203cca27c0a3508a98f0b3174b6de7faf401a8e76b7cb5cee9e9d9769dd3fe7104803b123fbefd07f62885e9b6355251e12a3480f77591c29db11e8c846babbf1a10a03a219dc14973ac784cbd20251fa31e2ecf432d905ce4c6b0860b9f5ff9290e3be037063292cbc30c2367c78c56f27ff163569fcbb0acb3c803f573cd988f61dea510219ffff05581e0376206f0ba778b536f8b5c5571b9cf6ee4279b8082d1545b9c5dc0b90700f044804d2f05f318bb64c1904cd0219f23e030356fb2ec062e1cac458b921fbccbb3f4d3e48c2378b52e2e7ad0bb69b841d93039db634b3587d75d5bcedd67164e02fb80e249876ee8ccb7d819da510daa8800d03dbbd8a3f5b6df75b02b6cfa04c5f3244530dfc6108c90878f96cf44d6b3d133303fb497226c81384cb04f0cec78c93195a3cda400a7fefb13d310fbcfee70e2989036ed959e1743ae41cc34259baae5586176885e7eedf1452848f99b8f3b2fb52e903f33c1db47d18c2ab2e22b62c88f06c74359cf0a56ca85f0ed7103ba68be169da035900fb625ae3519ac78bd5a805103fe7b33e5537e0fb38d1683425cd4343a1a603584688d03e2cfa0fb39b152f4f085d1db6c95a8ecf981c3750e1127330aa0996035e46e1a0c95d09e927c89cbf8f2489a2c6dcb777b20101704498ff1b0f70fe6f03aedb26cca64ee7b46ec7072a40ecd4947cc1d0bd92e66d90132c00a3dc5f6280036a0e3bbbf243120a51a4e87edc44dce0840fb7b6c272229677afe82b6f407b8b03409d731e3a813ab450dbb4cd3850c51edd88b2e4eb46028f46b597b4aec15a0b0388cbd79e3594bbdef0a0b565d3b67c7f3e6bddf6f55c325d1f409e3ae535b1020219ffff0353ac907a52ca6c934573ee1a5179fb1cb6220924f8949d3717dda710b231eddd032050a42120acda39c75a857eae5651522f6ede8b78ddebc63fadd2c32ac06ca9036eb058f6f920d9f4874b30ad114b3be2de4dfc24913f2fc5c04cf8942fc8335c03e997ed41248d3d0de834819f6ebf42fc5bfa3dbeb9ed9675ea3fa6d0366e4cf40219ffff036ad4a1b0a179bfde73a46b859902c41f8c3506f2a6ec6c9155649b0cde9afb0603a564bd6f99d5026abd352578955062d995caa6e17d2e47b5e901bb685b9c03f303d66d49257915128eea087bda816dad21b6a61e4cc02ccb41c94f4833319fb38b03c5920674fcd25a5f40660771ed3af1e3ae4a28e72cee0349c066b746abd0495d0333e02285b0a8892e1293f692f145153fd14403540a655428cdc960f9c45913f1038567acaef04ab488fc6b5b3c50758b3b4670b11541b31cc1899807d3ac203fe203476e59c93870ce4c4d81602fb7439cedcedd1ab457ca62a20a86b18ca0bb12740219ffff0219ffff039e11e0b2e60bfa240fbc4ce5ea38a02668cd86f2d95d59f355a9225f52b99fd403fc563fb961a4fa575a897d9f4782cea4aa3bbaa736c014846a0bb11a4c5fe7e303132b0f35cc84603c40392e2fc0cc386c9dd21e9b717edfa1e7233d07c3dd4789037e0555ef45379f0651b5487f7c8ec7339ddd94265bc4674e2165045383d2e84d03e4bb075ab8fdc0ded8002d558addeddfe14edaece1f6d9c0ca715724af1dbd0c030a8950f99b532a8e26ad2601e12d70cbbf37f09579a05e361ab7417432537bb603d41651365e44d8fa6051a9179bb9c72785d20b7cfe477d492f941119906c5a0e036aa2f522e1d31c6db622aa08cccc87d69268ed80f745cfb15e8ffee818f17a9c03167168664087740699af7559845849ac5d2c37e46993b1cfb89030abd5c5678e03ead67f4b130256083a1b83fdd04133ad9587aefc5bfeabba82279eeac7e267c40337f2b0d48efffa5ee07805b36ae00f303d7d733b689d94b57ebf5a549731289f03fe25d52c1c69a9921a8fb733268eed66ee4c117e6456906d450b8bf45e6a1e420366dcbaaaf02e05ddce1c2bfff2013b6a93766c8f21102573d938981dd158d8ee03360d70a8c2f3d19eb886827a94e14d2e0fb61f923c2ad48070c06658b615565403e2b6989696eca188b2c8d6864ad190ba03e031aa0533cfacd4b18cc78901f98803993741b583d063de0b616b9c920d773762cd0687a6522cd375665e06a29aa2a9037e72d0b2925079fee15d1123a14d11d701e0fd67b8c50cbef908b48c2959f2db039eb03468ad91edee4e9045d619225f0e1c5c0f4728c08c7f27baa3b545fc292703c86848378e6702f77fbff2c72f86ce7afd0d7fe1b36aa537374815fdc91bf9d103a54f7e603147f631c9fda221af8c6dccb7e779426106355aae344f823241f99e0387e56545f25e0108be617fc86753a719d67c22c067dbd73005aae352ca8807c0030bcc49a91a110ba428956d1d628fa767f5a2b651d8e7249ec5fe339e3181ab0c036d790bf3be4f64e13ff88dda3134975b7980278851590d32457f7b89fcb23668035b27d8065caf2542fafaacd95073cbdf2e6214d322efd71033c6342ba61f4bfa0380508373e59f16e54d9ecd555e14bb44bb73609243e83971aabe5991c494416303c76bca48687403bca79381d53238adcac50af92fe15112cf6844ecf70e95d575037ffeb11d9cbda1b66d2af1aab1afa8bc5e5ddc0044148ee0b44421bc4ba4bd4e03e26989cf74bd4873d24eced20cce94e0308e045694eeceb26de3d4043016d49503b9b2b2c21021fb7e0b634ab25e2e3b83275c74d2384c642920d3110d21ff094c03782e6d908f1b076c71019bdd818bf8b1bc122e2a110e3943e9b03bb3aaadc480039b546ac1aee65f52f3d153127b17e99960b5a23394478abaf78fa154d0fe4aba03ddfe845d47c377e9cfa9e2187c698f76a802161bb3f42cfbf8ed0febb4a6f956035774f1fc435893c448d5fe018c80ae6996377929bacbc50b1d23fc33e12c235e03d8b3e513eaa136ab7feadb9a153995b0f421a0a364a0f416feb6402f5856217203a812aa0a90d8dbe124172185f9c305a0f9fe5b067001cbbac74d62a194e93dbd030466bb6434638e3601c4840f4b7373ced2a22b6bade1a68706ace14a4afd1f2d0380b155e133453b70b4ab6d42a9c094f56ff4ab9040b2204b7bbeb8e69a78adb5039afc1e6b6080903add242c438e61ab2c7894c20ca514c6c482e17e8042c4a05003844fea85154023e42effbb9fa5305924efd745b47a5447bbbe88785b92f847840386645c304aff70b12c503395ea59f87ccab97a025073028e6ba658790ae87aa603d08b1ef6a8a1592d093bd336d381f626a2adc8e88c49e72a87a05fc4191185bc03f02fda2c46476f7c34bad85b77afcb7309c0c33445ce9acf1ed3f2bfde892bb403e300efdf76b150c1ed4fb63faff11276dd99de69de5c346909a4449d8f4326f703ec52bcb262b565d0dcf6fe93f3e4a8301056fa69690c9f40a4c89f2cde2bcf710375e776360f21abbee70d76d3428d96feeaf626f99fce98b5a55f3dd32120e43c032dff75f85c7eabfd7160762a43e6dfa465e31f1b2f9edef25e775e472a5c2a5f033025352304dd923ba987ee6116c11a63e6a0f183bf0fe058f4f9b241f425cc1103cd15b9a0da894f89fe6724f75d2c9bd8dadcfe907c06182982af2ba68e1d809003f99366ec7c32fa666d98664d415069ba3e7885eb942619859ba4609c72e774a10388097f0f375a04b44f762080f0e88e346e6b031772500247286cdbd63e1b4fc603d81597f66d4bfa4898bce568ff07b7b8fbfb766e2d8e4b0d33464d79c779e6410357b167d35071fa4302eb90e112aeaedf2831affcaf58bf9e70f1847da8e1e9ab045908b360806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c634300080900330058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56305437aab97476ba8dc785476611006fd5dda4eed66b005821032df0bdf5a5f92d8037cf11e50f13d8017aefc99d20a73c826416df79570d4810546e38d4999fdb6fac24973e508cde9397e369c5af005821035b20eef8615de99c108b05f0dbda081c91897128caa336d75dffb97c4132b4d054bcd3a47e4d0000cf170e25d1bd3d53f7c08be0a60058210310e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6049011d6c8fba323ca0250058210328a5566b8a884201ab44e2d991177ce8b88325e02e52cbc3da6e67b3ecf29c604101021948a405581d02beea506e63d9311b0eb23c6ed86e7ddc2248d7bbe9d3d02bc17219010f0149011d6c8fba323ca0261908b305581d022f5dce6d993107338134f4048a0ef5d2430bef1a1a61f0a9ab5c5fa60c01450572bfaa000219a0000334160b2b3414a1b448458100361c64bdccf5936cc939e8b2d592200ed19105df03da3cc90ef62d3ad9e255dff552fa7525c31d06eb64d5df5045e56a7bcd3538fe05581e037013a88a4a324f330a934552003c0ea9bf3bbae161c26003b4f849c0800c024701383b84a9a17005581e038a68ca0de222757ad180dfe2910996104dbdf45e510d8b7f8ce0c729700c01470cc8aa441de58003562d59a51820d47f520c975e0b2bcffac644a509749a3161f481f57b6e826d210605581e0334748c9b864c1a7503fc03dd1016d10f8275d447ebcd45d257d242560007011bffffffffffffffff05581e0349a7d5dc763a3e1a8fff885943cd752edfd2814de2560f113870c7f4400c03480c2d8c1449f7162e02191ce403f1f0fc1c77adf0e1cb5abf0749989e5eb140c12723125ae612d53b5e650713530219ffff03ee5a53f74f94eed211b1550315db61e61ec4bbcbf88d691d9ba75d007b0415540219ffff0326d411259dd7a816b3e4416eccc5f9f3f8797f60e9181cb62c60f59668bb20890323172268bd2a09f78c3552b2e5469c6b05c29a7d95b51d92028cc3bbaab691340219ffff03872087c58f60307b4963d61f7279828d9659dd62ba57be08be4367c53f688e5f0342bd50705846793c09d7e345dbc01747561e7615b92d9b5568466d332d9cb72d036746d7523176057df9ab50e4124f7f615d7d18f3773c220e5a3269d2b3a9528003e9c64ed05da18c3ebb4debb8492489dcf5a681431a2901138f51a6bf6346994b034ebd4a376a2edb82cc2ddad312403e5665f5d2af52367cb74512252b2605f2dd0219ffff03a6839ce079f60fe5a0bd5ee110ebdc668f09e876aed102b15594c44975775c5503e086e477c41fadfe88bf76baf2d04aad8f1ee57ac9e0b5ded35062eeed59fa150307a6af432a815dfc18260a96302efda221a50d09284c6bc818d5b164da9919bb0382257a760af0178efb22ff1983af08c955bf92062ef7dec5d694d64b657a4824034f06e32cbc687a439d9a12eff4a36118fd188bfc7901f79c7f7b98f0287e603b0317f36a9ac825f2fc8a2645631bb1beb8516c0f0e7cfbaa06010b5c7a151eb1ed03d48abe54fa6f199c420e4917ab4c765d23eb852e22d547fd55c37f01a03546410398aa75631e6b1fc7e191c7aa3619ad11b8267b977d2cf4e894f3a69d109c9cb403a185050c2dc07f8446343fd835edba8ff120b78c513555065d08a8c396089efa03c4a450ff4fe0b60bc2f915baac2d659226e8a53c97994a59fcbb80a0084d4651032d17c5617f0ad9fc4ec576c97fa75b32b239ccc37b2d8b4cd22a90704b2590280312e5da494b0bddf2f9118e2b35474df3c516dcbbf861c95f8500c817afa1b4b9039530abcde320a8d9b39fb7d51e409f4304d8060a4899be848378f735aa90b58303fb5d50a431f418aaa71dd484241df04246e654f0e67748321b19ae6c78ec327303f543828ef2845f2c8cf51ae72a1dd5fc2faf6263bcf28ddae421b63805feac21034ead60a6ac6264a2d238cddee2e5f1e90cb3e2ba7689d3a75b50ce80830e079203678a94c99d74e1ae18662084e14b8893f74db93efd64fc26ff0e966ebcde173403e192c69a516ba6c70068c90d97ed4c2033e55a3a2586c8adb19df29afa2277d503a51b07521882854afa78ee6e331b5d517644356fe8b7234873c1bd8a3b87d64603b69d810acfa81e692d1be7318ecce80bd30cf020b36925fbc2e7de498d64cd2e03eb75b2d973cf7d6f68e3e94ea6a1da16136ee04fd939beeb25970523fee36129036c8b0f5ae48859f90edff010e930899f9b9c69e2831edb176f9606f1a5ee7b7f03153c9b0963e63277b37ad32e7292dd70fe80d17355d5072f7c3743583570c86403108c18059693942247bd69adb0df426f8d4da285a2a65ae8aafe230335f49a1503c18819da1e1030a0a57e3e6a8e1c7ab1ea6d1dd9e5a84ab1800695f8041485c4037071502c6556c483a799c2a51ce6ec3844e25bf7eea6546cba9529806b4b19ab0373cdcc78853cf441d75a71aac0cd2c192cdb7b60969e74f21dc3b6c93ab32da0038cf2110a8ad3c555e4f0a8f10d16cbf380090ace829f5b86783f7210c7f13b2303c6788ad3233c4c8f782a2b38f8853c6f6162cef4f67e5e7f2dbbad9add5cb74805581e03399bd41150c10abeaf754ac321869d467391ef5decd21b75fff4219e700c0147012e2dd507d14003ff0957529f4b0b7086551af1d2f543907f305a6618b6d43e042f333e0ce4648e05581e035cd68627a90d1ca3dc18b99862721b2278fa98386e6d523036ea949ac00848046ad03e9b97ae0003ea8e8bd08804ae9b32373abc45eb59d48a256f042146a09f2538a2d3034eecb601410a039d09a5a782766c68adf3c29606454c5274e07e05c4f40bf0c376258caac4537f039fc58d92eb043d53f3c41dc5169b576520a8aca309d69101b339122a14be7c0d0368d9ef9c32c6355d5ce1cb3803f4f20debc1aacb6619685de20bfe9763730eda03907c071fd61daba3703da934f69afbbd97123740e1068cd951252cf29a291651035b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce503e2a8b47e80f9bfd9d571a0cabe7497fbfba8e0ca15a24d21f33b9ab0c56b993105581e03916c2ed2b6d5339fb36af92813895bba1355bbeab9ee10542daea391c007011bffffffffffffffff05581e03206138f42a11cde77dd412a77b978ad37f6b4f570aec86e0a1c790a2b0040103117189cf78bcaf818810f233e4ae673fcd70f45794330df8e3bb714cc316772c0219dd7903f54c9cbb3080ff1e2bcaef7ab712448d665da3956026df1d171dfe8bfffe0b0503ac2cd5329fbd1e6fd22680a56158b22fc584751834b48f69bdc0836599c0aded0366979e47a7fe99007395a35155f9603a06296f7e6aa6951a2220751dee62515203dc8883551a971349f5fd8cb22867c6743eee07a1f77d57b0f9d907bf1b879ede039fd8eeacf6465b4d38ca65a9379dbe44b2d293f00cc09a33d8e1283f7637af5303210b5c315bd98a298830bae4b2e60431d30619b36227a1183655980059acc58f038cf582082fb608aabf9d2bca983532883fd7e3eee95529fbee0d1a758eb2c4ec0219ffff0342bf1e11d8795edf35957bbd2d61a7277b438beb12af11648267c35ba3ff374703f5bb67db6cda6a25812358b5f708e4dca91f7f8462eb0be9601ffcae8948177203e93fd382cc1bf408ed0706845b918c5720cb36c7c7941123e2b7bdb3d758f89b03f9400af720ef1840945af5b36d0e4f3af5766ee8d0f4aaf8fecbd418fa7eec39033fd6a57415a27e5b7c4bf731daf7286537ba5639a9567d88c478c0b137cd7262030456ab8efb69183cbdb8c63c71cd129614e9daadf2e7b9b8a0c4101e8e9c453003e018d814d055c7330e3ab9b3359d7db7734449adf4c178d26028e75a0c1ac45603fd167e2b0bdf5f0c30d3529fb3e926c1d267e84fc9685901f51a90ab331466bb03b1242b71b64b3bcddd4d3c1786d54af1b260ac4f7c2066f6fcdef568365ac7ef0357e5b239bcc5ad5717ffd615c344856b3d6c9dd74f704e1e7856c0e0585bfdf303cde81b38ca1a223ec508f1f226792e3f12ac056747bf684a5d603e01cfb2d2380219ffff0364defbb9a6fbc924bd567cf3387a6e25d055042845772fa3ab529b3a9a5828000301f3e8092a01718f3cd47c56de74d8b98559038dea01eedda183185be80d86d003aab320ecf5d16d33bca1122f35f9e17316adb65c2baf57353709bd78c03a25d103270c40a28a22bec1ad8f14c07a11f95a91a16458c14557c276413c96afe8497603bdeb8754d7f1164e87019989ed477d7bb1395164675e64500e47837dd1b31747031f49eb284cc882e095eb09dbf642eb60badbf48a2f372ef44fb15153cdf521210387fa81eb2dda109118258ac34d94ace4af4b2dabfb2d41ae4b6a35ed8071da09030d2f75caaaf51b3959469327ffe70edceab2d58e08207a099eece96e1f869c2c03842ab4cfaa843db0bca6aad8d175f3f2eef317e140898c42b1a1c9fd550991b80384623c79273883912ad178f5da4bf9f91dd07b4290b9352de96e0bc13a2bae4c03a57b5dc0dfb8e51d48353a5d2087a71218013b0ffc8c6e3e3edef4601154ee7e032ed3744231ce450bc20761a6a8130d754e72fc14184506042f02b4f78bcf00bd03077a347e4b1dccc359665872fcc3ad60cf7e3f23084cdea50e603cf38fc257c803503811ba352666fcecc55fdd0d3ccc2b75d7e4bb8e1d4b9bd7d772627800fc930219ffff0219ffff03108ffd2a8772789b9ad3335cdc989a073af4088847ecd9f1514520655118ea17032ec3966d3cdefccd3e2ee6e41d833259f813b7ef7475232c6597eae911de2f6e03aae95c40c66c1d5a14f791e81cd7a17534fd3b14c0b570a7bda842fb0e93b30d0363ee859bbd97767a30a408024f7d5a0686599706654a20b0d17a182c943bcecf0343af6e03f204c12ff28e52fa8f46d4a35a3fac06a19a9cfd6beec73080b62c8c03990fa8491a1839f504db72a498614761da84a9b28298a81be1a040445f117644037ceba9a733de1c94bdb8c0d50df46a228e927b52bc96d136c6a88c103a345d210337f9558f1cfe7f448830c8480ec60c9930002ed48b30ccd9e1ef4c5d8caa2aff03083af68cff161b4a6e1ffbe01e0b05d8eb71bb08413e8c06df21ae387642755f0307e13e7578300b73dcaadb5416304ab2219a78b4cfa3d45ac71fa0050a88ce410398769ee425eb19b8f0f9e72f8803cf909f9f3f6af05803274fb51f0691a89477034d116c0489c6a7830a6e71739878323d8fe0faa2bdc6d5f7b26e830cea8d7fe403cc9eb9d3881d2a179b91f6fc872a850802f828800678bf13fcac07a4db7589820314e53be3d411ae0f3f9ab05bee4ffe840f1642ea1a0b1b565bda279fde68351903b1754f87f0a900d340be549a6b15a0f30d55ee636a33e46943a708770a99d68303be0a1d3868303e0e13c4e3659a46c1b5c9390f34478ada9522f12a5aca74ae5e03a790fe17be277293a34810538b9673d4fbe3d03a0b035dc498fb87edf5837221035d8423169fb402a507758ba4d194af340fece08129070bccdaf0567e012712d103ac5779f00db1f3779385ed52fddcdb0742f5596922e73917a14b39851f20ddfd03311db8afba9fd90bd253ff2e853ee56485612c83bb4e6e86fe29a8116427a94103682bf118d6c7588275e2bf659f49f9386a9cfdfdb62c8f1974c6b83ddcbda7cc032a005fd0432915d283dc5acf30d7d4ca36354c94c959aa5d87869f4758dfc3d8035b0cf0b4fc18610cc5234a6742cd07a94fea25d89e41220758f6b59d2257483e0329343f36760cbb0951e444492e04d89771c8905af0c8705f5949fe5157a4e38a03a7282ad3171cd6a8b00a6fe5cfacd2fad9db9d351ba4f0b846d26482e1b8f9fa03da4be3855117f77715adc181a7f4a881cf1ed8293ae0dddefe40f8a5d12f886f03f47b99538fc4e2d7d6fbb8b555e79f69dea2562a70608ec8a76ad665845e4feb03a825017dc238633febb30917c45993c6063432aac186794af783bbb39f398d0303f8280644186a3b896527ba7062dde863bcbf66dee141c4d8c7d3ade009d461860315f2adb176e17ebfd73c507d85e6c1bff295f733e4a4618fbf47a15b73148a650360dd50876647af16ff77e424f71c5b94a330919fcaf2932e738a9e2c4efa4a5805581e032af143968bf17c4f670b868c298a55e7c5c16991bdb658e3eed3cd4c9007011bffffffffffffffff031804e5cd0675cdeb28d9517d51606517bdd557b39a1b48aeec456ecdbec352fa03645c169e00b675096fd330b389d954736e724467b40f8111b68cbe1d8ca8ff7a03edeacad95a6c7b2ebd8060e27a659b4b3f4b863f34db539070207ca072783b4205581e03a011bcf3da4861819cd38306db473ce00a0f7ab83b5f017d398e28afc00401035fa8c6f35c8fa363a6451cf6d5134e313c0454d707dcb36c9e01e8a10578c468045933cb608060405260043610610138575f3560e01c8063715018a6116100aa57806395d89b411161006e57806395d89b41146103eb578063a9059cbb14610415578063bf474bed14610451578063dd62ed3e1461047b578063ec1f3f63146104b7578063fb201b1d146104df5761013f565b8063715018a61461031b5780637d1db4a5146103315780638da5cb5b1461035b5780638f9a55c014610385578063909bd599146103af5761013f565b8063313ce567116100fc578063313ce5671461023957806332712140146102635780633395f22b1461028b57806335949eab146102a157806351bc3c85146102c957806370a08231146102df5761013f565b806306fdde0314610143578063095ea7b31461016d5780630faee56f146101a957806318160ddd146101d357806323b872dd146101fd5761013f565b3661013f57005b5f80fd5b34801561014e575f80fd5b506101576104f5565b6040516101649190612377565b60405180910390f35b348015610178575f80fd5b50610193600480360381019061018e9190612435565b610532565b6040516101a0919061248d565b60405180910390f35b3480156101b4575f80fd5b506101bd61054f565b6040516101ca91906124b5565b60405180910390f35b3480156101de575f80fd5b506101e7610555565b6040516101f491906124b5565b60405180910390f35b348015610208575f80fd5b50610223600480360381019061021e91906124ce565b610579565b604051610230919061248d565b60405180910390f35b348015610244575f80fd5b5061024d61064d565b60405161025a9190612539565b60405180910390f35b34801561026e575f80fd5b5061028960048036038101906102849190612692565b610655565b005b348015610296575f80fd5b5061029f610774565b005b3480156102ac575f80fd5b506102c760048036038101906102c29190612692565b6108a6565b005b3480156102d4575f80fd5b506102dd6109c4565b005b3480156102ea575f80fd5b50610305600480360381019061030091906126d9565b610a5b565b60405161031291906124b5565b60405180910390f35b348015610326575f80fd5b5061032f610aa1565b005b34801561033c575f80fd5b50610345610bef565b60405161035291906124b5565b60405180910390f35b348015610366575f80fd5b5061036f610bf5565b60405161037c9190612713565b60405180910390f35b348015610390575f80fd5b50610399610c1c565b6040516103a691906124b5565b60405180910390f35b3480156103ba575f80fd5b506103d560048036038101906103d091906126d9565b610c22565b6040516103e2919061248d565b60405180910390f35b3480156103f6575f80fd5b506103ff610c74565b60405161040c9190612377565b60405180910390f35b348015610420575f80fd5b5061043b60048036038101906104369190612435565b610cb1565b604051610448919061248d565b60405180910390f35b34801561045c575f80fd5b50610465610cce565b60405161047291906124b5565b60405180910390f35b348015610486575f80fd5b506104a1600480360381019061049c919061272c565b610cd4565b6040516104ae91906124b5565b60405180910390f35b3480156104c2575f80fd5b506104dd60048036038101906104d8919061276a565b610d56565b005b3480156104ea575f80fd5b506104f3610de2565b005b60606040518060400160405280600881526020017f536f726120496e75000000000000000000000000000000000000000000000000815250905090565b5f61054561053e611305565b848461130c565b6001905092915050565b60115481565b5f6009600a61056491906128f1565b6461f313f880610574919061293b565b905090565b5f6105858484846114cf565b61064284610591611305565b61063d8560405180606001604052806028815260200161336e6028913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6105f4611305565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611dd99092919063ffffffff16565b61130c565b600190509392505050565b5f6009905090565b61065d611305565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e0906129c6565b60405180910390fd5b5f5b815181101561077057600160045f84848151811061070c5761070b6129e4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506106eb565b5050565b61077c611305565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ff906129c6565b60405180910390fd5b6009600a61081691906128f1565b6461f313f880610826919061293b565b600e819055506009600a61083a91906128f1565b6461f313f88061084a919061293b565b600f819055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6009600a61087f91906128f1565b6461f313f88061088f919061293b565b60405161089c91906124b5565b60405180910390a1565b6108ae611305565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461093a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610931906129c6565b60405180910390fd5b5f5b81518110156109c0575f60045f84848151811061095c5761095b6129e4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550808060010191505061093c565b5050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a04611305565b73ffffffffffffffffffffffffffffffffffffffff1614610a23575f80fd5b5f610a2d30610a5b565b90505f811115610a4157610a4081611e3b565b5b5f4790505f811115610a5757610a56816120a6565b5b5050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610aa9611305565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c906129c6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600e5481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b60606040518060400160405280600481526020017f53494e5500000000000000000000000000000000000000000000000000000000815250905090565b5f610cc4610cbd611305565b84846114cf565b6001905092915050565b60105481565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d96611305565b73ffffffffffffffffffffffffffffffffffffffff1614610db5575f80fd5b6008548111158015610dc957506009548111155b610dd1575f80fd5b806008819055508060098190555050565b610dea611305565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6d906129c6565b60405180910390fd5b601360149054906101000a900460ff1615610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90612a5b565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d60125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f633060125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166009600a610f4e91906128f1565b6461f313f880610f5e919061293b565b61130c565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff19190612a8d565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109b9190612a8d565b6040518363ffffffff1660e01b81526004016110b8929190612ab8565b6020604051808303815f875af11580156110d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f89190612a8d565b60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473061117f30610a5b565b5f80611189610bf5565b426040518863ffffffff1660e01b81526004016111ab96959493929190612b21565b60606040518083038185885af11580156111c7573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906111ec9190612b94565b50505060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161128c929190612be4565b6020604051808303815f875af11580156112a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cc9190612c35565b506001601360166101000a81548160ff0219169083151502179055506001601360146101000a81548160ff021916908315150217905550565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190612cd0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90612d5e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114c291906124b5565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490612dec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290612e7a565b60405180910390fd5b5f81116115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e490612f08565b60405180910390fd5b5f6115f6610bf5565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156116645750611634610bf5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611b295760045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611707575060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b61170f575f80fd5b61174b606461173d600a54600d541161172a5760065461172e565b6008545b8561210e90919063ffffffff16565b61218590919063ffffffff16565b905060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156117f6575060125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611849575060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561190357600e54821115611893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188a90612f70565b60405180910390fd5b600f54826118a085610a5b565b6118aa9190612f8e565b11156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e29061300b565b60405180910390fd5b600d5f8154809291906118fd90613029565b91905055505b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561198b57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156119cf576119cc60646119be600b54600d54116119ab576007546119af565b6009545b8561210e90919063ffffffff16565b61218590919063ffffffff16565b90505b5f6119d930610a5b565b9050601360159054906101000a900460ff16158015611a44575060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8015611a5c5750601360169054906101000a900460ff165b8015611a69575060105481115b8015611a785750600c54600d54115b15611b2757601554431115611a8f575f6014819055505b600360145410611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb906130ba565b60405180910390fd5b611af1611aec84611ae7846011546121ce565b6121ce565b611e3b565b5f4790505f811115611b0757611b06476120a6565b5b60145f815480929190611b1990613029565b919050555043601581905550505b505b5f811115611c2857611b818160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546121e690919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c1f91906124b5565b60405180910390a35b611c788260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461224390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550611d1b611ccf828461224390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546121e690919063ffffffff16565b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611dbe848661224390919063ffffffff16565b604051611dcb91906124b5565b60405180910390a350505050565b5f838311158290611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e179190612377565b60405180910390fd5b505f8385611e2e91906130d8565b9050809150509392505050565b6001601360156101000a81548160ff0219169083151502179055505f600267ffffffffffffffff811115611e7257611e71612556565b5b604051908082528060200260200182016040528015611ea05781602001602082028036833780820191505090505b50905030815f81518110611eb757611eb66129e4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f7f9190612a8d565b81600181518110611f9357611f926129e4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611ff93060125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461130c565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b815260040161205b9594939291906131c2565b5f604051808303815f87803b158015612072575f80fd5b505af1158015612084573d5f803e3d5ffd5b50505050505f601360156101000a81548160ff02191690831515021790555050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561210a573d5f803e3d5ffd5b5050565b5f80830361211e575f905061217f565b5f828461212b919061293b565b905082848261213a9190613247565b1461217a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612171906132e7565b60405180910390fd5b809150505b92915050565b5f6121c683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061228c565b905092915050565b5f8183116121dc57826121de565b815b905092915050565b5f8082846121f49190612f8e565b905083811015612239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122309061334f565b60405180910390fd5b8091505092915050565b5f61228483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611dd9565b905092915050565b5f80831182906122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c99190612377565b60405180910390fd5b505f83856122e09190613247565b9050809150509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612324578082015181840152602081019050612309565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612349826122ed565b61235381856122f7565b9350612363818560208601612307565b61236c8161232f565b840191505092915050565b5f6020820190508181035f83015261238f818461233f565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6123d1826123a8565b9050919050565b6123e1816123c7565b81146123eb575f80fd5b50565b5f813590506123fc816123d8565b92915050565b5f819050919050565b61241481612402565b811461241e575f80fd5b50565b5f8135905061242f8161240b565b92915050565b5f806040838503121561244b5761244a6123a0565b5b5f612458858286016123ee565b925050602061246985828601612421565b9150509250929050565b5f8115159050919050565b61248781612473565b82525050565b5f6020820190506124a05f83018461247e565b92915050565b6124af81612402565b82525050565b5f6020820190506124c85f8301846124a6565b92915050565b5f805f606084860312156124e5576124e46123a0565b5b5f6124f2868287016123ee565b9350506020612503868287016123ee565b925050604061251486828701612421565b9150509250925092565b5f60ff82169050919050565b6125338161251e565b82525050565b5f60208201905061254c5f83018461252a565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61258c8261232f565b810181811067ffffffffffffffff821117156125ab576125aa612556565b5b80604052505050565b5f6125bd612397565b90506125c98282612583565b919050565b5f67ffffffffffffffff8211156125e8576125e7612556565b5b602082029050602081019050919050565b5f80fd5b5f61260f61260a846125ce565b6125b4565b90508083825260208201905060208402830185811115612632576126316125f9565b5b835b8181101561265b578061264788826123ee565b845260208401935050602081019050612634565b5050509392505050565b5f82601f83011261267957612678612552565b5b81356126898482602086016125fd565b91505092915050565b5f602082840312156126a7576126a66123a0565b5b5f82013567ffffffffffffffff8111156126c4576126c36123a4565b5b6126d084828501612665565b91505092915050565b5f602082840312156126ee576126ed6123a0565b5b5f6126fb848285016123ee565b91505092915050565b61270d816123c7565b82525050565b5f6020820190506127265f830184612704565b92915050565b5f8060408385031215612742576127416123a0565b5b5f61274f858286016123ee565b9250506020612760858286016123ee565b9150509250929050565b5f6020828403121561277f5761277e6123a0565b5b5f61278c84828501612421565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115612817578086048111156127f3576127f2612795565b5b60018516156128025780820291505b8081029050612810856127c2565b94506127d7565b94509492505050565b5f8261282f57600190506128ea565b8161283c575f90506128ea565b8160018114612852576002811461285c5761288b565b60019150506128ea565b60ff84111561286e5761286d612795565b5b8360020a91508482111561288557612884612795565b5b506128ea565b5060208310610133831016604e8410600b84101617156128c05782820a9050838111156128bb576128ba612795565b5b6128ea565b6128cd84848460016127ce565b925090508184048111156128e4576128e3612795565b5b81810290505b9392505050565b5f6128fb82612402565b91506129068361251e565b92506129337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612820565b905092915050565b5f61294582612402565b915061295083612402565b925082820261295e81612402565b9150828204841483151761297557612974612795565b5b5092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6129b06020836122f7565b91506129bb8261297c565b602082019050919050565b5f6020820190508181035f8301526129dd816129a4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f74726164696e6720697320616c7265616479206f70656e0000000000000000005f82015250565b5f612a456017836122f7565b9150612a5082612a11565b602082019050919050565b5f6020820190508181035f830152612a7281612a39565b9050919050565b5f81519050612a87816123d8565b92915050565b5f60208284031215612aa257612aa16123a0565b5b5f612aaf84828501612a79565b91505092915050565b5f604082019050612acb5f830185612704565b612ad86020830184612704565b9392505050565b5f819050919050565b5f819050919050565b5f612b0b612b06612b0184612adf565b612ae8565b612402565b9050919050565b612b1b81612af1565b82525050565b5f60c082019050612b345f830189612704565b612b4160208301886124a6565b612b4e6040830187612b12565b612b5b6060830186612b12565b612b686080830185612704565b612b7560a08301846124a6565b979650505050505050565b5f81519050612b8e8161240b565b92915050565b5f805f60608486031215612bab57612baa6123a0565b5b5f612bb886828701612b80565b9350506020612bc986828701612b80565b9250506040612bda86828701612b80565b9150509250925092565b5f604082019050612bf75f830185612704565b612c0460208301846124a6565b9392505050565b612c1481612473565b8114612c1e575f80fd5b50565b5f81519050612c2f81612c0b565b92915050565b5f60208284031215612c4a57612c496123a0565b5b5f612c5784828501612c21565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612cba6024836122f7565b9150612cc582612c60565b604082019050919050565b5f6020820190508181035f830152612ce781612cae565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f612d486022836122f7565b9150612d5382612cee565b604082019050919050565b5f6020820190508181035f830152612d7581612d3c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612dd66025836122f7565b9150612de182612d7c565b604082019050919050565b5f6020820190508181035f830152612e0381612dca565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612e646023836122f7565b9150612e6f82612e0a565b604082019050919050565b5f6020820190508181035f830152612e9181612e58565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f612ef26029836122f7565b9150612efd82612e98565b604082019050919050565b5f6020820190508181035f830152612f1f81612ee6565b9050919050565b7f4578636565647320746865205f6d61785478416d6f756e742e000000000000005f82015250565b5f612f5a6019836122f7565b9150612f6582612f26565b602082019050919050565b5f6020820190508181035f830152612f8781612f4e565b9050919050565b5f612f9882612402565b9150612fa383612402565b9250828201905080821115612fbb57612fba612795565b5b92915050565b7f4578636565647320746865206d617857616c6c657453697a652e0000000000005f82015250565b5f612ff5601a836122f7565b915061300082612fc1565b602082019050919050565b5f6020820190508181035f83015261302281612fe9565b9050919050565b5f61303382612402565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361306557613064612795565b5b600182019050919050565b7f4f6e6c7920332073656c6c732070657220626c6f636b210000000000000000005f82015250565b5f6130a46017836122f7565b91506130af82613070565b602082019050919050565b5f6020820190508181035f8301526130d181613098565b9050919050565b5f6130e282612402565b91506130ed83612402565b925082820390508181111561310557613104612795565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61313d816123c7565b82525050565b5f61314e8383613134565b60208301905092915050565b5f602082019050919050565b5f6131708261310b565b61317a8185613115565b935061318583613125565b805f5b838110156131b557815161319c8882613143565b97506131a78361315a565b925050600181019050613188565b5085935050505092915050565b5f60a0820190506131d55f8301886124a6565b6131e26020830187612b12565b81810360408301526131f48186613166565b90506132036060830185612704565b61321060808301846124a6565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61325182612402565b915061325c83612402565b92508261326c5761326b61321a565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f6132d16021836122f7565b91506132dc82613277565b604082019050919050565b5f6020820190508181035f8301526132fe816132c5565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f613339601b836122f7565b915061334482613305565b602082019050919050565b5f6020820190508181035f8301526133668161332d565b905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220faf31d25f5bba3321231e05d0088926b459202ad60fd4c4f7681424d8b8b286064736f6c63430008170033005820035b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db904114005820039d0e332f80d1cff51a8a4d8865620006c19ed620818900cbffcee63890d910480cd157e3580065c40219108000582002ffb05fa7fb6a86937d01a672ff01821f7da270655c75053d497d06c32e5346480c7d713b49da000003255f32ed2a6bde98002da6e3cc0e58b70a5c3aff988ad5ddec23964bead0189600582002bcbd2ca84c64596a5f4a56e37d84862dbe3f7b4f8e487005029c09dbeb1e9a48519b8da754b697c80398d66d4877a1fb465b7a78297794c425caf898b8e7350b4ba0127bea651f55a5005820023c38f9d0b8def738a80423f5265f1ada8d30b34be15c19bc3a3fd1df57d55a42029703314b929e13059b976b44aa45bd1151392160875b85ace22641d630d3164429bc005820025f4b1b6e2ee5136983d50c8431bae54e98f73b1caf7d3e17cd5798afda01635820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582002ec4e4fbbcb6da7b80a630e152dca58edc7dc693b288741bb9c8ae9765a20ae5820ffffffffffffffffffffffffffffffffffffffffffffffffaa9621c7818547ff03323eb01f87ce6292295fb80c6386ed7dba5a24992ddb40d9f650a8c5b91f786e00582002738f9317652af9a2f8d98a36d9b74af5d5efb3005bd748616a3951790c1be1481c0e9fabf28e665200582002a83e01ee189236ea420c06c1e5ad90ee0241afac784f6f77e49865ae28d7ef4807588688d615179a0219afbe00582002444e3cbf73033e1b3611d22ec5d580e428dace4b6282de44d4e8f3155962cd4802e368fc01683cf9005820026311e91d717d058f799f715c63bbb3bc375e51d8f7465b4b47ed7e710a1af148183f863632009b8c005820026847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672483a4965bf58a400000393fea7c248e1632707119833e743d7b4c08d7e8e83edc0d635aef8ed23ec0dbc0325c25567ee1cf657c32e1672aa17e8da341a31e8eb483e8ffafaad1683bd875202193a400323c8c4e0df9d31c4cfcd74b19e920aef8a6be3f58d833ba46ae1fce01c10da790058200233f2dabe70191bf91fee4f9192ccb4504339a8d7408b1f65a4903f2b916a115820ffffffffffffffffffffffffffffffffffffffffffffffffeb9013c7aaf39062037ffe4e689610cb88f86a56212b1816ca45df612faef8d7976586254db00649ff03cda10e5391e9264228eb2f0bf034f1ca9f26c78abf2cee8fbda3a8926dbe0b78038a2670b1260d74eceb27bc089fab9138528a3cd6f144f557d44ce7b6a9d02a9303a874ccc003f5fda475569abf6e38cec1a397e3481c89767abd60752450da87670058200200adfa2d10f44031f716086e8a88b410cbcddc45a2423c0b1dad37c1f3b1a85820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff033fa7a7af3e3e272ca70a6c5bd1899dcf9ae5d1629e59b68a7e7ca4b5ab14ac0201410d00582002a8cd92dfedbb1d839e6d78cf6ecb71f14d547134c79c2ee1efce9a4eb1fa624802be735d5101ab6c005820025afb5375241c8723c9b801292630c2ba18cfae58963b95963507b1c2642db9481d044d641b3ff24602190fdd032f98a28fea9c256f312526db825f1e1def4919d6c7838f156cbb1f2d0b250ffb035ed1b9a0abaca55b8185639f555671606960c317025b1d03df6efde927741b8003732861e026d5c368f4f63aec23b05e6b935c100c04105bda9f7cab75346a245000582002ea540327ac56e8c788686a6063618ec78e3c1635660cfe53397209b174133c4817e50e2ae28be1f5005820021877b57dda2f007e1abc736d6f26bebe6633bd8d41d03cc915856d2336eaf45820fffffffffffffffffffffffffffffffffffffffffffffffff48ed2e258780baf00582002e2f9063983567252a650cc97a252926147af57153df0b458bbc49d82b949285820ffffffffffffffffffffffffffffffffffffffffffffffffba2662f0eeb654ff00582002d2e02aa0f5af8c37b4ddaeb0e96f6e7e2e7317db11479ebaf39e8a7ceb5b294864a151da1f0decde0345a5a859c0ce381a99a5c83df826c5e1b0480f7fa3b081275c6b15d9a7152baa035236fe8186bcdfa1066327db9addd460af663f697163d0f382fe12d1e9e1f21900582002de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09057010001df675ac7eb6a7053e6988565f57dc3da177661ef03818b287d07bfe7ad6b072e3416af9f7e5717f5d00548b66293da464f6d9c1a0d037352aa8975319123fba4fe7c7f8b6249d3595fef4d7962b0aef9887769ad7de50058200296098a2446992373a77be9e143670314335ac28d9a1f87c775d7af694a61f9485ee43b728c07df89033e320bde6d10d065f028067fec9b1f739fe03bf81b6b09158cf371d331e8d3b9014106030530e71f99b92abc4c27d827fff142800b5b0a63696a0b1c78438449f07027260219d67f00582002dc61613003c2437d393fda5248af1d077f6825b1a38e61033509f051002e605820ffffffffffffffffffffffffffffffffffffffffffffffff8ba0eb582bc2595803bb48d01868b678d50046f4e696f719a436968e1d491c85f4fe62c359e13edebd03eecd73caf6493e4be7c603e4e1080383ac00d3dca01db6cfea259509573099d8005820028452c6f95a7f9525d32f33fb2253d40897cb9cdebd16a9b4545e99261edb3d5820ffffffffffffffffffffffffffffffffffffffffffffffff8b984f00ed0e6c98005820024b38c10e058d274c6f94ea67affa92614db48fcddb8170c5c4031cd8090813480e95a1f178897cf500582002eb66a969808d62b1afb823795ef60ba0bc917f35815ccff6bc8b36715bcfa05820ffffffffffffffffffffffffffffffffffffffffffffffffe92c7ab1dba5df5b038ef189089c02ce0fecf07f5c7a057d6b0cc76cac47d5e03874a5da5033063d5700582002a34a87882315cf2fda3dda6cbc2c1add4016ca5c8683d0f6f71d79fc3e66195820ffffffffffffffffffffffffffffffffffffffffffffffff9112c4cde760a01700582002150f4ac141e5ec5504f6b4a2d8401fa1aba4d7e8f68a4f65a83dde9a58161b4806bdf88e5f71b78a005820028d876d584f4a8242779a0975855998e30ee37efb2ae467e24cd62427ecb0e3485b3339c8692f3ab9037b387dce82f7e3b3e7b4b6278f4068f3df3554e5ba3580af6ae2641aeeae7f6d03a5047a3fd6acc6d8505bb01d8738e839b8e6631ea2448ec35ab1043824b83e860219ddf6005820022d974797b3b46e4d943da9dc92b06cb2934a6e91fbbf97a119cb77b4a24fc94847d15e72bcc28a8f00582002585ff0d8ce7cadeb77acfb034dcd8dd3d7689b2aa97599ba171c777da37ec15820ffffffffffffffffffffffffffffffffffffffffffffffffd4e053a6dadbcef903969c3fceb182b762ea8ba65a0f993844fff06bc6fe4bf7ccaacb0c925be2bddd00582002565112902a4a5a91fde59db5a2e801b4c4e8cf0168b26eb61ff2e36ddc7308480b3b9bbd30ddab9f0363f80b925ed26d77c6bb2d5519b19ecc3ed20c468c3bd58b978e944048b7981a03cb1ed5e25447d7e02fb23549f51223ddd7160b5762875ed2f10d4ba4d501e33600582002d69c03cf5551cc8b0f393cf43bc578c22eacc469dc716b10f867636dfa3ebc485569de387e7ab80003a7416d4f5229ce571c29639c4f74b49b7048cea0edf9073cc2cc9793779c7e31031b2806e68a9e13dbe98d6823e61ac80e368b9c5e9eabeea806ff1a0d5537fcbf01410e00582003108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80204916ce3f1e16bf15000000582003232da615b5c033fb8d0072d39388965f67cfd9d0dffb0a0d3ba04e20168eb0481b5723013f013d3a0058200328a345034a2aa0ec6b4a56d2b1342ee46f38caf2955f4a47fa965abcf9e2604807588688d615179a021902220385a752ad25004391b2e3475e9818c51e06c1a358e3956514a4066fb56709450500582002ae75c1fa39d39eeb533514396d24cc991109978850263abf852c80bd46c60d481761df2327e5224c0219fbd60058200258223ec9b1cd060e6e88ab61ffda14222c82576a2ca0fa217f4daa57c732345820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582002ce2b00e67e51b88f13a6faf65dd6bc62d933dd14c707e6edfe4e50b89b59715820ffffffffffffffffffffffffffffffffffffffffffffffffeae8d50aa59cd3e0005820029fe2a24cce1cd41ed05437c7cbb96a7b0f02c9ce00289d521ddf59df9f60ac5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03ec97e91d18ced98c4f01522a83906b723bd4bb6d7ecefdc2cadf056f1ef9863800582002496e4d7297e0f840d838f0719c8eb46740450f6270da99726357c7a43a983c5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0058200274a36c3cc810528bb60d34384c32d51c09471d004373bfd0026e8e123497925820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0314ed59207e71e8cbd5b0d38dd79fd663b25607297280ccf7d34b7fb7929a5c3800582002ab67acdc83a12e0782c15bc4edda80c36929b792dfc9f0fb145cdfd10857685820ffffffffffffffffffffffffffffffffffffffffffffffffaa9621c7818547ff005820025f4baa35c70a3bf96cb82c8401f63c407096104600027e70f86be6ab32aad5483c527bd8a08019a70058200263acd56fcb2f339fb3f7dedb16a10f2aff189c738a182fbc77cee7ab5608a8481e581d85cc30c3fc03e31416e8abf81feb5b727d7831fa6e9b25289a671a142053739b7835283551440219f66e038fb6b20c4f0d9e12c5d002661372e3b5056893bb5d49ccc36d760b85865c63e001410400581f02d5bf52c97786f6d49f6f5af64808f5c05d84076b253a3de803687a314a0d481def1d7d83b212ba00581f02a5c4a82f2f74ffabf6e51c5edc80dce67d50982c0c165e3df2feab8b12e35820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0219100200582003ba592b733732b5db407258ebb5f6a11046235e770a179ba85aea1fc8ce4e905820ffffffffffffffffffffffffffffffffffffffffffffffffaa9621c7818547ff0058200393956e6942405ee084e8f6c832ab5f163ceebc85c317e8948788711f0542b05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0219880400582002327f18f1218f10e5564604e6d6600edb492beb431010fa198bd26022b6dc145820fffffffffffffffffffffffffffffffffffffffffffffffffb7b8c0e13e5518e032eedc573beedb59e9330c854fa29681a521acbba2288950aa204f0839c4412b9005820028a8b5e3d47b1975e30e71e509c5f9fd93fe502bc38ae124317652ae0d182885820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005820026cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6884118005820021d605fb637aa8c7717aacaacfc49ecdf5769d052093fd56e4aceb4ee7d0c0e5820ffffffffffffffffffffffffffffffffffffffffffffffffaa9621c7818547ff005820029e766b2c698518b98289a405279a4de84dd6049c5fd4f813357bc1c8d1685e5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03d1c19c44f8e052c279743d3fd7a358f7d39ba32d90a75c475eadd159c9e5cdfb005820027bc50f9564b90b48c4a65061f356ccb7748969d2f2c7aadc9d031f3623b51d5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff021954df0311b8fe0315e564bb30976c75a52bf2f67198847f07de5384a1c6d877862a6f6b03bcbf5bb710b84a303bfaf20a232a23452e0ece6c6b9a0d5952ace144304d302d037df575970351f0066f502bb0d6caf8b56ed74385c5fe0a3615f8928d79f38a0103b646890cbbc31e7d49846d22d5688238637dbd95707d83bf4ad7c6ec6a39944a005820022f7a27493622f61e3365374a4b634aff849db10c60fd5427d6aac4a047cbc8480d8f7d2d8c069aa0005820020f4b0cddebca23d2ed385dc7e32cfe59a1c0e4e1c97fb80d935e0fe34712d65820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02172cdd55898a22955a9a0bf9d6a3758d8cd8106521105c3f611f0f4839dd4817b084268bda1da600581f024a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd4916ce3f1e16bf1500000219082000582003a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440547a250d5630b4cf539739df2c5dacb4c659f2488d02190180034abb82ee5c29edffd45e070956f328bf02b4216fc5c37694dd75e4f711ff53820377995c8950a268b647f0ca6953df0e080c9f78d6fb51ace8028d8dc8dfd234f10058200218b5cbc40af393a10dbe47c36bae4843a3ef36c8129535c1c7096168e6be895820ffffffffffffffffffffffffffffffffffffffffffffffffa92a820890902aa70219be1e0339e20ef5060e7fd3dd24308efc8e6e35150efdbcea62054f41a213c021f45faf03f842b6ac46dcfa019f4a3e561ad924d1b2d26087f6026da5251b82ce67ef529d034ce8525f58614a21f7ae593d6fba34483581cd0f66aa21f66c783fbba535715a005820026eb630cb900483fb16f5cab455ea908fda88ac470ae123e060320544e2101a486d558200aeb3acdf0058200273550101a06d06d5938f124853d15593bdf0736ad246da599d0e98e6c6188e4803cf5b53b3533b24005820031ed3604650b2aeb65f74a72d2bab8f72eeedaac2dde3d554b57f413b8aab404801fb17a92d5c32c9005820033a7de1166cb53a7600f7f9f52a3a49a00c5d436df6773c6d20bb1679d33f605820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80411402183803b91326e6a2c9fa047c8bd798ec24236687ee90f1cc5d50ba9c7f9e69798324ab00582002005d929aa278bdcdcd39219e13c566064d0561a8b8a8d582267f88589cca36480f6d31dd3d2352980379bafa2283069cd505dd6ea8267925bdec7f80721e379528c51b2bd5d65f840c034ec13858d2fff1f311b6d74083da8a223c8b0e917a7171d3cd0c29743d10297e030a9397b9c4e5e7d21529d108fa5271073f7d62a476f0cc1b2507438167d4de42005820026d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec410102196eef00582002d3e948e6a5b56dcc9b4a7e103ac01e6b059cf285482de8fcf963c25efa2f7e48013cb4ef34e4e36603beefc61f2bacba252b4d25fc4c4edc3e6014175d31d78bc8d528e4519b2a974d00582002d16192d0a6798e6197663e1f89ada19483a35605ee10b968f08fb595d373925820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005820036990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5041cc00582003710088d32e4994e46679566ebfa9500c14ae78be6b520a091f2e6cfe143850480b172ab904f4cd5502192800005820029786cc93ad8f4f91813264000043a054e66d1caf2b2a86e8fd975c8cabfea249013234647c72fce12a031db3ef4b0c75d2229bf08141ace300d5c7ff3908ff9d36cd6a0d59e352c913f100582002a547f0890839bdcd4fc4b7c095db256dd585339efed8e975a8d8e139c44eb4481018d652aafb29a100582002834e2cd19284199db710501916e3b1b362ab824580275d16eba52b782f536a5820ffffffffffffffffffffffffffffffffffffffffffffffffc52a055048a39e9300582002768a983e211af9d796a60f857a3644c23d0ce4d297bc698ac8ffb79c12492e45010000000000582002005169355126d939da883c623da688a0969e2222ea9815f3710ed05dec2289482154bf545a4a471803524e3202caab6f56fa6441c66caae9c37955b753c46d43907c5ed605af8a15f00219fed103a519b11272c1bff29c32df6014f39228cfefc8a073b9b1cf5fa4a4a78006715c005820027f48010d796c29b5aad4fc5c152f344d68cff517aaf3a0996cf7904d4751b3482608543101313c2200582002aa4d51f69eb291c140b6f9648f4b61562e4e404d95962cfc5765453118372a5820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0058200241aee9229b07ed4a400d1a4eed9976238604d36658acb418ba0d9cb2b27e8e48778f0792e84ce2ee00582002af5c5ddaee0bf4a15c3d1893e01ca63c840269303f9e66f7094e75c6a352b45820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005820024142445b2301e4ea5611d5eff4ef981c2a07acb2f2187a32467d78967ad327480852de72071daaf600582003880657d58a62b40e3c027ce8416fbc66be9c9bd6bd42147e86f83511295a405820fffffffffffffffffffffffffffffffffffffffffffffffef9c83cc5b48dd83e00582003560cffe9526d74d63aad97dfe4aef6b7ce300b64c7455023396b3491c352c0490215a2f25a7370a09802192200005820033ea59b58fdba855a6d190cf5caec5f93aaf864767b0eb6a809c2c132afa4c0480f581fa2423bb638005820036e570e2f67c3027e9a44bb16d8755d39e52de9fa7f65d34e01103a2d169e405820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0219400402194537005820025a586a4be78b8487e653b2ce51fbf634a768207dbb99eae5de4249f1b9d0365820ffffffffffffffffffffffffffffffffffffffffffffffffda71d1de03e7b7da035d1555ae00077dd648143826ad3a913a9df60796dabffaee1bd8ed3beb46b3c70399e7a91a6ea447ac45fff256751ea1dfc09fb45007ed19ebcc282abb48cb935800582003d5e7dfe2872d00c84c6ded1428c95a5f1705f3fbb70c1b69b3bf25b9ca66e05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003be6f2cd22d3f34de208228f5d6491b41f0804c063d65af6d91b80283c98a30410102190801005820027cee98442ecc82d8b2fc9984bbe567211a7c044a168e7e956ee5d8eca2ba3f481ae98547ada32e3a0058200215e13cd9a0736f20dff93fc118b1c5b5b8c250776e1e58e0132b32350e09505820ffffffffffffffffffffffffffffffffffffffffffffffffaa9621c7818547ff0304e7710c47796243b8124fdfc4a9d5789acdaa9f5e0acdb1520683c00d9e249600582002d5365ea1cf3c3d39d64a115840ccd8cf9b55a3900746c637789b2bda5b2b155820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582002b85d58da4ed176bec88101a805a50d36dcf3039a157fd91fb47c9b269e36e55820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff032e9f907bc5708238e7e8f8042e7b4281eb5b1f7126fcaae1ea5e46b7416d176e005820022319175196c6c661f7dc69acd2dae315270660e5b82d974d3927861a0f935a4802c68af0bb140000037a7b8f7d64d739352c13ebfb7ac406872c213eb7b4114c8835ccc9d607f13521031c3354ad087b5ec1b99fc19cbe4bdaf3d8fec168e6347368763f3dc963b9d1cb0219b9ff0219ffff05581d036a101de4a9179825a19e13659e6a8011fc585d9a332b0a91c55d8bd007011933cb035b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce503d269c60893f40cff1e32d7b1ee8d3c5c1e5964a71924b5ea49b1c5fd7f23a52905581d031789bf6cb26eed1e8b3ea56221825a9a063fee0853cede07567c520007011bffffffffffffffff0218a005581d02e7824bdaf0cd934e9b787c487e492997289412ddf18c36543bc19a370c04467e679e70b9d802190180030ffba86baaf43f22a3c9e6955d19b5d1941aadd2526da81285b43a5b06039bae05581e039b386b408462161eca34e768554d18247a6de3f9dfa2357f127ef09ae0040102199d5d03579eb1a0c5fda29de507f6ccadb25a1d9e40feeed1155e6ee160345f4bb36dce034c0f88f6a61f35409e3bfd6386c0f231ff1326ebf7ad956106c1d4b3a57eb704032cba1eae703deaa8a59d070015c15615f90a5035bc46bb83c149733de25359cc0377c271c132870a0c67aa96e8c294f2452b80ac9422c50f1ad883c6c88b478fdb032f7cca978d052db1905e4412a490f6df4a1415bae9f7ac62f8ed67abb51620970392daefbadd96e0f7bf14ae8dd638700dc283e6d07b90d8ab72271a8ecc87587f0318370b4bcce959f2b92e13554182edbd205fc43a085090b8bc76520f10f157e70392f9ce86473b8dd6ce65badbbba5ef9dd1b3bbbbec130fcc0cf116e34076e50603b91eceeebc4bcb6c63ce5c33299db60b7e4ec1746d0f1fb2319485a779788e68030588bbb02468329de2c189793cadb6bff1c1473d61180d3421171361a0b179d0033eb9fb02ce8cb36b9730882518128fe21f35822d6d27ff4cb1432d01d30d83c603016829d72741b5c4e696abf5e97b3eb0ef26f4d43e5a0abedf42f03aba85a7d103787876d959fc11caed534a7ff6ffaad32bd9cf10482ade3ec346e9ecc0f688b10327cb206460a3f405532a4f9a10364271fa30c6fe828e323821d39b521be6b67d0219ffff0391a12cd7409df898675c4418e51a7c6ee68824b9ffb530902009a1ae9fb2584a03075dce743e152e052f1d455abd9b05c24a4ae1eb09bc014a601e074a7e4ad8e90360abda94d0df1ec0acaac7a9634066c7d0e0f1a1e5e665013ffcf9c73aa16dcf032a026ae2ae6a04edb8f9eda104ed855bf7b9f147cec70c74b85ef40d1ce084d603f5c2a0e4033a23e388662d5443ab193dd15a49bdd2c6270094124e26ee2ba245031108860c6578591c8ab169774409a78daf2a3d3255c457c048e40234f337d6a603d7fd24453059eca52a9ee481b65b572f9eb62bca2cb14d11c67e49e8cff27185037371e732b040f195f6f43304dbbe5cce11365f46e7e305a1c5fb61d75247f12003f4c979446bd2c4df50c9a6648c0266ddacb5ea09424c794358d8d5dd6206a75e03f512eb08a40b6707e3c92265da1e517ff76245bdac0064752384b59f8b8c10f20219ffff038d84ffac5ced83925b7d25d4435341583fd92996e11c96c4b670459acae91c2903cbb03de33fb9c93b91bcc3e06ceab607a217e3d812a4967be3702c00efac481403bf512ee7a715bebf95014bddd6df800747dab07221266e72a06608cdaf8b604803276d5fff5722b14e381d8f7a7e1d69666c6fbea6d9b1606df0d73970be43f6cd03927062299b451ac2cde2a21636fceb63fce372945d608049da9366ad6a1a0b27034493bae9040f371425960a86181ee9459fb3ac44e438f745c709bb32b4365fc80219ffff0306b9d9597bb88c2a7e54a170820830e89fd66b952b83e8945de6619ee77d4f1d03436622163e4bd309b7eccd939228a3adf0e67d288873277b9e78e4b541e569bf03d9c575e36329371287799908185b427cdef2dc4012d6230ef61c9807e388e249037e8ce31eb7f2b3d015aff9f4db69e1417d3fd190d182e57431d61a035a87371103c5ff1b14dcf4f3ac7f604d78316bf1bb7adb0fbd55fdcde06c3dfdbf6d1ea7b10350d9e07c72f3f1f779ab0bea062811101f0ef247f8ec5b3e501cc5d497597d0f0302ae5747f5d2cf20f71b19466b11f9935c3abfb87915c5b8aa17b838cd036b270219ffff03ce22e0e8bd02fe2f895584073998da27559fcdb454695c1a7261f18c2bb7ee5d0393dcf20e65a10053f4be33b6ac52cb83fe7663137f14161417e900fd84be10fe0307ff7b9935fb7ec7d573d602ad01c7333bbaec414be46cd4c57f7b148ca043c40344f8e6e40359686ba47e772410682d3866fd074b66df440980351ca2881ef3830219ffff03d985500aeb04d748b77fdf3529ed53f5b96e5d62d8695e1cabd35e713b030ab20374ed45e771a90b9c346408e68a46b520365e5d5fa3e31b8e2397c8bb0e1a2bb903f1812756ceb667f0768e9bfd77e1dcdd1b70b51a7ac877fb9e3bf585b6320e8e0359df74959093d8bcbdae18a658ec4768b976093eced86a45eaa2938ec145664a031fcbf0e0b2c9801c6b95fbae34c93a4fba8916bc98d3b40c20ad9bc3f988f1ef03a791d6eb706b7a03ee89d4aec801ba1abe78ba0184bdf26a7393e963af02e3d903f1e04725d8666dec005379be2a598668daa4631deb2b61c66f60b31c0d666ec203832044ae9da4a60789aff925e579ea62c18d19add19fe9a75de943207ef836d103d87e272d291952c6a3aba1001b3e3bc351787b7f5c1f40075d5fba2a5e89a30903d9c1b14bf49390a6d9438255d7d40afb609662bdbc6b97dfa25dbb75ac8af860033efc65323efccdb204dcf0f1d4e071d9724cef9e754a3adb4dd94b333199ad8f031a9ca299e6ff942567b671f96b002aacbcb721831fb3ed19eb240ff286670d9c03fa968972e05d55fa5e86742095610f838c988e1aa33bee115912cd48cc05370a03e4c834dda4865d4352847e41eacabe7bc026c4da4cef1b80d5a6a2ceff60c11903f43bfd4e34de0e209000f6f2a1590bf0426f0bbd0e8ce227159a3aa616f1253603f68366266b81e531ae24279788bea5e3d55934dd98109295909015ccb3816bd403e6f7389981151a19524ea613e6a519a8d34052aaef594d09a25c69b7fc1ad676031ede4af18d0341de71353ffd896eaf9ce710f7656d434231e9ba88616a85050e0393d2e4bc8e2b87bc799706ba945c393a0ee6c842a20a34467d322f42334e10ac03eaecc2733ee91b9b4892774eb8819c27a3649de6eaf8ac96ef4145dbb2e95c89036c6af24ea6bc200566430d73604a32f32d7625e80758598a570069b765a7d15103778f23d77ab44cc721554dc9e941c59b4ff786a5cbb7cb6825e25e5ef06d65e303c43c0d36232b69c73fa67104219ca36496a38deaf51eaae544a7e112c847a36c03b99e6909083df3ec81d9a19d28e50069659b6b6f7a53a017df25f7fd5edab2a303c31216239384871581825c62351a89a895010848fd7b69838737408e533f74d4039fd1fb03269d90e32c78a6f32f292110656c63c62cfe97fec04ed386e2c4c4a6038ed1638ccd76ab0d2b7a278eef4dafc660bafa14915c9e0e8d82be4126616e9903ad5961095c525ad009365123e53882e75e7b6076cb6a4291cf3112fb010f82620305c14c02a73b21663459df1965e083c0e2b5c82cc6bbace9c5dc828dd0f438a30325560e7762f28c0b68b0ab23e7b4e0d04a3ffcc19ea363dfe49060afdae3573003e5d0902d134148bf46e0822eaaa001b26652ebad372cdb396c30ac560a4eafc603aa06cd35e038f80a907e86a29daeeb605aa805fdfeb2892ed2ecc30c5699d76c03d4bbaee488e57a11254fa86776740ba3f70e8b548861da474a1eceee71710227034005d5a0259649602499f395e7c8d68776d223f6dcbae17abf5b1b8e037cfcb4032123bb34a10b37ed16159b0756bc1dbc07e9e8da2863d31b78c355dde2d3123103f0bc15ae09b08ddb6e2cf6ade1f7c1944bd252b7f97ee96bfe23e907d1d7a71b03fa32fac57fcee6bccd2cb9876caa66647e085fa7d0afa02160c0f72c63a67a0103cdba035265b99fbc55bb8d9dd98d21bc0bd5ca643abdccc24b94001962fa312503c6932c4a78ce64337acc9de5887ba1a18d1203c7a5ad40f650b662b3b52e3a4f03fee5b9354f7afa3b7926c49e77d204b4c687d1de0a6ed5cbc60d01c24b2a773403a1c1f0e0e3b9fc91e4ccaab0529836713baa4e2262c24de893185f24d1b3b4ab031ba5342dc7ef049089d5472d2709cad094a2aa69077cfe6ec32eb8d5be0552620357a94bebab69c48d97717ef7f9c091c8c4fff761812fb43dd9dcc72574634e7303d20f80191e58a26e4b72dbde7d20b494c7c955967cef2fa17d412983023c127003fb635ddcc5bd902288b57c6d190ff1e0befec811d0f452dfa0ef329edefeb0030362f10d279ce64a2967891eac21fdb25bc32459e999e5c3a8234c0dfbc437d2600305bba7e2adb1af2607a51fcbeae91204d8713c2e3b7913fe5e3a32d33149185a033d4b58695c4ef858e16b907987c43ab32d3d4b01611fc12b2cbc8c69aae34406036b09308b2f5ff7329af362444d57e70a44b9998e69d1e0c2de12f15690a941a603a2eafbb8df8f6a5789e9a39f131cfdc75d65d0426d1fdaef88aaab5e1ad513eb034d7d7549f2c4654e772c170f01fc80f34a60463d7f5993c57069f690f09d859703cc92cc79decc6471f4b751bc0ca0ecdd3c2b12c28aafc100405ddb1a589fc66c03e4d66c6365e4d8425e5f4b90985ebec8bd4e9ece873e9b9d5ac10ce479a49d7f03034ee1eb117d05caf0d3874025311bf768f13f9b2ef7ef91b2c216b94d9464e003b991cfe7777d20c44e924b20c3b95d48944e27014ade9ea4ecdbf11213d08dfc039f7f98c70db192293bda936097b12697b00a30955e4669264da63e728a4fd4b80325ce7fcb4d0f24bad6c80d3bdcd1aa759bb064f6b90d74dbc4c9fee7d68ab43103cb942b3ba64b0debd84c6d35917bf94fc685703fd82639ac3fa7f5a3bae2d5e70308a93def30c398f4e67bfc028293514a33225618616a0776ea0bd11a7d77678c03567309f3694e20d08eb905bf2cc396cfede8cc06aa11c765add2013e62eaa55603f88c60914869cad3501f881b02bf278caa7188d19c94a43e3df52eb026e1323503b34002a9c8962b973709ce8518d1195888bd047d9d1f10f61217be7a7834db670318f218c6f0601ab4a3b5f123233d3c9828646813554c9f31ed2c21fb04a4bfc805581d026da1572e969498d2aeea7890749e291e3428439d62b97a9112bcd2f70c18404783ef33385aeac5031af4fe3189f1941a1e227b6d38354818cf82e57978a7bf9981911f0ef35fd5d505581d02979b35fb846ebe67a2ee86ffa3b044acc5629bc837f590c6801592470c0645012a05f2000219082403278fdcfb64cff6b6a8edb8dbe115ce42d7f1ad26d01bf944d929bd00fd5cdadb05581e03471313e3dd8816e34201436699edc90918142f363b4f358abd93a7e2400c05472c84cf74b75230038302ac6d84b493efc5789f7626f30a186f1970b65ace5f5bb5dc82d0045bd21c05581e0376327eed36c4af62b611494701a64ecb75b54417609bca443d25583c700402031a573896010463741f44a9e53c7dc1d07b66dbdcfb756b68d716e54e968263230335d419e98b5308eea4be2e9af37c934f7db1c679b57498ec0372f3a5e9782bfc0302591673bd9f1a2df27d4e5c0fa507178045d7a767661eac189e0fcd332068a70398a00fe4a9347a33bbada3aa60eee6ce58f11dac052cbde4008ade269ac7cdba05581e03830c219d3451d96b97bdf300a3b88072ffba2545956ef8cc07f6a1a56007011bffffffffffffffff02198bb20219ffff036cae310dc347d0f1b2c9f71d9d3455e85783411a10d73ea0a1657943983bc4130219ffff03e62918726fe53651863b398b7d280a948e18f797df2df91d81c52f5bd9c2bb650219ffff030a328b4bcebc9e6af48f4c8dd7d6c82a255b432c0457eb625b2341d99eb428da03e61e596012413bbc10e2364c6383a9a373be32f5344ffe4c49c9d8e7f0133ccd03ee90bd82b2f384a933f1841c528e6ce163ebfa1cd1dc2e68a0362ead3703836003ec9db5e28ec1b4cbdeab06db0c7f1e3318c35661f5aebcbcb72955bded7c5244033e82e48cace172f9ede7867ee2a3e335c0501d72ff644bc3132f79e08b72db4903416a5c6720b6a27fa1ee6153b1c4693bf9a7011a1f672f6a50bc119e5d5d28e303c74aaaed70f29903d95047f75565ebdc86284bc1006158d469f8f00cddabca9303783b0a8d0cc00c837f2646f608d77a0126f6e40886e34fdb09a8ba43cee7f4d00219ffff0350d9488c8b2eef2bc676c7203c6ee1cdf00eb12d4b8b3ca97f372f52397b452803513b3cbcf8e5dcfde4f0b1a986f1952de9b0732a5197fac4f7befd5ec9a47d360219ffff03d3427ebdbc516db4f8ce553f34cbc557e7cd57611179e29ddc53b1dcf8ad69c703345cf3eccb164b180e73bb2246cd67b4360856618c81557cc40f9653c0b582bb0381ea7f05444ea211c97bd82797dbe729f0e304e4022965acdf887f695752e66303eccd85d47406a08d88690764ddb96460a922ae92e877c2e744fb634707a9967c035386a932fbd7fa2a93f3135daf702fdca185f266a6942aae08d7fe1de2d99f9603e345f5a4c4c6a631628c369e20d8398ce73392638cf8082360b460ebd532b8d703a2f1f51124caacea9a6c470d360ef751e0f4e85fbe4ad714e6520967cb1c7cc2039707f03c56818da080eb3faaa395f9b4137f6923db4a996cce2bab36b56117e9034f73cee25a48791596a34b406fce65158bf9b6b6f174b15fb9845fcb1122a29e03c835dfb8b6526e52bbd52570d0b4b7c9d4d762d49f764e709d29ce2aeb0122d303a4c849171da0cac4b5ddd2fee18ad25f5f827db7713896c90c2f237c497431410399f82e838bb52daf79aa310078e31adb5ee59b51ce2bba2c37967d4c90af88c103b0c912339bb39f60578e70f72700682c9aa101d5263e914eaef126e8c96f610203a0425eeac624b2862168e6b0eeef819bf535191e9a9ec19e88978d0d8c28fcbf034e0d8b09a41be87bb0eb3d0d0710929ab7d2fd19bc1dadaa4a1c4177b6e09ae6035f8779eba8ecb7358928d25b9cd855ccd8df417a0a5075654e189a6db129c0f8031d4628e211da367227a23ed36650e830d55d8f2745bca6ad9d34debc6f3ef1d503720640896ab527d6b6ba2b2cf776044eb2f66baf107c968aa9a9457dd6ed05ba03569812b1252887a1c6c10dc083a79a5199d3d8e90069e18c8da94b05c2f9ac13036e2d0bf8dc6e674c0591c720eb9f2f38f77fa3a356bc0df6c8616dbe91eafb87032f954665c63fa1f176e9761e51070de59bf20347f5f5cf30665d3921ea50e45503a2732e7ea3395ce910157e40e3c7cfc53b745458ce4c84ff0920d614fc3ff00a03ec781d7a2f1f305c5b21e32fdd5016e42aa4b361855cf803416f5aae057e975f03909646b313b078a40086a6414a4c3cd9b4594d3544d160df9572f8c580c8f70c03755ceac27a6c81ee7b10f41cfe33ffd31b6bc34cba389f6df23e5569fbb90c1403ec5e98e14dfbc90eb46fd51562e6b148ac5ded713c0a94f730e5787d54f252950326a8b434661dd7f751a0106d730678ce3805fa572295336eb8ae3c0f952eeb050317b4c10d2ba669947a31a3deb5c328775561fa60515495d3b12f04788fb483a703faf9d803ab56773756298c25904854f89a5ba23851798b8536f50ecedd04587303ec3e90542f1b2073ac50ad0a0416650c44ed8a597291670fbcb9242ed21c6d99033411ffbdb84e6d4e59f2a7df103f50408914066c73f3f6f53632c27635eca204035e1482193dcc977cf58e7108ce2b32587dc42ea8ec379fe7172ec7f74da5442403622483e9dfe82dfc1d4a81adb651ec6deaa031dba8ad452643fd6ddc4b369fdf03776d40cebe5359b85f62f9170889a8aa9a516ef5342b8d6323f0420b40483d0003900ee424e0ffba5f1f83ef94b59592b63fc7393635d57de49b81a3c64d5896440384545919f1d8aa7dd6f919584d3c8cb85ff96b43ce464d71ce1d998340a226fa05581e039e91f3985aa9356f17b1269ffbea7276bc875c1f87632a88b1df07ee300c0147277af8187b7cfc05581e03df83fcf7887910a3fa90b9b14c8650855296c438aca012151c87b173f0040105581e03f1b426288cac2eb41e81d7068c9b47936f232505ab58f39977656f365008480320db8cffada80005581e0315bae696893ace6979b9463b8af411e9e7ee73c6e6a773ccaa74ba26d00c18224758e3312d5514d803702d223c6e51ac63ff8ad1620c65e768a79f24c12c9e82a52b20776e7ca189f205581e03c7bd9bef4670c155a21164dbbf8528317624038383c62aaadf8687efe00c014609184e72a000031271f1a3c827e8250ce21f4c5501d4b57e4c30e3a914445a92447b9aed8a04a705581d025a3c668361a652c79f070961fac3e9dd7eed911a6d6eca2b37de71a704020459462660a0604081815260049081361015610022575b505050361561002057600080fd5b005b600092833560e01c90816301ffc9a71461093d57508063150b7a02146108af57806324856bc3146107e85780633593564c146106b1578063709a1cc21461044f578063bc197c811461038a578063f23a6e61146102f95763fa461e330361001257346102f55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f557813590602435926044359067ffffffffffffffff918281116102f1576100db9036908301610a97565b919092878613908115806102e7575b6102bf5783850186868203126102bb5785359182116102bb5761010e9186016136d0565b5060208401359373ffffffffffffffffffffffffffffffffffffffff938486168096036102bb5761013e9161415a565b959097602b89106102935786359260178460601c98019561016d62ffffff883560601c9660481c16868b614365565b3391160361026b571561026157508186105b15610197575050505061019493503391613ac2565b80f35b9395945091929091906042871061021b5750505083601711610217577f8000000000000000000000000000000000000000000000000000000000000000821015610217577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe961021194019161020c33916141b5565b6141e2565b50505080f35b8480fd5b91969550929391508454841161023957506101949394503391613ac2565b8590517f739dbe52000000000000000000000000000000000000000000000000000000008152fd5b965085821061017f565b8483517f32b13d91000000000000000000000000000000000000000000000000000000008152fd5b8382517f3b99b53d000000000000000000000000000000000000000000000000000000008152fd5b8980fd5b8286517f316cf0eb000000000000000000000000000000000000000000000000000000008152fd5b50888813156100ea565b8680fd5b8280fd5b5082346103875760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261038757610332610a2b565b5061033b610a53565b506084359067ffffffffffffffff8211610387575060209261035f91369101610a97565b5050517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b80fd5b5082346103875760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610387576103c3610a2b565b506103cc610a53565b5067ffffffffffffffff9060443582811161044b576103ee9036908601610ac5565b505060643582811161044b576104079036908601610ac5565b5050608435918211610387575060209261042391369101610a97565b5050517fbc197c81000000000000000000000000000000000000000000000000000000008152f35b5080fd5b50346102f557602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106ad5783833567ffffffffffffffff811161044b576104a1829136908701610a97565b90818551928392833781018381520390827f0000000000000000000000000554f068365ed43dcc98dcd7fd7a8208a5638c725af16104dd613675565b50156106855780517f70a082310000000000000000000000000000000000000000000000000000000081523084820152907f000000000000000000000000f4d2888d29d722226fafa5d9b24f9164c092421e73ffffffffffffffffffffffffffffffffffffffff168383602481845afa92831561067b578693610646575b5081517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ea37093ce161f090e443f304e1bf3a8f14d7bb40169581019586526020860184905294849186918290899082906040015b03925af193841561063c577f1e8f03f716bc104bf7d728131967a0c771e85ab54d09c1e2d6ed9e0bc4e2a16c9461060f575b5051908152a180f35b61062e90843d8611610635575b61062681836135fa565b81019061388d565b5038610606565b503d61061c565b81513d87823e3d90fd5b9092508381813d8311610674575b61065e81836135fa565b810103126106705751916105d461055b565b8580fd5b503d610654565b82513d88823e3d90fd5b9050517f7d529919000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b5060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f55767ffffffffffffffff8235818111610217576106fb9036908501610a97565b91602435908111610670576107139036908601610ac5565b92909160443542116107c0573330146107b1576001958654958773ffffffffffffffffffffffffffffffffffffffff88160361078b5750509185949391610782937fffffffffffffffffffffffff00000000000000000000000000000000000000009586339116178755610b54565b81541617905580f35b517f6f5ffb7e000000000000000000000000000000000000000000000000000000008152fd5b90919293506101949450610b54565b8585517f5bf6f916000000000000000000000000000000000000000000000000000000008152fd5b50807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f55767ffffffffffffffff8235818111610217576108319036908501610a97565b91602435908111610670576108499036908601610ac5565b9290913330146107b1576001958654958773ffffffffffffffffffffffffffffffffffffffff88160361078b5750509185949391610782937fffffffffffffffffffffffff00000000000000000000000000000000000000009586339116178755610b54565b5082346103875760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610387576108e8610a2b565b506108f1610a53565b506064359067ffffffffffffffff8211610387575060209261091591369101610a97565b5050517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b849084346102f55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f557357fffffffff0000000000000000000000000000000000000000000000000000000081168091036102f557602092507f4e2312e0000000000000000000000000000000000000000000000000000000008114908115610a01575b81156109d7575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014836109d0565b7f150b7a0200000000000000000000000000000000000000000000000000000000811491506109c9565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610a4e57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610a4e57565b359073ffffffffffffffffffffffffffffffffffffffff82168203610a4e57565b9181601f84011215610a4e5782359167ffffffffffffffff8311610a4e5760208381860195010111610a4e57565b9181601f84011215610a4e5782359167ffffffffffffffff8311610a4e576020808501948460051b010111610a4e57565b919082519283825260005b848110610b405750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b602081830181015184830182015201610b01565b9192909260805282810361350d5791906000905b828210610b755750505050565b8382959394951015611b4c5760059282841b60805101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe19182608051360301821215610a4e578160805101359767ffffffffffffffff8911610a4e576020836080510101988036038a13610a4e57606097603f90818989013560f81c166001976020821060001461317157506010808210156127b4575060088082101561187e57508061109157505050610c2a908a614198565b92909860a08560805101013560001461108757610c6173ffffffffffffffffffffffffffffffffffffffff600154169b5b35613854565b9960408660805101013585829d927f80000000000000000000000000000000000000000000000000000000000000008314610fcf575b50959c95505b7f8000000000000000000000000000000000000000000000000000000000000000811015610a4e5760428610610fc85730915b86602b11610a4e578d91601783013560601c9083359462ffffff8660601c96610d1573ffffffffffffffffffffffffffffffffffffffff92839260481c16868a614365565b169084881015610fac57806401000276a4965b602b60405199604060208c01528160608c015260808b0137600060ab8a015216604088015260a0875260c087019587871067ffffffffffffffff881117610f7d576040948288958688527f128acb080000000000000000000000000000000000000000000000000000000087521660c48a0152868a1060e48a01526101048901521661012487015260a06101448701528160007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4088610deb610164820182610af6565b0301925af1928315610f71576000928394610f2f575b5050610e159310600014610f2857506141b5565b9a60428510610e5657309085601711610a4e5760177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe991019501949b610c9d565b50985098606091969597949392509160805101013511610efe575b1580610ed1575b610e8a57506001019291929092610b68565b90610ecd60409283519384937f2c4029e9000000000000000000000000000000000000000000000000000000008552600485015260248401526044830190610af6565b0390fd5b507f8000000000000000000000000000000000000000000000000000000000000000828501351615610e78565b60046040517f39d35496000000000000000000000000000000000000000000000000000000008152fd5b90506141b5565b91929093506040843d604011610f69575b81610f4d604093866135fa565b8101031261038757505160e092909201519190610e1538610e01565b3d9150610f40565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8073fffd8963efd1fc6a506488495d951d5263988d2596610d28565b8b91610cd0565b60149192501061105d576020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301523560601c5afa908115610f715760009161102b575b503880610c97565b906020823d602011611055575b81611045602093836135fa565b8101031261038757505138611023565b3d9150611038565b60046040517f3b99b53d000000000000000000000000000000000000000000000000000000008152fd5b610c61309b610c5b565b6001819d969d9b989794959a999b146000146111b7575050506040926110bf84836080510101359382614198565b608051840160a00135156111ab5760606110f273ffffffffffffffffffffffffffffffffffffffff600154169435613854565b946080510101356000557f8000000000000000000000000000000000000000000000000000000000000000851015610a4e576111319361020c866141b5565b9091901561119c5750611143906141b5565b0361117357507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000555b610e71565b600490517fd4e0248e000000000000000000000000000000000000000000000000000000008152fd5b6111a691506141b5565b611143565b60606110f23094610c5b565b9194929391600281036112065750505061116e925073ffffffffffffffffffffffffffffffffffffffff600154166111ff604060608560805101013594608051010135613854565b91356139d0565b9193916003810361157857505060805181018084019390604090850312610a4e57823567ffffffffffffffff8111610a4e5782608051010192606084860312610a4e57604051946060860186811067ffffffffffffffff821117610f7d57604052602085013567ffffffffffffffff8111610a4e57850160208201809882011215610a4e5760208101359061129a826136a5565b926112a860405194856135fa565b8284526040602085019360071b830101918a8311610a4e57604001925b828410611513575050505085526112de60408501610a76565b956020860196875260606040870195013585526040846080510101359067ffffffffffffffff8211610a4e57602061131f92611325966080510101016136d0565b5061417b565b909173ffffffffffffffffffffffffffffffffffffffff600154169473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3163b15610a4e5794929391906040519586947f2a2d80d100000000000000000000000000000000000000000000000000000000865260048601526060602486015260c48501935193606060648701528451809152602060e487019501906000905b80821061149a575050509461143e9285949273ffffffffffffffffffffffffffffffffffffffff600098511660848701525160a48601527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858403016044860152613537565b03818373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3165af18015610f715761148b575b50610e71565b61149490613576565b38611485565b9197965091929394602060806001928a5173ffffffffffffffffffffffffffffffffffffffff815116825273ffffffffffffffffffffffffffffffffffffffff848201511684830152606065ffffffffffff918260408201511660408501520151166060820152019801920188969795949392916113d8565b608060208584030112610a4e5760206080916040516115318161358a565b61153a87610a76565b8152611547838801610a76565b83820152611557604088016136bd565b6040820152611568606088016136bd565b60608201528152019301926112c5565b600495509193508482036116e757505090916040606061159e8286608051010135613854565b608051909501013573ffffffffffffffffffffffffffffffffffffffff908116933516806116145750479283106115ee575050806115de575b5050610e71565b6115e7916144d1565b38806115d7565b517f6a12f104000000000000000000000000000000000000000000000000000000008152fd5b9391908051937f70a082310000000000000000000000000000000000000000000000000000000085523083860152602085602481895afa9485156116dc576000956116a8575b50841061168257505081611671575b505050610e71565b61167a9261453f565b388080611669565b517f675cae38000000000000000000000000000000000000000000000000000000008152fd5b90946020823d6020116116d4575b816116c3602093836135fa565b81010312610387575051933861165a565b3d91506116b6565b82513d6000823e3d90fd5b8103611714575061116e925061170d604060608460805101013593608051010135613854565b90356138a5565b9091906006810361184e57506080510160608101359060409061173990820135613854565b9282158015611843575b61181b573573ffffffffffffffffffffffffffffffffffffffff16938461177f57505061116e92506117786127109147613984565b04906144d1565b8151907f70a082310000000000000000000000000000000000000000000000000000000082523090820152602081602481885afa91821561181157506000916117dd575b506117d661116e94939261271092613984565b049161453f565b906020823d602011611809575b816117f7602093836135fa565b810103126103875750516117d66117c3565b3d91506117ea565b513d6000823e3d90fd5b8482517fdeaa01e6000000000000000000000000000000000000000000000000000000008152fd5b506127108311611743565b83602491604051917fd76a1e9e000000000000000000000000000000000000000000000000000000008352820152fd5b819d969d9b989794959a999b93929314600014611b85575050506040916118ad83836080510101359185614198565b92909460a082608051010135600014611b7b576118e373ffffffffffffffffffffffffffffffffffffffff600154169135613854565b908615611b4c576118f385613a94565b8760011015611b4c5761191561195d9161190f60208901613a94565b90613c34565b907f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f613b2c565b938481611b32575b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff860193868511611b03576119b9946119be73ffffffffffffffffffffffffffffffffffffffff9687928a85613a84565b613a94565b16948651947f70a082310000000000000000000000000000000000000000000000000000000091828752841693600499858b89015260249460208987818d5afa988915611af857600099611ac3575b509160209695949391611a1f93613cad565b8751968793849283528a8301525afa928315611ab857600093611a83575b50906060611a519260805101013592613ab5565b10611a5d575050610e71565b517f849eaf98000000000000000000000000000000000000000000000000000000008152fd5b90926020823d602011611ab0575b81611a9e602093836135fa565b81010312610387575051916060611a3d565b3d9150611a91565b84513d6000823e3d90fd5b90986020823d602011611af0575b81611ade602093836135fa565b81010312610387575051976020611a0d565b3d9150611ad1565b8b513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b611b4492611b3f88613a94565b613ac2565b388084611965565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6118e33091610c5b565b919492939160098103611f66575050611b9e9082614198565b608051840160a0013515611f5c57611bcf73ffffffffffffffffffffffffffffffffffffffff600154169335613854565b92611bd9836136a5565b95611be760405197886135fa565b83875283901b820160208701368211610a4e5783905b828210611f44575050506000946002875110611f1a576040816080510101359680517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908111611b035790815b611ca757505060805101606001358611611c7d578215611b4c5761116e9585611c7892611b3f85613a94565b613cad565b60046040517f8ab0bc16000000000000000000000000000000000000000000000000000000008152fd5b90977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89019750888811611b035773ffffffffffffffffffffffffffffffffffffffff611cf7611d6d9984613a70565b5116611d2373ffffffffffffffffffffffffffffffffffffffff611d1b8c86613a70565b511682613c34565b819a917f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f613b2c565b90604051907f0902f1ac00000000000000000000000000000000000000000000000000000000825260608260048173ffffffffffffffffffffffffffffffffffffffff87165afa9a8b15610f7157600092839c611ed1575b5073ffffffffffffffffffffffffffffffffffffffff1603611eb7576dffffffffffffffffffffffffffff8091169916905b9880158015611eaf575b611e855782611e0f91613984565b916103e892838102938185041490151715611b0357611e2d91613ab5565b6103e590818102918183041490151715611b0357611e4a91613997565b60018101809111611b0357978015611b03577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019081611c4c565b60046040517f7b9c8916000000000000000000000000000000000000000000000000000000008152fd5b508115611e01565b6dffffffffffffffffffffffffffff998a16991690611df7565b611f0a919c5073ffffffffffffffffffffffffffffffffffffffff935060603d8111611f13575b611f0281836135fa565b810190613c77565b509b9092611dc5565b503d611ef8565b60046040517f20db8267000000000000000000000000000000000000000000000000000000008152fd5b60208091611f5184610a76565b815201910190611bfd565b611bcf3093610c5b565b92945091600a81036120cc5750608051830160e08101358101946020808701359450909291611f9991908703018461414d565b1161105d5773ffffffffffffffffffffffffffffffffffffffff93847f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba31692856001541691843b15610a4e5760409587875198899687967f2b67b570000000000000000000000000000000000000000000000000000000008852600488015261202190610a76565b166024860152808883608051010161203890610a76565b16604486015265ffffffffffff808360805101606001612057906136bd565b166064870152826080510160800161206e906136bd565b166084860152816080510160a00161208590610a76565b1660a48501526080510160c0013560c484015261010060e48401526120b1916101048401918701613537565b03815a6000948591f1908115611811575061148b5750610e71565b600b8103612296575050506120eb604080926080510101359235613854565b91807f80000000000000000000000000000000000000000000000000000000000000008103612266575050475b8061212557505050610e71565b73ffffffffffffffffffffffffffffffffffffffff90817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216803b15610a4e578351927fd0e30db0000000000000000000000000000000000000000000000000000000008452600493600081868187875af1801561225b5761224c575b5030908616036121b4575b5050611669565b6122139460006020948651978895869485937fa9059cbb00000000000000000000000000000000000000000000000000000000855284016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03925af1908115611811575061222d575b808080806121ad565b6122459060203d6020116106355761062681836135fa565b5038612224565b61225590613576565b386121a2565b86513d6000823e3d90fd5b47101561211857600482517f6a12f104000000000000000000000000000000000000000000000000000000008152fd5b600c810361242657505050906122ac9035613854565b9073ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21660408051937f70a08231000000000000000000000000000000000000000000000000000000008552600430818701526024916020878481885afa968715611ab8576000976123f2575b506080510183013586106123cb578561234e575b50505050505050610e71565b833b15610a4e57600091869183855196879485937f2e1a7d4d0000000000000000000000000000000000000000000000000000000085528401525af190811561181157506123bc575b5030908316036123ac575b8080808080612342565b6123b5916144d1565b38806123a2565b6123c590613576565b38612397565b82517f6a12f104000000000000000000000000000000000000000000000000000000008152fd5b90966020823d60201161241e575b8161240d602093836135fa565b81010312610387575051958361232e565b3d9150612400565b600d8103612681575082608051010191602083019360208260805101850312610a4e573567ffffffffffffffff8111610a4e57849160805101019182011215610a4e57602081013590612478826136a5565b93604093612488855196876135fa565b838652602086019285849560071b820101928311610a4e578501925b82841061261f575050505073ffffffffffffffffffffffffffffffffffffffff90816001541684519060005b8281106125b357505050817f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba31691823b15610a4e5783517f0d58b1db000000000000000000000000000000000000000000000000000000008152602060048201529451602486018190528592604484019290916000915b81831061256f57505050509181600081819503925af1908115611811575061148b5750610e71565b91938395506080602091846060600195975182815116845282868201511686850152828d820151168d85015201511660608201520195019301909187949392612547565b81856125bf838a613a70565b515116036125f6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b03576001016124d0565b600486517fe7002877000000000000000000000000000000000000000000000000000000008152fd5b608060208584030112610a4e576020608091875161263c8161358a565b61264587610a76565b8152612652838801610a76565b83820152612661898801610a76565b8982015261267160608801610a76565b60608201528152019301926124a4565b9294505050600e810361278357506040918251907f70a0823100000000000000000000000000000000000000000000000000000000825260208260248173ffffffffffffffffffffffffffffffffffffffff806004983516888301528886608051010135165afa918215611ab85760009261274e575b5060805101606001351180159290612710575050610e71565b517fa3281672000000000000000000000000000000000000000000000000000000006020820152908152909150612746816135c2565b9038806115d7565b90916020823d60201161277b575b81612769602093836135fa565b810103126103875750519060606126f7565b3d915061275c565b602490604051907fd76a1e9e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9150915060189b95939897999692949b808310600014612d435750810361282a5750505060009250906127e883928261417b565b81604051928392833781018481520391357f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc5af1612824613675565b90610e71565b6011810361288157505050600092509061284583928261417b565b81604051928392833781018481520391357f0000000000000000000000000000000000e655fae4d56241588680f86e3b23775af1612824613675565b601281036128d857505050600092509061289c83928261417b565b81604051928392833781018481520391357f000000000000000000000000941a6d105802cccaa06de58a13a6f49ebdcd481c5af1612824613675565b919392509060138103612a3e575050909150357f000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb916040600080825160208101907f8264fe9800000000000000000000000000000000000000000000000000000000825260248781830152815261294e816135de565b5190606086608051010135885af192612965613675565b948415612a04578273ffffffffffffffffffffffffffffffffffffffff612993921694608051010135613854565b90833b15610a4e5782517f8b72a2ec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921660048301526024820152916000908390604490829084905af1908115611811575061148b5750610e71565b505091925050517fae9bdf0000000000000000000000000000000000000000000000000000000000602082015260048152612824816135c2565b60158103612b4f57505090604091828051917f6352211e0000000000000000000000000000000000000000000000000000000083526020836024816004976060816080510101358983015273ffffffffffffffffffffffffffffffffffffffff968791608051010135165afa928315612b4457600093612b05575b5081903516911614918215612acf575050610e71565b517f7dbe7e89000000000000000000000000000000000000000000000000000000006020820152908152909150612746816135c2565b6020939193813d602011612b3c575b81612b21602093836135fa565b8101031261044b575190828216820361038757509181612ab9565b3d9150612b14565b85513d6000823e3d90fd5b60168103612c765750506040918251907efdd58e00000000000000000000000000000000000000000000000000000000825260208280612bc160049660608660805101013590358884016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b038173ffffffffffffffffffffffffffffffffffffffff8886608051010135165afa918215611ab857600092612c41575b5060809081510101351191821592612c0b575050610e71565b517f483a6929000000000000000000000000000000000000000000000000000000006020820152908152909150612746816135c2565b90916020823d602011612c6e575b81612c5c602093836135fa565b81010312610387575051906080612bf2565b3d9150612c4f565b909290601714612c87575050610e71565b60409073ffffffffffffffffffffffffffffffffffffffff612caf8383608051010135613854565b93351692833b15610a4e5782517f42842e0e00000000000000000000000000000000000000000000000000000000815260805130600483015273ffffffffffffffffffffffffffffffffffffffff909216602482015291016060013560448201529160009083908183816064810103925af19081156118115750612d34575b806115d7565b612d3d90613576565b38612d2e565b9396938214159050612d7e5750505061282492507f00000000000000000000000074312363e45dcaba76c59ec49a7aa8a65a67eed391613717565b60198103612dd5575050506000925090612d9983928261417b565b81604051928392833781018481520391357f0000000000000000000000002b2e8cda09bba9660dca5cb6233787738ad683295af1612824613675565b601a8103612e2c575050506000925090612df083928261417b565b81604051928392833781018481520391357f000000000000000000000000a42f6cada809bcf417deefbdd69c5c5a909249c05af1612824613675565b601b8103612f53575050506000612e4481928461417b565b9390604094818651928392833781018481520391357f00000000000000000000000074312363e45dcaba76c59ec49a7aa8a65a67eed35af1918291612e87613675565b92612e95575b505090610e71565b73ffffffffffffffffffffffffffffffffffffffff608083815101013516612ec4606084608051010135613854565b90825190612ed1826135a6565b60008252803b15610a4e57612f2d94600080948651978895869485937ff242432a00000000000000000000000000000000000000000000000000000000855260a060c0836080510101359260805101013590306004870161380f565b03925af19081156118115750612f44575b80612e8d565b612f4d90613576565b38612f3e565b91949091601c8103612f8e5750505061282492507f000000000000000000000000cda72070e455bb31c7690a170224ce43623d0b6f91613717565b9193929091601d81036131175750506060816080510101359060409173ffffffffffffffffffffffffffffffffffffffff612fcf8484608051010135613854565b9435168351947efdd58e0000000000000000000000000000000000000000000000000000000086526004936020878061302e87308a84016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0381865afa96871561225b576000976130e2575b50608090815101013586106130ba57845161305c816135a6565b60008152823b15610a4e576000946130a486928851998a97889687957ff242432a0000000000000000000000000000000000000000000000000000000087523090870161380f565b03925af1908115611811575061148b5750610e71565b8385517f675cae38000000000000000000000000000000000000000000000000000000008152fd5b90966020823d60201161310f575b816130fd602093836135fa565b81010312610387575051956080613042565b3d91506130f0565b929450925050601e810361278357508161313560009392849361417b565b81604051928392833781018481520391357f00000000000000000000000020f780a973856b93f63670377900c1d2a50a77c45af1612824613675565b9499989a92506020819d9792969d989498146000146131da575050505050508061319e600093849361417b565b81604051928392833781018481520391357f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd65af1612824613675565b602190808203613351575050505090916131ff6131f7868661415a565b96909561417b565b929061324160409788519760208901997f24856bc3000000000000000000000000000000000000000000000000000000008b5260248a01526064890191613537565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc878203016044880152818152602082818301951b82010195856000915b8483106132d357505050505050505091816132c5600094938594037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826135fa565b519082305af1612824613675565b90919293949596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085820301885288358284360301811215610a4e578301906020823592019167ffffffffffffffff8111610a4e578036038313610a4e5761334160209283928b95613537565b9a0198019695949301919061327f565b929750929593509350602281146000146127835750604080936080510101359060009060028310156134e1575050808491156000146134895750506000907f0000000000000000000000001e0049783f008a0085193e00003d00cd54003c71925b6020838251937f095ea7b3000000000000000000000000000000000000000000000000000000008552600496878601526024947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868201526044968792355af13d15601f3d1187600051141617161561342e5750505050610e71565b91600e7f415050524f56455f4641494c45440000000000000000000000000000000000009260206064969551957f08c379a0000000000000000000000000000000000000000000000000000000008752860152840152820152fd5b036134b8576000907f0000000000000000000000002b2e8cda09bba9660dca5cb6233787738ad68329926133b2565b600482517f5461585f000000000000000000000000000000000000000000000000000000008152fd5b602492507f4e487b71000000000000000000000000000000000000000000000000000000008252600452fd5b60046040517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b67ffffffffffffffff8111610f7d57604052565b6080810190811067ffffffffffffffff821117610f7d57604052565b6020810190811067ffffffffffffffff821117610f7d57604052565b6040810190811067ffffffffffffffff821117610f7d57604052565b6060810190811067ffffffffffffffff821117610f7d57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610f7d57604052565b67ffffffffffffffff8111610f7d57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b3d156136a0573d906136868261363b565b9161369460405193846135fa565b82523d6000602084013e565b606090565b67ffffffffffffffff8111610f7d5760051b60200190565b359065ffffffffffff82168203610a4e57565b81601f82011215610a4e578035906136e78261363b565b926136f560405194856135fa565b82845260208383010111610a4e57816000926020809301838601378301015290565b919290613724908361417b565b90938460405195869384378201906000958693838580955203918635905af19261374c613675565b9284613756575050565b73ffffffffffffffffffffffffffffffffffffffff60608201351661377e6040830135613854565b91813b156106ad576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff93909316602484015260800135604483015290919081908390606490829084905af190811561380357506137f85750565b61380190613576565b565b604051903d90823e3d90fd5b919261385195949160a09473ffffffffffffffffffffffffffffffffffffffff8092168552166020840152604083015260608201528160808201520190610af6565b90565b73ffffffffffffffffffffffffffffffffffffffff908082166001810361387e5750506001541690565b90915060020361385157503090565b90816020910312610a4e57518015158103610a4e5790565b9092919073ffffffffffffffffffffffffffffffffffffffff16806138cf575061380191926144d1565b7f80000000000000000000000000000000000000000000000000000000000000008214613902575b92613801929361453f565b9050604051927f70a08231000000000000000000000000000000000000000000000000000000008452306004850152602084602481855afa938415610f7157600094613951575b5092906138f7565b6020813d821161397c575b81613969602093836135fa565b8101031261021757519350613801613949565b3d915061395c565b81810292918115918404141715611b0357565b81156139a1570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b919273ffffffffffffffffffffffffffffffffffffffff91827f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba31693843b15610a4e5760009484869281608496816040519b8c9a8b997f36c78516000000000000000000000000000000000000000000000000000000008b521660048a01521660248801521660448601521660648401525af18015610f71576137f85750565b8051821015611b4c5760209160051b010190565b9190811015611b4c5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff81168103610a4e5790565b91908203918211611b0357565b92919073ffffffffffffffffffffffffffffffffffffffff8082163003613aee575050613801926138a5565b8084959411613b02576138019416926139d0565b60046040517fc4bd89a9000000000000000000000000000000000000000000000000000000008152fd5b9173ffffffffffffffffffffffffffffffffffffffff93613c2d916040519060208201927fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16845260601b16603482015260288152613b8f816135de565b519020613c01604051938492602084019687917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826135fa565b5190201690565b73ffffffffffffffffffffffffffffffffffffffff8281169082161015613c585791565b9091565b51906dffffffffffffffffffffffffffff82168203610a4e57565b90816060910312610a4e57613c8b81613c5c565b916040613c9a60208401613c5c565b92015163ffffffff81168103610a4e5790565b9260028210614123578115611b4c57613cc584613a94565b9160019481861015611b4c5791613ce360209461190f868601613a94565b50926000935b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84018510613d1c575050505050505050565b613d2a6119b9868685613a84565b92613d3b6119b98a88018786613a84565b936040908151957f0902f1ac00000000000000000000000000000000000000000000000000000000875273ffffffffffffffffffffffffffffffffffffffff80941694606092600493808a86818b5afa998a1561225b57908d9594939291600091829c6140fd575b50508780916dffffffffffffffffffffffffffff8091169c16921692168214998a6000146140f7575b8651958680947f70a082310000000000000000000000000000000000000000000000000000000082528b8883015260249889915afa9283156140ec578e6000946140bb575b5050808303918115938480156140b3575b61408b57826103e5808602958604149114171561405e57613e439083613984565b926103e880830292830414171561403157613e689291613e629161414d565b90613997565b971561402957600097905b898b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe820181101561401d579161190f6119b9613eb9936002613f039c9601908d613a84565b8198917f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f613b2c565b965b988551918d83019367ffffffffffffffff9484811086821117613ff057885260008452813b15610a4e5760008a93613f8382968b519c8d97889687957f022c0d9f0000000000000000000000000000000000000000000000000000000087528d8701528d860152166044840152608060648401526084830190610af6565b03925af18015611ab857908d969594939291613fa8575b505050505094019391613ce9565b909192938095965011613fc45750505287903880808080613f9a565b6041907f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b876041887f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b5050508b956000613f05565b600090613e73565b856011867f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b866011877f4e487b7100000000000000000000000000000000000000000000000000000000600052526000fd5b8689517f7b9c8916000000000000000000000000000000000000000000000000000000008152fd5b508115613e22565b8181959293953d83116140e5575b6140d381836135fa565b8101031261038757505191388e613e11565b503d6140c9565b87513d6000823e3d90fd5b90613dcc565b899c50899250908161411a92903d10611f1357611f0281836135fa565b509b9091613da3565b60046040517fae52ad0c000000000000000000000000000000000000000000000000000000008152fd5b91908201809211611b0357565b91823583019161417460208435958186019503018561414d565b1161105d57565b91602083013583019161417460208435958186019503018561414d565b91606083013583019161417460208435958186019503018561414d565b7f80000000000000000000000000000000000000000000000000000000000000008114611b035760000390565b939193602b841061105d578462ffffff6000614267946142ee6142999935988960601c9a8b9a61423b601789013560601c9d8e109c73ffffffffffffffffffffffffffffffffffffffff9e8f998a9460481c1691614365565b16968b861461434a576401000276a49a5b60409d8e9b8c93845196879560208701526060860191613537565b91168b830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826135fa565b848851998a98899788967f128acb080000000000000000000000000000000000000000000000000000000088521660048701528c6024870152604486015216606484015260a0608484015260a4830190610af6565b03925af190811561433f576000938492614309575b50509192565b9080949250813d8311614338575b61432181836135fa565b810103126103875750602082519201513880614303565b503d614317565b83513d6000823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d259a61424c565b73ffffffffffffffffffffffffffffffffffffffff92838316848316116144c9575b62ffffff90846040519481602087019516855216604085015216606083015260608252608082019082821067ffffffffffffffff831117610f7d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613c2d9183604052845190209361449c60a08201957fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54907f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f98488917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608101845201826135fa565b909190614387565b600080809381935af1156144e157565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152fd5b60009182604492602095604051937fa9059cbb000000000000000000000000000000000000000000000000000000008552600485015260248401525af13d15601f3d116001600051141617161561459257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152fdfea2646970667358221220b2d6a39827110492aaa15cba3556e23894a51f2f635dc99ae66d21764ad4d90b64736f6c634300081100330058210390decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56305820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0058210310e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6041010219080405581d02367b74293bb052cf32dbf499b5c69c98fda9beb40172c7513283aa71070119462603eab71320eeef085932d28d44e0baf57b58344eb1e00ad28043fed2773af1d7eb0605581d02fa23563862f322c7e205623469c0b78f515b247fc070b0a8a7a361b207011bffffffffffffffff02192210030c975042158b302d08b687b5ad55407adea0f6c0c8e2ae9027af5f2b66a90e2503db731c607521cbd787386a1fe342cdf1bac891251c300135c9c48e15f96572ae021979ab036f2ee834e1f27ab29334718c1891c1fbf7b4905b5c3c8413a6455bc362071e0703a6e69c4e7f6c01cdbd2a57007b66d03fcc4d915e823bc0128e46df6d003bf27103886f7645e367e56ba68b766987c56dfef14001d37ea052544e5bc80fa127574203d5e6f2c9fedc019daec57e9f9de99606ad6622acd7e5752e59cce941342141550368fd523bc7a98534cd05165476e5f4aff3d49d9353645c45a3718810935c63b703a2b47f7b9bb8970017b462680a3019b86a20a3053c28d35b35d8055c6e9ec09f0219ffff038d82a113feec5be1befcd1a92c6b71e128f238629f74c895b40f1b0d31970eb703e32cc14941b0c0e26fd4cd6a1ff7904594c84aee9ebc8ea8971e9e4ebb4e11630365a9fd54eea42809ad5d130b0257ffc59ecea4d36525c5f059f0ba74e12d97da03281a34dfcf4c9272ce28f683e1214c28e3bc7320ec32034b66c88950440b6d29037acfa0a74627f84ecc785940d286ea2f47d8719391be009f1ace0ba56de41b970311cdc47e8172f6af544d8b529571110c099bc95182cb9fbefdbfa94a345b453703f2b6daba9341b5868251a1ca9c40c9331d0458fd2860406a2d3b2c2429368f0103607f0de0931910ba9ecf0e19204ef4454c8f293039132d816a94fd013c53224503de0dd51065e16214b69968bc663ea47bd1b58f4a23def0cdb9ce7826e6b5798b03208d267634ee7ef8b6dd028468268e4642393faeea95298b745a6d3793a910240219ffff0338c61070304c5a56b382ff5fe8279b579ba528f8450ef0972671f54aaf8a1807033df2a9b7c7835a37cae5bcacb6bd5614801c723c65b8c038b6895bb8721005d30345f5378f333db1e4dbc4ff7bb03fb174652735acc417491426ec1d5b4b7c962103f624a84b5da7da6f6d297359ff86b3f5b7aa514c3c544d10b7cdda48c3b6538c03d2ea0d5257ab5b2e9d684cf536fa24090bdbf8144370ff8296130dd05fef871f03649f0628bacb781a5e38fe229e48f6333d3fcccb12e8232e0ef40894f79bd01403265f0d31dffe3ddaceb1a6264373b2071694a42cdc8deac6f08e7167e3b53b5c0348755492522f9d4186ee1d2ef54e05eb48ff50167faaa3cd8bdbbdcd0f1dfb270388fcd11bfa6af7102fc26c75109a9bfb91b18b098abdf9941b4fd719c4b38b51032b8c63effd1c55715b1030ff3b0e540120c7468ab949e045e2b56b75a851f8ad03f1f869a4f7853a567e16451e77c8fcd41eb35442dca17ffa169117e376b12f52035315b68e12efbfd7e425d1303ac50276124043bdec90967756d20c135a4439030219ffff034fe4674fca460c6b0d3775f93ae770fd2f8f6adbf3df8a38cbd20f6858dae16603d5f6e825b679423f3bc83a3858566924aca2c9fe0fea7a738e50c7473705430f03d8f3699affd4c37f3873e6cb56c520da8768f9b299beb3d24a6870e3ef840cf90219ffff03a856879ba50e428f706e8ea8ab23bdfcf6e533526774c801832f406c496c8bf5035060819b722c0510205215121ae18a0c91ff232cb1bcfb88cf5b126021f47f0103f192f4200aad1a68680a0ee8a45f52d5d9499b04c4ca9a9468ee3e6d05fb06a4031dd5eed083075ab6aab72f5bc31a42da9e452af16b44126c68c121599b5d7d5d034b4c77225b00a5628f40c7b1d2edde5a0e1e73ee390eaf46102e93ef8b5c6ec803f4cdd6911f721cf8a8349705e06795e1537271c6e71ce482458062864481d36a03224c9b283bca44bd906cbb6f8aa336e7a8832c19b90234aca912ac95e3b23b2403738163b6eff66aaa37335f5c07a84f61fad13f1dbe24a9e3305b4f9847612e16035366ef61de8dd9508e66112b8a8b9107be9b4713d881a04d20e9b24b4f8555a30367bf6f3570230084e9c845f3e358a0a970cba8ad34aae28c1b39d795c49abb9d034879cf3d253b210eaf97a54bfb2882218cd549e779dd0d460106eaff45f0e2ae03f344efafc63dfff5359260d7f7bbcab1fc6c9323363f11b02462ad8b02487a7e03698d776c9cdd56361bade4cd6f0367c0b52268918652074bb0f1671277be82ad037b49101ecf8284f85a08144c80e24b6387eee2b2b282d59822cf8371b48a26280316035ab46792ea0c73b6c679cb03babde3ef39281aa0432db7112e9a803b947503eafd1132f34423710d00cdb047c30f5dc4c63684c6b4aa48a8c0094e6b2ad4a503397aecf779627d1b5ba31cddaeb3a41d45ba3a8851546c42fc8b848da29e968f03a31a78dca744bb051e20db4fcd34e9bba63d3706702f20d33ad199cd4ab4158403a908dc082006334a16b811a096a809f25c9d7b210a0fe3f8d7bd6cdcc36e7f77032915c27a44a0c56ab5b5afdb8d8abe8f346ef4025707debb97ab0ebb7848384103fc2222896f3316227969e6b783146dae8b67e920fb4ecca348f07fb708be8d3603177bccb80a7c5a54167ce15e7e4dac105176699cb48417cdb1f44b8c3a11164f05581d020562f180317169b17c114dceb8f530662cbf5cb45104976be1c5799c040105581d02cf6f47949b59006dcee0bad9757d925c1b03370423e7b3d302a33b0e0c0247051bbc32954c0005581d0207d087d0e06a061d8cf2eff483c4c045de877251fd50ec7b4ce9adf1084801ab91dfed466c000219182203a690a9b22e0e9d4081a8239747d3e85652d6142224268c40bb04bf4e613b0e4f05581e03f795d314522a92fe3cddad5ccb6effe61e7c8f0e1712b46dac64cc1dc00c014705217d32a74c4805581e03cb5f1adcd30ce464ef14796b2dd04127771e378a1fd231dd39e1298dc0040205581e03d81578c817561388355e2ad7b32ca851dfc59f8c6c00ed57a27d33b2500c0647019f6c1af7231805581e03c67474d53313f21b8ca161dd5b4e8363a97fe4c39547284fe47c396aa00c03470389b413e1aec003d3183fbfdab637c08db5ae2b8a3a28bc294ad04da22eb904ad8adb7d93b7aede035401c2db8b68c2e025117584dae009174f816ed4097edfa39027af3985a6b86e03f47c023b26d46373454f84175ac598ed5487c76eed04930adc60c25f0d7f258205581e0311a2f42e657e9333f22ad102102245aa3da2808880764b8b220367a8300c01466346fa684d000219d6e30361ac68c7460b43f1179d400ece1a1c2347efd5bd0d9f82a89858826b616c121a03440ccd7dd0fbc59b9b31d45edaa2ca42e226a8534328acc77ddbf0685902f6b10345883bdaa16f74f7608c7e7d23b01bd2eb3175864cc1216f1c1b17e223cce3cb03b5a1452b917a08cc1fb519a022df0763cc3cada88fb73de62685c43a5776171203b0856d38cc1efff710a845dfd301eb555c3a5d363b25be0c7296b3c7436f212c0395581839c4f631602aa9815d6c6f5bde978402810d2a81379c062219c446dcc80353ac20cc0541b52d042bcac44795ec73e83b99454312bc9dabb1805ffcc69d0b03aace27d352a94b435805f2e867d3ad5a313873bbbb7daa09f3e8448bd65c3e7c038fdc73be650f209da66653d3dd754ff0a5992dc0bca44af1900cc2e4270bc3bb031a596835d22e9dfe81946f42c32c99e4847c7ea1240e9f618495fc553373634d034208930241b5a8096c2095002ae9f3376ffe7bf5622681fa02ae4d2ee243468103a09b17a06953faf770cdf4004f487d6ca38dd959bdb95de1d4efb989c074442703546736042c4a11904245877b4ead062251fce46bab096d5e70a455ffa788cd9d0219ffff03ac9a2d51a10f528167c4801018f26235bebf1dd784e39eddf8edea5bf30d55f503465555c4dc84934066ddb671d203404f6a6518ad795f2e1f00cd97cbaba5aa4d03ecf80f1437417b984cde4b6191bf8705fe9743c9694bf7e8a0e39f118a2a639b03732291a91c072c786847787dc5a1b6ed7d782a4d402ab15d4f3dcfe85c47459503b04eb23bbb084ab2d08e808940529bda17651367e69915eba2e7f78a71d6a12b03d6e5fd7b0571ff163315cc7f3eed475a9ef4cd06d7e51964cbf00868c212e91703a491332be56b92bf50fdee51b32061690b6ffd4540fb9edb6c8d751c1a93c959037f6a1004b4c0e87449ae7e676984de52682d4dd5e4a82f6560d54b458fe97e4203fde2bb17312eef02c226e9e307b1e75a568953146b1e50175c962d52762b9e7003519c02bb0ccd6e4e7a983a322aea9c5ac97410629bd1140a8bc0f34c640a4a1103150963371f7a441d90eb104c6819e3052f886f4e41363f36880ea99983ff7d2003fe94cd9319fb1dde5cafbc421fa08111caee08185b518bc8f41efd021dd65930033fd2f7d42851ebdd5eeb3f785b883cb8c6a716d1d14acfa1da3e4dad33cba3960219ffff037a3b2292b97d951935219e48e0af413fc0b2a080ec12ecb11500fa30693f371c034d898ec8e9221364417fa29aacfdbfacf664733803a271be359d515f1c75e39e03da84dc259556887bf48381f635e12a92b100ce69da5eeeba6dd685cc45e7a9f7036b0f68c757e23d6ef24b887411b95b3a6061862203d12f6650c081cd6b7a96e7032815d7f992d035862ec2b2b1711b9100d5a4bada4e683644b52cf0eb808fe803032ee816bdf1bf4916da95b818192a58ae97ab144037fc0773ab2f7844d8034e6a03b5814acffb81775b79b223c8a41d7927e351e5836a2162f5d7ae6db7e5646b93034fd3d1ff915c4f3ec0903f7233c4e0eea80f7f3dbc57627438f11ac2580994390219ffff036ae455a8f98f602ad3df3bb4b8f35140ed320d28981d268d11e4bdecf761f691030f365cab02f9fbbab84a2d2abc964a5d04815fbf27caa1f574c20ff88dfe3d34033f5ffd77dfa969a03878e24bcdd6aae9804df7dd805355087f754cf34ca27351039e1674c0fe03b797fb0d0ad7c1a0e47e9813b457884b61087b07394399bc21b80379e4ddae0109844cc53761f22bc5b53c3910bd6105cf368eae6d358cdf3311210219ffff03cd98bf9f6f35337d1dc7521ba37683c5a9c7db2f97c15ebd327bd1ecc94f73480399358e17a1bce7878169d6caa3743f1d3ab4becf862ddbef324ad5fcec1ffee20387f568ac40805eee9bafb18fd2b86755ddc504ff7d7a8e623da11e7db03bdf53033ab9ea79b00ca0d33fcc0e64dd87b8722ea5be97610aea3007b451e751c3087c0349d44405343b3471e6bf6c72a37de5605908e5de5aefeeaa449a759d4e0227d503f1f346e98202b9b6197ae71711be78b64951b18c4629c1f91c10e7f18f4f8a87034ec68f38a295d5464c83f1d4a64558e7abd9cb6f649c27888fc513859fb17cc90341b4a1403e3a2cdca6627e540ba32ee84397f3764dc4a8f67441fdb35032f249032a70224aebc05d5bff03c5a4163781d136fa81cbc9fab25c18c2609578e2039303e1c63c898087885a3d179684fd728e1daea6112639de2b454e3c953d4db4c6e20307a213c9ef6e55d90bdad7c1a9604a16879cf7e5fd3cc67cd7f2a75bac8971fc03241f8c19007140a630e5edd4da2b6b2b9c89da8a7d9fae6f2ba8a28f4d2d632d034af651f1e0cc55a176ced1698a8fce42331445baf3095b5f247b21f48dd7c22e0302153fede80508f9ad33413847336a160617d67cbacd452f2807bcb5e2c54a59033133288ed6d559d82a7f2f68cdfa086c5138894e4d58fe0070242d73d208969e031f71467888afa462854d1c40e49f6f81ad28a85256a6d3ec58a97d60d70262290327a9c52f24d0bd1d5b735faf7c322e32eac9d9906aa4657bdb8e80e6f4637ec00303117d5f66c9040f7dff9e742bc1ab5a86b8f46d88e0fc43a794a2a0897e0a7b03dd77d7a3707ba04957fbfeb34b23d447212261a7c4bb8f250c3ba3bcf297730e0327f86466975873c5c29cadc05699588b004c248585542aa28a2d2cdb85ca48b103166d0292a047a2b742102af5a626b605e56b1a8a92ad222086e373f8d45576ca05581e03a43e3903f66aaefd901fb67613eaa643955317e0bb01c1a792b4c00630040105581e03a341e158089440752a302ccd30e9dfcb39f0b62a9b6a500de87183dc40040203106a972eed001c08010e86dc4053257b14ffcfd34afc7474f5c204c56f33fc7903510b686d4bb215b8da138b060ef7aca04959308b7200eae2e7d7183bdd91775305581e0309822469b484d0d834e850f6213228ba12127fe695d2fcc5c7e0969f70040305581e03a5fb559e6713f246852c3b9b24d8521e4e21007486f220197f2e181fc00c0246e1069bcda90005581e038ece7292ca4c5fbc902a74d5ff3cf4c515e0b2a8d3a824073a46c39fa0040205581e0377a4c85cd5ba94f9ddb4c65ba76da98bbd1a329f35fc18b1599dea2a100c0b47106502b615b5e605581e030baed5bca79d091f4ad010f631622b1cd06ccd3e691a2c3565e70ffb40040205581e03b17f6401573465e8dfc06e5acaaab0ac800896b72e8ed1330ce6667db00c0446940d56198a0003a7e48f0d73eaf7c47528d6ab59ffae7b4aec13c5eb888b7359f014521767c84803f4894f5d93a9fad81ddc3c915bba04e8b24b153184b4a38622d4e353288b537905581d02be5be7319110e052ef96ea1f34e3470214805f16c64ec3d744461a1b07011bffffffffffffffff05581d0359795cbe09a5b3d4cf6416da453015c5a2cd9d77646c7ed8bfe0c56004010459567e608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f4314610800578063f305839914610820578063f30dba9314610828578063f637731d146108aa576101ae565b8063c45a0155146107d1578063d0c93a7c146107d9578063d21220a7146107f8576101ae565b8063883bdbfd116100c8578063883bdbfd14610633578063a34123a71461073c578063a38807f214610776576101ae565b806370cf754a146105c65780638206a4d1146105ce57806385b66729146105f6576101ae565b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146104705780634f1eb3d8146104fc578063514ea4bf1461054d5780635339c296146105a6576101ae565b80633850c7bd1461035b5780633c8a7d8d146103b45780634614131914610456576101ae565b80631ad8b03b1161018c5780631ad8b03b146102aa578063252c09d7146102e157806332148f6714610338576101ae565b80630dfe1681146101b3578063128acb08146101d75780631a68650214610286575b600080fd5b6101bb6108d0565b604080516001600160a01b039092168252519081900360200190f35b61026d600480360360a08110156101ed57600080fd5b6001600160a01b0382358116926020810135151592604082013592606083013516919081019060a08101608082013564010000000081111561022e57600080fd5b82018360208201111561024057600080fd5b8035906020019184600183028401116401000000008311171561026257600080fd5b5090925090506108f4565b6040805192835260208301919091528051918290030190f35b61028e6114ad565b604080516001600160801b039092168252519081900360200190f35b6102b26114bc565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102fe600480360360208110156102f757600080fd5b50356114d6565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091168383015215156060830152519081900360800190f35b6103596004803603602081101561034e57600080fd5b503561ffff1661151c565b005b610363611616565b604080516001600160a01b03909816885260029690960b602088015261ffff9485168787015292841660608701529216608085015260ff90911660a0840152151560c0830152519081900360e00190f35b61026d600480360360a08110156103ca57600080fd5b6001600160a01b03823516916020810135600290810b92604083013590910b916001600160801b036060820135169181019060a08101608082013564010000000081111561041757600080fd5b82018360208201111561042957600080fd5b8035906020019184600183028401116401000000008311171561044b57600080fd5b509092509050611666565b61045e611922565b60408051918252519081900360200190f35b6103596004803603608081101561048657600080fd5b6001600160a01b0382351691602081013591604082013591908101906080810160608201356401000000008111156104bd57600080fd5b8201836020820111156104cf57600080fd5b803590602001918460018302840111640100000000831117156104f157600080fd5b509092509050611928565b6102b2600480360360a081101561051257600080fd5b506001600160a01b03813516906020810135600290810b91604081013590910b906001600160801b0360608201358116916080013516611d83565b61056a6004803603602081101561056357600080fd5b5035611f9d565b604080516001600160801b0396871681526020810195909552848101939093529084166060840152909216608082015290519081900360a00190f35b61045e600480360360208110156105bc57600080fd5b503560010b611fda565b61028e611fec565b610359600480360360408110156105e457600080fd5b5060ff81358116916020013516612010565b6102b26004803603606081101561060c57600080fd5b506001600160a01b03813516906001600160801b036020820135811691604001351661220f565b6106a36004803603602081101561064957600080fd5b81019060208101813564010000000081111561066457600080fd5b82018360208201111561067657600080fd5b8035906020019184602083028401116401000000008311171561069857600080fd5b5090925090506124dc565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156106e75781810151838201526020016106cf565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561072657818101518382015260200161070e565b5050505090500194505050505060405180910390f35b61026d6004803603606081101561075257600080fd5b508035600290810b91602081013590910b90604001356001600160801b0316612569565b6107a06004803603604081101561078c57600080fd5b508035600290810b9160200135900b6126e0565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff1682820152519081900360600190f35b6101bb6128d7565b6107e16128fb565b6040805160029290920b8252519081900360200190f35b6101bb61291f565b610808612943565b6040805162ffffff9092168252519081900360200190f35b61045e612967565b6108486004803603602081101561083e57600080fd5b503560020b61296d565b604080516001600160801b039099168952600f9790970b602089015287870195909552606087019390935260069190910b60808601526001600160a01b031660a085015263ffffffff1660c0840152151560e083015251908190036101000190f35b610359600480360360208110156108c057600080fd5b50356001600160a01b03166129db565b7f000000000000000000000000aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd81565b6000806108ff612bf0565b85610936576040805162461bcd60e51b8152602060048201526002602482015261415360f01b604482015290519081900360640190fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526109ef576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b87610a3a5780600001516001600160a01b0316866001600160a01b0316118015610a35575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610a6c565b80600001516001600160a01b0316866001600160a01b0316108015610a6c57506401000276a36001600160a01b038716115b610aa3576040805162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015290519081900360640190fd5b6000805460ff60f01b191681556040805160c08101909152808a610ad25760048460a0015160ff16901c610ae5565b60108460a0015160ff1681610ae357fe5b065b60ff1681526004546001600160801b03166020820152604001610b06612c27565b63ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c610b8257600254610b86565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b805115801590610bd55750886001600160a01b031681604001516001600160a01b031614155b15610f9f57610be261560e565b60408201516001600160a01b031681526060820151610c25906006907f000000000000000000000000000000000000000000000000000000000000003c8f612c2b565b15156040830152600290810b810b60208301819052620d89e719910b1215610c5657620d89e7196020820152610c75565b6020810151620d89e860029190910b1315610c7557620d89e860208201525b610c828160200151612d6d565b6001600160a01b031660608201526040820151610d13908d610cbc578b6001600160a01b031683606001516001600160a01b031611610cd6565b8b6001600160a01b031683606001516001600160a01b0316105b610ce4578260600151610ce6565b8b5b60c085015185517f0000000000000000000000000000000000000000000000000000000000000bb861309f565b60c085015260a084015260808301526001600160a01b031660408301528215610d7557610d498160c00151826080015101613291565b825103825260a0810151610d6b90610d6090613291565b6020840151906132a7565b6020830152610db0565b610d828160a00151613291565b825101825260c08101516080820151610daa91610d9f9101613291565b6020840151906132c3565b60208301525b835160ff1615610df6576000846000015160ff168260c0015181610dd057fe5b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610e3557610e298160c00151600160801b8460c001516001600160801b03166132d9565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610f5e57806040015115610f35578360a00151610ebf57610e9d846040015160008760200151886040015188602001518a606001516008613389909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b6000610f0b82602001518e610ed657600154610edc565b84608001515b8f610eeb578560800151610eef565b6002545b608089015160608a015160408b0151600595949392919061351c565b90508c15610f17576000035b610f258360c00151826135ef565b6001600160801b031660c0840152505b8b610f44578060200151610f4d565b60018160200151035b600290810b900b6060830152610f99565b80600001516001600160a01b031682604001516001600160a01b031614610f9957610f8c82604001516136a5565b600290810b900b60608301525b50610baf565b836020015160020b816060015160020b1461107a57600080610fed86604001518660400151886020015188602001518a606001518b6080015160086139d1909695949392919063ffffffff16565b604085015160608601516000805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b93909316929092029190911773ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116179055506110ac9050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b0316146110f25760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561114257608081015160015560a08101516001600160801b03161561113d5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b611188565b608081015160025560a08101516001600160801b0316156111885760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146111a157602081015181518b036111ae565b80600001518a0381602001515b90965094508a156112e75760008512156111f0576111f07f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28d87600003613b86565b60006111fa613cd4565b9050336001600160a01b031663fa461e3388888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561127e57600080fd5b505af1158015611292573d6000803e3d6000fd5b5050505061129e613cd4565b6112a88289613e0d565b11156112e1576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b50611411565b600086121561131e5761131e7f000000000000000000000000aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd8d88600003613b86565b6000611328613e1d565b9050336001600160a01b031663fa461e3388888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506113cc613e1d565b6113d68288613e0d565b111561140f576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516818701526001600160801b039093169183019190915260020b60808201529151908e169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679181900360a00190a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b6004546001600160801b031681565b6003546001600160801b0380821691600160801b90041682565b60088161ffff81106114e757600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff16611560576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611575612bf0565b60008054600160d81b900461ffff169061159160088385613eb5565b6000805461ffff808416600160d81b810261ffff60d81b19909316929092179092559192508316146115fe576040805161ffff80851682528316602082015281517fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a929181900390910190a15b50506000805460ff60f01b1916600160f01b17905550565b6000546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b600080548190600160f01b900460ff166116ad576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556001600160801b0385166116cd57600080fd5b60008061171b60405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b81526020016117118a6001600160801b0316613f58565b600f0b9052613f69565b9250925050819350809250600080600086111561173d5761173a613cd4565b91505b841561174e5761174b613e1d565b90505b336001600160a01b031663d348799787878b8b6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156117d057600080fd5b505af11580156117e4573d6000803e3d6000fd5b50505050600086111561183b576117f9613cd4565b6118038388613e0d565b111561183b576040805162461bcd60e51b815260206004820152600260248201526104d360f41b604482015290519081900360640190fd5b841561188b57611849613e1d565b6118538287613e0d565b111561188b576040805162461bcd60e51b81526020600482015260026024820152614d3160f01b604482015290519081900360640190fd5b8960020b8b60020b8d6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde338d8b8b60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60025481565b600054600160f01b900460ff1661196c576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611981612bf0565b6004546001600160801b0316806119c3576040805162461bcd60e51b81526020600482015260016024820152601360fa1b604482015290519081900360640190fd5b60006119f8867f0000000000000000000000000000000000000000000000000000000000000bb862ffffff16620f42406141a9565b90506000611a2f867f0000000000000000000000000000000000000000000000000000000000000bb862ffffff16620f42406141a9565b90506000611a3b613cd4565b90506000611a47613e1d565b90508815611a7a57611a7a7f000000000000000000000000aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd8b8b613b86565b8715611aab57611aab7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b8a613b86565b336001600160a01b031663e9cbafb085858a8a6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015611b2d57600080fd5b505af1158015611b41573d6000803e3d6000fd5b505050506000611b4f613cd4565b90506000611b5b613e1d565b905081611b688588613e0d565b1115611ba0576040805162461bcd60e51b8152602060048201526002602482015261046360f41b604482015290519081900360640190fd5b80611bab8487613e0d565b1115611be3576040805162461bcd60e51b8152602060048201526002602482015261463160f01b604482015290519081900360640190fd5b8382038382038115611c725760008054600160e81b9004600f16908115611c16578160ff168481611c1057fe5b04611c19565b60005b90506001600160801b03811615611c4c57600380546001600160801b038082168401166001600160801b03199091161790555b611c66818503600160801b8d6001600160801b03166132d9565b60018054909101905550505b8015611cfd5760008054600160e81b900460041c600f16908115611ca2578160ff168381611c9c57fe5b04611ca5565b60005b90506001600160801b03811615611cd757600380546001600160801b03600160801b8083048216850182160291161790555b611cf1818403600160801b8d6001600160801b03166132d9565b60028054909101905550505b8d6001600160a01b0316336001600160a01b03167fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6338f8f86866040518085815260200184815260200183815260200182815260200194505050505060405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611dca576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19168155611de460073389896141e3565b60038101549091506001600160801b0390811690861611611e055784611e14565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611e3c5783611e52565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611eb7576003810180546001600160801b031981166001600160801b03918216869003821617909155611eb7907f000000000000000000000000aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd908a908616613b86565b6001600160801b03821615611f1d576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611f1d907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2908a908516613b86565b604080516001600160a01b038a1681526001600160801b0380861660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b60066020526000908152604090205481565b7f0000000000000000000000000000000000023746e6a58dcb13d4af821b93f06281565b600054600160f01b900460ff16612054576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f9841691638da5cb5b916004808301926020929190829003018186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d60208110156120eb57600080fd5b50516001600160a01b0316331461210157600080fd5b60ff82161580612124575060048260ff16101580156121245750600a8260ff1611155b801561214e575060ff8116158061214e575060048160ff161015801561214e5750600a8160ff1611155b61215757600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c16602083015286831682820152918516606082015290519081900360800190a150506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff16612256576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f9841691638da5cb5b916004808301926020929190829003018186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d60208110156122ed57600080fd5b50516001600160a01b0316331461230357600080fd5b6003546001600160801b039081169085161161231f578361232c565b6003546001600160801b03165b6003549092506001600160801b03600160801b9091048116908416116123525782612366565b600354600160801b90046001600160801b03165b90506001600160801b038216156123e7576003546001600160801b038381169116141561239557600019909101905b600380546001600160801b031981166001600160801b039182168590038216179091556123e7907f000000000000000000000000aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd9087908516613b86565b6001600160801b0381161561246d576003546001600160801b03828116600160801b90920416141561241857600019015b600380546001600160801b03600160801b80830482168590038216029181169190911790915561246d907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29087908416613b86565b604080516001600160801b0380851682528316602082015281516001600160a01b0388169233927f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151929081900390910190a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806124e7612bf0565b61255e6124f2612c27565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b900416614247565b915091509250929050565b600080548190600160f01b900460ff166125b0576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061260990606081016125fc6001600160801b038a16613f58565b600003600f0b9052613f69565b925092509250816000039450806000039350600085118061262a5750600084115b15612669576003830180546001600160801b038082168089018216600160801b93849004831689019092169092029091176001600160801b0319161790555b604080516001600160801b0388168152602081018790528082018690529051600289810b92908b900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006126ed612bf0565b6126f785856143a1565b600285810b810b60009081526005602052604080822087840b90930b825281206003830154600681900b9367010000000000000082046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061275f57600080fd5b6003820154600681900b985067010000000000000081046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806127a457600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e810b91900b1215905061284d575093909403965090039350900390506128d0565b8a60020b816020015160020b12156128c1576000612869612c27565b602083015160408401516004546060860151939450600093849361289f936008938893879392916001600160801b031690613389565b9a9003989098039b5050949096039290920396509091030392506128d0915050565b50949093039650039350900390505b9250925092565b7f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f98481565b7f000000000000000000000000000000000000000000000000000000000000003c81565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7f0000000000000000000000000000000000000000000000000000000000000bb881565b60015481565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b9067010000000000000081046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b6000546001600160a01b031615612a1e576040805162461bcd60e51b8152602060048201526002602482015261414960f01b604482015290519081900360640190fd5b6000612a29826136a5565b9050600080612a41612a39612c27565b60089061446a565b6040805160e0810182526001600160a01b038816808252600288810b6020808501829052600085870181905261ffff898116606088018190529089166080880181905260a08801839052600160c0909801979097528154600160f01b73ffffffffffffffffffffffffffffffffffffffff19909116871762ffffff60a01b1916600160a01b62ffffff9787900b9790971696909602959095177fffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff16600160c81b9091021761ffff60d81b1916600160d81b909602959095177fff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692909217909355835191825281019190915281519395509193507f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c9592918290030190a150505050565b60008082600281900b620d89e71981612b9957fe5b05029050600083600281900b620d89e881612bb057fe5b0502905060008460020b83830360020b81612bc757fe5b0560010190508062ffffff166001600160801b03801681612be457fe5b0493505050505b919050565b306001600160a01b037f000000000000000000000000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7f1614612c2557600080fd5b565b4290565b60008060008460020b8660020b81612c3f57fe5b05905060008660020b128015612c6657508460020b8660020b81612c5f57fe5b0760020b15155b15612c7057600019015b8315612ce557600080612c82836144b6565b600182810b810b600090815260208d9052604090205460ff83169190911b80016000190190811680151597509294509092509085612cc757888360ff16860302612cda565b88612cd1826144c8565b840360ff168603025b965050505050612d63565b600080612cf4836001016144b6565b91509150600060018260ff166001901b031990506000818b60008660010b60010b8152602001908152602001600020541690508060001415955085612d4657888360ff0360ff16866001010102612d5c565b8883612d5183614568565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612d84578260020b612d8c565b8260020b6000035b9050620d89e8811115612dca576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216612dde57600160801b612df0565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612e24576ffff97272373d413259a46990580e213a0260801c5b6004821615612e43576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612e62576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612e81576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ea0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612ebf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612ede576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612efe576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612f1e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612f3e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612f5e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612f7e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612f9e576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612fbe576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612fde576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612fff576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561301f576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561303e576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561305b576b048a170391f7dc42444e8fa20260801c5b60008460020b131561307657806000198161307257fe5b0490505b64010000000081061561308a57600161308d565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906131245760006130d88989620f42400362ffffff16620f42406132d9565b9050826130f1576130ec8c8c8c6001614652565b6130fe565b6130fe8b8d8c60016146cd565b955085811061310f578a965061311e565b61311b8c8b838661478a565b96505b5061316e565b8161313b576131368b8b8b60006146cd565b613148565b6131488a8c8b6000614652565b935083886000031061315c5789955061316e565b61316b8b8a8a600003856147d6565b95505b6001600160a01b038a81169087161482156131d15780801561318d5750815b6131a35761319e878d8c60016146cd565b6131a5565b855b95508080156131b2575081155b6131c8576131c3878d8c6000614652565b6131ca565b845b945061321b565b8080156131db5750815b6131f1576131ec8c888c6001614652565b6131f3565b855b9550808015613200575081155b613216576132118c888c60006146cd565b613218565b845b94505b8115801561322b57508860000385115b15613237578860000394505b81801561325657508a6001600160a01b0316876001600160a01b031614155b15613265578589039350613282565b61327f868962ffffff168a620f42400362ffffff166141a9565b93505b50505095509550955095915050565b6000600160ff1b82106132a357600080fd5b5090565b808203828113156000831215146132bd57600080fd5b92915050565b818101828112156000831215146132bd57600080fd5b600080806000198587098686029250828110908390030390508061330f576000841161330457600080fd5b508290049050613382565b80841161331b57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716613430576000898661ffff1661ffff81106133aa57fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461341c57613419818a8988614822565b90505b806020015181604001519250925050613510565b8688036000806134458c8c858c8c8c8c6148d2565b91509150816000015163ffffffff168363ffffffff161415613477578160200151826040015194509450505050613510565b805163ffffffff8481169116141561349f578060200151816040015194509450505050613510565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b816134cd57fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b031602816134ff57fe5b048560400151019650965050505050505b97509795505050505050565b600295860b860b60009081526020979097526040909620600181018054909503909455938301805490920390915560038201805463ffffffff600160d81b6001600160a01b036701000000000000008085048216909603169094027fffffffffff0000000000000000000000000000000000000000ffffffffffffff90921691909117600681810b90960390950b66ffffffffffffff1666ffffffffffffff199095169490941782810485169095039093160263ffffffff60d81b1990931692909217905554600160801b9004600f0b90565b60008082600f0b121561365457826001600160801b03168260000384039150816001600160801b03161061364f576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6132bd565b826001600160801b03168284019150816001600160801b031610156132bd576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b038316108015906136e1575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b613716576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106137b757607f810383901c91506137c1565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146139c257886001600160a01b03166139a682612d6d565b6001600160a01b031611156139bb57816139bd565b805b6139c4565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106139e757fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff161515606083015290925089161415613a575788859250925050613510565b8461ffff168461ffff16118015613a7857506001850361ffff168961ffff16145b15613a8557839150613a89565b8491505b8161ffff168960010161ffff1681613a9d57fe5b069250613aac81898989614822565b8a8461ffff1661ffff8110613abd57fe5b825191018054602084015160408501516060909501511515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16640100000000026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613c025780518252601f199092019160209182019101613be3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c64576040519150601f19603f3d011682016040523d82523d6000602084013e613c69565b606091505b5091509150818015613c97575080511580613c975750808060200190516020811015613c9457600080fd5b50515b613ccd576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b5050505050565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd1693919290918291908083835b60208310613d6d5780518252601f199092019160209182019101613d4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613dcd576040519150601f19603f3d011682016040523d82523d6000602084013e613dd2565b606091505b5091509150818015613de657506020815110155b613def57600080fd5b808060200190516020811015613e0457600080fd5b50519250505090565b808201828110156132bd57600080fd5b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216939192909182919080838360208310613d6d5780518252601f199092019160209182019101613d4e565b6000808361ffff1611613ef3576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b8261ffff168261ffff1611613f09575081613382565b825b8261ffff168161ffff161015613f4f576001858261ffff1661ffff8110613f2e57fe5b01805463ffffffff191663ffffffff92909216919091179055600101613f0b565b50909392505050565b80600f81900b8114612beb57600080fd5b6000806000613f76612bf0565b613f88846020015185604001516143a1565b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c08501528851908901519489015192890151939461402c9491939092909190614acf565b93508460600151600f0b6000146141a157846020015160020b816020015160020b12156140815761407a6140638660200151612d6d565b6140708760400151612d6d565b8760600151614c84565b92506141a1565b846040015160020b816020015160020b12156141775760045460408201516001600160801b03909116906140d3906140b7612c27565b60208501516060860151608087015160089493929187916139d1565b6000805461ffff60c81b1916600160c81b61ffff938416021761ffff60b81b1916600160b81b939092169290920217905581516040870151614123919061411990612d6d565b8860600151614c84565b93506141416141358760200151612d6d565b83516060890151614cc8565b92506141518187606001516135ef565b600480546001600160801b0319166001600160801b0392909216919091179055506141a1565b61419e6141878660200151612d6d565b6141948760400151612d6d565b8760600151614cc8565b91505b509193909250565b60006141b68484846132d9565b9050600082806141c257fe5b84860911156133825760001981106141d957600080fd5b6001019392505050565b6040805160609490941b6bffffffffffffffffffffffff1916602080860191909152600293840b60e890811b60348701529290930b90911b60378401528051808403601a018152603a90930181528251928201929092206000908152929052902090565b60608060008361ffff1611614287576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b865167ffffffffffffffff8111801561429f57600080fd5b506040519080825280602002602001820160405280156142c9578160200160208202803683370190505b509150865167ffffffffffffffff811180156142e457600080fd5b5060405190808252806020026020018201604052801561430e578160200160208202803683370190505b50905060005b87518110156143945761433f8a8a8a848151811061432e57fe5b60200260200101518a8a8a8a613389565b84838151811061434b57fe5b6020026020010184848151811061435e57fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050614314565b5097509795505050505050565b8060020b8260020b126143e1576040805162461bcd60e51b8152602060048201526003602482015262544c5560e81b604482015290519081900360640190fd5b620d89e719600283900b1215614424576040805162461bcd60e51b8152602060048201526003602482015262544c4d60e81b604482015290519081900360640190fd5b620d89e8600282900b1315614466576040805162461bcd60e51b815260206004820152600360248201526254554d60e81b604482015290519081900360640190fd5b5050565b6040805160808101825263ffffffff9283168082526000602083018190529282019290925260016060909101819052835463ffffffff1916909117909116600160f81b17909155908190565b60020b600881901d9161010090910790565b60008082116144d657600080fd5b600160801b82106144e957608091821c91015b68010000000000000000821061450157604091821c91015b640100000000821061451557602091821c91015b62010000821061452757601091821c91015b610100821061453857600891821c91015b6010821061454857600491821c91015b6004821061455857600291821c91015b60028210612beb57600101919050565b600080821161457657600080fd5b5060ff6001600160801b0382161561459157607f1901614599565b608082901c91505b67ffffffffffffffff8216156145b257603f19016145ba565b604082901c91505b63ffffffff8216156145cf57601f19016145d7565b602082901c91505b61ffff8216156145ea57600f19016145f2565b601082901c91505b60ff821615614604576007190161460c565b600882901c91505b600f82161561461e5760031901614626565b600482901c91505b60038216156146385760011901614640565b600282901c91505b6001821615612beb5760001901919050565b6000836001600160a01b0316856001600160a01b03161115614672579293925b8161469f5761469a836001600160801b03168686036001600160a01b0316600160601b6132d9565b6146c2565b6146c2836001600160801b03168686036001600160a01b0316600160601b6141a9565b90505b949350505050565b6000836001600160a01b0316856001600160a01b031611156146ed579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b03868603811690871661472957600080fd5b8361475957866001600160a01b031661474c8383896001600160a01b03166132d9565b8161475357fe5b0461477f565b61477f6147708383896001600160a01b03166141a9565b886001600160a01b0316614cf7565b979650505050505050565b600080856001600160a01b0316116147a157600080fd5b6000846001600160801b0316116147b757600080fd5b816147c95761469a8585856001614d02565b6146c28585856001614de3565b600080856001600160a01b0316116147ed57600080fd5b6000846001600160801b03161161480357600080fd5b816148155761469a8585856000614de3565b6146c28585856000614d02565b61482a61564a565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b03161161487e576001614880565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b16816148ab57fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b6148da61564a565b6148e261564a565b888561ffff1661ffff81106148f357fe5b60408051608081018252919092015463ffffffff81168083526401000000008204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061495890899089614ed8565b15614990578663ffffffff16826000015163ffffffff16141561497a57613510565b8161498783898988614822565b91509150613510565b888361ffff168660010161ffff16816149a557fe5b0661ffff1661ffff81106149b557fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909250614a6c57604080516080810182528a5463ffffffff811682526401000000008104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b614a7b88836000015189614ed8565b614ab2576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b614abf8989898887614f9b565b9150915097509795505050505050565b6000614ade60078787876141e3565b60015460025491925090600080600f87900b15614c24576000614aff612c27565b6000805460045492935090918291614b499160089186918591600160a01b810460020b9161ffff600160b81b83048116926001600160801b0390921691600160c81b900416613389565b9092509050614b8360058d8b8d8b8b87898b60007f0000000000000000000000000000000000023746e6a58dcb13d4af821b93f06261513b565b9450614bba60058c8b8d8b8b87898b60017f0000000000000000000000000000000000023746e6a58dcb13d4af821b93f06261513b565b93508415614bee57614bee60068d7f000000000000000000000000000000000000000000000000000000000000003c615325565b8315614c2057614c2060068c7f000000000000000000000000000000000000000000000000000000000000003c615325565b5050505b600080614c3660058c8c8b8a8a61538b565b9092509050614c47878a8484615437565b600089600f0b1215614c75578315614c6457614c6460058c6155cc565b8215614c7557614c7560058b6155cc565b50505050505095945050505050565b60008082600f0b12614caa57614ca5614ca085858560016146cd565b613291565b6146c5565b614cbd614ca085858560000360006146cd565b600003949350505050565b60008082600f0b12614ce457614ca5614ca08585856001614652565b614cbd614ca08585856000036000614652565b808204910615150190565b60008115614d755760006001600160a01b03841115614d3857614d3384600160601b876001600160801b03166132d9565b614d50565b6001600160801b038516606085901b81614d4e57fe5b045b9050614d6d614d686001600160a01b03881683613e0d565b6155f8565b9150506146c5565b60006001600160a01b03841115614da357614d9e84600160601b876001600160801b03166141a9565b614dba565b614dba606085901b6001600160801b038716614cf7565b905080866001600160a01b031611614dd157600080fd5b6001600160a01b0386160390506146c5565b600082614df15750836146c5565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614e91576001600160a01b03861684810290858281614e3157fe5b041415614e6257818101828110614e6057614e5683896001600160a01b0316836141a9565b93505050506146c5565b505b614e8882614e83878a6001600160a01b03168681614e7c57fe5b0490613e0d565b614cf7565b925050506146c5565b6001600160a01b03861684810290858281614ea857fe5b04148015614eb557508082115b614ebe57600080fd5b808203614e56614d68846001600160a01b038b16846141a9565b60008363ffffffff168363ffffffff1611158015614f0257508363ffffffff168263ffffffff1611155b15614f1e578163ffffffff168363ffffffff1611159050613382565b60008463ffffffff168463ffffffff1611614f46578363ffffffff1664010000000001614f4e565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614f7f578363ffffffff1664010000000001614f87565b8363ffffffff165b64ffffffffff169091111595945050505050565b614fa361564a565b614fab61564a565b60008361ffff168560010161ffff1681614fc157fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff87168281614fee57fe5b0661ffff8110614ffa57fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061506557806001019250614fd9565b898661ffff16826001018161507657fe5b0661ffff811061508257fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906150ed908b908b614ed8565b905080801561510657506151068a8a8760000151614ed8565b15615111575061512e565b8061512157600182039250615128565b8160010193505b50614fd9565b5050509550959350505050565b60028a810b900b600090815260208c90526040812080546001600160801b031682615166828d6135ef565b9050846001600160801b0316816001600160801b031611156151b4576040805162461bcd60e51b81526020600482015260026024820152614c4f60f01b604482015290519081900360640190fd5b6001600160801b03828116159082161581141594501561528a578c60020b8e60020b1361525a57600183018b9055600283018a90556003830180547fffffffffff0000000000000000000000000000000000000000ffffffffffffff166701000000000000006001600160a01b038c16021766ffffffffffffff191666ffffffffffffff60068b900b161763ffffffff60d81b1916600160d81b63ffffffff8a16021790555b6003830180547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b1790555b82546001600160801b0319166001600160801b038216178355856152d35782546152ce906152c990600160801b9004600f90810b810b908f900b6132c3565b613f58565b6152f4565b82546152f4906152c990600160801b9004600f90810b810b908f900b6132a7565b8354600f9190910b6001600160801b03908116600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b8161533457fe5b0760020b1561534257600080fd5b60008061535d8360020b8560020b8161535757fe5b056144b6565b600191820b820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b80820b60009081526020899052604080822088850b850b83529082209193849391929184918291908a900b126153d1575050600182015460028301546153e4565b8360010154880391508360020154870390505b6000808b60020b8b60020b121561540657505060018301546002840154615419565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b6154d65781516001600160801b03166154ce576040805162461bcd60e51b815260206004820152600260248201526104e560f41b604482015290519081900360640190fd5b5080516154e5565b81516154e290866135ef565b90505b60006155098360200151860384600001516001600160801b0316600160801b6132d9565b9050600061552f8460400151860385600001516001600160801b0316600160801b6132d9565b905086600f0b6000146155565787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b03821615158061558457506000816001600160801b0316115b156155c2576003880180546001600160801b031981166001600160801b039182168501821617808216600160801b9182900483168501909216021790555b5050505050505050565b600290810b810b6000908152602092909252604082208281556001810183905590810182905560030155565b806001600160a01b0381168114612beb57600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040805160808101825260008082526020820181905291810182905260608101919091529056fea164736f6c6343000706000a03b77131c1b9aee7534978db824b772cc3256a400cf8d6166a19d8a58b360c0ba003a1f78d9693bcd5a58c2feefa8b6865ebcfd841e62fb82e526e188ab7882ce4190366a309a96c0dcda4eecc20e8cdafebc753c57a5133104c8cb0638f0c19063a880355d40929974909af7204e0854244aa122333f0d83462287a6328c4df3dd513c103c5ecc63d6b5b23a69e5a2d1cc54f7858681e7659e77be3b12e5d682468aec2e803f34c132a8d62712860aaa9dd7726231931ead6b0ec8feca80502a9bc71bb518e035e7c06830da5d61486d75fb45aef711f2314109257409684641035f66b4b67d7035f364edd41fd03d6d5559fe2734b2a0605628c80aa43078f2d64b4040ef6d56803d8d159b23abefbaa99d9b6c0ee3df9f8cfc34d0e5ad8f452bc4df6411ec2d04203eddd52d56b49348455db9b1d2bc13c3b9b6270bcbf20f5b76de854b94a6459bd0396b1960dd27e222527e4cb064eb8449a70a219dbaad098c06c4914f579f4831900582003decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630581f010000960096001cff4604000000000000000017aec52119ccd7cc88860f2603eb8bea9692a47fb99a8010b171af4618327466493ea64bdad070c36389e2a352014101005820034e426c4bedf21aa91acbc91530bfe652db9ebcab8cf58a5e826a05f75b61305820ffffffffffffffffffffffffffffffffffc2d6ed506d354d2a49a2f317cee393037f0acc77793cb6606c3aa841e62b2d7d400f12ae729395d21fa313a70b16dd710058200310d70cb8916de18e97192e4bc74ed0fd05842fb98dbd70d1b4a091684594c050385c4b772fc5848f05ab69adfa9172e8005820033dcad244d5755f1d2b08d84747e15a5e72a22f6c5405fba4cb4fe9e226ec004fa36f1822be7bf3e78d1871b94d4b140058200328644b4979a1fd54d6000361880e49ebfa78c8a19050b8a4fecca4b21068604fae1387dff059c22e476e6e406d166400582003ea50641ec7821f7a4e0615a834a425087d66b3b27e8304826904d6cc8e8fa05066ca06fd1b9e60d9d76686b334bbab0700582003ff92a342df489dd95855c374221e2582967b984deaafe340c4c23fd0d2bb504f1576e0ba37d5e368068c08f619293f02195b3503ad1aa595d32fba83caf31a4907aa9e79bb5f1b66df1108b19cad16f7aeed1708038b5f70a3a91f73a3d819bf5f0e0b7304d43c349ddd443e09951d3b22bb425ab10355252b34159a667de1da04e7a39f3caf68e03306710f4193113bb73b36f4b70d035124f83a6f3133ccb9ade52132236aa5f50ffcd179277b65176100c08046098e034a90d45640de6511ed3a39d1f6d60b8d2a500f9c9bee5ac0fb439a93cf30421c03e8b92938b9979f7657b399adb3d3340e6239af360b346cb67dd2b69d110f68a20219ffff03c25585b5075f18f1e87f9d934f7df1b6acee449e8daff4c8f1ed50378b65d369039c0edf77a4f67500d94efe580b3c0bd8ff2a8060b1a000563675366414b20feb00582003968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0582001000000000000000000016fd193522bd9fd77edbffffc8811714c3765c3b7b703eb9bef866e0b242f641e8235df09d54029a7dccd085be029ebe412f466557f0500582003c121d27737c7e04e89b1c35a201228afbc590edb2b7cc7c37b1cccd911e4a05820fffffffffffffffffffffffffffffffff5e53f39e2a0a8c19db565df1f277e7a00581f0214e07e238b869c8de897078a136a012c4cfc1865f9bb2fb068d563e723b75004bae6218a382c25d79ee59665b5433b00581f0287fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5007b776b6f7f89a9b01153e6edf9f705b00581f021ba098010bf28167e34294f0d4f5362a5ad91a479b25b0e4a29c29d913724f0b01b6bdfb95c34ae42942f98c6362021902a00058200372231f0df6d604b39b3c9e0b21f04f81d032a267d8ab634f1f11407211f8c0500e15ac082551fd581c8d4ba52739699900582003018d72b691f50a1d0388afe78d55c356d4eda980fedb81e990019a266969204f207d27080ad32f53c39787886ee954005820033f34d991ba4cc16296e0e23edc9f782e961faf5c50b7abbf97dadcc9e8bde050055a477131398231df1a40476e43ff680058200386fbcd7aa48bb25b13db7fc2c791a8bce6c3c61d08b05158c6f6af3cec9270582001000e89fe00000000000000000000010e7ef369415fe992eefffffaa9da42120058200326da45bb052096e7110481c3729a44362fcde2c35f8bf9197e13b79615771051010000000000000000000000000000000000582003a7b91630585f599ae9f4c43b7dceaa11a82e83e07ca04a9993f9061f2329c0500c72de35d21081f9d8f783ab4010c951038d26cdf0783d7dd5ae5510f6718c8e2d1e969d776a612e420f1f52911e5931cc021997f703fcacafd197a9813e8d1eda7f19c05bcf2124c474f23943c597b6e9655fbc91b803c77b5a7e14566ae2886fba2f0748ee2e9e6564d584b15264b8ec5038e2cbd8fb0301fc456aa244080b2967e61fae40ce7a93d78ccc6dc6f594c91287ffc9b8698a03912ede85665af05f8d00f694b97d0ce4128b2328710ccf276e8781be836857150343ec712582b76168cee9a4fb0222b5ddc89fd311d08a3d2c7d64e4651a166f1c035470a6bc2e3ea047739dd2f52333b6369f1957354b9c0415c980a78957c24bd4039a97b39d25426509a820615931d6947b8b5165fcd7d37a01114074d52fcdfdc403ec332af67c7442a29bf444450221b07a0274550580a6b65c4523b74fcfc4a7590351087bb1af26310c3a04979b58bd128d4b63f71d92200eb9b9381a3e72dfd48103494b5e06e26dd91d8401df94d2afbdd9e6cd6e2b7f7af6ba088b7ce0f7b577ef03778149debd725a1a38d065c900070d24635a695d3d297e2e4c84a76308630fd6035184035a15e4e3d73282f850618df84ecb05f5e46b490691a314ea8f3436f427030017e6fc16f5e96004b5ca6b6110258b81090991f3d9705f7dc28c484e9fc7ee03a5a4a351624154bd6caa487570cfd25c8e8778a12e944290748fb28fbf280666036ad37e6bd9f69adf26986c532c9058c76d23c6de34e52f13f395512bdd503ce30219ffff0319bebc0d5b9b3e2c426e12f2a9f713208ba322f9864aa2b1b5a944368dce26df03395723bc577c79b2b53b32b19ff3776faec8f0df59ae3b23ae540646f2d32d5d035228cf4114183b998c8c33bffe16de282b577d944e1d309a056e481ac650394503c7b18898724891b2ba2541b13ea2eab5ecf5a4bfa0f7c020fccac95a9f2eefdc03dae8404b93fe261341cf3c3fef6f00d0c1b99cd42d9fc181c9519ef17f09abab03928c2c7eaed2d45972bbb9183db6a6326c92657bc7ce0d31f953968dbba6713503cddff768c20048446a862f463188ef7d25cab55a4648664edaf847a1bb3ab006030d8685d32ff5fafce8532465bb27d075ebb1b5edfd4a1a50c5b533f8287509cd03dc443848fa04fbf4b9e64bdbe30ec15d818bdf4edc25ff8b7f266e8af17d5bab0307fdd008a4cf94c97b558504b2c7851945ab2fc18fe842140bb3255bc1722e7d03c0a1ab5b5f4e29a6c7159dce173684492672f1c42b62c48e154b54c281a0e866005820034d838ae5a65c8684413e5b1fcdad8ad7c086453dfdc5b5a0d562914945d9704f3cb0cfea6a5225f3d651767aac185b0368706b4b36e124522853198276c703644a5b6d3ff373848992bcd821e8cc5ef80058200305c4dff12a2714b8b53f012978be28b6502cb9cf75debc3c5d698f88d1ab905006b611cf3200b3b76acefbc1dac1b9c200582003bd3c01070c86ec2f69d5dfa20e0eb72498e15246f6406724d60f2bc474ea40503df4362df57ebaf686420ab7a547d5f400581f0280cb52633fcf143703e205ff58e289adc650372f4feb3c2394fb63a8d0145820010000000400000000002884010015000001882020000000204000000000000000581f024e74037d718043e4ee5e4948658f38671f033648d671e4c2451864da8a2d4f0bfbb1ec225804fa6ab43cec0d261b00581f02d7d41f680d5328f2591f00795632a7a766e55ff0e428199037bf0b3cd2e44f4e73c958dde80f1550924838bd128c0219042100582003c22f5d19620fce14649126c5a51907c5f8e9a6b57af75a9c331c808f0b140050039754149606326c4f79a30a795d9c7000582003d649816771542bf1f465abe97c8a9e73195a7d97dbe5df4da6eaa593600e105820ffffffffffffffffffffffffffffffffd8664657acdc1dbba5cfc5f2ade037af00582003d8ef97b7aa7e801aed1c178428c53eacb13aa0b41f6f2c8fde03fd966ee7f05820fffffffffffffffffffffffffffffffffab46c98418671b9176361d098bfa7d8005820032b9c192a4ea260a57815d3b69ba50415ab39f2a8704e6d4f689e680f559a405002969a47ffb335a5988c5f5fd7a5043903fd1e7351b9464944ccc17b65807e4009cc5e8789b731486300f903a97fb4ec6100582003b3171b18daf9ce9a31212ed4faf6f734a32d2828ac1c1afec2367f320c7be04fb630fbdfa69d21b66265954f6c0ddb0373673a9f3790f26b8091ef58c4595c7c38d4eb47eb95bf2f4aeeaf8e76ebd82602199fbd0383deb6d3a9f6f3e4d31373a9d6eb5c93872baf5e792e06bd20776d4a870037a60390121b97179f77ff96846a265459df220ecd717aa39a0a72c12b703ba8460f600340fd9d1d88d3b863d2825a7da190b82c1836c507f28b2e21d7deef9cdd060c1d036fb25ca541ff6c5a282c887fac9565b0125587257e53e3515795ba45e98ce59b0219ffff03ee1e1aa658fb8c60920df74ddce91dd1d0f8a6f3ab18c60980eefeb806433f1403b90db81803bb6373cc3b3d68e54a7949f17f02262d8e4e3faea8f45cddc404e8034d1271ea4abdc2e3dc878a5fb289ea2dae6f987cb311c2f49fa5256e588f596b038bb11596e850820838d84661005b7827ed47407593996c855e59ac4c21e6631503e49796c1f22ce92cd663cd8ccee356b7520e733a4623d099594b5f2e123dd8cd0380b692f11f202873250cfe5a415c52491ef77ee89a038120b1579409baa6dc0303fefef13c3796cff6dd46c26e9d1df070508f77a45ab261f508c3e983f9e2b045032e5c79ae34200497f4f0d8d8c458ed7f8a6d2f13d8c9d3b2160604134ac64586032191502e0303bfdf725603f434780e13f50a8981811a6cf86bda7babccd83624033a9f78d7ae4ce0b01493b7be5502918e69780c33cee283758daa371cbbad51190390cac81febaa40d8eec9c1cf00c6ebcbc0d0f4ef7710fea16b48f2877ea62058033f5c39ebe2fe74689645198d3a14c67c85a3aa53059b8191ce69e5adac1163c903276619a42502df20063e1ed86b402dc3e7e7c4e2d5f7e19a7ad1c6ece812306903aeb5125574ee3697243cd18132ac4cdb41d8016326709b33b5e693b614c9264500582003d9919653a601927c0af950d3a9cc227ab7ce19b0c5eac3ab77a84e20bd6f404fc570331596ad6cd707c29f4f8cdb0a00582003525a322cbe10b91c29bb870cd3c38e9f33d4a35d237d8695052d912f383140500251e25eb209c2294b206712f95c182a0338cf2caa64e9da7d2050ab4565346afadc69cf1a7519cf4991d83c3c733ff0a403bd69f78e580eab7da9e0d19abf6f25c25dd615f79e2bf55424256a2afe1f0853036efd46199bdaa43f827731d07165fb78c71a18e66d987e29e501bf978a353c08005820039480327b2cfe2326890bdd1d5854b4ac8eac5f88839e3a1ecfd61b8aeddd505002874069c9522c7fc0b26949db10a7a003e6f6ed277165db0683a3a625a3ca4a13dd2e45aaefb42bfe58422a9c730750df0058200318f60fb8648676c7adce56102ade3b25254bafa7641b6d45d6589fce8775304f010de13fff819b46596b99d9870df100581f0232d19b93bcabe3cce7ca0c18a052f57e5fd03b4758a09f30f5ddc4b22ec458200100000000000000000001739cf8c3361479d55f6efffc7f6fb6bce365cf606300581f02c42644cfe9df7db4f9f66ddc2a14e7afc71e2d49fb7d80dbdc1a480c61044f34f95ae32c061bb8177277bfd2b9d102190808036b519555bba3fc0346356b40268693403f6f53944d579bc8f42575000096f72602197e3b03aec9b08e2aa7c86ce83f4777a5f7702f79275fcb66dfd7dc119408136ef6308e0354fb36f6aec3c0e8edbbae05d09c1025ce5599bf7bb01982279afd041894b46f038e655744c5dba5193b4586b0df1ea37e397c130e16dc65fc1a94a87d32248ac20219ffff037c753178831286f4d1f2593639a7fe69531e9a80e938ca79f82238fbb20d56a803182a3b78787fa55b9628f7b5176117b2c0b4b92e7d0a63433f03eb7e7e69b9c103e521db573cd3ca1599e6cface24543bd7b7584a64f8316a7928223b7d6e7c094038afe0b7700a605689217bb16fa87a3ff388dd51ea160a09820e6d2debac7e92d0313be0609f8fc79cbafb51b06a816b9c3b300fe618b596173b75fc615072c497d039cb07a2241f4bb6d07a6931f5bf40098244745c64398895646a70368867a099503499338faa9e931ab9765d8016f8b405f3477bae41384a3209ce50125762bae5b03fc52c593288a96831372f05e4114546473e32e31027bf249a5ecae7699b75e02039f2811e1bcb29e7511b7e8d4d24d406929bdb03523a3fa6b8f7314f9796efc6c0346732f61e74707118439bc7be73dc1ced99c53a58eb75cf8b63182db902e442100582003671d854f4c0db92567dfdd3882cfe9e64096da1233a9bb2153f97d6ab4dd2058200100ddab56000000000000000000000a8ee562be632ec9dc7cffff97b6b53e31031923b8e47eab25d58b34001d5fe3c89eeb1b909a1203f269ed600b55e798eadc00581f02acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b4a030c7ac73fb9897ea01c00581f024c7e7c7be117d923e8ed2b7cbdb713c5c901f8ee5fafddf53235ad0437984f1d44327f21439be68f32aa9a5469c602190220039eabc2ced54e36fcb1f8e2af2b39f99cf637fd15f22a9033a5d9aaa3ee3a3d5e034f47c70305bbbb734b299ec4f3cbc1dc86606fb031fd67cbff3bc686a56db0c303e3cfe8372f479600e1fd1087198873e95527013fc200d0c32e10a6991deb5a69005820032aac4e4f7bc7734b3fe13f32f940c277e8e780d309d9804e886bba4177ae804f05c4b1b82b1468c6d6558da7f557ff03392791e65ec0483f92d8603a74fe43e5d52569f836c69936669fcc6d0123d8c703e2458d45580d37fb7413cd56300a81cb2fdbe2fe04c2fee99e62dcd13a81975d00582003d8026adb3f0b39943de67e2c6bb15e0cc26ab29f561fed47880f49cd598fd05001d75f01db845d9db3c33436f33e900f02194dee034dfbc9509900386e63d6c6f176359f3ed5ec69d9fad0d62fecea5649231f97980305ceebb04b366fe035cc8cfd435e83e2e1d50b3d83002aed3370e7dfb92a24ce03758f89d5afe001d5d4ef7925b24eb5c313e8c0e8f669659d154de3d80b662fd80377896d90e9f9ef4038447d103a052ac9f32bfb11f3879903cbe6830f850d4041033bb0e0a874eb2d2884d5eb8e368891662c4780a74039782b132b60bbc2eaec020219ffff037e31ff49fab1ada0a32b272f5bc2551a11c695cfdc847ff91c7a4640c3d39b4a03449d5341ee0eaa9ee13c297201bf0f0cd299b365815d34f64627e5947475f43103b1f9459cbda042214df27cb10a8d3bce17e36003c241193d238255187f3b830700581f024851edd98ba87f6101f2a143ba0c574549a6ecca34c76f11ead81e9397934f0c27ac9081a151b5a07341de80640800581f022d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf651021684e65c4d65b79c4d9b4fe20729441502194002036d05515213ede2ba7619a8e8e6e130e51d6d553cc3b37c620bfca77282d5d3c90367ac5ca191b7bdd4ba327abba362a68ba3269ef2af82170ceb387439149804cc00582003c536c28952452ba13d1c82058ae0d67c57fd1ae363daad093f22bc9dbe79e04f0a5470f8ce8ef6a739f6f6082523360058200327377986441823f2b71d2638e5ca5e21acfc94660b4ed39268f6d8f040cac04f6e7b1fe8167c11ee1974227850b5f500582003d6a7a196273dda54d4c0e7efd6bc2e563ea621b33e1bf588a815ae0c1beb505052b4dfba30d13116f0433118b6a5a85200582003ff6432fd55ab276aff0be3da5f0ffcd7e143c7e617f6b64eb480d1bc3409505820ffffffffffffffffffffffffffffffffffa06752c0efcd039e7413a4af12f1d0005820036152da20f01019b3d3532e27e24c30a821e69673631e7fcb0d5dd5237b78605013b46fa3b1670d901945f70bc0d60b8a03d22391a202369c77d66a9444b3fea4bdb3c21e8c4292cba5c20696f768e0681f0219637903eef4041b52956da595a856926c92e3d1d4fdf0bb45e170d40a7ba69eb0eb278b03a6b189c01e0ce4c084ed2b6623361caefbd1b67a52b1f6c0e0c49b8c6c06a23903b28183b6b8c9ac5601f416adc15f9dd94e686a41cd999f025578ed0f3014a38d032f7182ee4164d21259a0ed940f9f35b679acb6a6f55282b4b8c0cb2d4c31c3e00348838e39094baa5ae8c27a429b85c04db85982d324e2c3d644fce5d36bb1aae903a63b6c605e2952ea57f6412c6260e5112ee35e1dd5947dcd1fe9c43665124a6903867e39aaabf277ec8b4ea431a869062b228957c44f6c567733df42eabed40e91035de3aa47b08b8f3534df752000887d3347b8be24b0b36ad5c2ec330a7c2c4ed003d97692ae1e96ca372e054bf68bdaa6966b132408e90392371359962f5618954f03d4db7944569f34c4cbf452fa878d4d01d8d720ff3c4fd4fedd9594a3fd37bb29038390662f3e84ee774002a1eef784e01ad642dd453bc3eec188db6ed62ca70c790398da0cdd619255b18adc865b07a06510259f984ac869564cfa44da8028d546d603604db99953f01e36304aba22a39a6b57fdb9726bb238299fb6b0405c2e1eb9ef03566d643ec3a7d350b939afea90472e58adb93df7ca069d32c14e76d32477170f0219ffff0361109cd54f42521b78efe2d81d8971e2dd8861bc4ce70dd048106d8e6cf983f103cb44824f74f8e510fdf95e9758bd80e1b8126b9fa42ce8703efb8afbf1502cef03808f73c01285ef69807c568736f36458d0f50a4799c78f206f9624c25039719103bb5a02fa828f3cef05dbfb57f584e61028825e561f422e2192ec7df8867a20650219ffff05581d0383bc100b4e63e815deeba81810d9d6921d7ad3f4b987440c84ea6660070119567e021918000219401005581e033ac23442117a03e1a39f9fa7d9d5c798bd9634e3778a89443707e7ef000c0147018ba3a825fe580219ff4d03f7441febbb24a092f21df38d55f898f166ef669af077a8a30d29e41e890e4ec8033a7c16e9870a8b58f653300df6ba113c6d9819bc8c3c749513ff4eff8e5f24ab03f4fda840d40699253dd6595de7edd1244996a322226a076b88d4e7963d1473da035e07f4f5c5bc05db698e4f74e56281bac26b92f3fd6708505b8158616f71beb2036c9c2bb1e6ff641f627d39b37f22f340f7888dbcdea68b328f56e8ba588cdf1603a8fb00dc8b59d862a48e3271d4533c255135f2b85acbf2abc6708a2011238dea03b7cc0c36b8ee2ef58a01be43d30a241bbed070d98775bf6fe2f41ba40e5584b5030bada4de2f8b01f6dd5c0f86d3e2e4965b7b29ab5deaeaa9af4bec389ff94de40219ffff036e9eb91d179e60045aa68914edceb269f2104453ef74a1b619d73a87c2074e2703d5fa2080925b5e5e8d768ce332f293daf6409a8be483814241c111dd3c6527ba03cc9623a767deb166b946677b8d0e3656362fdedb3c48cbbe4b85a4fa0eec1e3d03ea62e05a68f5e9241fd14c92963a8ae6575ca2e8578c9b13ef6126de189e7130031265699ec46ea7aaaf69519a69791b33b6907c6c056260380950f3f8d2dcead80332796f9b5d19898ca5b0d186b2be7f23b2134d39016fcc811dc792f59980837803a5e47a0573a20acdd6bbb5d9f7f8d457a23f97e314c05f83bd75e6bda9082dbd0219ffff03d5603430dcb98671ee6a5c952978d436185d507267fad3129a195b2880ac6eab032185ec2cf26df33583528167aa03262a4bf9276f9154f2b4bcc86c713676281b03fd9884e5307ce88805443a1a19216cfe7c1ba35cd8ed1ea858493835b6ea03b503298ff43a362ac7c3e6259a06fcc6e1d0edfe5777403700e81ea26650b6c39a4d033b77fff2e9760b24dd7942ad28ffdadbe0222fa2884145e2bf3068bbac9832be03d2ee942623090127a96b2b4418a3b09632ed7fdf6ec3a6e2883521b9cd9fdb8403d13735207cdbae96489c46d0597996ca47f9000aeb5d8bad466f58bca31cffb503c4228e4a97cf576f70f37830672a52a96dc91087fed7623a16d94d185eff766b039628dc0ae1456f27a1d48a62032c954c8892af74aa0982f11b610282f7fb602103a0686cb98613212aac4955e90e79c7b7be8536787805fc9553accd0854cf3d5d03fe432b8d32820e7fae2a30ee7a1b75d54ae56a8f4da9017f322523fa3cd32d390385cdd8f515f3cd335999666ce749f8d808101186ceb8c50e52be482a3267d88f03b153752f28768a3d5388b48f11d3178b770064972e92516a7c2784a7747cfae40307049d11f19341a255b49a97c187d975f86aedf58d7ead6092dccf99ce178c1b0219ffff03e0bff19788647acd2a6040cbb54dbaf819744a70d75fa5adc18b15c49ab0b11c03d0ce3ead798d76bf6d40f1dc622b08619ff804155429504a67ca6a3aa9179905037551db937751d6d3ed912b32fb9e08c225dca562ae657cbb88ad0791523b86860341d634029bdfa0a035280bd866b0c8b27f687f489535b78f6709efa537efbbee037bd49328385d47b1fa72bde391303e620c6fd218dc52af67ed485c7d1616d068032db019fcda6b36f61c15e04eecdae1772d0c3fbf284d7610ed35d24978ffb3c8037c1724ce6e17f013153110be1e1d2efb0cb2a8ef703925be0c6b520c51fe49d203bfa6fe8cf877a3d77ac36b032e6a3ec9df2e7028dbc1c3b7799b56be19080a90035e8a9aaae3046642a6d11d70402febfe2e6ad5e02578e9e7ac4d1492eb207bfd0372f17c85ab7d240df22eaf3216f48dcdbc6d09df4da1fbfc7453262f9713918503bc4f545f62f0cd92e155451432c85b5beb2edeb8962123de730d3e5f4925782a038841d625cefa6f9e837dddcd4759d1b7d75272c602cbf8509e8317752f4c47bc0394090c854b9d78b43badadb176d8a422280b3d97ee568f406e05579bf38672da038d662e7b7cbc9bc33437a4df76a7fbdb2c002d75f9d1bde109e26af355fe5a100219ffff03eee380c496116d822a6b592f7cb2b42fb5992b81dea2237f9bc703138e88c58203e1657b4f4bca026a7deec369b9915faeee2da5466013065ffa91f59ae01fe0710219ffff034cad8bc5dc9eb3ab9b105ac920b95f8f2c8911266757ffd8afb0af462cadb0ca03298d89b92dd7b5f61845b57f18f4424a76b5d62ef1952d3a4a231e64ea805859035a6106904ec070c0c3146c3b53004fb7c374b713af3a54decb9c51fe5706351503f107d6702d60b0e0f8998e1651691644b7d8bfdfb56176bee4dde9421b0c5ec0032093dc06a4999529914271294568a22740f49c3303d43e98340b709fbc0f62420384da85690dc85bc54c7aed4d8ffc5e0e7bc340d75f5fd7b15782fc8b3cf4894a03987bae9096d0b5393f74e102998fbd4b28b90212c1c7ee48103c2e4272805be0037b3c4a36c2d89dd3c90cf7c607ea4f547fa5e8a8e9dc3f7d8dada8bd72147dd8032095e6d7383a22b226561d68123ab2c1214791dbdac52229a6869d589a3b7cf8038c7c08d0acd233e2ec64fa5b7541fc4ee0c63396f7394a74c2b20e0e882f6a52036f9315416a70fc5b967f2034b62dc4ff5013f38fdc18537591448273ea7eb38703d92e544d06ecca329b2abeec9abbd14a1e201d45053131d118f0583226e8e744033eb60b9e506cf1826759d3ca4ab574ec7af1381bd3a43896f52d75c0a440162c03a297382dc39e93a33f376a22f4e72ccf7d9b9b5039956f115f683db1f56d093f031dbfec66b5dd45ebf0a7d217a13b09af51b726be65dbfd8a073dff37edb06367031e3a89995526b5fa7c7546be2f87f24ad31d5a90d43684a938e11e8bea190e9a03bb5f90b166fe08410e6a81f70e84aa61bba1c5cffb192f6944f48f18bac7842f037f257b8f881ca3b9a068f124c5e7c779977d47758727645ac3c347c8a7e2cc0403e762ec64639707cd8c88e32620676c4afab77af0506fddb9e9338a44878cbf2b0375d94e4ffd563943ad1b30ceb70ffafe652cc3ef43751275b73fce2a8f4580e903e941e8c1cd2d1c2af9e6a830eaccb9dc852eb51a595f49f8020b1374b3d9671d0320a5d0928ffed1dfe17ce654600de0a8adde1e19c6ea8d3b3ec8eb1ad4722075038e724e924921b5e1b408d19789f7a807d957061d4a2e31deabab4dba410a54c4039145304cf541f509086d369c2591052eb6c35114466bfd95d143afa2440fcf9103f37fc8726c7ac600cea8d3c0a548f9d0fbfe5c343ccf492d38ceeb0fa64e389e032e658ed64ff2b1fd07d179daa64d89e6066ba0fdb17391508b516aa8538965c4035936c2a9466d4a2dfa96c16ee3a7412be746548dd4dea4b51e72b3abeb488f8703e674d75971128d7bc12b2e4537c4d5ec14851993eccf5636d201a8810232afc705581e0340c74e91d29617db518cc91bcc79d97dfb4f10b9eed6b9a7f2b669dee00c08468428fa8d5a7003d606c59bff9ba4c408acd4bd1a03645bf9be58cc3abc35ba732a83bff897749a05581e03b202d82e408460bdd424d4427bae5c8adfccc85babec48a68d2804c7c0040103e4b302f8d306e57a338be5edba5efe74c6741ed8cc82199c5a8daaf7d370f80305581e0356675496e893230127ecdfcdd6f47502c12da422154cff2de7a11c3cc0040105581e03cfe3126e3240c5f84d3c1a1165c83583d59454bd73336d91a50d66a0900c0847014e2b4384130005581e03d4114ff9ef2f468f2564b97c647a64cf1cfdfa60ab4017ca3688b5ce90040103be8edcfb1ed054bea7dca5450a83dbc853507260efa562f2e779e101b4c13b370307be01e7e7206fe31ecee91ad75dada65ad6ba433ae647a1b9330469f7c6677c03709eb5dda2147c4fb819a20da7a29219edf23b78b89a76895cb5bb987352df3005581e0373f77543f7825a60e6a5701c432e908745ed9b08e73b0a25150b6d34c007011bffffffffffffffff05581e0305c28b46bd8e81bdfb8a5f4d6e980885d2a4af2fe0d7824beab974b9c00c191aa348024a7947673773cc0219fe5a03d10712aa13d0f3995a9804e252a7f13f0330db2f77f1262c4de517d26bb235110390d5e6127610e23202df851e12dd51e1f173df2f449ef1502f8cb8ec1946c72c0340d95d05dbc8cadc39de4143d80043af6f2823634a897954a2a06e996d6545f103b6276e002ba6533d0da0005425db938210b67c9b41bc6f2ac584aae9de0f6cab0219ffff03f3dace1347dcda686fc36606f8325207c8f43d5c89616289ec5a8c2e1392fe5e03c4b2827e222f9393dfd2c17e277bcb5015b227af2818be5ac93677e4466086af032d21e91b97d746d069e6350da7edd46e62afe84a030761354e2f946e943863a103775749f3c799933da5cccb597248d0f06452efa42a04c7b6aa22a28a59e1284a036ed81b100db3d0c10581c4b9fa794d11403c4604996c23fcb7b70d728658ae9e037dc2ce07de091a9d43d01732ad91e070fd2de1bdaa466d7f3a8afdbcb814b7eb0300ad182b787cd5f74e1e445f1c1427bbda851e4af520d186adbeb44b77638395035d0eb5886b59f11c5a89ff217828da238ad229d49befdbf4ede49356e6311ced03c34e34c58951bffa6fc614956d1fa57566ca7ee88b6ef02f1003fc2b84a27c8c035998413c1da595d78cc993f61733a859917c89d1fc8600ad414872e4c0eda24903e3b09886001963c040552d15b1b3230536f27a2913c5485a6bbe923a0cc1342a03c06d4726e1718cc11c9641586d6a88b7215be0ee05b94feedd05615ab0ed98990219ffff03e63c9ab2ed95722b19c109f03639757b6112738689d74ebdc8ecbb2c5ce46ced03a90a8502021d0c8403d106a77550fdedf8d8970d36a483174219f2ad518024e203db86accd2441d4ab15ce47241fde2b166a2c1c769042858bdab62077e3775e450395ad46356db32a3262592a3120f35f8d87e559f0d80a59a00f5f1496d79e1f3703ea0f478c5dd0d6860fe592f1064e12254146a87d7a5b32b5f69218e40543eece03f9685a4a1c22957f996b3a47d7b0d909a5337a980ad98a27ef8b01be121ebb820219ffff03a50f36b2a3aec225746cba77b256aa39baea8688ff9710f77ad371a1850b530c03d6b914782c056946db444e70e0762eadea31e3df5599237b3e66da71dc7ccd4103d52f79911ee66b756458bab97d6c63b5f089375ace9770d7cb7573287ac1bdfa038a6cb307f82845f574b2ffb6d548b3a50d4758e935abaf163a285da011b78f2c036bb9a5488e9d3123825e8ac90119b9e208035a3867cb3d6da9b6bc00678fc98403648bc1949264e264e724f3dfbb50a216cdfe05f3e95f234a81f22f47ea6772d203546b3a0d697ec1062b81522b4d084e9ec57c711cd4ea7d34bec7de09e0f1ba3e0383cd8f34312fd8ba6f85d0b5925f3a8a4ef4c2fb1dafe401bb87c9a1bea5213b03f6e8e346c25231891bae41caca569ce3119244c2a7fde5d5c71cf8fd7f3987ef03c51ef578408ed2bda43c71d7635cd6de9b456caa8f94e58ddc710393026ff931038db24e908809e8bb921ca8369d94130bc726ddb1feb383e1bb0428f10388556d03fdfe947e0412f21e731185beb4d688c76b1b25487213a889b392fe968f674f610219ffff03a60d2927f6b9b12188134cc239c40d23f9ccc70d3a7de9e09bf38b52eef3bce303433ce07a0d1bab3d582a296f83247078f7e724d1ac4092ea5111b0fb071ca02a03fb9e2161ade905fd2a2ef6bfab89ec7840ddccec045dc40070d4ced7f53b6e67031feb13beb775981d91a3062cf8e8a4fcb82d18f051a36ad7458c8e290220efca03a0e5ec6797ecd01497f609217ec925b01d05dee564308bda87e5cf92128c9a3803f674c47dd5a6c8ac69cd7ac69ddb49ced9dc58c05fa143c2cb97edccbd0b9bd303390bdbaf591b8ef8605852a1cf699e17f0ed8d513e033aebedfde8a73ebab74003179fd7a59752c138b342dfcf72466af530561333dac80ee105c76e7cde150306036a44ffb000ae3ee4b350b8845cb039cf7f9fa7b2241348b924f88218b66ab70c0348439d5859d54cd376c1c5523610849eb269b43a5433970801c31413a30b7742033fc0ea144e814572124c28db95e360a8ac2e82cecef6be56f99ded79e04ccbb803721018a806deb51a2dd6c4e4108ec19b9bfa13018030cc4787000df532f83b2d03be9cafc91ce5c493bff4195a711c3d027c59f96fb9de36ea791652d9e0ebefbb03d92b63a22b09c70eec21638713c888e08fc3094601fa959df16f5421bb0997400360cbe274a256abecadd967d1c9157250a8a6c9d9a7b732034dc42eb59f4337160356fbcad33cbc58a3f6c1d2a8bfea491d8dce5396e7d2c28b37c03966da6564ff03b82d4ee8a3bd099298354fd419779e9d9b23437e8eb0726503d635243071300a03489189e2fc1544cafbc038b00d4756dcb85fd97e490f66fb118509c17f3709cc037727b83a3c075641e096e7d358b4d508c02d94bf69dcf0e80c850aea57e3be5c03504b9e18153c54818674884cb6605cf7c1d2f51018ab2b8ea4cce38a64056af1038562b0206dcfdb03a3c955ab6787a612a6662b336db326533840332caa4b31280316fff45014600e04c5544653c60728d9f86e6b6629c64d09eb5faa6e95447e9d03421172bde32acf8d6525a1eb119c7b9af525df582ad3f66cf970ee5b40d4c1a303877aeaeed643b247b01b8f2f8fcc7ea584c37668f85dc230b45a10530ecc1fd703f7cccf2a3bd25254e8cd67559b9b8b3a510eb8a6298f45925e981230bc82f96c03c82854e63d06042387aebf6e0525c6e827ea0567f95ba0e84fbbac7b6e3babdd03ec5bb81669a23bfeac73bc9ae261a303e4233afe3f91999b6edbf44699afeffb0393f6766a00d101d1e2ccb18b17ee5d3c9169e414d348f3e38ea4b6ad51d249c3032e019ec2455ebd81fd8accdc332db5a3dbf498d5e8ab2424547c72e4bc0f754d03f3167c7ec060c7e8e4d4209142673800a2beff378cd85d5c5ab9fa44ef23f9950377ca9d123a6f1a926b0441413ead4ecfe64670147a3793e90fc40a83a98eefbf035c6b68124718d0f0ad938e089409526f2a61a3c62bdca0f15ba23d696cb9c3eb0363b7cf7f9aaf628c5ea5b0b014eb143ab8a339d6d5a9ca66cab5c07d4e9930b003bb38a3268a4529afd2b1246dc9bc1b81db56195ea458c9de3751bdef4f06794d03c2b8aee74e06f9b7719cfb835463672be34dd8c9f51a4ab228f8dcdd704773dc03fb9ffa6e4cb446cdf0fa328bb4b998ce480c24fd9fe2507df65fe11cc7601113031ff9f90f0646746ede0dd3000ee9eb92e952a2f5a19149e0f9950a9d8268bcff03111fa6456d535e473ab5cbe31075d36156b25f00be25d5fa54ef80a46b75e6a50360794bc9db223f3c2148276e90d32e3e4a23d302022f15b0b11bd49cc049b0f803e67366d9f8df4a548372165a810704bffc86a422e8b568a398556d63147c53fa03dd1d971baa9697b8962175d0d3d5897fad93c9129dde88bf91896fce83bc39b303a4d23ce45ab615a9bfff79118650a7e82cc850858c1bd43b8c6d08766d3ed44f03194bae0a4b7d6fa060b99e6f5c97b8211109d70a87e960efdf87ead447fe09bd05581e03b66d91f8635919e84725f61e09f44d36e8cd16c45dd605d495dda732600c034747e2c05e2f053b045916166080604052600436106100965760003560e01c80636ae4b4f711610069578063803ba26d1161004e578063803ba26d1461015b5780638fd3ab801461017b578063fa461e331461019d57610096565b80636ae4b4f7146101195780636af479b21461013b57610096565b8063031b905c1461009b578063168a6432146100c65780633598d8ab146100e65780634a931ba1146100f9575b600080fd5b3480156100a757600080fd5b506100b06101bf565b6040516100bd91906115b2565b60405180910390f35b3480156100d257600080fd5b506100b06100e1366004611075565b6101e3565b6100b06100f4366004610f90565b61021d565b34801561010557600080fd5b506100b0610114366004610fe9565b6102b8565b34801561012557600080fd5b5061012e6102e6565b6040516100bd91906112dd565b34801561014757600080fd5b506100b0610156366004610fe9565b61031f565b34801561016757600080fd5b506100b061017636600461104a565b610331565b34801561018757600080fd5b50610190610476565b6040516100bd9190611268565b3480156101a957600080fd5b506101bd6101b836600461110e565b610593565b005b7f000000000000000000000000000000000000000000000001000000010000000081565b60003330146101fd576101fd6101f833610700565b6107b8565b6102138686868561020e88886107c0565b6107ed565b9695505050505050565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561028757600080fd5b505af115801561029b573d6000803e3d6000fd5b50505050506102b08434853061020e87610a65565b949350505050565b60003330146102cd576102cd6101f833610700565b6102dd8585853061020e87610a65565b95945050505050565b6040518060400160405280601081526020017f556e69737761705633466561747572650000000000000000000000000000000081525081565b60006102dd8585853361020e87610a65565b600061034085858533306107ed565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d906103b59084906004016115b2565b600060405180830381600087803b1580156103cf57600080fd5b505af11580156103e3573d6000803e3d6000fd5b50505050600060606103f484610a65565b73ffffffffffffffffffffffffffffffffffffffff1683604051610417906111f2565b60006040518083038185875af1925050503d8060008114610454576040519150601f19603f3d011682016040523d82523d6000602084013e610459565b606091505b50915091508161046c5761046c816107b8565b5050949350505050565b60006104a17f3598d8ab00000000000000000000000000000000000000000000000000000000610a77565b6104ca7f803ba26d00000000000000000000000000000000000000000000000000000000610a77565b6104f37f6af479b200000000000000000000000000000000000000000000000000000000610a77565b61051c7f168a643200000000000000000000000000000000000000000000000000000000610a77565b6105457f4a931ba100000000000000000000000000000000000000000000000000000000610a77565b61056e7ffa461e3300000000000000000000000000000000000000000000000000000000610a77565b507f2c64c5ef0000000000000000000000000000000000000000000000000000000090565b6000808080608085146105db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d2906112f0565b60405180910390fd5b5050505060448035602481013591810135906084810135906064013573ffffffffffffffffffffffffffffffffffffffff8084169085161061061e578284610621565b83835b9094509250610631848285610b0a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610695576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d29061149b565b5060008713156106b0576106ab8382338a610bca565b6106f7565b60008613156106c5576106ab82823389610bca565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d29061134d565b50505050505050565b60607ff0ec779b0bcda6d84abf99ee2c67647d1100ebbb553a9c2d1c2ba1579592832c8260405160240161073491906111f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600073ffffffffffffffffffffffffffffffffffffffff8316156107e457826107e6565b815b9392505050565b60008415610a2b577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85111561084f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d290611407565b60408051608080825260a082019092526060916020820181803683370190505090505b600061087d88610c09565b905060008060008060006108908d610c10565b9250925092506108a1838383610b0a565b93508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161094506108e1878483858e610c76565b5050506000808273ffffffffffffffffffffffffffffffffffffffff1663128acb088661090e5789610910565b305b868e886109315773fffd8963efd1fc6a506488495d951d5263988d25610938565b6401000276a45b8b6040518663ffffffff1660e01b8152600401610959959493929190611216565b6040805180830381600087803b15801561097257600080fd5b505af1158015610986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109aa91906110eb565b915091506000846109bb57826109bd565b815b600003905060008112156109fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d2906114f8565b965084610a0e575050505050610a29565b309850869a50610a1d8c610cae565b9b505050505050610872565b505b808411156102dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d290611464565b6000610a7182336107c0565b92915050565b6040517f6eb224cb0000000000000000000000000000000000000000000000000000000081523090636eb224cb90610ad59084907f0000000000000000000000000e992c001e375785846eeb9cd69411b53f30f24b90600401611295565b600060405180830381600087803b158015610aef57600080fd5b505af1158015610b03573d6000803e3d6000fd5b5050505050565b60007fff1f98431c8ad98523631ae4a59f267346ea31f98400000000000000000000007fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54828073ffffffffffffffffffffffffffffffffffffffff80871690891610610b77578588610b7a565b87865b604051958652601586019182526035860190815262ffffff909816605580870191909152606082209091529290965250902073ffffffffffffffffffffffffffffffffffffffff16949350505050565b73ffffffffffffffffffffffffffffffffffffffff83163014610bf857610bf384848484610d1c565b610c03565b610c03848383610e12565b50505050565b51602b1090565b6000806000602b84511015610c51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d2906113aa565b50505060208101516034820151603790920151606091821c9360e89390931c92911c90565b6020850193909352604084019190915262ffffff16606083015273ffffffffffffffffffffffffffffffffffffffff16608090910152565b6060601782511015610cec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d2906113aa565b5080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe901601790910190815290565b73ffffffffffffffffffffffffffffffffffffffff8416301415610d6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d290611555565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015273ffffffffffffffffffffffffffffffffffffffff83166024820152816044820152602081606483600073ffffffffffffffffffffffffffffffffffffffff8a165af13d600183511460208210151681151782169150816106f757806000843e8083fd5b73ffffffffffffffffffffffffffffffffffffffff8316301415610e62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d290611555565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152816024820152602081604483600073ffffffffffffffffffffffffffffffffffffffff89165af13d60018351146020821015168115178216915081610eec57806000843e8083fd5b505050505050565b600082601f830112610f04578081fd5b813567ffffffffffffffff80821115610f1b578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610f59578485fd5b604052828152925082848301602001861015610f7457600080fd5b8260208601602083013760006020848301015250505092915050565b600080600060608486031215610fa4578283fd5b833567ffffffffffffffff811115610fba578384fd5b610fc686828701610ef4565b935050602084013591506040840135610fde816115bb565b809150509250925092565b60008060008060808587031215610ffe578081fd5b843567ffffffffffffffff811115611014578182fd5b61102087828801610ef4565b9450506020850135925060408501359150606085013561103f816115bb565b939692955090935050565b6000806000806080858703121561105f578384fd5b843567ffffffffffffffff811115611014578485fd5b600080600080600060a0868803121561108c578081fd5b853567ffffffffffffffff8111156110a2578182fd5b6110ae88828901610ef4565b955050602086013593506040860135925060608601356110cd816115bb565b915060808601356110dd816115bb565b809150509295509295909350565b600080604083850312156110fd578182fd5b505080516020909101519092909150565b60008060008060608587031215611123578384fd5b8435935060208501359250604085013567ffffffffffffffff80821115611148578384fd5b818701915087601f83011261115b578384fd5b813581811115611169578485fd5b88602082850101111561117a578485fd5b95989497505060200194505050565b60008151808452815b818110156111ae57602081850181015186830182015201611192565b818111156111bf5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261125d60a0830184611189565b979650505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6000602082526107e66020830184611189565b60208082526029908201527f556e6973776170466561747572652f494e56414c49445f535741505f43414c4c60408201527f4241434b5f444154410000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f556e69737761705633466561747572652f494e56414c49445f535741505f414d60408201527f4f554e5453000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f556e69737761705633466561747572652f4241445f504154485f454e434f444960408201527f4e47000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f556e69737761705633466561747572652f53454c4c5f414d4f554e545f4f564560408201527f52464c4f57000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f556e69737761705633466561747572652f554e444552424f5547485400000000604082015260600190565b6020808252602d908201527f556e69737761705633466561747572652f494e56414c49445f535741505f434160408201527f4c4c4241434b5f43414c4c455200000000000000000000000000000000000000606082015260800190565b60208082526023908201527f556e69737761705633466561747572652f494e56414c49445f4255595f414d4f60408201527f554e540000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f466978696e546f6b656e5370656e6465722f43414e4e4f545f494e564f4b455f60408201527f53454c4600000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146115dd57600080fd5b5056fea26469706673582212204cc6b7a366a0a6e22a04d2d8d2b0410ef6d76b5c47d78862c5dda3d6644d33db64736f6c634300060c00330605581d024a44b4d2b5f6d242dda9b7b806263cef66b2f139670929bb28fc7fea0701191616031b460c826a854d61dca82f718e088b8b4c4082ffeb93752d7691bc62c51dc0280605581d0248da54ef2abcff5a6301b47cc3692cc096a0adad40101738c69779e707011bffffffffffffffff0219010805581e03a0ac152d3ac0c9c9c5005c9d692bd5ec77014cd36d9486547a8ae0e5800c044718c6b04dbcde8303201700f92a763e27560f6ea05eced4cbe1d48deaa7943c683c4b4f49cb13106f0342fbb8ca46729b921d60dd79bc5e955d37ed77c2f6b882cff6874fd18527bf8e05581e036c5bc4dd61532c76ed680ce6a453319986bfa089b6f9be89f1f79574c00c02470305d37cf544b805581e035f496c54a63e3e6452326d58130075258bda3b6f8cc4c367cb565d26e0040105581e03ad44e4916d57aa025a1cca3fef327c942a8ff7d793403bcdf72a5912000c024717a681984510000316c07421137d6fca67dbf763e0cc23c12a58498d88d94791d2a6c260c562bfa005581e039e4aea363c26f33a85ab6a01b8b36e057abd6eef33bbe3118a012cc4c00c064682e7c0c427e805581e038b4747193ef8e3a8860fc395cafe5c98a3f0131092943d5219e3431a300847038d7ea4c6800005581e03ed21ee4b22c2d91a89ee20876c15c9f2625971db8ef0d1a8976c4b2be00c01470128546a26c40005581e03d16dced3be69b2b03f5944d1abef9bda9e457c9d4deb7453efb8eafea00c03467076e2d3b0c005581e03fe59d2729a8994ae4ca677efca10032142fe70091fb49ab30acfc281e00c024672560413755003eaa13b8d3ed72aef2a071a3d3b532ea9ad4997230aeee9d8150ef68f5dd83c8f0219fffb030bceeab60ca03c8c5b7cde19730f866a9ef38c0a37643c6d39546f7af96d51d10219ffff03a6006aa40a58141a519795380e434e94825fa08b5248839b2ed7b3693a4f3dfc034bba7ae1a355704b85c51cee8cf4f4dba999cd55f3604ddee93057f36bb1dee703b7832ce24ebb6fa5fdc4ef76a4c4ca5d8142648eacfdd15746d067e1ea257f6903e0f549cc631a96803e664ca36a2f7dbcd1d0ee4e066a15510eccbd894ae6557a034b75e0fa02f80cf3eadb5d800c649fe6ad3e0a6aee768f1b25a7ca8cc7f8d0040219ffff03fceec48695c750f27287986c72e35e27bebf4e1639c4fc9f65bc2eef741a5b33036f75beba82fce098703546993bed9689151fc797b4e88611ec24e971d03e8b9f035839d648b24acf37c951e7e5910e891014ece1f24171af0f522e6a6c13bd677b0350fdcf647a78979d158556530db8f37fd7ec3225aab5f1a5d4c4e31f3d2f744c0219ffff03a5358cc2454ba4c7f154311b9ff6bb01071bf9fdf23d4108c919e33423d89f2903d40009515ae21d8a43b91420a2fa991fe93effab28a8760a9698ea98773f19180360a498da729e25da3657699c97a9ace336618417c2e912914d938db3e84f2f5003873e97878802dda957d633ea49395ae2bf9103f5fd8f8000f9182ab43a04364503a9d86a2b79a6103b84dd6ef12bf5bf3787d3b0c098a6fc761cb38beb1e1ecd0b03d238cfcd2b28a4482edba8e80bf9aa0b003a3b33497d2fcdd746123e7d59dda403c2f88297f853d6310db54fe70e152c70c3ec111a81eb851e9d0a76fa9c7ad440030ed761b51c0263802d083b432009de2ec65751012f43d5f330c22f0b96e1e55d03e2e2cd5b203a4d72486e39d17cbab7d02b5201679aa17b6021c92936552f92b603b8251ed3f6a3af683c9f0ccb5236487067c747929db09befc9b68ac86281b073039690ed0c011eac200370fa571c5c639e28d03eb89806688d11412f92d174d6d5039bf266bd1cddd39435a5a3399488d55af6d11a99c3e90e0d27608ed8e38c8774038e590efdca91dcf151999342d356c277f277f16f9f211a4acf7b6f7f6213355b0219ffff03c365ee5441e8c48180b1ef35944b8733c4b3d37ebd154346b1e6001607119b2a036dae95f064b6da0ee893baac0078e75d3e19a70ce28646dab697c976062de0ef03c3ecd3ff3a9607e48e0c822d02cf6c5cbce7cd0ea15421f6d5750c073e9ebb3e03b3ff8f58edf5ddf6d4adf5c32338eacfb112cbfc8c971cd6079adbb7a2dbaa4303451a836a4df657623c87c2104e20bbbe4abf0d83b8ea7c70debc89ca4160061b03a647f616918dd2435d88cc788973431fd204e7f1de9b1de1b17e0b67df230dc50373ca8e89bec3ec9c59c9843a49b1bc3ca2b11a9cb238b5b83e05e4cfa01edb1a0219ffff039fb9394ff3933cabb7b457c93b0e5a424a1033c8a90c88449fb73d1cf507dfe003485709238c8f1f7e476de6f96806a99b795dcf4d76d53f438fe51f66763b752603b3037c5785bac94975d795ee6423b90a25a8899216d75f82284335948d09033503752a3f07b73a10e30e742fb436c8dc00758f76cbbc2efad6b9b7d7511c0322ef034e99c4cfd4cba2fd4697bbed754f92fb035e0e838101cb394e5a0935a1336abe03e1834aaec0d499aaa5a5a64ccd8d197b61c59e78793516bc903a390425112a5503ec737642c0a734faf20b72589473b4f48d62ebd2f4c0ffb0b33babc8ba09654f0347b6f41b14a49bd35053e28d7a065640a4359b4a60fcccd4a978b1a7ebffcaba037be2065d424856b81a06ce14bb23c6420688036f474fd621bfa3824bd90e7b7b03058c4f262b30de3eb651c4337f3aef21cba06a78bc87fc21d05fa4698a7e174b03f849fd05668787bda96337f42c349b4f7a7434e767b3de7567a65628771ff2d603c9082a60da784f47342cb192621aeca062a37bfe535bc629e37fcb6b622c8ee4036f57630ac7b7a0e77d7abfcba4c33b05436e5a64084296b45a5fa9b268ee63e8033256528c21d48395c1077c77f2b117dfd2a153aac00ee1ccf05d9cc7014f66a7035b4ab4e64e2ec5d0c42b68ba35948e2156783e365d7fb5dfaf665058c2e1eda3034b2740f5a6ef8a9f22bdd8fbcd19065833e209822193d5659636808a0f3c18fd03ca4bd94dfc4959317e8ed501958b680ba2b9923515d18f17f937dba6ea8eb15a03bdcf276694f341508da369e08f3d3824a32bb02547129e22ce135128460239c4037203ee0eccf89e5860bbe12c1deba265d28ae628dc0560abdff65db321301b2e03cd172e47b3df6ea808baa836772b3559747eadf1e1380319374f03276f7b800603b0fc2f77f4db7a13edfa8f2af21623fc33c665993b0cf23f41db0511e274de9903878d771dd50c40301b9c3f0ad7a73bc5f36c33e3a34be784056ec5b0c22fae6803b82f18b8043845e73cae063e9ffeadde3ba43031e54ab38da9902795d13284b003b97d9d71abef205f5132943fbdcf635c2dd7ee80350e2d8872b0f81115bc4a2903b5403b0da7bf9724a80e0bd78d446fea2c707547725531d62703713ba91bb9c80317f71902f2f1e0ca9871b58316303ea28cda7a3ddbe96ec34f12e76247dac08d032ab28ea259958c87dc987f622506bfe202450a4770f0430d71dcc734fafa40950322591b495bef360943f9e060e8b4f4d992341f06e53bce5e2323f5b88f39a2470357f5b601c39d224acbc960e5714e6fe30c6ea7ee80d1222e861e44545a09d1c803ff4c9f5c0e59aff022295b380d934e2857a2dec6c6a4e51dfb08efc449c763710306e7c49c06259ffefe69c91139058ddfc9c7979f793f60b6c8a5f626c01452fa05581e03d9ab0290a9dd356f9096641df5ce47c9f6eec327a11a153c78dc7b87700c01465d939a103a2c03a522a77020d700e5c514ccbe69e3a790f5c6394b87eb7736ac140960181d183c031b460c826a854d61dca82f718e088b8b4c4082ffeb93752d7691bc62c51dc0280605581e03c4b63b3c2dc8d1ca50adad69438e450c26647541382697608794da38b007011bffffffffffffffff05581e0379b29cfb68efd058e64ea5e9e1a4ffce49e676bd44758c9de3cbb696a00402039fa4285c7e5dbcd8918901616b84710fd6622b769ef71e53ddc6b1ebcba75d1a031f8b67be329f6419c9282095843235301b6b3475e42bc9e3262b646aba8072060605581e0360b12e35e192fabb92b653f436a8d93a3fe4a31c6f0e0bb9b6aa660e9007011bffffffffffffffff05581e03512e5fd6aa467ba0275da97cb7898c314203ff01162ef999c2e6e85ab00c014744e45d81dea8480307e2c6b61c9af478c838e0cd185c69d3833252bafc6b482672d34ad9dc615c9205581e038b5dded3dcfdf54afa0824f0a97c21abf0f2645644c8c079a7e7d279900c174711e8334ea5ff0505581d027c3cf7663beb2da7bb9dc1c18bacdf107d0d93633f4e9071ca0f312c08470accb0eb3c140005581d026526f3239521117e32e590deb149db493bb5c665ac3aae6b493c9b20040104591045608060405234801561000f575f80fd5b5060043610610115575f3560e01c80635c975abb116100ad57806395d89b411161007d578063a9059cbb11610063578063a9059cbb14610243578063dd62ed3e14610256578063f2fde38b1461028e575f80fd5b806395d89b4114610228578063a457c2d714610230575f80fd5b80635c975abb146101c957806370a08231146101dd578063715018a6146102055780638da5cb5b1461020d575f80fd5b806323b872dd116100e857806323b872dd14610181578063313ce5671461019457806339509351146101a357806342966c68146101b6575f80fd5b806302329a291461011957806306fdde031461012e578063095ea7b31461014c57806318160ddd1461016f575b5f80fd5b61012c610127366004610e4e565b6102a1565b005b610136610347565b6040516101439190610e74565b60405180910390f35b61015f61015a366004610edb565b6103d7565b6040519015158152602001610143565b6002545b604051908152602001610143565b61015f61018f366004610f03565b6103ed565b60405160128152602001610143565b61015f6101b1366004610edb565b6104b1565b61012c6101c4366004610f3c565b6104ec565b60055461015f90600160a01b900460ff1681565b6101736101eb366004610f53565b6001600160a01b03165f9081526020819052604090205490565b61012c610622565b6005546040516001600160a01b039091168152602001610143565b6101366106e0565b61015f61023e366004610edb565b6106ef565b61015f610251366004610edb565b61079f565b610173610264366004610f6c565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61012c61029c366004610f53565b6107ab565b6005546001600160a01b0316331461030e5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c655374616b653a2063616c6c6572206973206e6f74207468652060448201526437bbb732b960d91b60648201526084015b60405180910390fd5b60058054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60606003805461035690610f9d565b80601f016020809104026020016040519081016040528092919081815260200182805461038290610f9d565b80156103cd5780601f106103a4576101008083540402835291602001916103cd565b820191905f5260205f20905b8154815290600101906020018083116103b057829003601f168201915b5050505050905090565b5f6103e33384846108f7565b5060015b92915050565b6001600160a01b0383165f9081526001602090815260408083203384529091528120545f19811461049b578281101561048e5760405162461bcd60e51b815260206004820152602d60248201527f45524332305374616b653a207472616e7366657220616d6f756e74206578636560448201527f65647320616c6c6f77616e6365000000000000000000000000000000000000006064820152608401610305565b61049b85338584036108f7565b6104a6858585610a50565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916103e39185906104e7908690610fe9565b6108f7565b336105485760405162461bcd60e51b815260206004820152602660248201527f45524332305374616b653a206275726e2066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610305565b5f81116105a75760405162461bcd60e51b815260206004820152602760248201527f45524332305374616b653a206275726e20616d6f756e7420657863656564732060448201526662616c616e636560c81b6064820152608401610305565b335f908152602081905260409020548111156106155760405162461bcd60e51b815260206004820152602760248201527f45524332305374616b653a206275726e20616d6f756e7420657863656564732060448201526662616c616e636560c81b6064820152608401610305565b61061f3382610c71565b50565b6005546001600160a01b0316331461068a5760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c655374616b653a2063616c6c6572206973206e6f74207468652060448201526437bbb732b960d91b6064820152608401610305565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36005805473ffffffffffffffffffffffffffffffffffffffff19169055565b60606004805461035690610f9d565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156107885760405162461bcd60e51b815260206004820152602a60248201527f45524332305374616b653a2064656372656173656420616c6c6f77616e63652060448201527f62656c6f77207a65726f000000000000000000000000000000000000000000006064820152608401610305565b61079533858584036108f7565b5060019392505050565b5f6103e3338484610a50565b6005546001600160a01b031633146108135760405162461bcd60e51b815260206004820152602560248201527f4f776e61626c655374616b653a2063616c6c6572206973206e6f74207468652060448201526437bbb732b960d91b6064820152608401610305565b6001600160a01b03811661088f5760405162461bcd60e51b815260206004820152602b60248201527f4f776e61626c655374616b653a206e6577206f776e657220697320746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610305565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a36005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0383166109735760405162461bcd60e51b815260206004820152602960248201527f45524332305374616b653a20617070726f76652066726f6d20746865207a657260448201527f6f206164647265737300000000000000000000000000000000000000000000006064820152608401610305565b6001600160a01b0382166109ef5760405162461bcd60e51b815260206004820152602760248201527f45524332305374616b653a20617070726f766520746f20746865207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152608401610305565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610acc5760405162461bcd60e51b815260206004820152602a60248201527f45524332305374616b653a207472616e736665722066726f6d20746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610305565b6001600160a01b038216610b485760405162461bcd60e51b815260206004820152602860248201527f45524332305374616b653a207472616e7366657220746f20746865207a65726f60448201527f20616464726573730000000000000000000000000000000000000000000000006064820152608401610305565b610b53838383610dc9565b6001600160a01b0383165f9081526020819052604090205481811015610be15760405162461bcd60e51b815260206004820152602b60248201527f45524332305374616b653a207472616e7366657220616d6f756e74206578636560448201527f6564732062616c616e63650000000000000000000000000000000000000000006064820152608401610305565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290610c17908490610fe9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c6391815260200190565b60405180910390a350505050565b6001600160a01b038216610cd65760405162461bcd60e51b815260206004820152602660248201527f45524332305374616b653a206275726e2066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610305565b610ce1825f83610dc9565b6001600160a01b0382165f9081526020819052604090205481811015610d595760405162461bcd60e51b815260206004820152602760248201527f45524332305374616b653a206275726e20616d6f756e7420657863656564732060448201526662616c616e636560c81b6064820152608401610305565b6001600160a01b0383165f908152602081905260408120838303905560028054849290610d87908490610ffc565b90915550506040518281525f906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610a43565b600554600160a01b900460ff1615610e495760405162461bcd60e51b815260206004820152602760248201527f45524332305374616b653a20746f6b656e207472616e73666572207768696c6560448201527f20706175736564000000000000000000000000000000000000000000000000006064820152608401610305565b505050565b5f60208284031215610e5e575f80fd5b81358015158114610e6d575f80fd5b9392505050565b5f602080835283518060208501525f5b81811015610ea057858101830151858201604001528201610e84565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610ed6575f80fd5b919050565b5f8060408385031215610eec575f80fd5b610ef583610ec0565b946020939093013593505050565b5f805f60608486031215610f15575f80fd5b610f1e84610ec0565b9250610f2c60208501610ec0565b9150604084013590509250925092565b5f60208284031215610f4c575f80fd5b5035919050565b5f60208284031215610f63575f80fd5b610e6d82610ec0565b5f8060408385031215610f7d575f80fd5b610f8683610ec0565b9150610f9460208401610ec0565b90509250929050565b600181811c90821680610fb157607f821691505b602082108103610fcf57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103e7576103e7610fd5565b818103818111156103e7576103e7610fd556fea264697066735822122036575823465540cb1277c31fc2caf8a9189293837511e06209ac0d70400a979364736f6c63430008170033030ef6d3e7960a317c69218d5d92fdce0fff31359989e6286e3df138ebd3e077ab038f7a887c84db31a58a7a0d0e2b9cae5f46976bd7c5746d61462c159ef9beb7fd037b222a6da811fdfb74c6e9b5d66dd45b4f780d1bd22acc4bafeedbf5b13c34d3005820033c3826e1f77dbef94454169dc41345d1e7c3c7a14cf121e9ffe4af30076ae04b3385228ab1b849575293e1005820038235766f40646125d712d36a80881b10f838ec254690bdda6456f286ec27f05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03790493f4e7ab113d43110a0e0560ccf96c4f7bf14b7d08bdb63cf05dd967e13e0058200392d39d2135ebb0c7f898ae40ccdfb16ecb9e2f8210381cd78d89fc4981c6904b0b5f229fdff9d6cda435d200582003bc84877ad7abfca7957dd2e39622e71aa59d4ca3d7ce0c96d84b6f6a5bdf705820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003f4ffdfcf6e7f69781af66d6d1182fe785ba203637a5afa4fe186f29d801eb05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f0289439f5413a769307d83a5ab107a9288f697e5500386e7632b78552c05e35820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02f89e54f5451c1214fe6b1acaaf91666058154883794b6cb9e3d66aa70b314c13e5b251ffc3522bbf655de002183003dddfeb32b7f496582f6f3b991e19486e644a391ee45eb32c4bfe0fae221a51240219f39200582003c267cea428e8ac6981847912a61e91dd8a81408df2120fdbdc18ee5738db505820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0058200386ca55ac77e42f21d8d4b4f9d9f8b470857abdb53413f4f0b1ff977210e2105820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff032425b7cc50df3122b79c56bb6ed94aae8706786a3fc241b67a4121284b7a93bd005820032b1e2be0efa02a0adad205ad4bb7958ce3ba49e2b4a0b886580182c7cee3605820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003c8fff7b3b19212c06ba5cd02a40e8e35caad1e4f66030a939b436c26c904c04bfb822c05ed3c6632725a3800582003b5f6ad52279217dd61a2354ac2e6f185a14e8022baa685bfcedd76a8d7e0305820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003f2f989a56404bc1f6b91dd7f8cbedd6f8055dfc7c74e7bc988945620f3fbc05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0368c5d0368755d261f1f9a1669660ce112928907bca9c1ecd473061d723429ea9021929d303f57ed86c6a30a714f95f13227aceac26c29523901d53fc490fba21b4a7eaf3310348a3fa607473f9c44193783186048a09fec318ae1e0085695dbf6dbfa0956607039f1c7528b052bc79e1b670c3dc4bbf8b95dec056f2e2b64f12a65336f2cb0f0603622b7a43821b96e38851ca23b32eb7d6cccdda87034474edb1beadc877d0bf5f03a8a4a943b7378169804a11f35ef9a480a77ccdb3ad09463511f15347f6220ba6032d63edd8657cbad64271f9dc865c8b19a638f3b674c49ee6a42cadd59ce6c9870058200367dc8a9205ffc5917d62479cc780f8a26f9c7c4888c021204281e00af14ee04b0f8eeb71aac39ef7a9394903d6ebe4e8cb46105d5cfb523ed0411f04ae53398629e81c0cc5b40b1f3567cb9b00582003464f451c68b0bb0b14ab97bff7d5d7a06f1d5f220a6481ef7cc737ca23b8b05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003f02809787849eafe5457bab1af5c01c25b4e1a7c19fca2e214aac9e5c550c04d01838810f254c24ce8a92f5660005820030b6e70c090a7b20f9eb912c5084325285c918ceddc49c3c8003bf3a140d0205820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003c43f77d64a206b64736c351a36e75d815d084672625b8edc5c3455db40f1304b068d08401270e02ec65d470058200341effc6778304fe0c4f2037d7ba9ff35e62c3211a69a05e4035684f0ff65804b984f9e6c1e85048c6ccb7f00582003933b78e9e0c7c0824f5f4836a06a3babc51260820e89e2c2d5ac463c86b8b04c1c0ae8955648488a18f40000005820032091dee59f5a2ae4d2b59babef3f726aa87d7bc579d964cf7fdd83e562b9305820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005820032ebbf4f7ea76d48e198e701cc06ad683e577e4645d7700031024252d31ec4045829e12ccd000582003dba0d6754d0a91113bc40f5a7f987e0a8f351e2a73cb21b1ffc1fcf0e30cd05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0219ee57032fb66ec702797efe4a32d372876b70baac6b3c9f2ea2efa52153695d55dcf4f0031ae4d928f9deb5753204775c1bb5ce9f1f54130b3fd7053b8f988c762c48d69b0326046a9dd92cb8859d048845d1c5cc69d019c0502c2967b21ea1c70aa777ef6703ecb601fc06dbdeda1cbe6ba391625d3e3017871e8baf2574d33e073e4924528a032b413a401bd7298f128397fb7cfdc4a1ccc0259a5a00722a68f507e0b0ba40e20219ffff03f3ac01ed40a5ef1b236c5713eabcf0deed107c1b04be4316d8c6c317f7c220060399b78e44ce40b92bcfc97cad33bd3aa9bb345b946aaf2aa7f964fe13899c380c03714f112db8a13b4c006d26c0083aeb598d92d73a77aa69c170e7f2413a3fcae603f833089298efe7618d053343c2d0fbf59f922198ead8fff9b6257e4449d9ad0203e8f44bb7c36439a3248e69fcb9905aeade3ff10933be99726d457d278353d8e60308321fd309646536899cec0e93279b2d8270fc98e83f70a5c10570a0cea617d603070c9307fd4c9ba97b87a0781a3255b7d4d9c721f63d071102fe74bb3b57891b03f40ddec684a5ce4a98cacc9be705aaa285b2088a3d10eba6e7439ea7e2a40cd603e2311cc9eb791dedd7161aa43de19292580af5b84fae5e79c1a7df5b21b9e0cd0380cc8fb0d1ed4564eac95ac88702c6f8bb9ea79eff28104c61710f2804aeb5af035c9dcf7da7688808fef00a5d26739a140747017521cf2a54bb1620955eec3479033050d0b3c30f956d4c1716cfed5a9fb29c874ecae4d0c0ebd6db9f279095e42f00582003e16d14d7ba32f45fef8fb6b1b42f9220f988d707a8cb3d365641fc9f60a81045178592cf3900581f024b7416de84eb8c25afa4e09e512d1145462041f20fdf7b140c3317f31bbc4c0813f3978f8940984400000003513755985c6d5277f635bee6c5a0998619438ef86f3c0dc28e1e6de25a9f493201410b02191100031fe698c16eb9a8731b081b4d08e077123cd1aeda6dda380a2c33b5f5171a01e00058200365c8d2bb3d47ef7fb3bbc3864f233ab17e402cfb343fc33d3e5af0475db4d04b30b8186f032e4fe86200e800582003ba02d732d98be6245a4ca1a35faee206e3511f6ffbea5e4c15d76a635cf3004b01b0fac1fbaf00a4ff7f3400582003d582414561f5928afb9bbf3d4582c289fec27dd570c91f47b16ece7d5011d05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003d74e135548d668f078c208969f16b4c9eb883866d3f976457fb9cc0f769b605820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03ac257f634d58696802796cd2bfb622a0acb1f2a2cfbd24be16dfc4327d54a3a40058200342712e383da2e0e688cfa4f4b37062cd6e381403ec2c1f5c24ccb6bdfd3c404c020491f68f10b98a9255c49d0058200391fc84e89078e4bdbb2407809170816a4832bcf5452d9ddd911cbd0b1bd7704b3e09de2596099e48e9ef8d0219db5c03150061d38aa4f5a20749c2bfde4f019c69bce61b0b928634e9528b21163a74a203a15d229a04a5a0e1860a4f51a264f19747b4da7016fbfd123601d8586caf5926034aa8352e42fc7eb7212bc174ca1082c6297514dd0668a4fadc613913eb696b69036f8115901a4bf6f602c25c0d5f57784af3b7f398006168510d96f6bea2e2032703a42730bbda54654ea1a11f7fb9148a553a8f95e70dec55ca28fe76c7cbea750b0219ffff03fb252103c41d62b83191fab69bcb82bae87becd234de1d861a2614076e2acd01036b8293c901ba28f84bb56d947f97205d04c61695b28909d5b3a7a553c7c1030e03f8a825b8cf742175a61589e57087a4edcce1f63e4a2fe223fd1cfe055d2a0eb403bb9f9de9c0336da083d37bcca3d1a30a05d20095e67460deff66bea4d591c47c03b4400703486765373a53a24739da37ba2727ae831dcf4b534e37258da5a810c3030814e48f23521b267853242793f04ccad96d4249f3fafd7e6a1fe2564b94e48003855cc7e7dd7d9cc3abcfb2b35a271601d4b51b8f6af77e99325f0ca80ce1489903c8f404af366bbd3ab5a4bdd574b27e965c0cba1699a97ffcfa5611e10b16033200582003b3a6cd8a8f7ecf87fb63b468db4023b921e29231349e114bef35ad1a9e7de04b821087388b0f2a4f45ccb40332e5f77b51152f01d639274e8ad337725c05d8d9172bc68443824d301ba15933005820036ed6d6dad7b5bfc08a44a6eabc45732298129831ec3f9504e9b4a7224f28204b12557ff1cad9dea3ef77f2038e61f3a3eeeb1e2c92fcd03578e9f418c54fbca9f99fd1c996041c51c03d087700582003aa19a2901d32c1a33d3506351a441a123acda08f9e030199a7bcf3b65186304b086ebae3bfe60737aed31b005820034897436c6afd7f4ec1947e0af2fbf4196dc41cb8ecebac147c8447df785ef05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003b6d0aa33d163bf3fa95fba81d087acda7a6aa196e1b9618574f24fb6bfc0004bb661a9d20642ae30bca812005820032381760b7b98cdea68587542e718e86528477264468a8692c4d9a4f19a13205820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005820032daa2003f63e47af9af572cc789c1ef730fd87891a6e79fcb1505398f373505820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0219855f03dc775266b2204b63525f8890775406f26db498eac07d993651bcfccd812a96b100582003d4985449b33c75631b266ffa9ceef7c1d6839341f07760f9ac56e87c455a805820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003d751968282d320d36bc680872ca4cbf2c886a0d1649a34ed41efe3a457fbe05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005820032d112b751e25aa20bf916ea4754884d105003eddbde69d9cce7e829803b8f04b06b410ac2c25f8e98a3403035c2b7b4748613d9c45d8c7894b070bbe892ab516dca9d7c30275b5fc51e0e87c0058200372ce0a0a5753d2e4f0f5dd164bb0fd30c9e28b773208e9ab41624ac39c70905820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00582003db93392c1f52b40fa5f6b2e44c0c27e62cb6e8e690fa143c0aacaec70324104b433b2ff41b8a6ed012c938036140c26d6a4807eaacf96f1c8d2aa0d58ae92deec477cd4f04cf7ec507f66864021932170352c79299bcc7993440ecfd3fb9d2bb18f83c86025400e1d71bb7341a3d1229da03c3f5714f88e39734dde80babf05f489cdfb6e6c1be403015f5c336bbed9c977d03d452bacf308c49f6a589931097a4f943f46ed705b99175b13bc6290bbe9605c9036d2b226caaadc3f57c10ab36ce7494617ba8afe38e80a01fa7e4b8349eff0b0803ed08153c20c083a798976865a58fdc6da7b14aa99e4ea51f43f73decfd3c78ed03cb6ee3f7f60d97735a503afe652466c10b57f9bc6ad80130de280dcebf0584b50219ffff03ccae7dbb8bb0d5478f7b9ddcb343c821125606d0af7d02310b54e8a73db6b4140349bf1fbd1fad5ae9183edfd7985e58f8d2f0d0f791f6276e8aad65b6334466400392804b2083880ee0089c4ed1f10970bcf61a4072d0ea64f8a3fae24d0262127103d90a8f54035a230d50c0514ab74483105a9d066521e0bf68650fb494c512875303bfb16f7c29221fa5aa2ce0bf37dfa3410ecd73c6fc29ca87c28970a073a44ef8034f76801ab5a8125ad25973ef0633983604ffd9673014f7c24a4c0e31f594cc3c03449ce7c0298f291b3f58bc8bdffa1077a51ed7e0161d9fe46a6380ca1059ba430332ec03b483149a35c140f252a52ecd40b9a64682b3bc01913af998194865c32e030311aa00dc4b6bf6ba1dbc3c13e6de211373018c867ad140679e5307750b9552033f74d63eb166a2e94de1d65c5ec8192886899d25b69a3779ed0bfc4e56c6fbdf0361643984c747ad2c0c31034e97bfb00e22a383f486fb0a5471c9e1eec393543203bd9364d86feb5bb4a8548d39750ada47e7915cc8fb452609fff4936d9f07ca3703e8d4569cf7ae3ca8af3b91a841f34e741e628de8588ae1d1e685c3b69a584b31038e2f0e8c548ffb13cfb86fd86dac0b5103638f6ef2cae41c0318c7d35459d6ad037cd9d41b2d5e57a819c85fb0bcb41ef5548b85607aad3d490ed95e7c66f4c1c303c25782a20e4ab36d10e5ae56f0eef6a7ffafe752d27e9e778b8f473aa453f28601410900582003532c8bbfd8aad6024506147751490a47e89ce021541def2b754b77bd5048b05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005820033323da7e67ca5f8f7b5938f0702c852c6519772365b544d11272f24f7a0fd05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03f5eb8dce2100faeb2322346f79a805d22ef8a685ae54602a1fec3cc0a177a3ce00582003201bc5347beb9e4ba04f595f9280d633d8b8bbae002a73674606d1d71147404b0f3c2be80ddaeadbbc2b8c00582003b8c91c2aec8e1a8905e6d051ac7d8b4994cf59fd0d3450e1c7025aa16a27904b149e9eb22301646e35f7a1031e95682d575d3420a1fa40d69181b21cd61e2f850330d839f39e0b321d6cbbd000582003c088ab51b2351e6d5accdac80d1e543d823d873fb1c9331c902a425507a6a05820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02f2c15356c8065ec2c450ebead8eec19713e26dc04a0e17df722b38458dc95820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00581f02f5fbfec1a1c718eadfd87609c26520e84dcc20cc72c0ef2878b5ef4946905820ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0219402003913303f30f3f6fffb2dcc9010999b7e47065f38555cd5771427fc47ebe64da6203d4e559ab9bb1bf697598b5bc144f10aa51b41c51be32a74979c4ba6411f3c43602197fc303435c64d7a04b9429d7164a11925316eea1e3ae351a539ca7c4f1d4afc947b0dd034919041ff38ba0a45b92001cc32db47779ed620d704fcddfd669abfdcbba2e87030f561563c740a9ad02ccefdad701b87ba9f835bc1b265bfd6ac0d9207855a00203aab5a5711caaf54e3de04960810af10ec9ee4e48aa275b9c0744570d512560d2032f5c527a5698757a2852065dd7477051280ad77bbcde0d1dffdca568b9bd2ae103e30e3579a6370144e77a1326173ab79f84e3b0853b4053564d0a9f767e393f9c032817352df284fa8f2f30b181026a8cbb78a8557735a4db4880b7a09ee19a994b0219ffff035d236c1229c0b554f40ddb5f3159ff3dc2400eada4f0be7048df00b6acb3c3b703331a24fded924a51894413ee458da835dfa9b5a67d5b62ba6247dc9b2cf468420219ffff05581d028805254c4e619dcc39f3e70ddddf469798cdf56599b19efa9ff63a7107011910450219206003d75f6883ac458a4528483a72c1bc3cc2bde6b9c9c343917721ff6cc80e0374a905581e038aec84ef803b663eaabfb7c899e624b5288de18cce73b9bf9354e7dc000c02470893296d0cc5e005581e03c4f64461f41c5ad0fed41932f8986a374a5e21623be81e6e721a88ef600405031b460c826a854d61dca82f718e088b8b4c4082ffeb93752d7691bc62c51dc0280605581e03b2b4a87722f12d39e5a4e881fa9b4dad9b6c2b6345ff7b30142cde8f0007011bffffffffffffffff0219ef7f03fda786475ac131cf78b7fe9101f7295a18c61081b6c926f4af8d675f08a6179903eba3fd41271ab809f03852dea6852157868ceb4bb22079e364996673f3b27a9003faee0977bc1accc22b28a3509f77fb0220e77cbd0d443ff9f3f36be8b3a3c77803611bdb168769990e6a2e4e1889adcb70c4d28a2c73b5169f3e7958dda9987dac0219ffff03409e78ba7e81f4127c6dd67e3330900b3f028563e07b8d8ee18ab2a5bc8bf40c0335cf8d9a56821e4619b141150ad85621c3f5f880353196756a98f3298b07ac0803dde9d7af24f45585910b0ac6b5aa3b4b0b37384913e3b547311505a7fb386f0d03df9d96fd79c79b085c4f97dd46b6de5c69befe9b658a84dcebedf3726378807f03de2f4d3e1e146818a74496a6b9540b048ae8c6c4261a346c115d33af370bd1c30386a44c380c3ad28d588b42910edcc81f4d40b868067ffa8dadfa7f4fe1586943038fca6019285f75bc7fc9165bb6d7ad36d1a0a7a205e1dc5156c7078a0f41e834036946a8126a40129fb78e469934cca59ee5d37b7c64a85302c3ab3a4aedbc44ae0329d6fab1012d15bb24a5555f069e02085382deb14536125554b1dd9f4086f57603a447845db4adb215bbf2656b0ad38d85e1601a969d439b1fa58aa2180b910c480389625af592c052f22279c381e86c848d7c01d140630b8b75993d8f721df9afeb0348eb29cb93146910ce540d6ff928903d15d7b8869ba11cec2b74c0f7b355593f0219ffff0342bad1fcae613a291e955552ed9539aea09d81f3e9901861288e9ce75527bb2603857c2a6021e55c3ecb4c845c5903ba32419054f06c4694fefe4664a205292771036777bd6029a018bda01027a141bde1baba29dba20238b1fde1a04e8880071d85036ef67a4f66372aac3a476de2069bbb7850829aa3a2d812fb5e13302d2946278a039d7fdb0124bb89d6beebaf31176b64a2df9c96f567ff631faa23cae07d043a0503d5ba0a7164284ce0a5963833afc5a656bbdf3124c9ba978934234158abfa3c89034134401d55ab8657b70147709d58bc4dec5d6d30f844f20cd9d502bf4a2f2c1403e96d3fb4853cae6a58228a5708bcd15bae76133d44ec8e7e6fb6fb2961582bc503d6d69db198c4a5fafd38400212389e83ebd10f5a36a35441f9aaa4dd59f89529030e57be49466b87cf3023d3c404701ec35e982c749a7cb7bf55074de1455ab33e0219ffff03da0ef15e4512471c1f0fdcb74e7d9b9a698bb99e144b71b185567dc2a7f957d603bceed531e6b5a33bc7c53c38285b9b8c317afae8271d37e1107860a0d72c515e033c598b4cecf12003c4ea9afdbb6705eed722dce2504c008621d4c050586db13903a793f09d5fb1a5e1c386498b7bda5635730b3ca0094b535f2e9f02266906cecc0219ffff03aa4068534a9975b0001257e0c2fe2ca2e53eba1be3da12d88cf10615edb9f6ae03c5ceed00603107d284521b33aa38eb3c489394980d0fc384ba548f703649a737030f8e2be71d55cf8c589850d8f25d231c197013ae2f621946e4a20bc337f87eb403a20d393a73aeb67dfc4e2ca25ce8c8be62bdec853e386d2f7525eb32d694205b03306f1c97c95420b42329ece73ccab2fd2c3479d928501940e8409f80395c6a4c03284b5c9fd1d72bf4174b773178ed79db4ed449d70eb71d2de4f563839dd821f603405aed325812fe2bc24c3e47ca14a7d319c1769b390793229bb38a93a4fb139303e08bf03238889b49310f93c4d13e22e8b73682aaaf04c526026757cddb8b8854034601556a5447c924a262f81737e9c15117285f501b1b9273779436a3703badae039a4179bbe29e2f369c6098389eea51feb2d67e690f08a640c88a6772ff72156303be22092043e37a78b4a51c357f52e884d88cc52a62370264d36ebcde8edc721c03ec26516a63332450b02094c3c4e279061f4201adc00ace0e78c00fdd90c6c0b003796fd38681a7b447bc00119afdd13000da578ded0705a89a93825990f81b7f1803385bc2865ca7f44dfc75c486ed5bf5b41d2eda511dd6aa2e7ced7d23a57afcfc0332b4d3fdae9b84344a2c77aa3b6dc861360b23a696801bc97401e8af2bb37314037fd55291ebb774154090e26401959b68c0433d8f7bdf1378a3de43c4a9ab316c032405b73a1c62569e27ab4e41d010a80ce2b61f272451626ceeec4e141d0c7f2703295516e829ebf52caba115eb6e53e40f6df8a02ef686eb79d82b5b78de8e30d40314adec11d197956d85471be82e2c095eae30857ee8c3dcef2408d94d784e7ddb03c471f07038dd301c473d5ee5d1324df6d0027830de975814b5093c1a3716e4fb037b8e0c012a5453d2b32e2d869693797d89cade5217877342621e5169c64771d903c038c55386a10991979c16e018fb732aab01a537423f7cde0d8c4b9e7005061d0351a3239183ebf3e4ab46ab024b0a4fc033566fd94b60ffbaa3a040eaffbc6ca60317605e3fdf771dc421c06a6f8eceb592313cee228a7571a32aea51db359394a603cd93b56754ae570608a7a06f588543446e1ed1d03a2bc20b09be1234ed40bae00346016c2072b8683afe9451fe3bcb303b452bbe01546de17834cd21d8fc5fc73903f97358a689353db2a7620b5591eafe8a8aad6daf644ae66789ba121237f82d99036760d5ce784641815d6fff4b295fa185ca5702b9d1c756d56201a856499d456c0389e96641270bb073130ad9481cf46984e4c0b1ce7b9f329eae0d326e4fadcd5d030a9adc3a069b99bbd83943047ecb82c024f0cc456c5b375a4949b9455b277e2a03b3ee4a8441e3a19d3cbfd49da7564ff1f65ac9b25aa709f08e412f319916b10c03a1b51e5234a04959ece7e633e22cdea46cc65f7ecec39e2b32f34110b52f672503f1d42b6d50d37380fdc5a2feb712cb3662e6753f1d44e5eb5c7b4885e129235d035d4be196170b6d6e93e586b1322483fd6aa199051f3caefe6286ad839b765d8d03dc1698344d43a078f8c7cf608bc43bece4b14bdefdab26720d9be2c8695c34e703cf6f5ead294971b21efba5ec0a3ba83dd75c95ecdc723b01f288731957b0597e0381b6000b8a2925365cc6abdfaba917d069535ce88e640c6c763e4fdcf9adf92103fc426ee6e4d549dfa3e2779ef8b6808b857685c9dc2362a48427d3d83a8d0ebd0326f0501a42f29dc54bab2a28b97e5849c4678af413783073e0210e7adc328d97035c05f7aa594ed08009309fd37bf845c887421d7190f2c70095db1e7f950ca0f603b8a67e002b1009543282a6873957e04511f15e7a04d58856993fcc3ea7df36ba0373783021d46782d27873bce506133d3c65a0fdf484c29bd5401a57171aaf5e0403fab700bb77e50fb8a1a1b5b4a7cb626d0100850a547890b7d35ec0d3c5c1ee8403bd0872177a6ad38278fe084a7981e082df764d5fb42795dc4c77a5ac91fd888d03716cba084dcc86b1a13f46592666eab24278f4ce27d0841ee2b212b07609d6c703acf7430a0b8bf62413eaab75b9b6b51913756c937a97d5cbf5c5781be31a6698035d8e999755587ba57bc208af260c630b102e1f632a4525e3421f706a7e8a446305581e03b1b7140dbb197082853651d92061cf63c303b1acd46728e8793630cd400c02470231d0daf531e50358804d9c514e43993d72e4214f818817f3bbef070f90be05cf79234cee1908be03f13c458ec229d465ac25b6d138e98144fd1c48060ad94befdafa44cee618ffe105581e03ba8b0a0e5a87d3192df4af87840e26295455ee485895a4376f8370b2d00c02470147de98c1148805581e03760ff0c45616fcb05dc840044f6d9fac63fde0df8adb8d09a898bd50d00c024618261e87300005581e0336a36573829a8662acf38b0361590bb96da31c45b3edd25668dd3bfc70040205581d02af4083cb6c89b82c319d44aeb986481cde9f97dbd7db77e4becac7100c1a00201e8e490673486ce5463a882605581d022b75f0ab8856e4488839d159d1cb5c39391c25f3592cbd2ce04473470c01480163039f4f747b0002190802021945a90219ffff0219ffff03f13562e7e0bbe59fddbc0e4da33f80fde264f8431c92a034cbfec922276f03640339f615147699613099613104e19513af8d22a82fcafea2cfe5ad679c654e50300395d544e841d9c1853813b2911a7686ed227fabb298249f35b7d059f3de53d91203eec2235a910378bce52df73ed9599c4172db21dc5976fa691e2527789871879e0333a53c8dfcfc4e3781d921ce5743823be7a8324a2686b9d940404abd18d0f5c7031259a400f9e5d1bfe3bde08805d72f6a04804516c99f12a47e5d38cab2761bb403faefc54b75086802231233d641b595f841c2d7f622834ec0167a65569e4c2cb003b74f9660ccdd006e8623b80ebf513ade363e0d53176152c4d30f54427597c1fd035a954bda16f1b702e33b8eae4c5edc0754a399abb2c1a664b14113b92621b22e03e21c401fdf3abdfc0aa9a0fac867be5b7cd5dc8b2e801992168a7216af9333b603318fc23b123eb9a14d854158f7637e2899d5ec327f4f273d5d1e404ade0ff02803aab37afa00f2af7dfddf684496253686a5c514c9d02b18a63d1ce3eef2ba2e9303effd551c2b92e8afa2e0f29a9c817954acaefa42e66798d690a4d30913e8f49a031f6381b63464f7ee5605006d0f705722e571caa52a99453a9c42c0c989e09ad50319b2cb9787b2f50184045579c313a0949b909b760631b8ce5dcc23837f3ac2640219ffff03a9a7b7ce6826fc3cde003408d4ab7045219ed26673169eb430944f8759407ea10219ffff038e79b2c9b51b32c2d9441eb8b3071559f9db9540df984f3b4ee9993ecf037fa00302d172152466b7221303140d42525d9fc7dcd8d1ac03046db376839691554a7803d7db83803b68d24466a6447a1e3664cb0116936065a6a43c63471e214fdccf8f0374d242e51bdf0b94949d65c5dbc4282ff9f03380b7c04b0e8c12367abc31f3f503ed849d5813fb6757e352cef092648d5cc178fb74aa991c605eb4dd51c6dce304039b9218ec6bf3fbf023f03fc7521f8219182a472f7c7c0a277ca83e1765bed1ae032b3d83866d66c3aad6a47fe65413c160f9838e838e213b130504a0ce6c09ef2a037ece2ce283163e9950f6f3067ca724030a1e339f746c099e46bdc4a18ce4f69003267f5b02ecb0db4fd706f691266ed53cd83d8e53bd6ef9778535b35303e6475f0361314385ae0af152451f696cc1a77308034635a3bf453eb9972f0f3b5b3843d7034f04ac2d464c3e59f9b8a586d0dc7a5eda6072147c91a13339ccd93af837cdae0219ffff0219ffff" + } + }, + "code_db": null, + "txn_info": [ + { + "traces": { + "0x49f18c6370d3235fcc7cf4fd8167b8ca9bed0af8": { + "balance": "0x26c583e6f4de1f1b", + "nonce": "0x212b" + }, + "0x151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7f": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0xd8a47cc0a98b326a7d41ebdba69f2440a3db7a31c7edca3bc5f01523d2fabe24", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x7b78a71646e33e6e76cabfface36f52", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x100000000000000000001739d0492174ce5ffd126fffc7f6f9c957365cf6087", + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x10000960096001dff4659000000000000000017c861793bcc2ea99728962e" + }, + "code_usage": { + "read": "0x516e38ed2cd77bcb4dfb71f1afe70b0516eeb781a30e5c770fbee39aa6eb809c" + } + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": {}, + "0xcc2687c14915fd68226ccf388842515739a739bd": { + "code_usage": { + "read": "0x1b91d26a2eb23313e6e92fcd974f099f3428fd6d6e627d87d108ead574b68cb2" + } + }, + "0xaa6e8127831c9de45ae56bb1b0d4d4da6e5665bd": { + "storage_read": [ + "0xba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3", + "0x584faa44e8bbe81b643316e312b8153135ecec313a641b0e31d013822f728796" + ], + "storage_written": { + "0xba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3": "0x13b3c8f7603c2c2842ae", + "0x584faa44e8bbe81b643316e312b8153135ecec313a641b0e31d013822f728796": "0x237d1cf3f694229042" + }, + "code_usage": { + "read": "0x2105590e28e110e2e156f35dd5f376d12258ae82da2b4edab9b511d0d8bc0619" + } + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "storage_read": [ + "0xc52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9", + "0xd392e8d1b6835f6ffe48e3fa40f91a25dfa9ff2d64600e2b40173fa9c1d511bf" + ], + "storage_written": { + "0xd392e8d1b6835f6ffe48e3fa40f91a25dfa9ff2d64600e2b40173fa9c1d511bf": "0xde0b6b3a7640000", + "0xc52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9": "0x1e4537db023b263ffc" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + } + }, + "meta": { + "byte_code": "0x02f902490182212a80850755ff20688301d58394cc2687c14915fd68226ccf388842515739a739bd80b84700000003012597010000000000000de0b6b3a7640000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7f000000000000004e50ca71278ece8b0000000000237d1cf3f694229041f90195f8dd94151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7ff8c6a00000000000000000000000000000000000000000000000000000000000000002a0d8a47cc0a98b326a7d41ebdba69f2440a3db7a31c7edca3bc5f01523d2fabe24a00000000000000000000000000000000000000000000000000000000000000024a00000000000000000000000000000000000000000000000000000000000000025a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000004f85994aa6e8127831c9de45ae56bb1b0d4d4da6e5665bdf842a0ba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3a0584faa44e8bbe81b643316e312b8153135ecec313a641b0e31d013822f728796f85994c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0c52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9a0d392e8d1b6835f6ffe48e3fa40f91a25dfa9ff2d64600e2b40173fa9c1d511bf80a07c51ef3e703c82bc13da77fdbb8041933823f58c7c87a773ab38a31783148210a053e67561db17a23f5c140fb794c33993ed753d770ccc87b369e8871095166073", + "new_txn_trie_node_byte": "0x02f902490182212a80850755ff20688301d58394cc2687c14915fd68226ccf388842515739a739bd80b84700000003012597010000000000000de0b6b3a7640000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7f000000000000004e50ca71278ece8b0000000000237d1cf3f694229041f90195f8dd94151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7ff8c6a00000000000000000000000000000000000000000000000000000000000000002a0d8a47cc0a98b326a7d41ebdba69f2440a3db7a31c7edca3bc5f01523d2fabe24a00000000000000000000000000000000000000000000000000000000000000024a00000000000000000000000000000000000000000000000000000000000000025a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000004f85994aa6e8127831c9de45ae56bb1b0d4d4da6e5665bdf842a0ba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3a0584faa44e8bbe81b643316e312b8153135ecec313a641b0e31d013822f728796f85994c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0c52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9a0d392e8d1b6835f6ffe48e3fa40f91a25dfa9ff2d64600e2b40173fa9c1d511bf80a07c51ef3e703c82bc13da77fdbb8041933823f58c7c87a773ab38a31783148210a053e67561db17a23f5c140fb794c33993ed753d770ccc87b369e8871095166073", + "new_receipt_trie_node_byte": "0xb9036802f90364018301821bb9010000004000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000002000000080020000000000000000000000000000000000800000008000000000000000000000000000000000002000000000000200000000000000000002000000000000000000000000030000800000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000080000000000000000000000000000000200000000000008000000001000000000000010000000800000000000000f90259f89b94aa6e8127831c9de45ae56bb1b0d4d4da6e5665bdf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7fa0000000000000000000000000cc2687c14915fd68226ccf388842515739a739bda00000000000000000000000000000000000000000000000237d1cf3f694229041f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000cc2687c14915fd68226ccf388842515739a739bda0000000000000000000000000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7fa00000000000000000000000000000000000000000000000004e50ca71278ece8bf9011c94151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7ff863a0c42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67a0000000000000000000000000cc2687c14915fd68226ccf388842515739a739bda0000000000000000000000000cc2687c14915fd68226ccf388842515739a739bdb8a0ffffffffffffffffffffffffffffffffffffffffffffffdc82e30c096bdd6fbf0000000000000000000000000000000000000000000000004e50ca71278ece8b000000000000000000000000000000000000000017c861793bcc2ea99728962e00000000000000000000000000000000000000000000030c7ac73fb9897ea01cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4659", + "gas_used": 98843 + } + }, + { + "traces": { + "0xaa6e8127831c9de45ae56bb1b0d4d4da6e5665bd": { + "storage_read": [ + "0xba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3", + "0x6ef6c7e8f399cb2db0fa4c873fe572abbdc53d164ebe80278a1312f736e51a4a" + ], + "storage_written": { + "0x6ef6c7e8f399cb2db0fa4c873fe572abbdc53d164ebe80278a1312f736e51a4a": "0x1847fd3a07c9358c1ba", + "0xba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3": "0x137d0a7e86ce5fac6073" + }, + "code_usage": { + "read": "0x2105590e28e110e2e156f35dd5f376d12258ae82da2b4edab9b511d0d8bc0619" + } + }, + "0x1ab65eca96d51ad4d85a40c99cc6455f1af824e8": { + "balance": "0x1c70678d5ffc4c910", + "nonce": "0xd6" + }, + "0x151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7f": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0xd8a47cc0a98b326a7d41ebdba69f2440a3db7a31c7edca3bc5f01523d2fabe24", + "0x0000000000000000000000000000000000000000000000000000000000000025" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x7b7a93446ad53016a972250fbc581c1", + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x10000960096001dff46dc000000000000000017f050779bbd8f69ddf2d9bb" + }, + "code_usage": { + "read": "0x516e38ed2cd77bcb4dfb71f1afe70b0516eeb781a30e5c770fbee39aa6eb809c" + } + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9d98cc7f7141e349" + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "balance": "0x298720c707984aa2acb40", + "storage_read": [ + "0x73d637d229721ca538a0a2e9712eeef46a1889496c0a60f402b430eba28d4a2e", + "0xc52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9" + ], + "storage_written": { + "0xc52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9": "0x1ebf54f992aa1b625c", + "0x73d637d229721ca538a0a2e9712eeef46a1889496c0a60f402b430eba28d4a2e": "0x1" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0xdef1c0ded9bec7f1a1670819833240f027b25eff": { + "storage_read": [ + "0xfafa9e60b7fc3a82d6372f25242b5c1bd30e3927bfa454fa7233ccc186ec39fb", + "0x4a432555e3fde060855a28d4d0b3bf599bbd04b75121e1e4d841e85fbc68da12" + ], + "code_usage": { + "read": "0xade271f13b55729be286859c01c54fcb04c2dde098fc3bc9901c35927ece786e" + } + }, + "0x0e992c001e375785846eeb9cd69411b53f30f24b": { + "code_usage": { + "read": "0x5908b6ce9a77484c886ffc5f0635b2eca3327bdc7cc0be118d346f86250745f6" + } + } + }, + "meta": { + "byte_code": "0x02f9017e0181d5830f424085083c3424c88302391094def1c0ded9bec7f1a1670819833240f027b25eff887a1d1e906ef52260b901083598d8ab0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000036a76847622771e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb8aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd000000000000000000000000000000000000000000869584cd000000000000000000000000382ffce2287252f930e1c8dc9328dac5bf282ba1000000000000000000000000000000008357255014e1179f2b6959f49011226dc001a0d841a022ae900922b65814179dfec5760f57a4db627e00dbf851afac2bb6a4bba02862ab8cafec6edcaf55a04eb96b89f2ad43de423fc3b8481888fbcb2b00df6c", + "new_txn_trie_node_byte": "0x02f9017e0181d5830f424085083c3424c88302391094def1c0ded9bec7f1a1670819833240f027b25eff887a1d1e906ef52260b901083598d8ab0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000036a76847622771e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb8aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd000000000000000000000000000000000000000000869584cd000000000000000000000000382ffce2287252f930e1c8dc9328dac5bf282ba1000000000000000000000000000000008357255014e1179f2b6959f49011226dc001a0d841a022ae900922b65814179dfec5760f57a4db627e00dbf851afac2bb6a4bba02862ab8cafec6edcaf55a04eb96b89f2ad43de423fc3b8481888fbcb2b00df6c", + "new_receipt_trie_node_byte": "0xb903e402f903e00183033a08b9010000004000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000002000800080020000000000000000000000000000000002800000008000000000000000000000000000000008002000000000000200000000000000000002040000000000000000000000010000800000000000000000000000000000000000000000001000010000000000000000000000000000000000000004000000000000000000000000000000000000000000000000002000000000000000000000000000080000000000000040000000000000000200000000000008000000000000000000000010000400800000000000000f902d5f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca0000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25effa00000000000000000000000000000000000000000000000007a1d1e906ef52260f89b94aa6e8127831c9de45ae56bb1b0d4d4da6e5665bdf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7fa00000000000000000000000001ab65eca96d51ad4d85a40c99cc6455f1af824e8a0000000000000000000000000000000000000000000000036be78d96dcc7be23bf89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25effa0000000000000000000000000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7fa00000000000000000000000000000000000000000000000007a1d1e906ef52260f9011c94151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7ff863a0c42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67a0000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25effa00000000000000000000000001ab65eca96d51ad4d85a40c99cc6455f1af824e8b8a0ffffffffffffffffffffffffffffffffffffffffffffffc94187269233841dc50000000000000000000000000000000000000000000000007a1d1e906ef52260000000000000000000000000000000000000000017f050779bbd8f69ddf2d9bb00000000000000000000000000000000000000000000030c7ac73fb9897ea01cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff46dc", + "gas_used": 112621 + } + }, + { + "traces": { + "0xcc2687c14915fd68226ccf388842515739a739bd": { + "code_usage": { + "read": "0x1b91d26a2eb23313e6e92fcd974f099f3428fd6d6e627d87d108ead574b68cb2" + } + }, + "0x151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7f": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xd8a47cc0a98b326a7d41ebdba69f2440a3db7a31c7edca3bc5f01523d2fabe24" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x10000960096001dff4687000000000000000017d671dc8cef8aa73e4b270d", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x2168dd6f5ffee15918b6413c2f7d03e84" + }, + "code_usage": { + "read": "0x516e38ed2cd77bcb4dfb71f1afe70b0516eeb781a30e5c770fbee39aa6eb809c" + } + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e0ebbcf9956335c" + }, + "0xaa6e8127831c9de45ae56bb1b0d4d4da6e5665bd": { + "storage_read": [ + "0xba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3", + "0x584faa44e8bbe81b643316e312b8153135ecec313a641b0e31d013822f728796" + ], + "storage_written": { + "0x584faa44e8bbe81b643316e312b8153135ecec313a641b0e31d013822f728796": "0x1", + "0xba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3": "0x13a0879b7ac4f3cef0b4" + }, + "code_usage": { + "read": "0x2105590e28e110e2e156f35dd5f376d12258ae82da2b4edab9b511d0d8bc0619" + } + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "storage_read": [ + "0xc52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9", + "0xd392e8d1b6835f6ffe48e3fa40f91a25dfa9ff2d64600e2b40173fa9c1d511bf" + ], + "storage_written": { + "0xd392e8d1b6835f6ffe48e3fa40f91a25dfa9ff2d64600e2b40173fa9c1d511bf": "0x5cbf5f5d23391d08", + "0xc52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9": "0x1e707650e92e464554" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0x49f18c6370d3235fcc7cf4fd8167b8ca9bed0af8": { + "balance": "0x264431b497d56348", + "nonce": "0x212c" + } + }, + "meta": { + "byte_code": "0x02f902420182212b80850755ff20688301e05c94cc2687c14915fd68226ccf388842515739a739bd8775ef5028145013b85a00000004012597010000000000005cbf5f5d23391d08151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7faa6e8127831c9de45ae56bb1b0d4d4da6e5665bd0000000000237d1cf3f6942290410000000000004edea8a97bd51d08f90174f85994aa6e8127831c9de45ae56bb1b0d4d4da6e5665bdf842a0ba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3a0584faa44e8bbe81b643316e312b8153135ecec313a641b0e31d013822f728796f8bc94151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7ff8a5a00000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000001a0d8a47cc0a98b326a7d41ebdba69f2440a3db7a31c7edca3bc5f01523d2fabe24a00000000000000000000000000000000000000000000000000000000000000025a00000000000000000000000000000000000000000000000000000000000000000f85994c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0c52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9a0d392e8d1b6835f6ffe48e3fa40f91a25dfa9ff2d64600e2b40173fa9c1d511bf01a0b105c5752acf92923d7016e2edea7053d1ce73c43191ff51fe2da8bf6b27e37ea063a3408a605e3437ac6ce296063f7a7caa8e85298b80f942ee44b2dc64c8b6dc", + "new_txn_trie_node_byte": "0x02f902420182212b80850755ff20688301e05c94cc2687c14915fd68226ccf388842515739a739bd8775ef5028145013b85a00000004012597010000000000005cbf5f5d23391d08151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7faa6e8127831c9de45ae56bb1b0d4d4da6e5665bd0000000000237d1cf3f6942290410000000000004edea8a97bd51d08f90174f85994aa6e8127831c9de45ae56bb1b0d4d4da6e5665bdf842a0ba33e9b8db02508f048aa1db6e9c0afddb03933b0bff1a3c90d6bafefde1d9e3a0584faa44e8bbe81b643316e312b8153135ecec313a641b0e31d013822f728796f8bc94151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7ff8a5a00000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000001a0d8a47cc0a98b326a7d41ebdba69f2440a3db7a31c7edca3bc5f01523d2fabe24a00000000000000000000000000000000000000000000000000000000000000025a00000000000000000000000000000000000000000000000000000000000000000f85994c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0c52f396c407e484c805c250341c5b6182c11dea9069b8555d0a5c7093be785b9a0d392e8d1b6835f6ffe48e3fa40f91a25dfa9ff2d64600e2b40173fa9c1d511bf01a0b105c5752acf92923d7016e2edea7053d1ce73c43191ff51fe2da8bf6b27e37ea063a3408a605e3437ac6ce296063f7a7caa8e85298b80f942ee44b2dc64c8b6dc", + "new_receipt_trie_node_byte": "0xb9036802f90364018304c760b9010000004000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000002000000080020000000000000000000000000000000000800000008000000000000000000000000000000000002000000000000200000000000000000002000000000000000000000000030000800000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000080000000000000000000000000000000200000000000008000000001000000000000010000000800000000000000f90259f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7fa0000000000000000000000000cc2687c14915fd68226ccf388842515739a739bda00000000000000000000000000000000000000000000000004edea8a97bd51d08f89b94aa6e8127831c9de45ae56bb1b0d4d4da6e5665bdf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000cc2687c14915fd68226ccf388842515739a739bda0000000000000000000000000151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7fa00000000000000000000000000000000000000000000000237d1cf3f694229041f9011c94151ccb92bc1ed5c6d0f9adb5cec4763ceb66ac7ff863a0c42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67a0000000000000000000000000cc2687c14915fd68226ccf388842515739a739bda0000000000000000000000000cc2687c14915fd68226ccf388842515739a739bdb8a00000000000000000000000000000000000000000000000237d1cf3f694229041ffffffffffffffffffffffffffffffffffffffffffffffffb1215756842ae2f8000000000000000000000000000000000000000017d671dc8cef8aa73e4b270d00000000000000000000000000000000000000000000030c7ac73fb9897ea01cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4687", + "gas_used": 101720 + } + }, + { + "traces": { + "0xdbcc1787b02c39aa56f0f5365125933c08feeab0": { + "balance": "0x3137bee91a03b6b", + "nonce": "0x41" + }, + "0xf3de3c0d654fda23dad170f0f320a92172509127": { + "code_usage": { + "read": "0xe5b4a5c24225a0ec7687716ddb6728a7321fa50d7362c3a5acfe55e57b4b9564" + } + }, + "0x40aa958dd87fc8305b97f2ba922cddca374bcd7f": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000065" + ], + "code_usage": { + "read": "0xe8711c5f0fe7f3c28078140bb97b65aa015a58c06c14bad5abffa44f00f1ddf5" + } + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e0ef35ce50a235c" + }, + "0x6d7497751656618fc38cfb5478994a20f7e235df": { + "storage_read": [ + "0x2eb9e60c490d317d2a6384dacbf41a70692f1a2d46266ce32c5d6c8f769d10a6", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x72c80b5bc80df91afd56c3a951a32283559e7f7eb045d83c91efeee0d02c38fc", + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897" + ], + "storage_written": { + "0x72c80b5bc80df91afd56c3a951a32283559e7f7eb045d83c91efeee0d02c38fc": "0x0", + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897": "0x1840a21798d4d5c12f8752314" + }, + "code_usage": { + "read": "0x4123f56d86f276e684177a9b98a18f2f9d66d40208c423fe55b0e5c8f9d53abd" + } + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "balance": "0x2987209d3089f85f9af1a", + "storage_read": [ + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c", + "0xa78c3571170f7dcd4a9be5fc007f2e41d0568b2d304d741c66b27ec22dd33cfe" + ], + "storage_written": { + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c": "0x7d09f651ddc19d199", + "0xa78c3571170f7dcd4a9be5fc007f2e41d0568b2d304d741c66b27ec22dd33cfe": "0x1" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0xd420d5f24225702a68ddf21242d5eef816dc2e6d": { + "storage_read": [ + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000006" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf6087000000000007d09f651ddc19d1990001840a21798d4d5c12f8752314", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x1f3f8b4dab18b3280d3d842c2ce83b6bf72cd4cac", + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x1eef95b899058844625cad5354", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0x70cbb871e8f30fc8ce23609e9e0ea87b6b222f58": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000066", + "0xfca24f26881178fbb721486fd81006a8a2f47f9f9479f3a10e978c0ededf333a" + ], + "code_usage": { + "read": "0xb6a0916f3f4f33110bd1c57652c6e21f4beb32ffcfb50124f8b51cb5cee61f04" + } + } + }, + "meta": { + "byte_code": "0x02f901310140841dcd650085084cf716c08303910094f3de3c0d654fda23dad170f0f320a9217250912780b8c49871efa40000000000000000000000006d7497751656618fc38cfb5478994a20f7e235df000000000000000000000000000000000000000000821087388b0f2a4f45ccb40000000000000000000000000000000000000000000000000273aa821f0256880000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000170000000000000003b6d0340d420d5f24225702a68ddf21242d5eef816dc2e6dc001a06863a39687e4a7ece96ca402bdd324ac2c2a7ee422887fcbd1923642eac5457ea07008839de0dd17b4e1296982b88325ed658f439a519998e67671f3b5db141d63", + "new_txn_trie_node_byte": "0x02f901310140841dcd650085084cf716c08303910094f3de3c0d654fda23dad170f0f320a9217250912780b8c49871efa40000000000000000000000006d7497751656618fc38cfb5478994a20f7e235df000000000000000000000000000000000000000000821087388b0f2a4f45ccb40000000000000000000000000000000000000000000000000273aa821f0256880000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000170000000000000003b6d0340d420d5f24225702a68ddf21242d5eef816dc2e6dc001a06863a39687e4a7ece96ca402bdd324ac2c2a7ee422887fcbd1923642eac5457ea07008839de0dd17b4e1296982b88325ed658f439a519998e67671f3b5db141d63", + "new_receipt_trie_node_byte": "0xb9057302f9056f018306a490b9010000200000000000000000000080000000100000000000000000000000000000000000000000000000020000000000000002008000080000000000000020000000000000000000000100000008800000200080000000400000000000000000000000000000000000000008000000000000000000000000040000000010000000000000000000000000000020000200000080000000000000080000004000000000000000001000000000000040080000000001000000000000000000000000000000000002000000000000000000010000000000020000009040000002000000000100200000000000022000000000000000000000000000000000000000000020f90464f85894f3de3c0d654fda23dad170f0f320a92172509127e1a07724394874fdd8ad13292ec739b441f85c6559f10dc4141b8d4c0fa4cbf55bdba00000000000000000000000000000000000000000000000000000000000000000f89b946d7497751656618fc38cfb5478994a20f7e235dff863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000dbcc1787b02c39aa56f0f5365125933c08feeab0a0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da0000000000000000000000000000000000000000000821087388b0f2a4f45ccb4f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da0000000000000000000000000f3de3c0d654fda23dad170f0f320a92172509127a0000000000000000000000000000000000000000000000000029d70e524311c26f87994d420d5f24225702a68ddf21242d5eef816dc2e6de1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000001840a21798d4d5c12f8752314000000000000000000000000000000000000000000000007d09f651ddc19d199f8fc94d420d5f24225702a68ddf21242d5eef816dc2e6df863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a0000000000000000000000000f3de3c0d654fda23dad170f0f320a92172509127a0000000000000000000000000f3de3c0d654fda23dad170f0f320a92172509127b880000000000000000000000000000000000000000000821087388b0f2a4f45ccb400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029d70e524311c26f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65a0000000000000000000000000f3de3c0d654fda23dad170f0f320a92172509127a0000000000000000000000000000000000000000000000000029d70e524311c26f8d994f3de3c0d654fda23dad170f0f320a92172509127e1a01bb43f2da90e35f7b0cf38521ca95a49e68eb42fac49924930a5bd73cdf7576cb8a00000000000000000000000006d7497751656618fc38cfb5478994a20f7e235df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbcc1787b02c39aa56f0f5365125933c08feeab0000000000000000000000000000000000000000000821087388b0f2a4f45ccb4000000000000000000000000000000000000000000000000029d70e524311c26", + "gas_used": 122160 + } + }, + { + "traces": { + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": {}, + "0x6d7497751656618fc38cfb5478994a20f7e235df": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897", + "0xb39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470a" + ], + "storage_written": { + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897": "0x1829b4c8b8d4d5c12f8752314", + "0xb39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470a": "0x1554873fffc3522bbf655de0" + }, + "code_usage": { + "read": "0x4123f56d86f276e684177a9b98a18f2f9d66d40208c423fe55b0e5c8f9d53abd" + } + }, + "0x6b75d8af000000e20b7a7ddf000ba900b4009a80": { + "balance": "0x153a4d0bb8a49", + "code_usage": { + "read": "0x213c3f38a90242ff53461e679cef9a1bbbae20e63de087cdbc972d813c857711" + } + }, + "0xdc900845732a53ee8df737efa282a6bc56976e62": { + "storage_read": [ + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000009" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x2bc82346b12aee24647cdf327df00ffc9eea257ff0", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf608700000000000943a14c374712a218000000000001a06b4c3d0c4e80bb", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x2ef738cbf909b92548d6879e3bb43dd8dab50249c", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0xd420d5f24225702a68ddf21242d5eef816dc2e6d": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000006" + ], + "storage_written": { + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf6087000000000007d80f65efdd19d1990001829b4c8b8d4d5c12f8752314" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "storage_read": [ + "0x12231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8", + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c", + "0xc4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8" + ], + "storage_written": { + "0xc4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8": "0x943a14c374712a218", + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c": "0x7d80f65efdd19d199", + "0x12231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8": "0x1e2827b20fdf1f6807" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0x9e9fbde7c7a83c43913bddc8779158f1368f0413": { + "storage_read": [ + "0x6e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969c", + "0xab2e97a75db32eb3b19136ac5fcb6d7a64d182e81eb81decf514e3d877434a50", + "0x5026556a9e91dc9bba9215081252f333fe1d44bf12f6b47633a8259ffde03acb", + "0xa34640eb1c607d836ceb4af07c59befcec4cdb4943351c3a245f8712063aa3b6" + ], + "storage_written": { + "0x6e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969c": "0x1a06b4c3d0c4e80bb", + "0xab2e97a75db32eb3b19136ac5fcb6d7a64d182e81eb81decf514e3d877434a50": "0x5aeaca7bfd930dd" + }, + "code_usage": { + "read": "0xde2d3cb78918547c06e2d4f09804da99d8ee9dbfecc4c8023b7ccecfe92a829b" + } + }, + "0xae2fc483527b8ef99eb5d9b44875f005ba1fae13": { + "balance": "0x67338c630eb425445", + "nonce": "0x201e8f" + } + }, + "meta": { + "byte_code": "0x02f903be0183201e8e80850755ff206883030c3e946b75d8af000000e20b7a7ddf000ba900b4009a8085077000d201b83a0918d420d5f24225702a68ddf21242d5eef816dc2e6d016ed4ee0b1cdc900845732a53ee8df737efa282a6bc56976e62010b06ca5c05f18c6f06f90311f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a012231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8a0ed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285ca0c4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8f89b94d420d5f24225702a68ddf21242d5eef816dc2e6df884a00000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006f87a946d7497751656618fc38cfb5478994a20f7e235dff863a00000000000000000000000000000000000000000000000000000000000000005a0db111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897a0b39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470af8dd94dc900845732a53ee8df737efa282a6bc56976e62f8c6a00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000000cf89b949e9fbde7c7a83c43913bddc8779158f1368f0413f884a06e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969ca0ab2e97a75db32eb3b19136ac5fcb6d7a64d182e81eb81decf514e3d877434a50a05026556a9e91dc9bba9215081252f333fe1d44bf12f6b47633a8259ffde03acba0a34640eb1c607d836ceb4af07c59befcec4cdb4943351c3a245f8712063aa3b601a0b48222e32e8cc2cc6a762704fbeebd29ad70e1d3fae2f6d03f3cbbd8fb7e36e3a07fcc102dc9a7cb2fa7d608696e7b2bf8760abe7efc62bfdd59a355140f512741", + "new_txn_trie_node_byte": "0x02f903be0183201e8e80850755ff206883030c3e946b75d8af000000e20b7a7ddf000ba900b4009a8085077000d201b83a0918d420d5f24225702a68ddf21242d5eef816dc2e6d016ed4ee0b1cdc900845732a53ee8df737efa282a6bc56976e62010b06ca5c05f18c6f06f90311f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a012231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8a0ed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285ca0c4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8f89b94d420d5f24225702a68ddf21242d5eef816dc2e6df884a00000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006f87a946d7497751656618fc38cfb5478994a20f7e235dff863a00000000000000000000000000000000000000000000000000000000000000005a0db111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897a0b39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470af8dd94dc900845732a53ee8df737efa282a6bc56976e62f8c6a00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000000cf89b949e9fbde7c7a83c43913bddc8779158f1368f0413f884a06e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969ca0ab2e97a75db32eb3b19136ac5fcb6d7a64d182e81eb81decf514e3d877434a50a05026556a9e91dc9bba9215081252f333fe1d44bf12f6b47633a8259ffde03acba0a34640eb1c607d836ceb4af07c59befcec4cdb4943351c3a245f8712063aa3b601a0b48222e32e8cc2cc6a762704fbeebd29ad70e1d3fae2f6d03f3cbbd8fb7e36e3a07fcc102dc9a7cb2fa7d608696e7b2bf8760abe7efc62bfdd59a355140f512741", + "new_receipt_trie_node_byte": "0xb9067502f90671018308c6bcb9010000200000000000000008000080000000000000000000002000000000000000000000008000000020000000000080000002000000080000000000000020000000000000000000000000000008000000200080000000000000000040100000000000000020000000000000000000000000000000000000000080000110000000000000000000000000000020000200000000000000000000080000004000000000000000001000000000000000000000000000000000000000000000010040000000000002000000000000000000000000000000400000201000000000000000000100200000000000022000020000000000000000000000000000000000000020f90566f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da0000000000000000000000000000000000000000000000000077000d201000000f89b946d7497751656618fc38cfb5478994a20f7e235dff863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a00000000000000000000000000000000000000000016ed4ee0000000000000000f87994d420d5f24225702a68ddf21242d5eef816dc2e6de1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000001829b4c8b8d4d5c12f8752314000000000000000000000000000000000000000000000007d80f65efdd19d199f8fc94d420d5f24225702a68ddf21242d5eef816dc2e6df863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80b8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077000d2010000000000000000000000000000000000000000000000016ed4ee00000000000000000000000000000000000000000000000000000000000000000000000000000000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a0000000000000000000000000dc900845732a53ee8df737efa282a6bc56976e62a000000000000000000000000000000000000000000000000005f18c6f00000000f89b949e9fbde7c7a83c43913bddc8779158f1368f0413f863a0e59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487a0000000000000000000000000dc900845732a53ee8df737efa282a6bc56976e62a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a0000000000000000000000000000000000000000000000000010b06ca00000000f87994dc900845732a53ee8df737efa282a6bc56976e62e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000000000001a06b4c3d0c4e80bb00000000000000000000000000000000000000000000000943a14c374712a218f8fc94dc900845732a53ee8df737efa282a6bc56976e62f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80b880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f18c6f00000000000000000000000000000000000000000000000000000000010b06ca000000000000000000000000000000000000000000000000000000000000000000000000", + "gas_used": 139820 + } + }, + { + "traces": { + "0xd420d5f24225702a68ddf21242d5eef816dc2e6d": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf6087000000000007e214465736aa6691000180b16886732f5b2b7244d35e", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0xebe6ef3a90f3219764c80ad4ed14c5d55fc0f7ed": { + "balance": "0xaacdccf86fb814", + "nonce": "0x26" + }, + "0x6d7497751656618fc38cfb5478994a20f7e235df": { + "storage_read": [ + "0x1bd9b9754ce474ec09aee3e6d6cc57e37d6bee4279bea3ecb0c393a9fbd783e8", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897" + ], + "storage_written": { + "0x1bd9b9754ce474ec09aee3e6d6cc57e37d6bee4279bea3ecb0c393a9fbd783e8": "0x9fdd79ca9a7417fca304fb6", + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897": "0x180b16886732f5b2b7244d35e" + }, + "code_usage": { + "read": "0x4123f56d86f276e684177a9b98a18f2f9d66d40208c423fe55b0e5c8f9d53abd" + } + }, + "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x1" + }, + "code_usage": { + "read": "0xc4f0904cd0f741bb3ab2a16013d23b4d72eec59e3cb24879f0f0ba0c3fea24d9" + } + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e0ef37450502d5c" + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "balance": "0x2987213d7e906df8a4412", + "storage_read": [ + "0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a", + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c" + ], + "storage_written": { + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c": "0x7e214465736aa6691", + "0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a": "0x0" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + } + }, + "meta": { + "byte_code": "0x02f902f90125830f42408507a19bfef983025906943fc91a3afd70395cd496c647d5a6cc9d4b2b7fad880a04e067599094f8b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000065cf62bb00000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000a04e067599094f8000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000a04e067599094f8000000000000000000000000000000000000000001e9e3fee017a9c00d7d992000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006d7497751656618fc38cfb5478994a20f7e235dfc001a0a7d3c4fa4d22844eef8509336c17265312ca81f3d2e04fe6ac1a36de9a9553c6a01dbe233b219a43644e29c3f467487ac529fb475fcf08c4865b6f98207347999e", + "new_txn_trie_node_byte": "0x02f902f90125830f42408507a19bfef983025906943fc91a3afd70395cd496c647d5a6cc9d4b2b7fad880a04e067599094f8b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000065cf62bb00000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000a04e067599094f8000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000a04e067599094f8000000000000000000000000000000000000000001e9e3fee017a9c00d7d992000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006d7497751656618fc38cfb5478994a20f7e235dfc001a0a7d3c4fa4d22844eef8509336c17265312ca81f3d2e04fe6ac1a36de9a9553c6a01dbe233b219a43644e29c3f467487ac529fb475fcf08c4865b6f98207347999e", + "new_receipt_trie_node_byte": "0xb9043e02f9043a01830a4fa4b9010000200000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000002000000080000000000000020000000000000080000000000000008000000200080800000000000000000008020000000000000000000000000000000000000000000000000000000000010000000000000000000000000000020000200000000000001000000080000004000080000000000001000000000000000000000000000000000040000000000000000000000000002000000000000000000000000000000000000001000000000000000000100200000000000022000000000000000001000000000400000000000000020f9032ff87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada00000000000000000000000000000000000000000000000000a04e067599094f8f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da00000000000000000000000000000000000000000000000000a04e067599094f8f89b946d7497751656618fc38cfb5478994a20f7e235dff863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da0000000000000000000000000ebe6ef3a90f3219764c80ad4ed14c5d55fc0f7eda0000000000000000000000000000000000000000001e9e4051a1e00e786304fb6f87994d420d5f24225702a68ddf21242d5eef816dc2e6de1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000180b16886732f5b2b7244d35e000000000000000000000000000000000000000000000007e214465736aa6691f8fc94d420d5f24225702a68ddf21242d5eef816dc2e6df863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada0000000000000000000000000ebe6ef3a90f3219764c80ad4ed14c5d55fc0f7edb88000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a04e067599094f8000000000000000000000000000000000000000001e9e4051a1e00e786304fb60000000000000000000000000000000000000000000000000000000000000000", + "gas_used": 100584 + } + }, + { + "traces": { + "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x1" + }, + "code_usage": { + "read": "0xc4f0904cd0f741bb3ab2a16013d23b4d72eec59e3cb24879f0f0ba0c3fea24d9" + } + }, + "0x6d7497751656618fc38cfb5478994a20f7e235df": { + "storage_read": [ + "0x7c44a045784228dd49bfe46362ff42dc299b3ecd9d8e17fe35caec0494fff806", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897" + ], + "storage_written": { + "0x7c44a045784228dd49bfe46362ff42dc299b3ecd9d8e17fe35caec0494fff806": "0x150722519ffe5a962caf11c", + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897": "0x17f60f661592f75820f79e242" + }, + "code_usage": { + "read": "0x4123f56d86f276e684177a9b98a18f2f9d66d40208c423fe55b0e5c8f9d53abd" + } + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "balance": "0x298721ac84460b33c4412", + "storage_read": [ + "0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a", + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c" + ], + "storage_written": { + "0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a": "0x0", + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c": "0x7e904a1b10a5c6691" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0xd420d5f24225702a68ddf21242d5eef816dc2e6d": { + "storage_read": [ + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf6087000000000007e904a1b10a5c669100017f60f661592f75820f79e242", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0xe36c5bd8f0b71155a26bec6bb103797e67b28df0": { + "balance": "0x389313b0ead419f6", + "nonce": "0x1a" + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e0ef4912e569c84" + } + }, + "meta": { + "byte_code": "0x02f902f90119839f2e54850a83ee7e738302aa0a943fc91a3afd70395cd496c647d5a6cc9d4b2b7fad8806f05b59d3b20000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000065cf62d300000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000014ebc6f42105214e1f88fbc00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006d7497751656618fc38cfb5478994a20f7e235dfc080a0220d39417b91ac5956b93280fa407e6f1ac3065e02b7abb24c3ede578724c097a07f5afa6d389eb30a95511c3eb34720c858741653c7bc8f71d48efdefdc004946", + "new_txn_trie_node_byte": "0x02f902f90119839f2e54850a83ee7e738302aa0a943fc91a3afd70395cd496c647d5a6cc9d4b2b7fad8806f05b59d3b20000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000065cf62d300000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000014ebc6f42105214e1f88fbc00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006d7497751656618fc38cfb5478994a20f7e235dfc080a0220d39417b91ac5956b93280fa407e6f1ac3065e02b7abb24c3ede578724c097a07f5afa6d389eb30a95511c3eb34720c858741653c7bc8f71d48efdefdc004946", + "new_receipt_trie_node_byte": "0xb9043e02f9043a01830c19c6b90100002000000000000000000000800000000000000000000000000000020000000000000000000000000000000000000000020000000800000000000000200000000000000800000000000000080000002000800000000000000000000080200000000000000000000000000000000000000000000000000000000000100000000000000000000000000000200002000000000002010000000800000040000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000010000000000000000001002000000000000220000000000000000010000000004000000000000000a0f9032ff87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada000000000000000000000000000000000000000000000000006f05b59d3b20000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da000000000000000000000000000000000000000000000000006f05b59d3b20000f89b946d7497751656618fc38cfb5478994a20f7e235dff863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da0000000000000000000000000e36c5bd8f0b71155a26bec6bb103797e67b28df0a000000000000000000000000000000000000000000150722519ffe5a962caf11cf87994d420d5f24225702a68ddf21242d5eef816dc2e6de1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b84000000000000000000000000000000000000000017f60f661592f75820f79e242000000000000000000000000000000000000000000000007e904a1b10a5c6691f8fc94d420d5f24225702a68ddf21242d5eef816dc2e6df863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada0000000000000000000000000e36c5bd8f0b71155a26bec6bb103797e67b28df0b880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000150722519ffe5a962caf11c0000000000000000000000000000000000000000000000000000000000000000", + "gas_used": 117282 + } + }, + { + "traces": { + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "balance": "0x2987274fce7f073464412", + "storage_read": [ + "0xfa6504e3ecae9cba67ae6b5b6e806a51a8edcbb5a1e390b371e2de4942e15e5c", + "0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a", + "0xc4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8" + ], + "storage_written": { + "0xfa6504e3ecae9cba67ae6b5b6e806a51a8edcbb5a1e390b371e2de4942e15e5c": "0x10efca6d71a9428e0fa", + "0xc4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8": "0x95a2e751b37152218", + "0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a": "0x0" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0x1df4c6e36d61416813b42fe32724ef11e363eddc": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8", + "0x0000000000000000000000000000000000000000000000000000000000000008" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x1000001b00000000000002040fa732129f4495d38000003b3168b2065cf6087", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x687f9ab5d70e304a0d73676075b00bd1", + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x10000010001000000442a00000000000000026493740823657f8089cb74c9" + }, + "code_usage": { + "read": "0xd9dcbdd3357d2c78ff4cc419e310f02017343dd23dafea9c650d2f0a146e76e4" + } + }, + "0xdc900845732a53ee8df737efa282a6bc56976e62": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007" + ], + "storage_written": { + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf60870000000000095a2e751b371522180000000000019c8228845f595370" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x1" + }, + "code_usage": { + "read": "0xc4f0904cd0f741bb3ab2a16013d23b4d72eec59e3cb24879f0f0ba0c3fea24d9" + } + }, + "0x9b76d386a5fd08908b9ebcd5997abbfd3a2d5225": { + "balance": "0x2589416a6d4e993", + "nonce": "0x655" + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e0ef731d7d03b74" + }, + "0x9e9fbde7c7a83c43913bddc8779158f1368f0413": { + "storage_read": [ + "0x7cbb9844f0e5b9ec22c652052569aae01ddeea1751c55120863e0f68310d1817", + "0x6e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969c", + "0x6110bdf7f338e605fe2de714e58354b9585061b394826a31bde40b788d384885", + "0x3aa2b2cb7392b06aa80dc060f242a1f6af24d5a5a85dc9c33b99fd974b80180d", + "0x3065b18c8be765242d5fce3e8976149d3d206de20dd939d9c797588978857717", + "0xbc13ce45e8a7427d0b04b31b6ecc1da81d3ef01808d0276ffa53991d07181065", + "0x1455294b9a8b6ae86c252fe9623af6c72d50bca1f4c6e530b6a1bcdf11e9e534", + "0x3b9931a3dd2045a353fff56daf77ae19462c7ce97a1e636ea8ee91f3409f006a", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x137d347834f4c0d606fb68dc1135a7458a32b2cfc9ef669be6b41be8aa350530", + "0x5026556a9e91dc9bba9215081252f333fe1d44bf12f6b47633a8259ffde03acb", + "0x0c82ab7793b0bf162f6f8a92cd0d311fa5421543395fbbf697960792e8f73704", + "0x9c4430f5adfa288e18fd6c6beedc13d3151020bdc380fdf63bf06a45d605dbae" + ], + "storage_written": { + "0xec824f15865e4f487f296b7097b0e9faf596562c8dc2ab2672b19ce830da8646": "0x0", + "0x0c82ab7793b0bf162f6f8a92cd0d311fa5421543395fbbf697960792e8f73704": "0x9b76d386a5fd08908b9ebcd5997abbfd3a2d5225", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0xd108", + "0x137d347834f4c0d606fb68dc1135a7458a32b2cfc9ef669be6b41be8aa350530": "0xf9d99261a8e0e87", + "0x638ec225f8b272946de63a54e6ab2745ac543226609f3b32cf416ac38acb5826": "0x0", + "0x6e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969c": "0x19c8228845f595370", + "0x934583f3a9ac11ca412bcb979f8a9c2bc4551a31930984b6fbbf6c3e2ae52ca0": "0xd108", + "0x1455294b9a8b6ae86c252fe9623af6c72d50bca1f4c6e530b6a1bcdf11e9e534": "0x400882ca47ace78425", + "0x3065b18c8be765242d5fce3e8976149d3d206de20dd939d9c797588978857717": "0x0", + "0x3aa2b2cb7392b06aa80dc060f242a1f6af24d5a5a85dc9c33b99fd974b80180d": "0x0", + "0x7cbb9844f0e5b9ec22c652052569aae01ddeea1751c55120863e0f68310d1817": "0x0", + "0x6110bdf7f338e605fe2de714e58354b9585061b394826a31bde40b788d384885": "0x1d", + "0x9c4430f5adfa288e18fd6c6beedc13d3151020bdc380fdf63bf06a45d605dbae": "0x1" + }, + "code_usage": { + "read": "0xde2d3cb78918547c06e2d4f09804da99d8ee9dbfecc4c8023b7ccecfe92a829b" + } + } + }, + "meta": { + "byte_code": "0x02f9043b01820654839f2e54850a83ee7e738306136a943fc91a3afd70395cd496c647d5a6cc9d4b2b7fad885a34a38fc00a0000b903c43593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000065cf62c700000000000000000000000000000000000000000000000000000000000000030b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000005a34a38fc00a000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000168d28e3f002800000000000000000000000000000000000000000000000000003e923ae5641b48100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000009e9fbde7c7a83c43913bddc8779158f1368f04130000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000043a77aabd00780000000000000000000000000000000000000000000000000000ba58d0ad0652c8800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20027109e9fbde7c7a83c43913bddc8779158f1368f0413000000000000000000000000000000000000000000c080a0c6c29ae62a8518f90964b3b89b854e3063bcd5de18e976fd15799dd6bf7141cfa0778acfdb416cc2f46feab71098bba323f340d60892488b72cf562fcb3effecbf", + "new_txn_trie_node_byte": "0x02f9043b01820654839f2e54850a83ee7e738306136a943fc91a3afd70395cd496c647d5a6cc9d4b2b7fad885a34a38fc00a0000b903c43593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000065cf62c700000000000000000000000000000000000000000000000000000000000000030b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000005a34a38fc00a000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000168d28e3f002800000000000000000000000000000000000000000000000000003e923ae5641b48100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000009e9fbde7c7a83c43913bddc8779158f1368f04130000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000043a77aabd00780000000000000000000000000000000000000000000000000000ba58d0ad0652c8800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20027109e9fbde7c7a83c43913bddc8779158f1368f0413000000000000000000000000000000000000000000c080a0c6c29ae62a8518f90964b3b89b854e3063bcd5de18e976fd15799dd6bf7141cfa0778acfdb416cc2f46feab71098bba323f340d60892488b72cf562fcb3effecbf", + "new_receipt_trie_node_byte": "0xb907d302f907cf0183105392b9010000200000000000000008000080000000000000000000802000000000000000000000000000000200000000000080000002000000080020000000000000000040000000080000000800000008000000200000000000000000000040108020000000000020020000004000000000000800000000000000000200000110000800000000000000000000000000040000040000000001000000080000024000000000000000000000000000840000000000200000000000000000000000010040000000000002000000000000000000000000000000400000201000000000000020000080200020000000000000020000000000001000000000400000100000000000f906c4f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada00000000000000000000000000000000000000000000000005a34a38fc00a0000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada0000000000000000000000000dc900845732a53ee8df737efa282a6bc56976e62a0000000000000000000000000000000000000000000000000168d28e3f0028000f89c949e9fbde7c7a83c43913bddc8779158f1368f0413f884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000dc900845732a53ee8df737efa282a6bc56976e62a00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000d10780f89b949e9fbde7c7a83c43913bddc8779158f1368f0413f863a0e59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487a0000000000000000000000000dc900845732a53ee8df737efa282a6bc56976e62a00000000000000000000000009b76d386a5fd08908b9ebcd5997abbfd3a2d5225a000000000000000000000000000000000000000000000000003e923b8acf52d4bf87994dc900845732a53ee8df737efa282a6bc56976e62e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000000019c8228845f5953700000000000000000000000000000000000000000000000095a2e751b37152218f8fc94dc900845732a53ee8df737efa282a6bc56976e62f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada00000000000000000000000009b76d386a5fd08908b9ebcd5997abbfd3a2d5225b8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000168d28e3f002800000000000000000000000000000000000000000000000000003e923b8acf52d4b0000000000000000000000000000000000000000000000000000000000000000f89c949e9fbde7c7a83c43913bddc8779158f1368f0413f884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000009b76d386a5fd08908b9ebcd5997abbfd3a2d5225a0000000000000000000000000000000000000000000000000000000000000d10880f89b949e9fbde7c7a83c43913bddc8779158f1368f0413f863a0e59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487a00000000000000000000000001df4c6e36d61416813b42fe32724ef11e363eddca00000000000000000000000009b76d386a5fd08908b9ebcd5997abbfd3a2d5225a00000000000000000000000000000000000000000000000000bb4756d6d98e13cf89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada00000000000000000000000001df4c6e36d61416813b42fe32724ef11e363eddca000000000000000000000000000000000000000000000000043a77aabd0078000f9011c941df4c6e36d61416813b42fe32724ef11e363eddcf863a0c42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67a00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada00000000000000000000000009b76d386a5fd08908b9ebcd5997abbfd3a2d5225b8a0fffffffffffffffffffffffffffffffffffffffffffffffff44b8a9292671ec400000000000000000000000000000000000000000000000043a77aabd007800000000000000000000000000000000000000000026493740823657f8089cb74c90000000000000000000000000000000000000000000000aab081aa14a00c686a000000000000000000000000000000000000000000000000000000000000442a", + "gas_used": 276940 + } + }, + { + "traces": { + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "storage_read": [ + "0xc4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8", + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c", + "0x12231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8" + ], + "storage_written": { + "0x12231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8": "0x1e35b19a1ee01f6807", + "0xed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285c": "0x7e180001c095c6691", + "0xc4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8": "0x954292ea137152218" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0xd420d5f24225702a68ddf21242d5eef816dc2e6d": { + "storage_read": [ + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf6087000000000007e180001c095c6691000180cfcb4e592f75820f79e242", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0x6b75d8af000000e20b7a7ddf000ba900b4009a80": { + "balance": "0x153ac555d1f4a", + "code_usage": { + "read": "0x213c3f38a90242ff53461e679cef9a1bbbae20e63de087cdbc972d813c857711" + } + }, + "0xdc900845732a53ee8df737efa282a6bc56976e62": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000006" + ], + "storage_written": { + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf608700000000000954292ea1371522180000000000019d8d2f4d5f595370" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e19185fe4f74274" + }, + "0x6d7497751656618fc38cfb5478994a20f7e235df": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0xb39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470a", + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897" + ], + "storage_written": { + "0xdb111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897": "0x180cfcb4e592f75820f79e242", + "0xb39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470a": "0x13e5b252ffc3522bbf655de0" + }, + "code_usage": { + "read": "0x4123f56d86f276e684177a9b98a18f2f9d66d40208c423fe55b0e5c8f9d53abd" + } + }, + "0x9e9fbde7c7a83c43913bddc8779158f1368f0413": { + "storage_read": [ + "0xa34640eb1c607d836ceb4af07c59befcec4cdb4943351c3a245f8712063aa3b6", + "0x5026556a9e91dc9bba9215081252f333fe1d44bf12f6b47633a8259ffde03acb", + "0xab2e97a75db32eb3b19136ac5fcb6d7a64d182e81eb81decf514e3d877434a50", + "0x6e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969c" + ], + "storage_written": { + "0x6e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969c": "0x19d8d2f4d5f595370", + "0xab2e97a75db32eb3b19136ac5fcb6d7a64d182e81eb81decf514e3d877434a50": "0x4a3a5debfd930dd" + }, + "code_usage": { + "read": "0xde2d3cb78918547c06e2d4f09804da99d8ee9dbfecc4c8023b7ccecfe92a829b" + } + }, + "0xae2fc483527b8ef99eb5d9b44875f005ba1fae13": { + "balance": "0x673201310c98ee9f4", + "nonce": "0x201e90" + } + }, + "meta": { + "byte_code": "0x02f903810183201e8f850c6fa6bfe8850c6fa6bfe88302d659946b75d8af000000e20b7a7ddf000ba900b4009a80850784a19501b83a7f386d7497751656618fc38cfb5478994a20f7e235df016ed4ed8b3c9e9fbde7c7a83c43913bddc8779158f1368f0413010b06c93c0605467a06f902cff87a946d7497751656618fc38cfb5478994a20f7e235dff863a00000000000000000000000000000000000000000000000000000000000000005a0b39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470aa0db111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897f89b94d420d5f24225702a68ddf21242d5eef816dc2e6df884a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0c4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8a0ed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285ca012231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8f89b949e9fbde7c7a83c43913bddc8779158f1368f0413f884a06e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969ca0a34640eb1c607d836ceb4af07c59befcec4cdb4943351c3a245f8712063aa3b6a05026556a9e91dc9bba9215081252f333fe1d44bf12f6b47633a8259ffde03acba0ab2e97a75db32eb3b19136ac5fcb6d7a64d182e81eb81decf514e3d877434a50f89b94dc900845732a53ee8df737efa282a6bc56976e62f884a00000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000000680a036a7f2a293f3ce240ee26aa2454a653a442aa817ce2c34f780fc46de5254a98aa01472bb980737e6a7b83cf1d8460e0144dadcf5e9aea3c58106059f680edbd7b2", + "new_txn_trie_node_byte": "0x02f903810183201e8f850c6fa6bfe8850c6fa6bfe88302d659946b75d8af000000e20b7a7ddf000ba900b4009a80850784a19501b83a7f386d7497751656618fc38cfb5478994a20f7e235df016ed4ed8b3c9e9fbde7c7a83c43913bddc8779158f1368f0413010b06c93c0605467a06f902cff87a946d7497751656618fc38cfb5478994a20f7e235dff863a00000000000000000000000000000000000000000000000000000000000000005a0b39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470aa0db111b6bab9f3303f59a63f0eb7b11cf5482c92ef8f241614c4c2bca1d38f897f89b94d420d5f24225702a68ddf21242d5eef816dc2e6df884a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0c4b5945b3d588809025580057cbcadbb58fc33740a13703202de569e28ad94f8a0ed86a1228e69cf38993e7d0567ff50154ce028b0b2307ce2b12f66fa0c6a285ca012231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8f89b949e9fbde7c7a83c43913bddc8779158f1368f0413f884a06e6081c5b55abcaa3c6e2e8a592b973640109071879cd803b85d3d706ee3969ca0a34640eb1c607d836ceb4af07c59befcec4cdb4943351c3a245f8712063aa3b6a05026556a9e91dc9bba9215081252f333fe1d44bf12f6b47633a8259ffde03acba0ab2e97a75db32eb3b19136ac5fcb6d7a64d182e81eb81decf514e3d877434a50f89b94dc900845732a53ee8df737efa282a6bc56976e62f884a00000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000000680a036a7f2a293f3ce240ee26aa2454a653a442aa817ce2c34f780fc46de5254a98aa01472bb980737e6a7b83cf1d8460e0144dadcf5e9aea3c58106059f680edbd7b2", + "new_receipt_trie_node_byte": "0xb9067502f906710183125004b9010000200000000000000008000080000000000000000000002000000000000000000000008000000020000000000080000002000000080000000000000020000000000000000000000000000008000000200080000000000000000040100000000000000020000000000000000000000000000000000000000080000110000000000000000000000000000020000200000000000000000000080000004000000000000000001000000000000000000000000000000000000000000000010040000000000002000000000000000000000000000000400000201000000000000000000100200000000000022000020000000000000000000000000000000000000020f90566f89b946d7497751656618fc38cfb5478994a20f7e235dff863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da00000000000000000000000000000000000000000016ed4ed0000000000000000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d420d5f24225702a68ddf21242d5eef816dc2e6da00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a00000000000000000000000000000000000000000000000000784a19501000000f87994d420d5f24225702a68ddf21242d5eef816dc2e6de1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000180cfcb4e592f75820f79e242000000000000000000000000000000000000000000000007e180001c095c6691f8fc94d420d5f24225702a68ddf21242d5eef816dc2e6df863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80b8800000000000000000000000000000000000000000016ed4ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000784a19501000000f89b949e9fbde7c7a83c43913bddc8779158f1368f0413f863a0e59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a0000000000000000000000000dc900845732a53ee8df737efa282a6bc56976e62a0000000000000000000000000000000000000000000000000010b06c900000000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000dc900845732a53ee8df737efa282a6bc56976e62a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a00000000000000000000000000000000000000000000000000605467a00000000f87994dc900845732a53ee8df737efa282a6bc56976e62e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000000019d8d2f4d5f59537000000000000000000000000000000000000000000000000954292ea137152218f8fc94dc900845732a53ee8df737efa282a6bc56976e62f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80a00000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80b880000000000000000000000000000000000000000000000000010b06c900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000605467a00000000", + "gas_used": 130162 + } + }, + { + "traces": { + "0xee1c139ea09924a95b98b56a68efc1104f049f21": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x336a15c2de424b150f2fe74517a91cf099618a9cc06476ee6969c87d83e552f7", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x3f21a237864d150ec73673aa9343e861c8699ada868b369630fe86259d2cc7b1", + "0xea698147b9768f539806750d0817afddf757d04fa6faa24ab18cb700ddf86c0d", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x27c000cb4a36e527548c82ca9c4152888ae4f091d192793223fa9fa8cdfdf108", + "0x382bec4ba2f2bddade773da93a20c3dc1f1a4da957985a987e0c01c70cb2c10f", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0xc3c109542df5f0b35d6c0977e1181ed3e16d8b7c34539182429309bafc1d36d9", + "0x000000000000000000000000000000000000000000000000000000000000000d" + ], + "storage_written": { + "0x000000000000000000000000000000000000000000000000000000000000000d": "0xcd", + "0x27c000cb4a36e527548c82ca9c4152888ae4f091d192793223fa9fa8cdfdf108": "0x20fa172815c441c0c", + "0x382bec4ba2f2bddade773da93a20c3dc1f1a4da957985a987e0c01c70cb2c10f": "0x6017fd9172c848c" + }, + "code_usage": { + "read": "0xff219df1cfcda45d9a2b4e3531676c6610f25962c839f543a04177f5904ef6ef" + } + }, + "0xbcd3a47e4d0000cf170e25d1bd3d53f7c08be0a6": { + "code_usage": { + "read": "0x6ed615a0ca19cd89538543cdcb17a7e8d26147013208623b1efd12f8361aa814" + } + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "balance": "0x29872765e68ecacafbd10", + "storage_read": [ + "0xb2940356fd89a84cf9a86227596a2f59f085c679d5f9450737d0ae4daf0efcea", + "0xa1418cf079260397be8c8824a66003accc52fdb01dd81e3e13c62f524976fed6" + ], + "storage_written": { + "0xa1418cf079260397be8c8824a66003accc52fdb01dd81e3e13c62f524976fed6": "0x7a5498b1e8721b5b", + "0xb2940356fd89a84cf9a86227596a2f59f085c679d5f9450737d0ae4daf0efcea": "0x0" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0x3328f7f4a1d1c57c35df56bbf0c9dcafca309c49": { + "balance": "0x11d6e5436565d2728", + "storage_read": [ + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x11d6e5436565d2726" + }, + "code_usage": { + "read": "0x4d9be648c5bf39973670d9f8b481d5d0b971e6a2db2deccc6b98cde21c5dd83e" + } + }, + "0xdf675ac7eb6a7053e6988565f57dc3da177661ef": { + "storage_read": [ + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x0000000000000000000000000000000000000000000000000000000000000008" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000009": "0x1774754155affcf0e8b24d330868aa174", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0xf52066d55f7abecb88d1a8dffc1e30", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf60870000000000020fa172815c441c0c0000000000007a5498b1e8721b5b", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0x3d427f91ebcd2943e7fff89975a9a49b27bbbb57": { + "balance": "0x1851e56df56915f2", + "nonce": "0x1d1" + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e2097c968f96274" + } + }, + "meta": { + "byte_code": "0x02f9023d018201d08502cb417800850a214098688307c524943328f7f4a1d1c57c35df56bbf0c9dcafca309c4988016345785d8a0000b901c40162e2d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001600000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000065cf6087000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039a7fe8a7811c5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ee1c139ea09924a95b98b56a68efc1104f049f21c001a0d4991c42fd0a6bbe99e02ad76f0bec40e8eceae6dc020634fd1753f0f27672b2a056102edb5986f3753438277d85e83a5359d6e768a79281a73799135ceeb7a45b", + "new_txn_trie_node_byte": "0x02f9023d018201d08502cb417800850a214098688307c524943328f7f4a1d1c57c35df56bbf0c9dcafca309c4988016345785d8a0000b901c40162e2d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001600000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000065cf6087000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039a7fe8a7811c5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ee1c139ea09924a95b98b56a68efc1104f049f21c001a0d4991c42fd0a6bbe99e02ad76f0bec40e8eceae6dc020634fd1753f0f27672b2a056102edb5986f3753438277d85e83a5359d6e768a79281a73799135ceeb7a45b", + "new_receipt_trie_node_byte": "0xb9057402f90570018314ff00b9010000200000000000000000000080000000080000000000000000000000000000000000040000000000000000020000000002000000080000200020200000000000000000000000000000000008000000200000000000000000000000008004000000000000000120000000000000000400200000400000000000000010000000000000000000000000000020000000020000000001000000080000004000000000000000000000000002001000000000082000000000080000040000000000000000000002000000000080000000000000040001000000001000000000000000000000200000000000000000000000000000080000000000400000000000000000f90465f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca00000000000000000000000003328f7f4a1d1c57c35df56bbf0c9dcafca309c49a0000000000000000000000000000000000000000000000000016180fc396978fef89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000003328f7f4a1d1c57c35df56bbf0c9dcafca309c49a0000000000000000000000000df675ac7eb6a7053e6988565f57dc3da177661efa0000000000000000000000000000000000000000000000000016180fc396978fef89b94ee1c139ea09924a95b98b56a68efc1104f049f21f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000df675ac7eb6a7053e6988565f57dc3da177661efa00000000000000000000000003d427f91ebcd2943e7fff89975a9a49b27bbbb57a000000000000000000000000000000000000000000000000006017fd9172c848cf87994df675ac7eb6a7053e6988565f57dc3da177661efe1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000000007a5498b1e8721b5b0000000000000000000000000000000000000000000000020fa172815c441c0cf8fc94df675ac7eb6a7053e6988565f57dc3da177661eff863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000003328f7f4a1d1c57c35df56bbf0c9dcafca309c49a00000000000000000000000003d427f91ebcd2943e7fff89975a9a49b27bbbb57b880000000000000000000000000000000000000000000000000016180fc396978fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006017fd9172c848cf899943328f7f4a1d1c57c35df56bbf0c9dcafca309c49e1a072015ace03712f361249380657b3d40777dd8f8a686664cab48afd9dbbe4499fb8600000000000000000000000000000000000000000000000000001c47c242087010000000000000000000000003d427f91ebcd2943e7fff89975a9a49b27bbbb570000000000000000000000000000000000000000000000000000000000000012f899943328f7f4a1d1c57c35df56bbf0c9dcafca309c49e1a09f849d23f4955d98202378ea318f2b0c7533695d3c9fb2a3931f0f919fa8c420b860000000000000000000000000000000000000000000000000016180fc396978fe00000000000000000000000000000000000000000000000006017fd9172c848c00000000000000000000000000000000000000000000000006017fd9172c848c", + "gas_used": 175868 + } + }, + { + "traces": { + "0x7a250d5630b4cf539739df2c5dacb4c659f2488d": { + "code_usage": { + "read": "0xa324bc7db3d091b6f1a2d526e48a9c7039e03b3cc35f7d44b15ac7a1544c11d2" + } + }, + "0xdf675ac7eb6a7053e6988565f57dc3da177661ef": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf608700000000000203f58c05f29fc1be0000000000007d1b23a2a3861b5b", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0xee1c139ea09924a95b98b56a68efc1104f049f21": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x20bbe88de1a142167932f8ddec2bb05de590675e9f971acea869b6f70144240b", + "0x336a15c2de424b150f2fe74517a91cf099618a9cc06476ee6969c87d83e552f7", + "0xae6ca7f389261fe7398f95da232e6501150488dc1b71131270c7e152bf7baea3", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x3f21a237864d150ec73673aa9343e861c8699ada868b369630fe86259d2cc7b1", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x5ec555b6279df85a9179991aed8c52c620ea49f11355a1d8aaf78a9d909be0ff", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x27c000cb4a36e527548c82ca9c4152888ae4f091d192793223fa9fa8cdfdf108", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage_written": { + "0x5ec555b6279df85a9179991aed8c52c620ea49f11355a1d8aaf78a9d909be0ff": "0x1b04061dabe01086", + "0x27c000cb4a36e527548c82ca9c4152888ae4f091d192793223fa9fa8cdfdf108": "0x203f58c05f29fc1be", + "0x000000000000000000000000000000000000000000000000000000000000000d": "0xce" + }, + "code_usage": { + "read": "0xff219df1cfcda45d9a2b4e3531676c6610f25962c839f543a04177f5904ef6ef" + } + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "balance": "0x298727924f3dd67c3bd10", + "storage_read": [ + "0xfb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba8", + "0xa1418cf079260397be8c8824a66003accc52fdb01dd81e3e13c62f524976fed6" + ], + "storage_written": { + "0xa1418cf079260397be8c8824a66003accc52fdb01dd81e3e13c62f524976fed6": "0x7d1b23a2a3861b5b", + "0xfb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba8": "0x0" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + }, + "0x85fe958bf2c9289855977c0ae99752094a159000": { + "balance": "0x4e44434923c7ed2e", + "nonce": "0x1d5" + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e2525dce26d3874" + } + }, + "meta": { + "byte_code": "0x02f9015c018201d485025a01c50085126f7eeb008304f014947a250d5630b4cf539739df2c5dacb4c659f2488d8802c68af0bb140000b8e4b6f9de9500000000000000000000000000000000000000000000000005f7d1e9e0a5719c000000000000000000000000000000000000000000000000000000000000008000000000000000000000000085fe958bf2c9289855977c0ae99752094a1590000000000000000000000000000000000000000000000000000000000065cf608c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ee1c139ea09924a95b98b56a68efc1104f049f21c080a0e0d2662f068013f865bfba429de67813e80848b7129709d223a19981ce918083a010cd7f31ca9471f59bf07468989f0a5782691d316222940ae078547eba4d3cb2", + "new_txn_trie_node_byte": "0x02f9015c018201d485025a01c50085126f7eeb008304f014947a250d5630b4cf539739df2c5dacb4c659f2488d8802c68af0bb140000b8e4b6f9de9500000000000000000000000000000000000000000000000005f7d1e9e0a5719c000000000000000000000000000000000000000000000000000000000000008000000000000000000000000085fe958bf2c9289855977c0ae99752094a1590000000000000000000000000000000000000000000000000000000000065cf608c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ee1c139ea09924a95b98b56a68efc1104f049f21c080a0e0d2662f068013f865bfba429de67813e80848b7129709d223a19981ce918083a010cd7f31ca9471f59bf07468989f0a5782691d316222940ae078547eba4d3cb2", + "new_receipt_trie_node_byte": "0xb9043e02f9043a018316eedeb9010000200000000000000000000080000000080000000000000000010000000000000000000000000000000000020000000002000000080000000020000000000000000000000000000000000008000000200000000000000000000000008000000000000000000120000000000000000000000000000000000000000010000000000000000000000000004000000000020000000001000000080000004000000000000000000000000000000000000000002000000008080000000000000000000000000002000000000080000000000000000000000000001000000000000020000000210000000000000000000000000000000008000000400000000000000000f9032ff87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000000000000000000000000000002c68af0bb140000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da0000000000000000000000000df675ac7eb6a7053e6988565f57dc3da177661efa000000000000000000000000000000000000000000000000002c68af0bb140000f89b94ee1c139ea09924a95b98b56a68efc1104f049f21f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000df675ac7eb6a7053e6988565f57dc3da177661efa000000000000000000000000085fe958bf2c9289855977c0ae99752094a159000a00000000000000000000000000000000000000000000000000babe67b69a45a4ef87994df675ac7eb6a7053e6988565f57dc3da177661efe1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000000007d1b23a2a3861b5b00000000000000000000000000000000000000000000000203f58c05f29fc1bef8fc94df675ac7eb6a7053e6988565f57dc3da177661eff863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000085fe958bf2c9289855977c0ae99752094a159000b88000000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000babe67b69a45a4e", + "gas_used": 126942 + } + }, + { + "traces": { + "0x3328f7f4a1d1c57c35df56bbf0c9dcafca309c49": { + "balance": "0x11d723ba73b28ad52", + "storage_read": [ + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x11d723ba73b28ad52" + }, + "code_usage": { + "read": "0x4d9be648c5bf39973670d9f8b481d5d0b971e6a2db2deccc6b98cde21c5dd83e" + } + }, + "0xd5dbf66480844b7aab2b09030aebc6cecf33e5b2": { + "balance": "0x53b82a7f4755def", + "nonce": "0x1aa4" + }, + "0xee1c139ea09924a95b98b56a68efc1104f049f21": { + "storage_read": [ + "0x336a15c2de424b150f2fe74517a91cf099618a9cc06476ee6969c87d83e552f7", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x748ace196a619e172e23c1ba712f30ad8277be72debd9e25dd0fd081fc5ea4b2", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0xd39e7a1713b7480b7572a56a5a140d5100f41a6add76a5f985b34896bf0b07e4", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x27c000cb4a36e527548c82ca9c4152888ae4f091d192793223fa9fa8cdfdf108", + "0x52904ea9675b2af48d62072df8d8967ad3b6e4fbbfd783a8ab5f507d2030d15b", + "0x3f21a237864d150ec73673aa9343e861c8699ada868b369630fe86259d2cc7b1", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage_written": { + "0x27c000cb4a36e527548c82ca9c4152888ae4f091d192793223fa9fa8cdfdf108": "0x210e428dc8c697a18", + "0x52904ea9675b2af48d62072df8d8967ad3b6e4fbbfd783a8ab5f507d2030d15b": "0xfffffffffffffffffffffffffffffffffffffffffffffffff3116329663647a5", + "0xd39e7a1713b7480b7572a56a5a140d5100f41a6add76a5f985b34896bf0b07e4": "0x110080a6e9e85a60" + }, + "code_usage": { + "read": "0xff219df1cfcda45d9a2b4e3531676c6610f25962c839f543a04177f5904ef6ef" + } + }, + "0xc465cc50b7d5a29b9308968f870a4b242a8e1873": { + "code_usage": { + "read": "0x7b287ee78288945f2c3ccb923d99243bbf70d6040de54ddeec372457739a4612" + } + }, + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9e2ae6376db6d474" + }, + "0xdf675ac7eb6a7053e6988565f57dc3da177661ef": { + "storage_read": [ + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007" + ], + "storage_written": { + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x65cf608700000000000210e428dc8c697a180000000000007a0e536fe4854876", + "0x000000000000000000000000000000000000000000000000000000000000000c": "0x1" + }, + "code_usage": { + "read": "0x5b83bdbcc56b2e630f2807bbadd2b0c21619108066b92a58de081261089e9ce5" + } + }, + "0xbcd3a47e4d0000cf170e25d1bd3d53f7c08be0a6": { + "code_usage": { + "read": "0x6ed615a0ca19cd89538543cdcb17a7e8d26147013208623b1efd12f8361aa814" + } + }, + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": { + "balance": "0x29872761823aaa8c2ea2b", + "storage_read": [ + "0xa1418cf079260397be8c8824a66003accc52fdb01dd81e3e13c62f524976fed6", + "0xb2940356fd89a84cf9a86227596a2f59f085c679d5f9450737d0ae4daf0efcea" + ], + "storage_written": { + "0xb2940356fd89a84cf9a86227596a2f59f085c679d5f9450737d0ae4daf0efcea": "0x0", + "0xa1418cf079260397be8c8824a66003accc52fdb01dd81e3e13c62f524976fed6": "0x7a0e536fe4854876" + }, + "code_usage": { + "read": "0xd0a06b12ac47863b5c7be4185c2deaad1c61557033f56c7d4ea74429cbb25e23" + } + } + }, + "meta": { + "byte_code": "0x02f9027501821aa38502540be4008509aa0b046883078b85943328f7f4a1d1c57c35df56bbf0c9dcafca309c4980b9020475713a08000000000000000000000000ee1c139ea09924a95b98b56a68efc1104f049f21000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000df675ac7eb6a7053e6988565f57dc3da177661ef0000000000000000000000000000000000000000000000000cee9cd699c9b85a0000000000000000000000000000000000000000000000000223d78c91ada825000000000000000000000000c465cc50b7d5a29b9308968f870a4b242a8e187300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065cf60870000000000000000000000000000000000000000000000000000000000000000c080a0642a7d57b8101cf657c1d084c70135cb64084383982ecb695bb044f39c01f904a02f935286fc624907ec3ae9b3aff154439d72fd29db15a6530adc265370053539", + "new_txn_trie_node_byte": "0x02f9027501821aa38502540be4008509aa0b046883078b85943328f7f4a1d1c57c35df56bbf0c9dcafca309c4980b9020475713a08000000000000000000000000ee1c139ea09924a95b98b56a68efc1104f049f21000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000df675ac7eb6a7053e6988565f57dc3da177661ef0000000000000000000000000000000000000000000000000cee9cd699c9b85a0000000000000000000000000000000000000000000000000223d78c91ada825000000000000000000000000c465cc50b7d5a29b9308968f870a4b242a8e187300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065cf60870000000000000000000000000000000000000000000000000000000000000000c080a0642a7d57b8101cf657c1d084c70135cb64084383982ecb695bb044f39c01f904a02f935286fc624907ec3ae9b3aff154439d72fd29db15a6530adc265370053539", + "new_receipt_trie_node_byte": "0xb905d002f905cc018319673db9010000200000000000000000000080000000080000000001000002000000002200000000040000000000000000020000000002000000080000200020200000600000000000000000000000000008000080200000000000400000000000000004000000000000000120000000000000000000000000000000040080000010000000000002000000000000000020000000020000000000000000080000004000000000020000000000000000001000000000082000000000080000040000000000000000000022000000000080000000000000000000000000001000000002000000000010200000000000000000000000000000080000000000000000000000000000f904c1f89b94ee1c139ea09924a95b98b56a68efc1104f049f21f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d5dbf66480844b7aab2b09030aebc6cecf33e5b2a0000000000000000000000000df675ac7eb6a7053e6988565f57dc3da177661efa00000000000000000000000000000000000000000000000000cee9cd699c9b85af89b94ee1c139ea09924a95b98b56a68efc1104f049f21f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a0000000000000000000000000d5dbf66480844b7aab2b09030aebc6cecf33e5b2a0000000000000000000000000c465cc50b7d5a29b9308968f870a4b242a8e1873a0fffffffffffffffffffffffffffffffffffffffffffffffff3116329663647a5f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000df675ac7eb6a7053e6988565f57dc3da177661efa00000000000000000000000003328f7f4a1d1c57c35df56bbf0c9dcafca309c49a0000000000000000000000000000000000000000000000000030cd032bf00d2e5f87994df675ac7eb6a7053e6988565f57dc3da177661efe1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000000007a0e536fe485487600000000000000000000000000000000000000000000000210e428dc8c697a18f8fc94df675ac7eb6a7053e6988565f57dc3da177661eff863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000003328f7f4a1d1c57c35df56bbf0c9dcafca309c49a00000000000000000000000003328f7f4a1d1c57c35df56bbf0c9dcafca309c49b88000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cee9cd699c9b85a000000000000000000000000000000000000000000000000030cd032bf00d2e50000000000000000000000000000000000000000000000000000000000000000f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65a00000000000000000000000003328f7f4a1d1c57c35df56bbf0c9dcafca309c49a0000000000000000000000000000000000000000000000000030cd032bf00d2e5f899943328f7f4a1d1c57c35df56bbf0c9dcafca309c49e1a072015ace03712f361249380657b3d40777dd8f8a686664cab48afd9dbbe4499fb8600000000000000000000000000000000000000000000000000003e770e4cb862c000000000000000000000000d5dbf66480844b7aab2b09030aebc6cecf33e5b20000000000000000000000000000000000000000000000000000000000000033f858943328f7f4a1d1c57c35df56bbf0c9dcafca309c49e1a0522881958b3c4a6fc0840ad3b7fb947b881edc28c004245a62541647422ade97a0000000000000000000000000000000000000000000000000030cd032bf00d2e5", + "gas_used": 161887 + } + }, + { + "traces": { + "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5": { + "balance": "0x9da8f5317178807d", + "nonce": "0xa961e" + }, + "0x876528533158c07c1b87291c35f84104cd64ec01": { + "balance": "0x152e639c78b8139f35" + } + }, + "meta": { + "byte_code": "0x02f87101830a961d80850755ff2068827d0094876528533158c07c1b87291c35f84104cd64ec01877f973f93e400b780c001a0a1e7913e05eb6bb6f4bcb70abd29b6c5fd217ed8c501c7e11fa8ef4cdc0db303a0380e9b3c08be1ea016553f0aecd2702f3ebfbfe59ab702eba90d6bfba8238202", + "new_txn_trie_node_byte": "0x02f87101830a961d80850755ff2068827d0094876528533158c07c1b87291c35f84104cd64ec01877f973f93e400b780c001a0a1e7913e05eb6bb6f4bcb70abd29b6c5fd217ed8c501c7e11fa8ef4cdc0db303a0380e9b3c08be1ea016553f0aecd2702f3ebfbfe59ab702eba90d6bfba8238202", + "new_receipt_trie_node_byte": "0xb9010d02f90109018319b945b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + } + ] + }, + "other_data": { + "b_data": { + "b_meta": { + "block_beneficiary": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5", + "block_timestamp": "0x65cf6087", + "block_number": "0x1259701", + "block_difficulty": "0x0", + "block_random": "0x45d29466a7116dd48c9826216292a8796242621f55677181b0395d70a2bcf23e", + "block_gaslimit": "0x1c9c380", + "block_chain_id": "0x1", + "block_base_fee": "0x755ff2068", + "block_gas_used": "0x19b945", + "block_bloom": [ + "0x20400000000000000800008000000018000000000180200201000200220000", + "0x48000100230020000020080000002008800080020200020200020600040", + "0x800000029000000088000802000808000004000000000401080260000", + "0x20220120004008000000002c4020000040000004028000013000080000", + "0x2000000000000004020040200060080000201000010080000024000080000", + "0x200000010000000028450400800002820010000080c00000400000100400000", + "0x2200000000008000000001000004008142000020904004000200002000", + "0x19021002000000002a0000200010000000810080100004008001000000000a0" + ] + }, + "b_hashes": { + "prev_hashes": [ + "0xcfab9f57a4374e241013c389a91566b7d0c37da2ea36c9b63baa646480d0ee77", + "0x38b80ec5e15c935edb4f4956f8224a1eaa88c93938f67a1018cd7c85eb606aab", + "0xc138d04a4d815c9d83e3cebb989239461ad3ec0f9fd298e3449f3659b323400c", + "0x58bf7320b17722b62478b50020e1fb0aa18ebbaea961d868cc2575a30f63852c", + "0xb87e56f81f0456db5c7a7a17af022bde49f20cd8193463d96b05162ccffa3157", + "0xe4d6f2bfe01b73af732882d3460e13e0ab1138396fa9007a82f042e4e7402663", + "0x621fb15b9d79724387592bc72583a72c2305a5bc862ec88ac4d88ad3c745bfbc", + "0x8b7ef7a4950c70602cc1244df146ed3c719c42659cc68891f81a26880dc916b4", + "0x394f527d6a108bcfa5cd58e5d41a749a99baa9edc4b64cdf9290e01e14803916", + "0x46832687b7e3c68faaf1e001ac3699aa050c9f17085d6a9fbab3b001e1e91486", + "0xd81a2a90046cbe42fd032342889fe343a4b5c4fd80d8f69add0c0f4b4e55bc8d", + "0x4c78e389d03ec147deee89d6762cb6ac9c125920027efe921922cf806c186d4c", + "0x3f444e94733f1f4183474b90ff76248c86d805a25c4d565167b7d7a3692d3565", + "0x4998bc4c9a48073a095afa2fc93eed3dbbaa12620460bbf0e73e7e23e560c69c", + "0x1945c4296041ab7b3024f7b263293a33777925fa09459adb80e8ba8bc3f6e2a2", + "0x9aafcd5475c1fdaad41c810a1e99ba53379146a00dbb17d679c15a38df47ae19", + "0x31667b67aff44c0d86c0b924e5e26869784c1ed7ad75e0a75b434a1caaaccb9a", + "0x2beb2ba1c187a5fe2a9d4a1412396e796dcdfb858c7b4c6ff410c35350788783", + "0xaa6d56335b227575c5bc40468216257e83b47ce73e41549de224191663a09652", + "0x25337050f0ed7224687c20b0e37ce8f29e8d63709812d9403558e655935fd4c9", + "0xa9c3447f820a08321e48ee868bc912e1081db04d1de6ac9c18d1cab00245445f", + "0x8db2a1e477e1a9e07b4e5d26443a20e0b5647fe48a575334a18a8c23ff237aac", + "0x836c2b6ec407582529d154ae54ad740616a25c9e95439b36954b0886220e234b", + "0x03a3dcba6d48a16dd9fdd1aaa07aecf2a712da17cb455ba1ca6979fef2411072", + "0x76802a7e201ef4b1522542e46a97360983dc387285b1685ee8cba6ba99e14a09", + "0x4bfd1b64c7e9e706a84f7bb077eaf4fc98dc1f38162f8407daac251b4c782ea8", + "0x4063789111da1e060b25c438ae04c7f7e68d8f10afe126b68b275314251a4ecc", + "0x5f86cc18e261aab47cb8d6dc78505e7b156e022b24d4e7e399e885dd4124d4ce", + "0xe80b83684ab3ffde0d9659caa516711ba37a58c4ac9bbdb6cf6c67d04affcf5c", + "0x8f6a91bc52615b275705fdcc7ec704832f8f5f0466589fde33f6f1e836113bed", + "0x9f681e1226c7894028550212383b4a5d3ea885dd6d1c28ba12ac773b5e3ecf51", + "0x1898b052344c3d0cb7dbacf461dad55cb6f56843e2319c25a490db0eef858908", + "0xcd3dce5835974ff8209c26f5eea2e0bd35bfe46b3f22ffad6582bfa74fe3e6a6", + "0x80300830d137dc63995cd47c4b9d593ee26c36424be1aea1f205a456fa01823f", + "0x4866b34cb7823b8888ae98f84d99a1a30e5216d824dbe850b53f800f745d18c2", + "0xa40cea299f742449a2a2abd1d8d240d2e42a16c63389b773291469b600b27a4c", + "0x44209e70324b497336058736dced16d65814d90b3fd0fbcfb68a3b81cbbc52c5", + "0x109e598cb2d8b68f154a6400ca56997ed066dd8aa7a15934a8bbcfb344452214", + "0x82cc91ec296a8aa275adc93cb60e76d8809d28eb1d0f6a979a286157cd102e1c", + "0xe24079903b98fd70b9bc36e4dd372876fc02b8ed28de4a2506c40b1351e36d82", + "0x06679c947b94629035585ada54a7705fb6d66cb05e080c4d9a666f0558a5e064", + "0xb7381aae1422385528b08aa99cf2e7cc6c9943fc7e06d7d26266ebac77f2038f", + "0x6695b8d48f45d478840310cb3c9824caf874e3bee8efa56dabd9256e547465a1", + "0xf64259c9be7c6e1510c291e782ce6713fe9e6a8c0670f51484c4b52fcdf143ef", + "0x6d9c6a66065d238588d2303c570ecfee237a12f3119e1e10d6da036ee3c6acb2", + "0xbb5b372993d468b1302baf20b0abf9d8385c4882367d1c7cfb0ffcdeb9ff50a1", + "0x5b6f4ffdcd85cfc4b81655d94be7c19c2436417387b2cb2ce45113790336db35", + "0x1f0f361a4c6f7f2601e677688df6b86d069b617faed4499869631e5adee39178", + "0x42bf25b614164ffd0da182efdad686cac48576fdbdd3f38e7dd1d3bbcc9e5224", + "0xe410e090a0d43d00db127c5639f1af1614ea1680a3e5f491842bc421a8d17521", + "0xad323e505477386f3bd81056800d740a3b10a23ac519f4ae7fa1cd1a2812ab41", + "0x9ffe1e89c81176cc1753d2080339aae9331de823e319f48b997a5a9a59d14a6c", + "0xeb354c27c6adff01efba0bb57a4695009bdde67dad829fca8646eed6c627c04f", + "0x025d06bcbaf4a54651c5b432dbdc1ab61e7e25cb3b33cbd1ad597f6361c64004", + "0xfbb795e49aa2ccc545ac5427d01b8b7f4c6f0f9c6f1636fa2d3f8175ea850e7a", + "0xcfbe0b821f3d9d860aef7f90099cf3eb3d1caf66892142988fdca7990cd2685d", + "0xd38e12f24648a60b38d401b79c034aaa4272e775e44790000de39bd45848b266", + "0x18cf65ee63fea104a2ff5fc02977f31bb686a64007b8cd16d67c431d3fc9985c", + "0xfbef834f90e5cc58a7c0c4ce0eda75881d413fb327954806f43c9831e863bcaa", + "0x20fb4ff5acf0f241bd613dadc8d3146d0b6a667bd66fa8ffc3630c89810a69a3", + "0xd4a1baae192ddc2229cf6425e0fd549bb20cf99bd1857ac14f5eb36ce4ce4882", + "0x0d49346d32b8df702a53de84eff651330b1c9a8f0b00cf3cdd9a37aea37a29b4", + "0xfff87d966513ad61904e37f3e0a822d1216a24f64a2cb0ba019b2ab55b391576", + "0x069e7e81d4ddada64c915bf27e7a7f005f0cae04f85c7c9d9e1c994b35044ab0", + "0xc574c2a0764d2b3424c82a903c6091fd3fc59043c89843001ceafc2f230e250a", + "0xcb57e5e65051817c806b651160ad4fab709fd35801f649854462a391e85113c9", + "0x49df8c35cdc69b9f79b64de400f9a9bd298237e591f561b976e8133f6f4e6e83", + "0x71ff9b73be32122ffd6a70a588cbd249ccac73ac7a72f83ec0b78d401c418c81", + "0x78c53c51467b4d0b0ef26550cf7a68b2c7943942de61f7a9912b7c0b0f54db6d", + "0x89789136684064fb05f130c8bfd122a01cb6013d25f86f25d934037f2cd669d8", + "0x3ce94acc60c5eae9566cad245b5087992d23991f9feaec46c0225f346cfa03cd", + "0x50c61cd40ed98ddde2ec48ef25ffda3c24562efb45466944292042b7646d6ca3", + "0x3be36e840168b97cf843f1282dda75ce7f9a8417e679372fa24747a834b552f6", + "0xb89f248c0659d4fd96fdd11b700772171722e21409694fe7858035b39c3fc84b", + "0xe8e71d5c1ee9094b09643fdeafa63c93a835d4783382c0888c1a93b77cfb27b9", + "0x76e794d55c8879a16255a0454b40d194af4f70b5ac8550f782054dd12fc56d4b", + "0x3c5378f5ed3da82166086ae9df32bd01ab6319bdf69bd64a78dfa2137b869b71", + "0xda149ed42d40c0ad4ba073990c0de763f8c258cfbe087c9db9a5c68ef363739b", + "0x1abdceaecc72ddc6f8058499c951913c9c683d0e68199e0d1646c9df9979bb1d", + "0x46115955203391608cc6633d875c27f2bba1bcb32a5b9a79a617d78e2f15ec6b", + "0x3b1af0c7c51cb1f08fff39c89e064d002d4573760f233d833b6d9f907cff243e", + "0xb4867bc77f1e7d54dd48be67197a8611017f53bc480573c0bd557eb2b8d1865d", + "0x79d41e27c5c3cab17658716e82fdff2bd18c39a37ff7f402b2f071e76efef237", + "0x1c47d6d1ada15f750a3fe992beada41d7698a0ae73fb3ff51d3a83c780b1bee8", + "0x6414f39c9a9aef62156b57044cacef12fb99ccde6944a53c28c9c7f59130c639", + "0xdca75dcbdc8531dfd2640c9f7979abd79a3e58c5e71f319d6aa63f1297e12637", + "0xbc82fd24e1be8bc9f7032a6bfafc482eed796460b3c76cfb482b67408db0a446", + "0x2a45e46666de9e8bc3d396917cbde99a6a0d859e64cc5e9ad8d67dfccbb06a1b", + "0xe4b24c21a7f23f5455f183b5d6b37137ae08c5bbad57851b2072601db62cb50d", + "0xd2cbfc68cb6060ceb677e4da6e21f56a6b086770b6f0d3717affdfada42ed799", + "0xa2942b6aa19abeb697ddedca8be248539c48ef596e08bcda26db0ba2bd5c95e3", + "0xa00ee5291426662b965577851d2f63639d30ba9b089431315cd51b0ea78171aa", + "0x057555a06a0f1faaeb2bc0c6e92d0a95336fd557271b720841cb99e2e0ce01cb", + "0x354d717988880d99017c7af5bcd9a98d2e24db9a9b66b802f374f074ea50651d", + "0x4a076d92f54d83551475bd3a00b6fbd0428a84da527a8d1529463c3697a148cf", + "0x7a0277376b4ff3e14916db4638440940a16cdfc37319c1696e4c6df1bd59c4b8", + "0x1e7b550fcf6a76237398d884f8b020c0f776a8e65b9b1ad1170dfaf69aebded1", + "0x44f458cfd9cbe3a376e75cf5bc43445ceec5c170e2155295350bb4c57ca73ada", + "0x3a130c2e4e95ff6f630797c2f2b2e6433e06979f965ecd4a170ec5c6d22d7748", + "0xa347b7de97da63b80adcb295a1c95f3cf836a0df9bc283c9710b799c00dd0b6b", + "0xa356c10c4e099212258c6f2fdae513032556c2a380814403900c6c0711d4b917", + "0xdd428412cbb7a32c3e7dc5c056db0827cb49fa8c83d984a998f32e15c3d73b48", + "0x40f61ff284733593a7b54896381e5364a054b9e7b1eb0d9b22e479f2468344d4", + "0x2fb5c179fdf142c2af4b2863cfc9b5a42dea7ed637a0f2c39d3af3b32c46c5e5", + "0x7d430b09e2ce51282117040927af580293f7704e9095bf4265797be7af55ee8c", + "0x7c62b0144ef255f729364ffa1b0e7f20ca4c87283618030c226fc0847855de1f", + "0x82deccd92a405b56f62d988c41d2418dd64324882eca967d8260e12cfcecb5db", + "0xbb8854151124237467e120b904244231ffb7f0342d742b0242a430c2ca587072", + "0xce988c73306b3671f018ad630800a6d70c6884ecfc84d172598581f31f5b0f48", + "0x4e5617a802f9a6ea3ec57138152a30a9791f6bc30cbb372a61e02258d5c1f5f1", + "0x8a4460e937b89c2b5ffa6e478a6f9ccc665870f313a7a06abdc82185adc1e296", + "0x429b9600e6a12bc746d21d3ee2ac76c559b5f06ab3e0f5f3b4c8f4504af965f9", + "0x6e8bd561662bf27835053957e56d9b510989efee68ac5cdb8571e9e649f10b63", + "0x4512b87f62323c6c8ade9fa56741823da2ef1f49e3fc76a6ab7a2b47026ad7f4", + "0x7315fc8e86ae2843394ebacbb40440eb66b5f3bf82d5d2a96741df5dce358038", + "0x860445348840ec438748ac4c579a33bf8f16a9922ca53bdac6aa09913d162564", + "0x0ba965c543ba155ebbbbd8bff4c5c63acf221790dd30c7be4bde078bab46dc06", + "0xe814f4ca631d612d0412b7c2c6723d351b2eb19b8563713925b033c676d87cc2", + "0xa3932c3653a210ab39a21127bb8ee97dae95c5bad9910a69bfbaed7b4ab9105b", + "0xbdff1e151c0d0ccd5c6a3be48030f5f905d06169cfe43f8dc1fc715270474344", + "0xe56765c9bc310b26996b60d030e45f7984bd641747e9520b2624f2b58a577f9e", + "0x58d51a1fda0740b191b91880f30035af7db135b54eceb7d1d064653368c39da3", + "0xe6c34027035fb35aefa0796d5714154526affa7bff1e926ccf23aaadc5a251ec", + "0x601023137408602a0d3f62c932de6f62b32372be2ff3e9508b77397e9c7b203e", + "0xbb51e1752b3a324f874ecacda5e4854778d08c976757aabe0d33f9eebce5b69f", + "0x648036ab2ef5c981d11bb45fc110d8c4effe00c6d06646e2df9f04c33b415829", + "0xf0400163aeda772b0139a4e69102589f143e9f23bda49bdc12e2609cc29c74c6", + "0x8d6227386788f4dbad5d8c43d575a627818648d258c03f0025aae5783659ae71", + "0xefa8513731cee73816c0b6168cb25153d29fe6940c1b30db971e1e53b0f59213", + "0x229da5c4b9c46829a93df8ae4bb34b6bf20c37644655277af3ec4b3ccb070351", + "0xca855b6710defa8e20942d981abb9a3a124f76b420ba48e5af32639ed14f8e1c", + "0xdb6e06723e801af3bb9432d02ca8136965dda7f37c592720c8dc7ac4a0c0d45a", + "0xea83e25432f45a0231993ef7b784d200cbb0f4d068d1ffd7c8652b9f1b3da061", + "0x9c6d1a2ac894a2e8f7cbe140d2f251fb454ca77d5b7c64c700bf02b08566032e", + "0x3a59d6738a9f712ed31740f4f211f926febc652ac65d39c768cc15ce6548ac29", + "0xe71d46072083ffc7b5ac292ae827019cb5cfaa335ad9b0717f6b4cd4c002e26b", + "0x0ab071ba6eb8197f56f5d7de6070c05774aec92fe3e38775dbe31b956c20de81", + "0x86e0d7fa597d2bc87b6e09714e2d9adcbf4ace67355414ba5b6cea23c747c0ca", + "0x70a095353bd4ecc77ae6253c93181c0c8880ed57ce5bf2ade7f75c3995ab53b7", + "0x273b6e8f768ce9478e9ca94a5c158ca1152698e89259ebcdefd9bcbb6ca1b28b", + "0xaf59d7b76771c5e8b3ad2f3965b81ed284d47ee892b69b991575f51f9024d82d", + "0x977a7259893512c087f602414f2c5498b52ac4a2283e5d9baba0e7e9d6074477", + "0x69f698ec8280e85baa7ee877652d6eb93281bc68fea8c778624c048113404e85", + "0x3a8e1bb449663fcc1afbf67899e136e3460f3a97fd87e2f2c9cf368ac605527c", + "0xa2656346c9cc287bc1f8697a4906310551f47a24da135467862eacf79f196f76", + "0xf6c099ca0d8d507610a3f549c53515ee11a9c4e55f8474131d3f247e6441d11e", + "0xdb6eb9df15e4da3163d93941524f16766a76be38d4967118c20b2a242e80e22e", + "0x6dc9cd38fb172a6a89672cb36be5fc994d16a126613b94433fe79e10945b3020", + "0xf3b8cd2494813f37bffae61f62a24c1be79e3a9473a556c53bc22ad305640d37", + "0xf1ec74d51276ceb47d5300db099b2729041244c16b1c7d5a9270815e4b2ad87b", + "0xbdb2440940a26dbe21a1e678e6ef5c133ed25f05a70055e52b961aa205dad7a6", + "0xc8e608b563a7af270682b2a5607c03a3e773792b1d59b42c9307d2de0b2287a2", + "0x204766659f1238b1084cf4be97ec53b579be09106ae5252ea6120561e7fa7e80", + "0x7b83846cb399dd5ce6ca56fc96188c5ec78b1c8175f1ca46f8f8ef562630783e", + "0xfc894212ea9bbc5972bc530b6ab7ed40aa7398e8cea35518701e21aaf5225812", + "0xb246a8d3f998bc40fc2862d6d065ac490fe0b8cbe6dc76b11ee9a7d14408864b", + "0xe9391a5600ebda987d96226f776f66d2d9a9ae6dcd61fbe40e2776cea2362165", + "0xf50492c1e56ff3fe1b499732d8e04be8dfe5c16326d31ff77ed9fbfab28ba3ea", + "0x160d294e2166b84c7b39e065b5420f75b845a3e2ca91601a47e86c492253c1a7", + "0x6fa516586c76584db45fa37f1c5c0ab7b7695d4f274ec1a794f88c408c6a9e86", + "0x38b23e425dcca799a06c70d8d4cdb15aeafb16df6b906e1459c9d2c09b00ff3b", + "0x6ccf588a93524bed61c1515129f9cbf228ead29ae4b019783af7ab043c216e72", + "0x3eb9bd1119bcea770e589c55646975e0ea7a825b7b18e27c4a397f98cb3fc072", + "0x18a6d2f8a33c0671304ed13e6b5d49098c95ad9084249d1e495bd3f5c5f8283f", + "0x4401e98be2f7bc8fb46f912d75d4918a03ddeb49c9c9f117bd92565e58a8469e", + "0x55ac69ff9f1a9bd7f88d9758ea891501844b3a932a15d8a4fdcb7ba2c1084495", + "0x3c7fa8eea9e6b19f49803ce3d3926dca64eae46a46d9a658919bae2c0d94b71d", + "0x1130c450d59983001032f00f934f838b20bb1520ff667de9bd8784b892bb6336", + "0xabdfb3d27da751c199289d132e29025923dd47efed222047b43e1584b3937da4", + "0xcfc39333669c6bb5506b2400bd0b682202a8397b9a369f597628c8c2ff62771d", + "0xa24e1607bf874ce72a9a237fc0604836287a2254b6bedc8befc20ca112f3f0b2", + "0x837ce20fe8b6184ec57972d5e9214a0f7e87822fa8e87c293645bbf095ef7a3b", + "0x25e11a9811c15fa64eb38bae5bf9c28d0135fda07185f68e668fbf1a9845970a", + "0x9bc56ef616eb63be18c96e479a4ff1b9b19c3e5874a7faf31d8a890964a507e9", + "0xdd1a5ac21a1acc161f4c73aa56ceac6dd90720cb4e293f15b6a2869d9a5d7501", + "0xd2474ed9bcc5145772ac21309b3bf461201ec85a13cc4b2503efebfe42f8aa9f", + "0xb90dde4373058caa2f5e402268b7c68486939369c062fe189b77d6ab73c96614", + "0x380ace11ada254f8c85083fde6e750ed01d2fab1409450ecf90311c16fc7154b", + "0x82ed384914a2d06ed9a3f9627b75c5329cea39b47667bc27b0c9815154b3c07c", + "0x71871257062f2de58dfe19330339c332eb336b509a3950c9f55210d702459f03", + "0x40a19295674bc11d2c5e28ee7ba584bf13cec92b709dc6d903f799871d4d5b16", + "0x76aa47f9816d3f2769edd4c605203fdbf732006664239e70ee8f46fc0bea693a", + "0xbdc813957728ae825aa3f11f0a518423cb563bd03535d8a8c017af39edd93305", + "0xea13b4df207c200a948fee3403af558b37c8ed660921268d3cd670bab7861404", + "0x98782d2a94d2eaff161ff7175580e794db2dd18ed9ed60431a3c663568ad6ce7", + "0x2f4e2925fd598937c5f268487ab6bcf07130403fdbad2a5422c9efd42bcb4413", + "0x7acf29b8b50a40e5879790dab398203f7a6d459947629624a09927d72a1c8876", + "0x2d08ef96ce1a6b2478b8ae9f442b14156b0a998f9c7e3778e0ab6f556bbcb5d6", + "0x7418de8e710dd6bb61c7559f581525b654b1950efebc62a18b71938ed2e70370", + "0x849c7c76b4a8f8d9090703f09a770fcd90458b99f099fb3f6802724f09782ae6", + "0x5fc720cfff22ef360b7ee9c1630137198a31166716a127c5cee0ebfa14e76719", + "0xd9b4dca033dbc28e1ef2a13d50fc550f18836eaef9d05bc6685fe9d531763a2f", + "0xe70dc6fe376311d6670e956d259af7d8a9c71ca90254849b0b91e2e9b5d5255c", + "0x2c5761e9caf98725a4170fd68b4784dbc9390bb720cf036e7284f6e82a5ec795", + "0x6b358b969aa8c56a722ec87e786e8dfaed7af9cdc1e289ca114c3f7211c36ef0", + "0x2d3a4b11eaf0dc658c0c19956edb0d60163f48198202784c33e992c706453ac4", + "0xda5a12aef28cbd95fb7f0f8041d26bc3cf11bb07a482426052d978f7715dacda", + "0x7d22ed949ac8b7388defd431d086dc651ef5eeb5fb7bf008b41ffeef577fc027", + "0x9b47b1800be3d0e9b008cf10e8afa67debc21dbf6f887b7c29c53713df8ecda2", + "0x7ed432ec67586b2f518e540b5f2b67d714fec68cfe3f1a569c093d9a780119b1", + "0x5440e156e97c8493bb9f4807230a808647de9ef8e14524cb7dbc0901a40184fc", + "0x986385123bdb3ed5c7226b882240ee619f30fd584a32957fc27a83aa1e06673d", + "0xa59fe31fbfa950d479a86eeff096fc455a7a699b3ff86ed1130bd8c8c1124853", + "0xea3bc775c21f3c1272e8204036fb517cc2f82441346e6ca3987a71993d907ca8", + "0x8001476e7252fabbc4fa046ae1f62634567ea538881c6a8a11b288f37ed64fcd", + "0xfd2a71ecf1b26505212d71467d2390cc80cecb0dad7888a6d0d0a6055eb9ca84", + "0xa7ea114a10801202d6a101371e5f9422136f1e173f98dea6810a9a09638872d4", + "0x5c3a8cecb7291388548f6150a16a6307b6edc4eeb69b8f01be34e8098bc7af28", + "0x1f6c0678871618e92bc65493552e70199aa342082d059fa6b0dd110a4b33c8d7", + "0x68fc40e6659f80a785e24cb875372e22f730b6c03d55448863db1eee57eb80a1", + "0x236adad26fbb619a9bb1ccc3e5c21fe705972498ff07898ba0df2d8ef3516869", + "0x03aa1165ebd146992ee1aee1ea82af214f9c923b99feb07e7c990f65adbe37f5", + "0xa89c64d5ab1aecc7e9f9df766fe96d3b0361d81e8048ed4527ed102d036244d0", + "0x90f26821990029ca0d738302c93a4b60c7ad9643b28f140373b91fa1dad39598", + "0x0f8cce246a5e4fa0140ff632ce99f96748987801f4a27e659f1ccdb3f97a8cd4", + "0x5deb4c4068270fe4e3871f3f70170e04276cec9f47fa4425225da1113de62a64", + "0x8c81ee90cfad026a6f23e6f8f33b47411b3602adf490dd6971f4c3c7c9671f57", + "0x05605b9ef167d70a2eedee808c560f61b2bdef0fbc3f61b02bbc52026126156f", + "0xf209a2efe21982cedf5c399040b52be63fe75bf1fe88030a00647c66dab02f96", + "0x6095b14b43cbe789aaea67d7f69d9c6722c17f15dd76ced663dbd747c1131bdb", + "0x94f74e0e64f18665575e26277b3664499dc1d01e4d6dab54a7adf2001e81dcde", + "0x1a901003a7c13e1fcdd13d8c12942c7282e72c94808dc9bd32d77e76cd63ccd0", + "0xea3609e61bcca46eae1695a0bd4188369932fedd20ffe5f93cf22ae871b4f1ef", + "0x027d38050cd0dd5a429d8c3e70b01ff44c8694547383971e2fd85cf312aff759", + "0x232a3620d0ef161d9c72810dcc19b6b76cf024cd551250f14254de046c2dcf4d", + "0x7b168f089c9708a92753916472b83b818994da06a0c64873976ecfe67b4e98c3", + "0x19440d9074c298034d77782b69844e72260d5f0badbc540d240eabfc5bb77a75", + "0x23905d3a64259e5c5496d71fa37e196ac7902b05d095e51bc94e1be6b7757d36", + "0x4aef396e9d58860fbd300b3b797bd51db5e57543fe0ea70291f20576b741103a", + "0x3a9f028ef7c907be3d7ee99cca564df1a6c7cdf461ce09f4765425980a027a1b", + "0xc333a37ec383f09e571492a27056325f7fd0cfbf061fcb5d20e53023acf073a5", + "0xfdf4499c98c4f4b4e31947595682baba0adab78dc11079f50de2aec0fd018a6d", + "0x58a7778a69ef7bd43ed826c54b79c5f070f4b99e2dd08888d817b5f8d375c52b", + "0x1cfb736673e8fcc6889240f1ff69b0d0fcfce34d28e9ddf27f6bee1d8fd90a50", + "0x6eb44090b9092b101d37b897ef88e7c7fc432a5daf7ea514a3cbdad3e5ebe273", + "0x72a902396914af491548de693380bd904776361624264f00a6baf615ea75d74d", + "0xee06fdf85bf3aae87a5b824259ae7dc4eb007f79f33e1d054e8ca7d1a0348b7c", + "0xf49996ee34248d37bfa89924f5d5900f5a4a37156fa172c8eb15ceab849a499e", + "0x2828c1bf01a0bdd6574e71f15b70e0b865162f3f9d85d7f0456bf17052d13db4", + "0x717c4e7d9822ff7e9f684428e7c1dfe41434113cc41b63177bd77bc01f222e85", + "0xfe43a2f383a77c3242a060322795002e5e85da68e338e0b04ef5bfb544a6f741", + "0x06d82bca611ecb5abac06b1bf1c5862f30e2e17c1ee4c56d83b6360666df2cfd", + "0xb51ceb3e5de3c80cde925de8cf8716e1f71cb6b36c3c93f796e0df03851eff41", + "0x93b59443a6a29a396d9770a8cc3a5514ed3b0790317f984b5e50af37d66c9c0a", + "0x8466aa0a7c0d9b667743784848786bade20f65fa6d8450070848f6c2f2f7afd8", + "0x5bddb05a4edfbbdf444a11f8b5a56cbb7274ad316f50084dd9031caf7c2a4395", + "0xa7a3cdc5b9487a826ba813acbc56467b892d07c693fb6ec63f026d6a20812109", + "0xcd0004cf696bf13fd6ca119b7a9bd8b8e82b7bf4b23d4ec82b7f3d813c8ea75d", + "0xa36e92341fdf9f6781420a0247929464c9c9609f068696853d80f0bfea672884", + "0x967ed9f10b5c76f44e18cf2ce8f6bf13904ad6f1b5ac57eb1a9c640eb8fc7461", + "0x5304fafac069aa22d2bac19c0ab61e9d2d8980cfdbe60c5cc24db80adb8d3195", + "0x6ff81f47be444691a521912a31fe83e497b87cd7f13e61d6b92ee7f0b8a44e1c", + "0x2db2c3f22099c4c59f5ed0507e87287b085c6756ecfc86ed6af6c5136bd0f54b", + "0x76314abadf3ba7c7d6ef2e4cd53c2e6541c9771167e8e5e4a240c6a243379b0b", + "0x4cf46c44d6dbb42a0d38f492ea90202c07f4f91abcfa3bb999a9e781c41a42a4", + "0xee8b17aed9e8e0e2dfa2be0734aad690cdf04375289957005af85bc0dcc1ddc9" + ], + "cur_hash": "0x5377110dfb73129b02e62329cfa303ffaf4b931cf4bf527a6aec97dbb98dc6eb" + }, + "withdrawals": [ + [ + "0x64048d00981975d1f6828a807e783d6ab550ee65", + "0x10d8516" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10d9ece" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10ceec3" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10d7f0c" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10d4753" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10be061" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10c99d1" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10d4fc8" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10baf52" + ], + [ + "0x252919b124156491d184da4444cd2d283e31b80b", + "0x10c78f5" + ], + [ + "0x3cd0c38d5c34ee95fef849256069a3b5c09ad349", + "0x10d1fbd" + ], + [ + "0x3cd0c38d5c34ee95fef849256069a3b5c09ad349", + "0x10cf7fc" + ], + [ + "0x3cd0c38d5c34ee95fef849256069a3b5c09ad349", + "0x10c5024" + ], + [ + "0x3cd0c38d5c34ee95fef849256069a3b5c09ad349", + "0x10d1464" + ], + [ + "0x7142ca8a9618ded97f8838fbe5ecc4515e840a47", + "0x10cdd11" + ], + [ + "0x7142ca8a9618ded97f8838fbe5ecc4515e840a47", + "0x10d60ca" + ] + ] + }, + "checkpoint_state_trie_root": "0x5c2fb1152746455e14b133a1bf1763f72172e681f6d693f4de7ad3f7430bece8" + } + } +] diff --git a/zero_bin/tools/artifacts/witness_b2_b7.json b/zero_bin/tools/artifacts/witness_b2_b7.json new file mode 100644 index 000000000..edb9d173a --- /dev/null +++ b/zero_bin/tools/artifacts/witness_b2_b7.json @@ -0,0 +1,2414 @@ +[ + { + "block_trace": { + "trie_pre_images": { + "combined": { + "compact": "0x0005582002601462093b5945d1676df093446790fd31b20e7b12a2e8e5e09d068109616b084a021e19e0c9bab240000005582002b64061d1b10621ed3cea3432c7e961244197663de5d2b7b25c29e63bec606d0847038d7ea4c680000218480558200268288056310c82aa4c01a7e12a10f8111a0560e72b700555479031b86c357d0841010558200239fa8ab811ddec4c30c62c575a346979cb7339d3e6b1b446aa9cec770bb1ca0847038d7ea4c68000055820022c9421b06b5fb4ed4f3f4b868f487d536ba02ebe1a6347c6a1312167dc000a0847038d7ea4c6800002194210055820021df1fa259221d02aa4956eb0d35ace318ca24c0a33a64c1af96cf67cf245b6084101055820021703c5eda8644a64cec152c58f5aacec93d72fb0bfa705f0473f9043a8357c0841010558200228a39461658094f425f190222a515c7902808b31fd90ea063e831b49d744390847038d7ea4c680000219808405582103b70e80538acdabd6137353b0f9d8d149f4dba91e8be2e7946e409bfdbe685b900841010558210389802d6ed1a28b049e9d4fe5334c5902fd9bc00c42821c82f82ee2da10be90800841010558200256274a27dd7524955417c11ecd917251cc7c4c8310f4c7e4bd3c304d3d9a790c064a021e19cb147d4182dc00055820023ab0970b73895b8c9959bae685c3a19f45eb5ad89d42b52a340ec4ac204d190841010219102005582103876da518a393dbd067dc72abfa08d475ed6447fca96d92ec3f9e7eba503ca6100841010558210352688a8f926c816ca1e079067caba944f158e764817b83fc43594370ca9cf6200841010558200296cdcb823ae5bcb55a33b2a1a22c03bb69870a0270cfef4e7ea22125e9aa090847038d7ea4c680000558200290b239ba3aaf993e443ae14aeffc44cf8d9931a79baed9fa141d0e4506e13108410102184205582103bd0026f7e234624f2bd4ca2c50d2f731cd19f206a89b29fa0c50b5b4e6bf13300847038d7ea4c680000219e573" + } + }, + "code_db": null, + "txn_info": [ + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19c778536cbd49b0", + "nonce": "0x7" + }, + "0x14dc11386c1eee1dff28b4823f68e8de3b5a2747": { + "balance": "0x71afd498d0000" + } + }, + "meta": { + "byte_code": "0x02f86f820539068084684ee1808252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c001a092dbe3ecfa549833bd3d19749cfe5cf8f52d97453161a1b7e54183844940748fa07a2b355a1badc2ac05a2114373c908041cd3a41d6e5fbffaeaa28564739f9c37", + "new_txn_trie_node_byte": "0x02f86f820539068084684ee1808252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c001a092dbe3ecfa549833bd3d19749cfe5cf8f52d97453161a1b7e54183844940748fa07a2b355a1badc2ac05a2114373c908041cd3a41d6e5fbffaeaa28564739f9c37", + "new_receipt_trie_node_byte": "0xb9010c02f9010801825208b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19c3dc2997f7b760", + "nonce": "0x8" + }, + "0x92d3267215ec56542b985473e73c8417403b15ac": { + "balance": "0x71afd498d0000" + } + }, + "meta": { + "byte_code": "0x02f86f820539078084684ee1808252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c080a0bc63624565de404628556d7eb9417d09b42a2d7ebe157b4f793228c1853eb264a07d864356f782d8550850cefd9443685949ca9a798b3525f18372b95631a1b3af", + "new_txn_trie_node_byte": "0x02f86f820539078084684ee1808252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c080a0bc63624565de404628556d7eb9417d09b42a2d7ebe157b4f793228c1853eb264a07d864356f782d8550850cefd9443685949ca9a798b3525f18372b95631a1b3af", + "new_receipt_trie_node_byte": "0xb9010c02f901080182a410b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19c03fffc3322510", + "nonce": "0x9" + }, + "0x882145b1f9764372125861727d7be616c84010ef": { + "balance": "0x71afd498d0000" + } + }, + "meta": { + "byte_code": "0x02f86f820539088084684ee18082520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c080a02713ccd51a6f9a0dffe183d16f74298378766ec9ad7144271c71d2585e33759aa0536b5efaacae718f1b88022075479e2a4a15538062feb46eed9195b24c9a02d7", + "new_txn_trie_node_byte": "0x02f86f820539088084684ee18082520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c080a02713ccd51a6f9a0dffe183d16f74298378766ec9ad7144271c71d2585e33759aa0536b5efaacae718f1b88022075479e2a4a15538062feb46eed9195b24c9a02d7", + "new_receipt_trie_node_byte": "0xb9010c02f901080182f618b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19bca3d5ee6c92c0", + "nonce": "0xa" + }, + "0x2c80179883217370f777e76c067eea91d8283c5c": { + "balance": "0x71afd498d0000" + } + }, + "meta": { + "byte_code": "0x02f86f820539098084684ee180825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c080a06fa2057d82f93db7270054b4d14a87ae9b637a55d1807554558df6d594426a3da01a305e8690961c69049c91241736e8f42a69331fc858be99f0c685d51459efcf", + "new_txn_trie_node_byte": "0x02f86f820539098084684ee180825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c080a06fa2057d82f93db7270054b4d14a87ae9b637a55d1807554558df6d594426a3da01a305e8690961c69049c91241736e8f42a69331fc858be99f0c685d51459efcf", + "new_receipt_trie_node_byte": "0xb9010d02f901090183014820b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19b907ac19a70070", + "nonce": "0xb" + }, + "0x9e0823da9f7f3a0b22dd2798e6af7b39be37f0da": { + "balance": "0x71afd498d0000" + } + }, + "meta": { + "byte_code": "0x02f86f8205390a8084684ee180825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a030aa6c020193e75936be747c0e8da2f9beebc266de42f6a3ebb3afe6247733bfa05220d355e4ec287f06ae0e40b23bb4a86dfb54c645b5a345d80fd9c097d5bccc", + "new_txn_trie_node_byte": "0x02f86f8205390a8084684ee180825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a030aa6c020193e75936be747c0e8da2f9beebc266de42f6a3ebb3afe6247733bfa05220d355e4ec287f06ae0e40b23bb4a86dfb54c645b5a345d80fd9c097d5bccc", + "new_receipt_trie_node_byte": "0xb9010d02f901090183019a28b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19b56b8244e16e20", + "nonce": "0xc" + }, + "0x7972eef40a371cbfd84c7d709507cc300c6d06a5": { + "balance": "0x71afd498d0000" + } + }, + "meta": { + "byte_code": "0x02f86f8205390b8084684ee180825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a0350f184d3a2dfd842fe7e95131933ab980f9ce1bf2d81fc37582df17d3c97883a03d91d78fb680003308495c1c1f40055c0e5530cd235cba33371ef0815bbabc2e", + "new_txn_trie_node_byte": "0x02f86f8205390b8084684ee180825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a0350f184d3a2dfd842fe7e95131933ab980f9ce1bf2d81fc37582df17d3c97883a03d91d78fb680003308495c1c1f40055c0e5530cd235cba33371ef0815bbabc2e", + "new_receipt_trie_node_byte": "0xb9010d02f90109018301ec30b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + } + ] + }, + "other_data": { + "b_data": { + "b_meta": { + "block_beneficiary": "0x67b1d87101671b127f5f8714789c7192f7ad340e", + "block_timestamp": "0x666a9696", + "block_number": "0x2", + "block_difficulty": "0x2", + "block_random": "0x0000000000000000000000000000000000000000000000000000000000000000", + "block_gaslimit": "0xafd1a5", + "block_chain_id": "0x539", + "block_base_fee": "0x2dc70bca", + "block_gas_used": "0x1ec30", + "block_bloom": [ + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ] + }, + "b_hashes": { + "prev_hashes": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xc493151b4991dd1bf459952509bba9bc3fb2b706299e18e36e6b78781835065d", + "0xecc163d4e19061c77f9bc84afaaa6b98961e33435f80f9ebd6f751716f172b9c" + ], + "cur_hash": "0x52ed2bdc1acae1b2ad7890c4084e6d0db5a85b79d6ffa3f7a7efc04e3428b5f4" + }, + "withdrawals": [] + }, + "checkpoint_state_trie_root": "0x0fd5324836befac89fcd430abb81f2a274130af0dfa1a89babac76c574b58c40" + } + }, + { + "block_trace": { + "trie_pre_images": { + "combined": { + "compact": "0x0005582002601462093b5945d1676df093446790fd31b20e7b12a2e8e5e09d068109616b084a021e19e0c9bab240000005582002b64061d1b10621ed3cea3432c7e961244197663de5d2b7b25c29e63bec606d0847071afd498d00000218480558200268288056310c82aa4c01a7e12a10f8111a0560e72b700555479031b86c357d0841010558200239fa8ab811ddec4c30c62c575a346979cb7339d3e6b1b446aa9cec770bb1ca0847071afd498d0000055820022c9421b06b5fb4ed4f3f4b868f487d536ba02ebe1a6347c6a1312167dc000a0847071afd498d000002194210055820021df1fa259221d02aa4956eb0d35ace318ca24c0a33a64c1af96cf67cf245b6084101055820021703c5eda8644a64cec152c58f5aacec93d72fb0bfa705f0473f9043a8357c0841010558200228a39461658094f425f190222a515c7902808b31fd90ea063e831b49d744390847071afd498d00000219808405582103b70e80538acdabd6137353b0f9d8d149f4dba91e8be2e7946e409bfdbe685b900841010558210389802d6ed1a28b049e9d4fe5334c5902fd9bc00c42821c82f82ee2da10be90800841010558200256274a27dd7524955417c11ecd917251cc7c4c8310f4c7e4bd3c304d3d9a790c0c4a021e19b56b8244e16e20055820023ab0970b73895b8c9959bae685c3a19f45eb5ad89d42b52a340ec4ac204d190841010219102005582103876da518a393dbd067dc72abfa08d475ed6447fca96d92ec3f9e7eba503ca6100841010558210352688a8f926c816ca1e079067caba944f158e764817b83fc43594370ca9cf6200841010558200296cdcb823ae5bcb55a33b2a1a22c03bb69870a0270cfef4e7ea22125e9aa090847071afd498d00000558200290b239ba3aaf993e443ae14aeffc44cf8d9931a79baed9fa141d0e4506e13108410102184205582103bd0026f7e234624f2bd4ca2c50d2f731cd19f206a89b29fa0c50b5b4e6bf13300847071afd498d00000219e573" + } + }, + "code_db": null, + "txn_info": [ + { + "traces": { + "0x14dc11386c1eee1dff28b4823f68e8de3b5a2747": { + "balance": "0xaa87bee538000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19b1d123920a4700", + "nonce": "0xd" + } + }, + "meta": { + "byte_code": "0x02f86f8205390c80845b8e17948252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c080a00a58699f9b733fbcedc646a376f2ce3147de686a82577f52345dcb07eb452636a036ccf13d2c1d7f3b3d73a35e1de002d5b8b9b3a16b1a76befb3dc652e3848a96", + "new_txn_trie_node_byte": "0x02f86f8205390c80845b8e17948252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c080a00a58699f9b733fbcedc646a376f2ce3147de686a82577f52345dcb07eb452636a036ccf13d2c1d7f3b3d73a35e1de002d5b8b9b3a16b1a76befb3dc652e3848a96", + "new_receipt_trie_node_byte": "0xb9010c02f9010801825208b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x92d3267215ec56542b985473e73c8417403b15ac": { + "balance": "0xaa87bee538000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19ae36c4df331fe0", + "nonce": "0xe" + } + }, + "meta": { + "byte_code": "0x02f86f8205390d80845b8e17948252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c080a004d21abe2e5c2b58d08dca7efdd4f1f5f9b612cbaac0559cb994dbab4af065e1a038c90f192cb6cd6b7932e55e816307ffefd43eac31daa12eb220f343f0c87ae2", + "new_txn_trie_node_byte": "0x02f86f8205390d80845b8e17948252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c080a004d21abe2e5c2b58d08dca7efdd4f1f5f9b612cbaac0559cb994dbab4af065e1a038c90f192cb6cd6b7932e55e816307ffefd43eac31daa12eb220f343f0c87ae2", + "new_receipt_trie_node_byte": "0xb9010c02f901080182a410b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19aa9c662c5bf8c0", + "nonce": "0xf" + }, + "0x882145b1f9764372125861727d7be616c84010ef": { + "balance": "0xaa87bee538000" + } + }, + "meta": { + "byte_code": "0x02f86f8205390e80845b8e179482520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c001a0c82df3fcaf2dc8704585465d951353092c85497dae88c0af95349b000ebec19da026311c7ed4f3580bdbb6ff90d66143ed9268f3fa849c22b0bf2697a87c27a042", + "new_txn_trie_node_byte": "0x02f86f8205390e80845b8e179482520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c001a0c82df3fcaf2dc8704585465d951353092c85497dae88c0af95349b000ebec19da026311c7ed4f3580bdbb6ff90d66143ed9268f3fa849c22b0bf2697a87c27a042", + "new_receipt_trie_node_byte": "0xb9010c02f901080182f618b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x2c80179883217370f777e76c067eea91d8283c5c": { + "balance": "0xaa87bee538000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19a702077984d1a0", + "nonce": "0x10" + } + }, + "meta": { + "byte_code": "0x02f86f8205390f80845b8e1794825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c001a024b550b0378ff482258f0cbded8acca28dd596cfa345b72eb820aef81547fbb5a0370acb5c8df0856109b044786515f7912fb126cae4749dd21ed842f2de9e15fe", + "new_txn_trie_node_byte": "0x02f86f8205390f80845b8e1794825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c001a024b550b0378ff482258f0cbded8acca28dd596cfa345b72eb820aef81547fbb5a0370acb5c8df0856109b044786515f7912fb126cae4749dd21ed842f2de9e15fe", + "new_receipt_trie_node_byte": "0xb9010d02f901090183014820b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x9e0823da9f7f3a0b22dd2798e6af7b39be37f0da": { + "balance": "0xaa87bee538000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19a367a8c6adaa80", + "nonce": "0x11" + } + }, + "meta": { + "byte_code": "0x02f86f8205391080845b8e1794825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a090a32c6b8c9465c41196acf9e693b08e354ab4b42a3f04d80031882dfa5201f5a066d70a3e893fccefdb8c64a099543a08c19d38b2456c5e39a25cc66ada38f319", + "new_txn_trie_node_byte": "0x02f86f8205391080845b8e1794825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a090a32c6b8c9465c41196acf9e693b08e354ab4b42a3f04d80031882dfa5201f5a066d70a3e893fccefdb8c64a099543a08c19d38b2456c5e39a25cc66ada38f319", + "new_receipt_trie_node_byte": "0xb9010d02f901090183019a28b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x7972eef40a371cbfd84c7d709507cc300c6d06a5": { + "balance": "0xaa87bee538000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e199fcd4a13d68360", + "nonce": "0x12" + } + }, + "meta": { + "byte_code": "0x02f86f8205391180845b8e1794825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a0cbd26a2d7e25345c0dc186ec91039a0d5cf958b0cffa9334b85c18949870c4cea02016b7f4800b0cc7f6c383e14a3bf7a1c1079c2a7a9158c7149f7bbc7147f079", + "new_txn_trie_node_byte": "0x02f86f8205391180845b8e1794825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a0cbd26a2d7e25345c0dc186ec91039a0d5cf958b0cffa9334b85c18949870c4cea02016b7f4800b0cc7f6c383e14a3bf7a1c1079c2a7a9158c7149f7bbc7147f079", + "new_receipt_trie_node_byte": "0xb9010d02f90109018301ec30b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + } + ] + }, + "other_data": { + "b_data": { + "b_meta": { + "block_beneficiary": "0x67b1d87101671b127f5f8714789c7192f7ad340e", + "block_timestamp": "0x666a96b7", + "block_number": "0x3", + "block_difficulty": "0x2", + "block_random": "0x0000000000000000000000000000000000000000000000000000000000000000", + "block_gaslimit": "0xaffd98", + "block_chain_id": "0x539", + "block_base_fee": "0x282e33e4", + "block_gas_used": "0x1ec30", + "block_bloom": [ + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ] + }, + "b_hashes": { + "prev_hashes": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xc493151b4991dd1bf459952509bba9bc3fb2b706299e18e36e6b78781835065d", + "0xecc163d4e19061c77f9bc84afaaa6b98961e33435f80f9ebd6f751716f172b9c", + "0x52ed2bdc1acae1b2ad7890c4084e6d0db5a85b79d6ffa3f7a7efc04e3428b5f4" + ], + "cur_hash": "0x43e9e6398559ccdd4238d08a0b79ef57f50dddb2b75dd7c00e132718b54414c6" + }, + "withdrawals": [] + }, + "checkpoint_state_trie_root": "0x0fd5324836befac89fcd430abb81f2a274130af0dfa1a89babac76c574b58c40" + } + }, + { + "block_trace": { + "trie_pre_images": { + "combined": { + "compact": "0x0005582002601462093b5945d1676df093446790fd31b20e7b12a2e8e5e09d068109616b084a021e19e0c9bab240000005582002b64061d1b10621ed3cea3432c7e961244197663de5d2b7b25c29e63bec606d08470aa87bee5380000218480558200268288056310c82aa4c01a7e12a10f8111a0560e72b700555479031b86c357d0841010558200239fa8ab811ddec4c30c62c575a346979cb7339d3e6b1b446aa9cec770bb1ca08470aa87bee538000055820022c9421b06b5fb4ed4f3f4b868f487d536ba02ebe1a6347c6a1312167dc000a08470aa87bee53800002194210055820021df1fa259221d02aa4956eb0d35ace318ca24c0a33a64c1af96cf67cf245b6084101055820021703c5eda8644a64cec152c58f5aacec93d72fb0bfa705f0473f9043a8357c0841010558200228a39461658094f425f190222a515c7902808b31fd90ea063e831b49d7443908470aa87bee5380000219808405582103b70e80538acdabd6137353b0f9d8d149f4dba91e8be2e7946e409bfdbe685b900841010558210389802d6ed1a28b049e9d4fe5334c5902fd9bc00c42821c82f82ee2da10be90800841010558200256274a27dd7524955417c11ecd917251cc7c4c8310f4c7e4bd3c304d3d9a790c124a021e199fcd4a13d68360055820023ab0970b73895b8c9959bae685c3a19f45eb5ad89d42b52a340ec4ac204d190841010219102005582103876da518a393dbd067dc72abfa08d475ed6447fca96d92ec3f9e7eba503ca6100841010558210352688a8f926c816ca1e079067caba944f158e764817b83fc43594370ca9cf6200841010558200296cdcb823ae5bcb55a33b2a1a22c03bb69870a0270cfef4e7ea22125e9aa0908470aa87bee5380000558200290b239ba3aaf993e443ae14aeffc44cf8d9931a79baed9fa141d0e4506e13108410102184205582103bd0026f7e234624f2bd4ca2c50d2f731cd19f206a89b29fa0c50b5b4e6bf133008470aa87bee5380000219e573" + } + }, + "code_db": null, + "txn_info": [ + { + "traces": { + "0x14dc11386c1eee1dff28b4823f68e8de3b5a2747": { + "balance": "0xe35fa931a0000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e199c347e6242cbe8", + "nonce": "0x13" + } + }, + "meta": { + "byte_code": "0x02f86f820539128084505c67c88252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c001a07623906391b43777272fd81f61128a53d5a774e2d8869706d55db74949f63c8aa06d5354f430ac0d64bea7ca1846bfc99818b70e56a2bbf11e43b563fbf92e6130", + "new_txn_trie_node_byte": "0x02f86f820539128084505c67c88252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c001a07623906391b43777272fd81f61128a53d5a774e2d8869706d55db74949f63c8aa06d5354f430ac0d64bea7ca1846bfc99818b70e56a2bbf11e43b563fbf92e6130", + "new_receipt_trie_node_byte": "0xb9010c02f9010801825208b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x92d3267215ec56542b985473e73c8417403b15ac": { + "balance": "0xe35fa931a0000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19989bb2b0af1470", + "nonce": "0x14" + } + }, + "meta": { + "byte_code": "0x02f86f820539138084505c67c88252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c001a093768ed5baa342a66908d6acf28633218c96d295fd1cd9c8fe22080f56202ed4a03464d2a6c818e77e004e66624d7d722aa98579b0fc821f1d9101b76f1f6f3e86", + "new_txn_trie_node_byte": "0x02f86f820539138084505c67c88252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c001a093768ed5baa342a66908d6acf28633218c96d295fd1cd9c8fe22080f56202ed4a03464d2a6c818e77e004e66624d7d722aa98579b0fc821f1d9101b76f1f6f3e86", + "new_receipt_trie_node_byte": "0xb9010c02f901080182a410b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e199502e6ff1b5cf8", + "nonce": "0x15" + }, + "0x882145b1f9764372125861727d7be616c84010ef": { + "balance": "0xe35fa931a0000" + } + }, + "meta": { + "byte_code": "0x02f86f820539148084505c67c882520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c080a05770c4bafb679d29918cd6320af2384452c3ba35ae27dd5614a226ba002db4c5a02bbbc7405851bc0a7e84ecb188262dcb2cc7e2128418b13f60c485f7e656e372", + "new_txn_trie_node_byte": "0x02f86f820539148084505c67c882520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c080a05770c4bafb679d29918cd6320af2384452c3ba35ae27dd5614a226ba002db4c5a02bbbc7405851bc0a7e84ecb188262dcb2cc7e2128418b13f60c485f7e656e372", + "new_receipt_trie_node_byte": "0xb9010c02f901080182f618b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e19916a1b4d87a580", + "nonce": "0x16" + }, + "0x2c80179883217370f777e76c067eea91d8283c5c": { + "balance": "0xe35fa931a0000" + } + }, + "meta": { + "byte_code": "0x02f86f820539158084505c67c8825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c001a0ba3727de78f7a49d17825ff5983dfeab11572736d4b22f1806e29d605e24c686a025c36e4810754fb42b2837e9fb7621f254c5a241709dae666e4adf00cf1e3e64", + "new_txn_trie_node_byte": "0x02f86f820539158084505c67c8825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c001a0ba3727de78f7a49d17825ff5983dfeab11572736d4b22f1806e29d605e24c686a025c36e4810754fb42b2837e9fb7621f254c5a241709dae666e4adf00cf1e3e64", + "new_receipt_trie_node_byte": "0xb9010d02f901090183014820b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e198dd14f9bf3ee08", + "nonce": "0x17" + }, + "0x9e0823da9f7f3a0b22dd2798e6af7b39be37f0da": { + "balance": "0xe35fa931a0000" + } + }, + "meta": { + "byte_code": "0x02f86f820539168084505c67c8825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a05481ba0ae3a286406d94d84fd70248a3d3a5daff8ec2375f40a9fb25c06b19b5a074c8d65317262b7b6ce89b9eb37438a82ea4ca9b9fcb76082ccd8252bc2b9351", + "new_txn_trie_node_byte": "0x02f86f820539168084505c67c8825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a05481ba0ae3a286406d94d84fd70248a3d3a5daff8ec2375f40a9fb25c06b19b5a074c8d65317262b7b6ce89b9eb37438a82ea4ca9b9fcb76082ccd8252bc2b9351", + "new_receipt_trie_node_byte": "0xb9010d02f901090183019a28b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x7972eef40a371cbfd84c7d709507cc300c6d06a5": { + "balance": "0xe35fa931a0000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e198a3883ea603690", + "nonce": "0x18" + } + }, + "meta": { + "byte_code": "0x02f86f820539178084505c67c8825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a03ab3b30088fffac6c69a35924b4f9750a3208f64a1db817490c1564bce6ea159a04bdf3f5a24c1b46a9a7a067557706f3edb8f7aabb9c728ae85ebc3c93ec3ae3d", + "new_txn_trie_node_byte": "0x02f86f820539178084505c67c8825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a03ab3b30088fffac6c69a35924b4f9750a3208f64a1db817490c1564bce6ea159a04bdf3f5a24c1b46a9a7a067557706f3edb8f7aabb9c728ae85ebc3c93ec3ae3d", + "new_receipt_trie_node_byte": "0xb9010d02f90109018301ec30b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + } + ] + }, + "other_data": { + "b_data": { + "b_meta": { + "block_beneficiary": "0x67b1d87101671b127f5f8714789c7192f7ad340e", + "block_timestamp": "0x666a96bd", + "block_number": "0x4", + "block_difficulty": "0x2", + "block_random": "0x0000000000000000000000000000000000000000000000000000000000000000", + "block_gaslimit": "0xb02996", + "block_chain_id": "0x539", + "block_base_fee": "0x2344852f", + "block_gas_used": "0x1ec30", + "block_bloom": [ + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ] + }, + "b_hashes": { + "prev_hashes": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xc493151b4991dd1bf459952509bba9bc3fb2b706299e18e36e6b78781835065d", + "0xecc163d4e19061c77f9bc84afaaa6b98961e33435f80f9ebd6f751716f172b9c", + "0x52ed2bdc1acae1b2ad7890c4084e6d0db5a85b79d6ffa3f7a7efc04e3428b5f4", + "0x43e9e6398559ccdd4238d08a0b79ef57f50dddb2b75dd7c00e132718b54414c6" + ], + "cur_hash": "0x7b32edfa990c8aa0dc2afc2c0a23e1c6e1ede6b03de689a444163011231d90ce" + }, + "withdrawals": [] + }, + "checkpoint_state_trie_root": "0x0fd5324836befac89fcd430abb81f2a274130af0dfa1a89babac76c574b58c40" + } + }, + { + "block_trace": { + "trie_pre_images": { + "combined": { + "compact": "0x0005582002601462093b5945d1676df093446790fd31b20e7b12a2e8e5e09d068109616b084a021e19e0c9bab240000005582002b64061d1b10621ed3cea3432c7e961244197663de5d2b7b25c29e63bec606d08470e35fa931a00000218480558200268288056310c82aa4c01a7e12a10f8111a0560e72b700555479031b86c357d0841010558200239fa8ab811ddec4c30c62c575a346979cb7339d3e6b1b446aa9cec770bb1ca08470e35fa931a0000055820022c9421b06b5fb4ed4f3f4b868f487d536ba02ebe1a6347c6a1312167dc000a08470e35fa931a000002194210055820021df1fa259221d02aa4956eb0d35ace318ca24c0a33a64c1af96cf67cf245b6084101055820021703c5eda8644a64cec152c58f5aacec93d72fb0bfa705f0473f9043a8357c0841010558200228a39461658094f425f190222a515c7902808b31fd90ea063e831b49d7443908470e35fa931a00000219808405582103b70e80538acdabd6137353b0f9d8d149f4dba91e8be2e7946e409bfdbe685b900841010558210389802d6ed1a28b049e9d4fe5334c5902fd9bc00c42821c82f82ee2da10be90800841010558200256274a27dd7524955417c11ecd917251cc7c4c8310f4c7e4bd3c304d3d9a790c18184a021e198a3883ea603690055820023ab0970b73895b8c9959bae685c3a19f45eb5ad89d42b52a340ec4ac204d190841010219102005582103876da518a393dbd067dc72abfa08d475ed6447fca96d92ec3f9e7eba503ca6100841010558210352688a8f926c816ca1e079067caba944f158e764817b83fc43594370ca9cf6200841010558200296cdcb823ae5bcb55a33b2a1a22c03bb69870a0270cfef4e7ea22125e9aa0908470e35fa931a00000558200290b239ba3aaf993e443ae14aeffc44cf8d9931a79baed9fa141d0e4506e13108410102184205582103bd0026f7e234624f2bd4ca2c50d2f731cd19f206a89b29fa0c50b5b4e6bf133008470e35fa931a00000219e573" + } + }, + "code_db": null, + "txn_info": [ + { + "traces": { + "0x14dc11386c1eee1dff28b4823f68e8de3b5a2747": { + "balance": "0x11c37937e08000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1986a119f5a569f8", + "nonce": "0x19" + } + }, + "meta": { + "byte_code": "0x02f86f82053918808446890a5e8252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c080a01ee4e0b9e3a36b9365dd66ef1739747aaa9ea180b99ef919745bb0c26eca9a0aa0529429ae74c290510e991704260aae40bbac5a8baa974bf7e8c2efedcc676c54", + "new_txn_trie_node_byte": "0x02f86f82053918808446890a5e8252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c080a01ee4e0b9e3a36b9365dd66ef1739747aaa9ea180b99ef919745bb0c26eca9a0aa0529429ae74c290510e991704260aae40bbac5a8baa974bf7e8c2efedcc676c54", + "new_receipt_trie_node_byte": "0xb9010c02f9010801825208b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e198309b000ea9d60", + "nonce": "0x1a" + }, + "0x92d3267215ec56542b985473e73c8417403b15ac": { + "balance": "0x11c37937e08000" + } + }, + "meta": { + "byte_code": "0x02f86f82053919808446890a5e8252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c080a09b213fe9a7ab176112945662b93d7a93a5f84f3ef6909e32d14608b12a1d5a71a0787b1244a63828be22c2d446d5861784bf0e2f2ff896142a3d8812da89f0cc24", + "new_txn_trie_node_byte": "0x02f86f82053919808446890a5e8252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c080a09b213fe9a7ab176112945662b93d7a93a5f84f3ef6909e32d14608b12a1d5a71a0787b1244a63828be22c2d446d5861784bf0e2f2ff896142a3d8812da89f0cc24", + "new_receipt_trie_node_byte": "0xb9010c02f901080182a410b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e197f72460c2fd0c8", + "nonce": "0x1b" + }, + "0x882145b1f9764372125861727d7be616c84010ef": { + "balance": "0x11c37937e08000" + } + }, + "meta": { + "byte_code": "0x02f86f8205391a808446890a5e82520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c080a0339da690b2886d5946051623746e59d1d39fe2bcd68779ad10dd1a6b79a5bf82a05240a5c320af3a5ef10125dd21a21fd661a3a9e9c5325c653aa3aea71ba61a47", + "new_txn_trie_node_byte": "0x02f86f8205391a808446890a5e82520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c080a0339da690b2886d5946051623746e59d1d39fe2bcd68779ad10dd1a6b79a5bf82a05240a5c320af3a5ef10125dd21a21fd661a3a9e9c5325c653aa3aea71ba61a47", + "new_receipt_trie_node_byte": "0xb9010c02f901080182f618b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x2c80179883217370f777e76c067eea91d8283c5c": { + "balance": "0x11c37937e08000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e197bdadc17750430", + "nonce": "0x1c" + } + }, + "meta": { + "byte_code": "0x02f86f8205391b808446890a5e825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c080a00583425445c2d0f1deb7a25ce7419319fec040a2a2f42964f50212b14a8786e2a027750f5f7bd58f4d5bda04fac460d8fd1655dcc3aed93c4c24e194d1bb52af1a", + "new_txn_trie_node_byte": "0x02f86f8205391b808446890a5e825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c080a00583425445c2d0f1deb7a25ce7419319fec040a2a2f42964f50212b14a8786e2a027750f5f7bd58f4d5bda04fac460d8fd1655dcc3aed93c4c24e194d1bb52af1a", + "new_receipt_trie_node_byte": "0xb9010d02f901090183014820b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1978437222ba3798", + "nonce": "0x1d" + }, + "0x9e0823da9f7f3a0b22dd2798e6af7b39be37f0da": { + "balance": "0x11c37937e08000" + } + }, + "meta": { + "byte_code": "0x02f86f8205391c808446890a5e825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a0adff5b10cb25534d49ee5ad0f20ef089c520faec0f16cfbac65066b422c42ff4a04421d46de38a004848f62c524e2f3ceb4d02a989b6b3331c149190b9631a60bb", + "new_txn_trie_node_byte": "0x02f86f8205391c808446890a5e825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a0adff5b10cb25534d49ee5ad0f20ef089c520faec0f16cfbac65066b422c42ff4a04421d46de38a004848f62c524e2f3ceb4d02a989b6b3331c149190b9631a60bb", + "new_receipt_trie_node_byte": "0xb9010d02f901090183019a28b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1974ac082dff6b00", + "nonce": "0x1e" + }, + "0x7972eef40a371cbfd84c7d709507cc300c6d06a5": { + "balance": "0x11c37937e08000" + } + }, + "meta": { + "byte_code": "0x02f86f8205391d808446890a5e825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c080a0607e1c02503e06143020ef6d58073e0346750c2d1a290b979570bd9e3be19829a002a062d70894169ba2e49894eb602dc5324ecab8e6a0453288dd1b9462a3bb45", + "new_txn_trie_node_byte": "0x02f86f8205391d808446890a5e825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c080a0607e1c02503e06143020ef6d58073e0346750c2d1a290b979570bd9e3be19829a002a062d70894169ba2e49894eb602dc5324ecab8e6a0453288dd1b9462a3bb45", + "new_receipt_trie_node_byte": "0xb9010d02f90109018301ec30b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + } + ] + }, + "other_data": { + "b_data": { + "b_meta": { + "block_beneficiary": "0x67b1d87101671b127f5f8714789c7192f7ad340e", + "block_timestamp": "0x666a96c2", + "block_number": "0x5", + "block_difficulty": "0x2", + "block_random": "0x0000000000000000000000000000000000000000000000000000000000000000", + "block_gaslimit": "0xb0559f", + "block_chain_id": "0x539", + "block_base_fee": "0x1ef496d3", + "block_gas_used": "0x1ec30", + "block_bloom": [ + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ] + }, + "b_hashes": { + "prev_hashes": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xc493151b4991dd1bf459952509bba9bc3fb2b706299e18e36e6b78781835065d", + "0xecc163d4e19061c77f9bc84afaaa6b98961e33435f80f9ebd6f751716f172b9c", + "0x52ed2bdc1acae1b2ad7890c4084e6d0db5a85b79d6ffa3f7a7efc04e3428b5f4", + "0x43e9e6398559ccdd4238d08a0b79ef57f50dddb2b75dd7c00e132718b54414c6", + "0x7b32edfa990c8aa0dc2afc2c0a23e1c6e1ede6b03de689a444163011231d90ce" + ], + "cur_hash": "0x540299ad479ada4fd07dc1f9506ab7cf71719c3d372d288d2ce43906a2437f59" + }, + "withdrawals": [] + }, + "checkpoint_state_trie_root": "0x0fd5324836befac89fcd430abb81f2a274130af0dfa1a89babac76c574b58c40" + } + }, + { + "block_trace": { + "trie_pre_images": { + "combined": { + "compact": "0x0005582002601462093b5945d1676df093446790fd31b20e7b12a2e8e5e09d068109616b084a021e19e0c9bab240000005582002b64061d1b10621ed3cea3432c7e961244197663de5d2b7b25c29e63bec606d084711c37937e080000218480558200268288056310c82aa4c01a7e12a10f8111a0560e72b700555479031b86c357d0841010558200239fa8ab811ddec4c30c62c575a346979cb7339d3e6b1b446aa9cec770bb1ca084711c37937e08000055820022c9421b06b5fb4ed4f3f4b868f487d536ba02ebe1a6347c6a1312167dc000a084711c37937e0800002194210055820021df1fa259221d02aa4956eb0d35ace318ca24c0a33a64c1af96cf67cf245b6084101055820021703c5eda8644a64cec152c58f5aacec93d72fb0bfa705f0473f9043a8357c0841010558200228a39461658094f425f190222a515c7902808b31fd90ea063e831b49d74439084711c37937e080000219808405582103b70e80538acdabd6137353b0f9d8d149f4dba91e8be2e7946e409bfdbe685b900841010558210389802d6ed1a28b049e9d4fe5334c5902fd9bc00c42821c82f82ee2da10be90800841010558200256274a27dd7524955417c11ecd917251cc7c4c8310f4c7e4bd3c304d3d9a790c181e4a021e1974ac082dff6b00055820023ab0970b73895b8c9959bae685c3a19f45eb5ad89d42b52a340ec4ac204d190841010219102005582103876da518a393dbd067dc72abfa08d475ed6447fca96d92ec3f9e7eba503ca6100841010558210352688a8f926c816ca1e079067caba944f158e764817b83fc43594370ca9cf6200841010558200296cdcb823ae5bcb55a33b2a1a22c03bb69870a0270cfef4e7ea22125e9aa09084711c37937e080000558200290b239ba3aaf993e443ae14aeffc44cf8d9931a79baed9fa141d0e4506e13108410102184205582103bd0026f7e234624f2bd4ca2c50d2f731cd19f206a89b29fa0c50b5b4e6bf1330084711c37937e080000219e573" + } + }, + "code_db": null, + "txn_info": [ + { + "traces": { + "0x14dc11386c1eee1dff28b4823f68e8de3b5a2747": { + "balance": "0x1550f7dca70000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e197115d4b751ecc0", + "nonce": "0x1f" + } + }, + "meta": { + "byte_code": "0x02f86f8205391e80843de92da68252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c001a0f097340ff786fe4936c8dcc2358abfb35b9888fd97da23f7de5966e9564e2766a0625ba834320c99f672daa3b53b965f7af9407485ce49ac450d169198a8972735", + "new_txn_trie_node_byte": "0x02f86f8205391e80843de92da68252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c001a0f097340ff786fe4936c8dcc2358abfb35b9888fd97da23f7de5966e9564e2766a0625ba834320c99f672daa3b53b965f7af9407485ce49ac450d169198a8972735", + "new_receipt_trie_node_byte": "0xb9010c02f9010801825208b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x92d3267215ec56542b985473e73c8417403b15ac": { + "balance": "0x1550f7dca70000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e196d7fa140a46e80", + "nonce": "0x20" + } + }, + "meta": { + "byte_code": "0x02f86f8205391f80843de92da68252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c080a02fce8a1c632efd8fea240326f04a7f9b01c84573282adf8595343ccb848286fba05a550cbb3851f59d214878d202ed9ee8eb12c54e38e20d0ee4826b0f25c601ac", + "new_txn_trie_node_byte": "0x02f86f8205391f80843de92da68252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c080a02fce8a1c632efd8fea240326f04a7f9b01c84573282adf8595343ccb848286fba05a550cbb3851f59d214878d202ed9ee8eb12c54e38e20d0ee4826b0f25c601ac", + "new_receipt_trie_node_byte": "0xb9010c02f901080182a410b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1969e96dc9f6f040", + "nonce": "0x21" + }, + "0x882145b1f9764372125861727d7be616c84010ef": { + "balance": "0x1550f7dca70000" + } + }, + "meta": { + "byte_code": "0x02f86f8205392080843de92da682520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c001a0a78cb955a97f7a93de2244bb33b7dcd34fd042883ce0875b4fee5bf8b106d7afa032b00b2c6907982ccca6ed1fb4f5e4c3a27bd1529b85e125f086999317070665", + "new_txn_trie_node_byte": "0x02f86f8205392080843de92da682520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c001a0a78cb955a97f7a93de2244bb33b7dcd34fd042883ce0875b4fee5bf8b106d7afa032b00b2c6907982ccca6ed1fb4f5e4c3a27bd1529b85e125f086999317070665", + "new_receipt_trie_node_byte": "0xb9010c02f901080182f618b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1966533a53497200", + "nonce": "0x22" + }, + "0x2c80179883217370f777e76c067eea91d8283c5c": { + "balance": "0x1550f7dca70000" + } + }, + "meta": { + "byte_code": "0x02f86f8205392180843de92da6825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c080a00d844acefc2d7e85b87efeb6b2dafe7e19cd48d3f22e6e4c7761bd2567b41b20a07056ce0b20e483e22384c69350893ebd00379f2a148486e17ac274d7bdba33a4", + "new_txn_trie_node_byte": "0x02f86f8205392180843de92da6825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c080a00d844acefc2d7e85b87efeb6b2dafe7e19cd48d3f22e6e4c7761bd2567b41b20a07056ce0b20e483e22384c69350893ebd00379f2a148486e17ac274d7bdba33a4", + "new_receipt_trie_node_byte": "0xb9010d02f901090183014820b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x9e0823da9f7f3a0b22dd2798e6af7b39be37f0da": { + "balance": "0x1550f7dca70000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1962bd06dc9bf3c0", + "nonce": "0x23" + } + }, + "meta": { + "byte_code": "0x02f86f8205392280843de92da6825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a00dd87a2c722138e8fe9e9242d6fea71c9456343457a58133867b3eb7b480506aa03f36067e682f89ef2723779b856f416d8fff548f99af0705bdb6ba32943dd4cd", + "new_txn_trie_node_byte": "0x02f86f8205392280843de92da6825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c080a00dd87a2c722138e8fe9e9242d6fea71c9456343457a58133867b3eb7b480506aa03f36067e682f89ef2723779b856f416d8fff548f99af0705bdb6ba32943dd4cd", + "new_receipt_trie_node_byte": "0xb9010d02f901090183019a28b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x7972eef40a371cbfd84c7d709507cc300c6d06a5": { + "balance": "0x1550f7dca70000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e195f26d365ee7580", + "nonce": "0x24" + } + }, + "meta": { + "byte_code": "0x02f86f8205392380843de92da6825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a0aaac3878bcb884b0cf46d1535fccb8421113d41045daed772338937500dcc57aa0593599f728a330be6d7bec338f95670bfc7021794ab83c0da9fe981b6e7248ed", + "new_txn_trie_node_byte": "0x02f86f8205392380843de92da6825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a0aaac3878bcb884b0cf46d1535fccb8421113d41045daed772338937500dcc57aa0593599f728a330be6d7bec338f95670bfc7021794ab83c0da9fe981b6e7248ed", + "new_receipt_trie_node_byte": "0xb9010d02f90109018301ec30b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + } + ] + }, + "other_data": { + "b_data": { + "b_meta": { + "block_beneficiary": "0x67b1d87101671b127f5f8714789c7192f7ad340e", + "block_timestamp": "0x666a96c8", + "block_number": "0x6", + "block_difficulty": "0x2", + "block_random": "0x0000000000000000000000000000000000000000000000000000000000000000", + "block_gaslimit": "0xb081b3", + "block_chain_id": "0x539", + "block_base_fee": "0x1b2b9dc8", + "block_gas_used": "0x1ec30", + "block_bloom": [ + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ] + }, + "b_hashes": { + "prev_hashes": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xc493151b4991dd1bf459952509bba9bc3fb2b706299e18e36e6b78781835065d", + "0xecc163d4e19061c77f9bc84afaaa6b98961e33435f80f9ebd6f751716f172b9c", + "0x52ed2bdc1acae1b2ad7890c4084e6d0db5a85b79d6ffa3f7a7efc04e3428b5f4", + "0x43e9e6398559ccdd4238d08a0b79ef57f50dddb2b75dd7c00e132718b54414c6", + "0x7b32edfa990c8aa0dc2afc2c0a23e1c6e1ede6b03de689a444163011231d90ce", + "0x540299ad479ada4fd07dc1f9506ab7cf71719c3d372d288d2ce43906a2437f59" + ], + "cur_hash": "0x8f4e8872fece2779107919faea4dd350dbdef0b579084080c12de204614b01e4" + }, + "withdrawals": [] + }, + "checkpoint_state_trie_root": "0x0fd5324836befac89fcd430abb81f2a274130af0dfa1a89babac76c574b58c40" + } + }, + { + "block_trace": { + "trie_pre_images": { + "combined": { + "compact": "0x0005582002601462093b5945d1676df093446790fd31b20e7b12a2e8e5e09d068109616b084a021e19e0c9bab240000005582002b64061d1b10621ed3cea3432c7e961244197663de5d2b7b25c29e63bec606d08471550f7dca700000218480558200268288056310c82aa4c01a7e12a10f8111a0560e72b700555479031b86c357d0841010558200239fa8ab811ddec4c30c62c575a346979cb7339d3e6b1b446aa9cec770bb1ca08471550f7dca70000055820022c9421b06b5fb4ed4f3f4b868f487d536ba02ebe1a6347c6a1312167dc000a08471550f7dca7000002194210055820021df1fa259221d02aa4956eb0d35ace318ca24c0a33a64c1af96cf67cf245b6084101055820021703c5eda8644a64cec152c58f5aacec93d72fb0bfa705f0473f9043a8357c0841010558200228a39461658094f425f190222a515c7902808b31fd90ea063e831b49d7443908471550f7dca700000219808405582103b70e80538acdabd6137353b0f9d8d149f4dba91e8be2e7946e409bfdbe685b900841010558210389802d6ed1a28b049e9d4fe5334c5902fd9bc00c42821c82f82ee2da10be90800841010558200256274a27dd7524955417c11ecd917251cc7c4c8310f4c7e4bd3c304d3d9a790c18244a021e195f26d365ee7580055820023ab0970b73895b8c9959bae685c3a19f45eb5ad89d42b52a340ec4ac204d190841010219102005582103876da518a393dbd067dc72abfa08d475ed6447fca96d92ec3f9e7eba503ca6100841010558210352688a8f926c816ca1e079067caba944f158e764817b83fc43594370ca9cf6200841010558200296cdcb823ae5bcb55a33b2a1a22c03bb69870a0270cfef4e7ea22125e9aa0908471550f7dca700000558200290b239ba3aaf993e443ae14aeffc44cf8d9931a79baed9fa141d0e4506e13108410102184205582103bd0026f7e234624f2bd4ca2c50d2f731cd19f206a89b29fa0c50b5b4e6bf133008471550f7dca700000219e573" + } + }, + "code_db": null, + "txn_info": [ + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e195b91b077ba65a0", + "nonce": "0x25" + }, + "0x14dc11386c1eee1dff28b4823f68e8de3b5a2747": { + "balance": "0x18de76816d8000" + } + }, + "meta": { + "byte_code": "0x02f86f82053924808436573b908252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c080a01f5434680e70fe67c289666daa62f021d77e75e014d772b76f7b66e96c2e35aca06ded5910833c78b37dcac16427030b2768c6d5457c79febb841c6a4f483c6138", + "new_txn_trie_node_byte": "0x02f86f82053924808436573b908252089414dc11386c1eee1dff28b4823f68e8de3b5a274787038d7ea4c6800080c080a01f5434680e70fe67c289666daa62f021d77e75e014d772b76f7b66e96c2e35aca06ded5910833c78b37dcac16427030b2768c6d5457c79febb841c6a4f483c6138", + "new_receipt_trie_node_byte": "0xb9010c02f9010801825208b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1957fc8d898655c0", + "nonce": "0x26" + }, + "0x92d3267215ec56542b985473e73c8417403b15ac": { + "balance": "0x18de76816d8000" + } + }, + "meta": { + "byte_code": "0x02f86f82053925808436573b908252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c001a0b58e8699319e3529c578ac9bb0b571f8f257df0943de4a17ce4cdab7cced1f40a078b718333c2cb89fbd67a2888fe72befb64685533c83f44980bc9e3a42feeb84", + "new_txn_trie_node_byte": "0x02f86f82053925808436573b908252089492d3267215ec56542b985473e73c8417403b15ac87038d7ea4c6800080c001a0b58e8699319e3529c578ac9bb0b571f8f257df0943de4a17ce4cdab7cced1f40a078b718333c2cb89fbd67a2888fe72befb64685533c83f44980bc9e3a42feeb84", + "new_receipt_trie_node_byte": "0xb9010c02f901080182a410b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1954676a9b5245e0", + "nonce": "0x27" + }, + "0x882145b1f9764372125861727d7be616c84010ef": { + "balance": "0x18de76816d8000" + } + }, + "meta": { + "byte_code": "0x02f86f82053926808436573b9082520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c080a011779b6c3d9c596d24125c4800472caaf666d22056a30156a3b52170c8f23b79a00e0129e08c7917f08356dc870976275a2de21d6dc89b36f53ffd74f9a8518d90", + "new_txn_trie_node_byte": "0x02f86f82053926808436573b9082520894882145b1f9764372125861727d7be616c84010ef87038d7ea4c6800080c080a011779b6c3d9c596d24125c4800472caaf666d22056a30156a3b52170c8f23b79a00e0129e08c7917f08356dc870976275a2de21d6dc89b36f53ffd74f9a8518d90", + "new_receipt_trie_node_byte": "0xb9010c02f901080182f618b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1950d247ad1e3600", + "nonce": "0x28" + }, + "0x2c80179883217370f777e76c067eea91d8283c5c": { + "balance": "0x18de76816d8000" + } + }, + "meta": { + "byte_code": "0x02f86f82053927808436573b90825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c001a077839a39ca68239775657fa67c028891424835ed0fcf9b84149382e9c65e018fa03c4aeea69f7a0c1b04ff13288702290155396075ea13ae982fab97441efbf594", + "new_txn_trie_node_byte": "0x02f86f82053927808436573b90825208942c80179883217370f777e76c067eea91d8283c5c87038d7ea4c6800080c001a077839a39ca68239775657fa67c028891424835ed0fcf9b84149382e9c65e018fa03c4aeea69f7a0c1b04ff13288702290155396075ea13ae982fab97441efbf594", + "new_receipt_trie_node_byte": "0xb9010d02f901090183014820b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x9e0823da9f7f3a0b22dd2798e6af7b39be37f0da": { + "balance": "0x18de76816d8000" + }, + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e194d3d24beea2620", + "nonce": "0x29" + } + }, + "meta": { + "byte_code": "0x02f86f82053928808436573b90825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c001a01d26b7cc6ff90bf7e28d5228add30e6231f68165ffe980d34b70a6ad313ab99fa00a03a2a9e24513a9e763948758937c31f223ed8f41fe345fb3bc439797b0ce89", + "new_txn_trie_node_byte": "0x02f86f82053928808436573b90825208949e0823da9f7f3a0b22dd2798e6af7b39be37f0da87038d7ea4c6800080c001a01d26b7cc6ff90bf7e28d5228add30e6231f68165ffe980d34b70a6ad313ab99fa00a03a2a9e24513a9e763948758937c31f223ed8f41fe345fb3bc439797b0ce89", + "new_receipt_trie_node_byte": "0xb9010d02f901090183019a28b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + }, + { + "traces": { + "0x67b1d87101671b127f5f8714789c7192f7ad340e": { + "balance": "0x21e1949a801d0b61640", + "nonce": "0x2a" + }, + "0x7972eef40a371cbfd84c7d709507cc300c6d06a5": { + "balance": "0x18de76816d8000" + } + }, + "meta": { + "byte_code": "0x02f86f82053929808436573b90825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a0c88544f777b3d7f6a069479f5a792b080efb42f90b1875e28a04b59105fc0931a017e6cf1abe23b0cfa3cf83947ae3ce26f69753aeb0a51695e3dc75c748fdf164", + "new_txn_trie_node_byte": "0x02f86f82053929808436573b90825208947972eef40a371cbfd84c7d709507cc300c6d06a587038d7ea4c6800080c001a0c88544f777b3d7f6a069479f5a792b080efb42f90b1875e28a04b59105fc0931a017e6cf1abe23b0cfa3cf83947ae3ce26f69753aeb0a51695e3dc75c748fdf164", + "new_receipt_trie_node_byte": "0xb9010d02f90109018301ec30b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", + "gas_used": 21000 + } + } + ] + }, + "other_data": { + "b_data": { + "b_meta": { + "block_beneficiary": "0x67b1d87101671b127f5f8714789c7192f7ad340e", + "block_timestamp": "0x666a96cd", + "block_number": "0x7", + "block_difficulty": "0x2", + "block_random": "0x0000000000000000000000000000000000000000000000000000000000000000", + "block_gaslimit": "0xb0add2", + "block_chain_id": "0x539", + "block_base_fee": "0x17d91afc", + "block_gas_used": "0x1ec30", + "block_bloom": [ + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0", + "0x0" + ] + }, + "b_hashes": { + "prev_hashes": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xc493151b4991dd1bf459952509bba9bc3fb2b706299e18e36e6b78781835065d", + "0xecc163d4e19061c77f9bc84afaaa6b98961e33435f80f9ebd6f751716f172b9c", + "0x52ed2bdc1acae1b2ad7890c4084e6d0db5a85b79d6ffa3f7a7efc04e3428b5f4", + "0x43e9e6398559ccdd4238d08a0b79ef57f50dddb2b75dd7c00e132718b54414c6", + "0x7b32edfa990c8aa0dc2afc2c0a23e1c6e1ede6b03de689a444163011231d90ce", + "0x540299ad479ada4fd07dc1f9506ab7cf71719c3d372d288d2ce43906a2437f59", + "0x8f4e8872fece2779107919faea4dd350dbdef0b579084080c12de204614b01e4" + ], + "cur_hash": "0x9fe97326da9f39550fd361614c13bc56b648fa5bd30ed7d296920b9928c44138" + }, + "withdrawals": [] + }, + "checkpoint_state_trie_root": "0x0fd5324836befac89fcd430abb81f2a274130af0dfa1a89babac76c574b58c40" + } + } +] diff --git a/zero_bin/tools/prove_blocks.sh b/zero_bin/tools/prove_jerigon.sh similarity index 93% rename from zero_bin/tools/prove_blocks.sh rename to zero_bin/tools/prove_jerigon.sh index 62766157c..409cbf331 100755 --- a/zero_bin/tools/prove_blocks.sh +++ b/zero_bin/tools/prove_jerigon.sh @@ -82,15 +82,15 @@ if [[ $5 == "test_only" ]]; then # test only run echo "Proving blocks ${BLOCK_INTERVAL} in a test_only mode now... (Total: ${TOT_BLOCKS})" cargo r --release --features test_only --bin leader -- --runtime in-memory --load-strategy on-demand jerigon --rpc-url "$NODE_RPC_URL" --block-interval $BLOCK_INTERVAL --proof-output-dir $PROOF_OUTPUT_DIR $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 - if grep 'Successfully generated witness for block' $OUT_LOG_PATH; then - echo "Success - Note this was just a test, not a proof" + if grep -q 'All proof witnesses have been generated successfully.' $OUT_LOG_PATH; then + echo -e "Success - Note this was just a test, not a proof" # Remove the log on success if we don't want to keep it. if [ $ALWAYS_WRITE_LOGS -ne 1 ]; then rm $OUT_LOG_PATH fi exit else - echo "Failed to create a witness" + echo "Failed to create proof witnesses. See ${OUT_LOG_PATH} for more details." exit 1 fi else diff --git a/zero_bin/tools/prove_stdio.sh b/zero_bin/tools/prove_stdio.sh new file mode 100755 index 000000000..b99df289b --- /dev/null +++ b/zero_bin/tools/prove_stdio.sh @@ -0,0 +1,101 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# Run prover with the parsed input from the standard terminal. +# To generate the json input file, use the `rpc` tool, for example: +# `cargo run --bin rpc -- fetch --rpc-url http://127.0.0.1:8546 --start-block 2 --end-block 5 > witness.json` + +# Args: +# 1 --> Input witness json file +# 2 --> Test run only flag `test_only` (optional) + +# We're going to set the paralellism in line with the total cpu count +num_procs=$(nproc) + +# Configured Rayon and Tokio with rough defaults +export RAYON_NUM_THREADS=$num_procs +export TOKIO_WORKER_THREADS=$num_procs + +export RUST_MIN_STACK=33554432 +export RUST_BACKTRACE=full +export RUST_LOG=info +# Disable the lld linker for now, as it's causing issues with the linkme package. +# https://github.com/rust-lang/rust/pull/124129 +# https://github.com/dtolnay/linkme/pull/88 +export RUSTFLAGS='-C target-cpu=native -Zlinker-features=-lld' + +INPUT_FILE=$1 +TEST_ONLY=$2 + +if [[ $INPUT_FILE == "" ]]; then + echo "Please provide witness json input file, e.g. artifacts/witness_b19240705.json" + exit 1 +fi + +if [[ $TEST_ONLY == "test_only" ]]; then + # Circuit sizes don't matter in test_only mode, so we keep them minimal. + export ARITHMETIC_CIRCUIT_SIZE="16..17" + export BYTE_PACKING_CIRCUIT_SIZE="9..10" + export CPU_CIRCUIT_SIZE="12..13" + export KECCAK_CIRCUIT_SIZE="14..15" + export KECCAK_SPONGE_CIRCUIT_SIZE="9..10" + export LOGIC_CIRCUIT_SIZE="12..13" + export MEMORY_CIRCUIT_SIZE="17..18" +else + if [[ $INPUT_FILE == *"witness_b19240705"* ]]; then + # These sizes are configured specifically for block 19240705. Don't use this in other scenarios + echo "Using specific circuit sizes for witness_b19240705.json" + export ARITHMETIC_CIRCUIT_SIZE="16..19" + export BYTE_PACKING_CIRCUIT_SIZE="16..19" + export CPU_CIRCUIT_SIZE="18..21" + export KECCAK_CIRCUIT_SIZE="15..18" + export KECCAK_SPONGE_CIRCUIT_SIZE="10..13" + export LOGIC_CIRCUIT_SIZE="13..17" + export MEMORY_CIRCUIT_SIZE="20..23" + else + export ARITHMETIC_CIRCUIT_SIZE="16..23" + export BYTE_PACKING_CIRCUIT_SIZE="9..21" + export CPU_CIRCUIT_SIZE="12..25" + export KECCAK_CIRCUIT_SIZE="14..20" + export KECCAK_SPONGE_CIRCUIT_SIZE="9..15" + export LOGIC_CIRCUIT_SIZE="12..18" + export MEMORY_CIRCUIT_SIZE="17..28" + fi +fi + + +# If we run ./prove_stdio.sh test_only, we'll generate a dummy +# proof. This is useful for quickly testing decoding and all of the +# other non-proving code. +if [[ $TEST_ONLY == "test_only" ]]; then + cargo run --release --features test_only --bin leader -- --runtime in-memory --load-strategy on-demand stdio < $INPUT_FILE | tee test.out + if grep -q 'All proof witnesses have been generated successfully.' test.out; then + echo -e "\n\nSuccess - Note this was just a test, not a proof" + exit + else + echo "Failed to create proof witnesses. See test.out for more details." + exit 1 + fi +fi + +cargo build --release --jobs "$num_procs" + +start_time=$(date +%s%N) +../target/release/leader --runtime in-memory --load-strategy on-demand stdio < $INPUT_FILE | tee leader.out +end_time=$(date +%s%N) + +tail -n 1 leader.out > proofs.json + +../target/release/verifier -f proofs.json | tee verify.out + +if grep -q 'All proofs verified successfully!' verify.out; then + duration_ns=$((end_time - start_time)) + duration_sec=$(echo "$duration_ns / 1000000000" | bc -l) + echo "Success!" + echo "Duration:" $duration_sec " seconds" + echo "Note, this duration is inclusive of circuit handling and overall process initialization"; +else + echo "there was an issue with proof verification"; + exit 1 +fi + + diff --git a/zero_bin/tools/simple_test.sh b/zero_bin/tools/simple_test.sh deleted file mode 100755 index 292c2ba96..000000000 --- a/zero_bin/tools/simple_test.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash -# ------------------------------------------------------------------------------ -# This is meant to be a somewhat self contained script for quickly -# proving an Ethereum mainnet block with the type 1 prover. The goal -# is to use this for benchmarking and CI. This is the block in -# question: https://etherscan.io/block/19240705 - -# We're going to set the paralellism in line with the total cpu count -num_procs=$(nproc) - -2>&1 echo "Pulling sample witness" -witness_cid_hash="QmbwnLGuZ2qxZDqETAFb5DnyjZry8Sv3UFwYnsgKmsE3of" -curl -s -L "https://cf-ipfs.com/ipfs/$witness_cid_hash" > witness.json.bz2 -bunzip2 -f witness.json.bz2 - -# Configured Rayon and Tokio with rough defaults -export RAYON_NUM_THREADS=$num_procs -export TOKIO_WORKER_THREADS=$num_procs - -export RUST_MIN_STACK=33554432 -export RUST_BACKTRACE=full -export RUST_LOG=info -# Disable the lld linker for now, as it's causing issues with the linkme package. -# https://github.com/rust-lang/rust/pull/124129 -# https://github.com/dtolnay/linkme/pull/88 -export RUSTFLAGS='-C target-cpu=native -Zlinker-features=-lld' - -if [[ $1 == "test_only" ]]; then - # Circuit sizes don't matter in test_only mode, so we keep them minimal. - export ARITHMETIC_CIRCUIT_SIZE="16..17" - export BYTE_PACKING_CIRCUIT_SIZE="9..10" - export CPU_CIRCUIT_SIZE="12..13" - export KECCAK_CIRCUIT_SIZE="14..15" - export KECCAK_SPONGE_CIRCUIT_SIZE="9..10" - export LOGIC_CIRCUIT_SIZE="12..13" - export MEMORY_CIRCUIT_SIZE="17..18" -else - # These sizes are configured specifically for this witness. Don't use this in other scenarios - export ARITHMETIC_CIRCUIT_SIZE="16..19" - export BYTE_PACKING_CIRCUIT_SIZE="16..19" - export CPU_CIRCUIT_SIZE="18..21" - export KECCAK_CIRCUIT_SIZE="15..18" - export KECCAK_SPONGE_CIRCUIT_SIZE="10..13" - export LOGIC_CIRCUIT_SIZE="13..17" - export MEMORY_CIRCUIT_SIZE="20..23" -fi - - -# If we run ./simple_test test_only, we'll generate a dummy -# proof. This is useful for quickly testing decoding and all of the -# other non-proving code. -if [[ $1 == "test_only" ]]; then - cargo run --release --features test_only --bin leader -- --runtime in-memory --load-strategy on-demand stdio < witness.json | tee test.out - if grep 'Successfully generated witness for block' test.out; then - echo "Success - Note this was just a test, not a proof" - exit - else - echo "Failed to create a witness" - exit 1 - fi -fi - -cargo build --release --jobs "$num_procs" - -start_time=$(date +%s%N) -../target/release/leader --runtime in-memory --load-strategy monolithic stdio < witness.json | tee leader.out -end_time=$(date +%s%N) - -tail -n 1 leader.out > proof.json - -../target/release/verifier -f proof.json | tee verify.out - -if grep -q 'Proof verified successfully!' verify.out; then - duration_ns=$((end_time - start_time)) - duration_sec=$(echo "$duration_ns / 1000000000" | bc -l) - echo "Success!" - printf "Duration: %.3f seconds\n" $duration_sec - echo "Note, this duration is inclusive of circuit handling and overall process initialization"; -else - echo "there was an issue with proof verification"; - exit 1 -fi - - diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index 5e7402552..06a0ecebd 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -17,16 +17,22 @@ fn main() -> Result<()> { let args = cli::Cli::parse(); let file = File::open(args.file_path)?; let des = &mut Deserializer::from_reader(&file); - let input: GeneratedBlockProof = serde_path_to_error::deserialize(des)?; + let input_proofs: Vec = serde_path_to_error::deserialize(des)?; let verifer = args .prover_state_config .into_prover_state_manager() .verifier()?; - match verifer.verify(&input.intern) { - Ok(_) => info!("Proof verified successfully!"), - Err(e) => info!("Proof verification failed with error: {:?}", e), + if input_proofs.into_iter().all(|block_proof| { + verifer + .verify(&block_proof.intern) + .map_err(|e| { + info!("Proof verification failed with error: {:?}", e); + }) + .is_ok() + }) { + info!("All proofs verified successfully!"); }; Ok(()) From c5433a2466b21c90aec8edc1924ea98f4cc1d194 Mon Sep 17 00:00:00 2001 From: Linda Guiga <101227802+LindaGuiga@users.noreply.github.com> Date: Mon, 17 Jun 2024 18:51:49 +0800 Subject: [PATCH 169/184] Fixes related to nightly and alloy (#101) * Fixes related to nightly * fix: use latest nightly --------- Co-authored-by: Marko Atanasievski --- zero_bin/Cargo.lock | 1397 ++++++++++++++++++++++------------- zero_bin/leader/src/main.rs | 10 +- zero_bin/rpc/src/lib.rs | 25 +- 3 files changed, 915 insertions(+), 517 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 3af52fd77..64740e5f9 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -17,6 +17,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "ahash" version = "0.8.11" @@ -32,23 +43,23 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-consensus", "alloy-core", @@ -63,10 +74,20 @@ dependencies = [ "reqwest", ] +[[package]] +name = "alloy-chains" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fd095a9d70f4b1c5c102c84a4c782867a5c6416dbf6dcd42a63e7c7a89d3c8" +dependencies = [ + "num_enum", + "strum", +] + [[package]] name = "alloy-consensus" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-eips", "alloy-primitives", @@ -78,9 +99,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7253846c7bf55147775fd66c334abc1dd0a41e97e6155577b3dc513c6e66ef2" +checksum = "31b8b8d8c4e84449ce8f310ed48e09ce38b8290b163e3d0df68ea445a9ccce3a" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -90,9 +111,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8425a283510106b1a6ad25dd4bb648ecde7da3fd2baeb9400a85ad62f51ec90b" +checksum = "efd2404399cb1b50572758e66e9b4bf088e5a3df9007be7126456c7e50af935f" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -102,13 +123,13 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow 0.6.6", + "winnow 0.6.13", ] [[package]] name = "alloy-eips" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -122,7 +143,7 @@ dependencies = [ [[package]] name = "alloy-genesis" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-primitives", "alloy-serde", @@ -132,9 +153,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e30946aa6173020259055a44971f5cf40a7d76c931d209caeb51b333263df4f" +checksum = "7c3abf6446a292e19853aaca43590eeb48bf435dfd2c74200259e8f4872f6ce3" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -145,7 +166,7 @@ dependencies = [ [[package]] name = "alloy-json-rpc" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-primitives", "serde", @@ -157,7 +178,7 @@ dependencies = [ [[package]] name = "alloy-network" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -167,15 +188,16 @@ dependencies = [ "alloy-signer", "alloy-sol-types", "async-trait", + "auto_impl", "futures-utils-wasm", "thiserror", ] [[package]] name = "alloy-primitives" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8aa973e647ec336810a9356af8aea787249c9d00b1525359f3db29a68d231b" +checksum = "5277af0cbcc483ee6ad2c1e818090b5928d27f04fd6580680f31c1cf8068bcc2" dependencies = [ "alloy-rlp", "bytes", @@ -196,8 +218,10 @@ dependencies = [ [[package]] name = "alloy-provider" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ + "alloy-chains", + "alloy-consensus", "alloy-eips", "alloy-json-rpc", "alloy-network", @@ -216,6 +240,7 @@ dependencies = [ "lru", "pin-project", "reqwest", + "serde", "serde_json", "tokio", "tracing", @@ -241,13 +266,13 @@ checksum = "8037e03c7f462a063f28daec9fda285a9a89da003c552f8637a80b9c8fd96241" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "alloy-rpc-client" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -267,7 +292,7 @@ dependencies = [ [[package]] name = "alloy-rpc-types" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -285,7 +310,7 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-primitives", "alloy-rpc-types", @@ -297,7 +322,7 @@ dependencies = [ [[package]] name = "alloy-serde" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-primitives", "serde", @@ -307,7 +332,7 @@ dependencies = [ [[package]] name = "alloy-signer" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-primitives", "async-trait", @@ -319,65 +344,65 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dbd17d67f3e89478c8a634416358e539e577899666c927bc3d2b1328ee9b6ca" +checksum = "30708a79919b082f2692423c8cc72fc250477e4a2ecb0d4a7244cd3cdb299965" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6da95adcf4760bb4b108fefa51d50096c5e5fdd29ee72fed3e86ee414f2e34" +checksum = "1c7a679ac01774ab7e00a567a918d4231ae692c5c8cedaf4e16956c3116d7896" dependencies = [ "alloy-sol-macro-input", "const-hex", - "heck 0.4.1", - "indexmap 2.2.5", + "heck 0.5.0", + "indexmap 2.2.6", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c8da04c1343871fb6ce5a489218f9c85323c8340a36e9106b5fc98d4dd59d5" +checksum = "356da0c2228aa6675a5faaa08a3e4061b967f924753983d72b9a18d9a3fad44e" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368cae4dc052cad1d8f72eb2ae0c38027116933eeb49213c200a9e9875f208d7" +checksum = "81fd4783b0a5840479013e9ce960d2eb7b3be381f722e0fe3d1f7c3bb6bd4ebd" dependencies = [ - "winnow 0.6.6", + "winnow 0.6.13", ] [[package]] name = "alloy-sol-types" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a64d2d2395c1ac636b62419a7b17ec39031d6b2367e66e9acbf566e6055e9c" +checksum = "6eb5e6234c0b62514992589fe1578f64d418dbc8ef5cd1ab2d7f2f568f599698" dependencies = [ "alloy-primitives", "alloy-sol-macro", @@ -388,10 +413,10 @@ dependencies = [ [[package]] name = "alloy-transport" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-json-rpc", - "base64 0.22.1", + "base64", "futures-util", "futures-utils-wasm", "serde", @@ -406,7 +431,7 @@ dependencies = [ [[package]] name = "alloy-transport-http" version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#975b849ab11a1bbc7285f46dcb0b99b7df7e438b" +source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -419,9 +444,9 @@ dependencies = [ [[package]] name = "amq-protocol" -version = "7.1.2" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d40d8b2465c7959dd40cee32ba6ac334b5de57e9fca0cc756759894a4152a5d" +checksum = "f051d4d77904272e9be7e292607378dc9900d15b8d314bfd3ed4b82fdd84f125" dependencies = [ "amq-protocol-tcp", "amq-protocol-types", @@ -433,9 +458,9 @@ dependencies = [ [[package]] name = "amq-protocol-tcp" -version = "7.1.2" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cb2100adae7da61953a2c3a01935d86caae13329fadce3333f524d6d6ce12e2" +checksum = "4e3d51dd36e67d757c9ba80a7b2a2a2a69254c1dbe4d8c631824ec7f5b69f60e" dependencies = [ "amq-protocol-uri", "tcp-stream", @@ -444,9 +469,9 @@ dependencies = [ [[package]] name = "amq-protocol-types" -version = "7.1.2" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "156ff13c8a3ced600b4e54ed826a2ae6242b6069d00dd98466827cef07d3daff" +checksum = "0acdd47054ced8b9bc89ee0dbb42ccc8028de48d8658b24de4c255a226c9bfec" dependencies = [ "cookie-factory", "nom", @@ -456,9 +481,9 @@ dependencies = [ [[package]] name = "amq-protocol-uri" -version = "7.1.2" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "751bbd7d440576066233e740576f1b31fdc6ab86cfabfbd48c548de77eca73e4" +checksum = "f17881b7575dab3e71403f28a3e50b71f0d1bd026829abca3c48664522ce0df0" dependencies = [ "amq-protocol-types", "percent-encoding", @@ -482,47 +507,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -530,9 +556,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" dependencies = [ "backtrace", ] @@ -667,29 +693,66 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "asn1-rs" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "async-channel" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.2.0", - "event-listener-strategy 0.5.0", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.8.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" dependencies = [ - "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-lite 2.3.0", "slab", ] @@ -702,8 +765,8 @@ checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ "async-channel", "async-executor", - "async-io 2.3.2", - "async-lock 3.3.0", + "async-io 2.3.3", + "async-lock 3.4.0", "blocking", "futures-lite 2.3.0", "once_cell", @@ -742,18 +805,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" dependencies = [ - "async-lock 3.3.0", + "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", "futures-lite 2.3.0", "parking", - "polling 3.5.0", - "rustix 0.38.32", + "polling 3.7.1", + "rustix 0.38.34", "slab", "tracing", "windows-sys 0.52.0", @@ -770,12 +833,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", + "event-listener 5.3.1", + "event-listener-strategy", "pin-project-lite", ] @@ -810,24 +873,24 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.78" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -853,20 +916,47 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "aws-lc-rs" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "474d7cec9d0a1126fad1b224b767fcbf351c23b0309bb21ec210bcfd379926a5" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7505fc3cb7acbf42699a43a79dd9caa4ed9e99861dfbb837c5c0fb5a0a8d2980" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] [[package]] name = "axum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" dependencies = [ "async-trait", "axum-core", @@ -888,7 +978,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "tokio", "tower", "tower-layer", @@ -911,7 +1001,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper", + "sync_wrapper 0.1.2", "tower-layer", "tower-service", "tracing", @@ -933,9 +1023,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" dependencies = [ "addr2line", "cc", @@ -952,12 +1042,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -970,6 +1054,29 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.5.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.66", + "which", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -1029,25 +1136,22 @@ dependencies = [ [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock 3.3.0", "async-task", - "fastrand 2.0.1", "futures-io", "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] name = "blst" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" dependencies = [ "cc", "glob", @@ -1057,9 +1161,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-slice-cast" @@ -1075,9 +1179,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" dependencies = [ "serde", ] @@ -1107,9 +1211,23 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.90" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cexpr" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] [[package]] name = "cfg-if" @@ -1119,15 +1237,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.35" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -1167,11 +1285,22 @@ dependencies = [ "inout", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" -version = "4.5.3" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" +checksum = "a9689a29b593160de5bc4aacab7b5d54fb52231de70122626c178e6a368994c7" dependencies = [ "clap_builder", "clap_derive", @@ -1179,33 +1308,54 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "2e5387378c84f6faa26890ebf9f0a92989f8873d4d380467bcd0d8d8620424df" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.0", + "strsim", ] [[package]] name = "clap_derive" -version = "4.5.3" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + +[[package]] +name = "cmake" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + +[[package]] +name = "cms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b77c319abfd5219629c45c34c89ba945ed3c5e49fcde9d16b6c3885f118a730" +dependencies = [ + "const-oid", + "der", + "spki", + "x509-cert", +] [[package]] name = "cobs" @@ -1215,9 +1365,9 @@ checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "common" @@ -1240,18 +1390,18 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] name = "const-hex" -version = "1.11.4" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ff96486ccc291d36a958107caf2c0af8c78c0af7d31ae2f35ce055130de1a6" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" dependencies = [ "cfg-if", "cpufeatures", @@ -1294,9 +1444,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cookie-factory" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" +checksum = "9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2" [[package]] name = "core-foundation" @@ -1344,9 +1494,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -1391,9 +1541,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1425,9 +1575,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -1435,27 +1585,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.53", + "strsim", + "syn 2.0.66", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -1465,12 +1615,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", ] +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + [[package]] name = "der" version = "0.7.9" @@ -1478,9 +1634,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", + "der_derive", + "flagset", + "pem-rfc7468", "zeroize", ] +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "deranged" version = "0.3.11" @@ -1545,6 +1729,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -1579,9 +1774,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "elliptic-curve" @@ -1617,7 +1812,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -1628,7 +1823,7 @@ checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -1652,9 +1847,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1695,20 +1890,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "4.0.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -1717,21 +1901,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.2.0", + "event-listener 5.3.1", "pin-project-lite", ] @@ -1744,7 +1918,7 @@ dependencies = [ "bytes", "env_logger", "ethereum-types", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "hex-literal", "itertools 0.11.0", "jemallocator", @@ -1790,9 +1964,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fastrlp" @@ -1837,16 +2011,10 @@ dependencies = [ ] [[package]] -name = "flume" -version = "0.10.14" +name = "flagset" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" -dependencies = [ - "futures-core", - "futures-sink", - "pin-project", - "spin", -] +checksum = "cdeb3aa5e95cf9aabc17f060cfa0ced7b83f042390760ca53bf09df9968acaa1" [[package]] name = "flume" @@ -1854,6 +2022,8 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ + "futures-core", + "futures-sink", "spin", ] @@ -1887,6 +2057,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "funty" version = "2.0.0" @@ -1962,7 +2138,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-core", "futures-io", "parking", @@ -1977,7 +2153,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -2029,9 +2205,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -2042,9 +2218,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -2063,30 +2239,11 @@ dependencies = [ "subtle", ] -[[package]] -name = "h2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.2.5", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "half" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", @@ -2109,9 +2266,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -2175,6 +2332,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "http" version = "1.1.0" @@ -2229,14 +2395,13 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2", "http", "http-body", "httparse", @@ -2266,9 +2431,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -2277,7 +2442,7 @@ dependencies = [ "http-body", "hyper", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tower", "tower-service", @@ -2385,12 +2550,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "serde", ] @@ -2406,9 +2571,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2450,6 +2615,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.10.5" @@ -2488,9 +2659,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jemalloc-sys" @@ -2512,6 +2683,15 @@ dependencies = [ "libc", ] +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.69" @@ -2566,16 +2746,16 @@ dependencies = [ [[package]] name = "lapin" -version = "2.3.1" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f3067a1fcfbc3fc46455809c023e69b8f6602463201010f4ae5a3b572adb9dc" +checksum = "fae02c316a8a5922ce7518afa6b6c00e9a099f8e59587567e3331efdd11b8ceb" dependencies = [ "amq-protocol", "async-global-executor-trait", "async-reactor-trait", "async-trait", "executor-trait", - "flume 0.10.14", + "flume", "futures-core", "futures-io", "parking_lot", @@ -2592,6 +2772,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "leader" version = "0.1.0" @@ -2619,9 +2805,19 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libloading" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] [[package]] name = "libm" @@ -2631,22 +2827,22 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "linkme" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2cfee0de9bd869589fb9a015e155946d1be5ff415cb844c2caccc6cc4b5db9" +checksum = "ccb76662d78edc9f9bf56360d6919bdacc8b7761227727e5082f128eeb90bbf5" dependencies = [ "linkme-impl", ] [[package]] name = "linkme-impl" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adf157a4dc5a29b7b464aa8fe7edeff30076e07e13646a1c3874f58477dc99f8" +checksum = "f8dccda732e04fa3baf2e17cf835bfe2601c7c2edafd64417c627dabae3a8cda" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -2657,15 +2853,15 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2684,7 +2880,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -2704,9 +2900,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "mime" @@ -2722,9 +2918,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", ] @@ -2740,6 +2936,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + [[package]] name = "mpt_trie" version = "0.3.0" @@ -2766,11 +2968,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2804,9 +3005,9 @@ dependencies = [ [[package]] name = "num" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -2818,11 +3019,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", "rand", @@ -2830,9 +3030,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", "rand", @@ -2855,9 +3055,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2866,11 +3066,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -2896,15 +3095,44 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "object" -version = "0.32.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" dependencies = [ "memchr", ] +[[package]] +name = "oid-registry" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -2934,7 +3162,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -2975,20 +3203,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] -name = "p12" -version = "0.6.3" +name = "p12-keystore" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4873306de53fe82e7e484df31e1e947d61514b6ea2ed6cd7b45d63006fd9224" +checksum = "df7b60d0b2dcace322e6e8c4499c4c8bdf331c1bae046a54be5e4191c3610286" dependencies = [ "cbc", - "cipher", + "cms", + "der", "des", - "getrandom", + "hex", "hmac", - "lazy_static", + "pkcs12", + "pkcs5", + "rand", "rc2", "sha1", - "yasna", + "sha2", + "thiserror", + "x509-parser", ] [[package]] @@ -3031,14 +3264,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af25dcb10b7c0ce99abee8694e2e79e4787d7f778b9339dc5a50ba6fc45e5cc9" dependencies = [ "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "parity-scale-codec" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arrayvec", "bitvec", @@ -3050,9 +3283,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3068,9 +3301,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -3078,22 +3311,41 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[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", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] [[package]] name = "percent-encoding" @@ -3103,9 +3355,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.8" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" +checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" dependencies = [ "memchr", "thiserror", @@ -3114,9 +3366,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.8" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026" +checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" dependencies = [ "pest", "pest_generator", @@ -3124,22 +3376,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.8" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80" +checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "pest_meta" -version = "2.7.8" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293" +checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd" dependencies = [ "once_cell", "pest", @@ -3163,14 +3415,14 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3185,22 +3437,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cfae3ead413ca051a681152bd266438d3bfa301c9bdf836939a14c721bb2a21" dependencies = [ "doc-comment", - "flume 0.11.0", + "flume", "parking_lot", "tracing", ] [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-io", ] +[[package]] +name = "pkcs12" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "695b3df3d3cc1015f12d70235e35b6b79befc5fa7a9b95b951eab1dd07c9efc2" +dependencies = [ + "cms", + "const-oid", + "der", + "digest 0.10.7", + "spki", + "x509-cert", + "zeroize", +] + +[[package]] +name = "pkcs5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +dependencies = [ + "aes", + "cbc", + "der", + "pbkdf2", + "scrypt", + "sha2", + "spki", +] + [[package]] name = "pkcs8" version = "0.10.2" @@ -3226,7 +3508,7 @@ dependencies = [ "ahash", "anyhow", "getrandom", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "itertools 0.11.0", "keccak-hash 0.8.0", "log", @@ -3291,14 +3573,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.5.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +checksum = "5e6a007746f34ed64099e88783b0ae369eaa3da6392868ba262e2af9b8fbaea1" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi", "pin-project-lite", - "rustix 0.38.32", + "rustix 0.38.34", "tracing", "windows-sys 0.52.0", ] @@ -3327,6 +3610,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.66", +] + [[package]] name = "primitive-types" version = "0.10.1" @@ -3352,11 +3645,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.20.2", + "toml_edit 0.21.1", ] [[package]] @@ -3385,9 +3678,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] @@ -3419,7 +3712,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", "rusty-fork", "tempfile", "unarray", @@ -3453,9 +3746,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -3507,9 +3800,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3547,23 +3840,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", ] [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.6", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -3583,7 +3876,7 @@ checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -3594,9 +3887,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "reqwest" @@ -3604,7 +3897,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "futures-core", "futures-util", @@ -3622,11 +3915,11 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.1.2", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "tokio", "tokio-native-tls", "tower-service", @@ -3710,9 +4003,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.12.1" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f308135fef9fc398342da5472ce7c484529df23743fb7c734e0f3d472971e62" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", @@ -3734,15 +4027,21 @@ dependencies = [ [[package]] name = "ruint-macro" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hex" @@ -3765,7 +4064,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.22", + "semver 1.0.23", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", ] [[package]] @@ -3784,69 +4092,65 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.11" +version = "0.23.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" +checksum = "a218f0f6d05669de4eabfb24f31ce802035c952429d037507b4a4a39f0e60c5b" dependencies = [ + "aws-lc-rs", "log", - "ring", + "once_cell", + "rustls-pki-types", "rustls-webpki", - "sct", + "subtle", + "zeroize", ] [[package]] name = "rustls-connector" -version = "0.18.5" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25da151615461c7347114b1ad1a7458b4cdebc69cb220cd140cd5cb324b1dd37" +checksum = "727a826801254b6cfcd2508a0508c01b7c1bca21d3673e84d86da084781b83d5" dependencies = [ "log", "rustls", "rustls-native-certs", + "rustls-pki-types", "rustls-webpki", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.4", + "rustls-pemfile", + "rustls-pki-types", "schannel", "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.22.1", + "base64", "rustls-pki-types", ] @@ -3858,19 +4162,21 @@ checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ + "aws-lc-rs", "ring", + "rustls-pki-types", "untrusted", ] [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "rusty-fork" @@ -3886,9 +4192,18 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] [[package]] name = "schannel" @@ -3906,13 +4221,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "sct" -version = "0.7.1" +name = "scrypt" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" dependencies = [ - "ring", - "untrusted", + "pbkdf2", + "salsa20", + "sha2", ] [[package]] @@ -3931,11 +4247,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "core-foundation", "core-foundation-sys", "libc", @@ -3944,9 +4260,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -3963,9 +4279,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "semver-parser" @@ -3978,29 +4294,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa", "ryu", @@ -4019,9 +4335,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -4040,15 +4356,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.7.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" dependencies = [ - "base64 0.21.7", + "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.5", + "indexmap 2.2.6", "serde", "serde_derive", "serde_json", @@ -4058,14 +4374,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.7.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -4109,11 +4425,17 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -4139,9 +4461,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -4155,9 +4477,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4196,7 +4518,7 @@ checksum = "8a8480ca5b8eedf83ad070a780783b4e21a56c6ef66b4c0d1b7520b72bdfda1b" dependencies = [ "ahash", "anyhow", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "itertools 0.11.0", "log", "num-bigint", @@ -4213,15 +4535,31 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "strsim" -version = "0.11.0" +name = "strum" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.66", +] [[package]] name = "subtle" @@ -4242,9 +4580,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -4253,14 +4591,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8db114c44cf843a8bacd37a146e37987a0b823a0e8bc4fdc610c9c72ab397a5" +checksum = "e6fe08d08d84f2c0a77f1e7c46518789d745c2e87a2721791ed7c3c9bc78df28" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -4269,6 +4607,23 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "tap" version = "1.0.1" @@ -4277,14 +4632,14 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tcp-stream" -version = "0.26.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da30af7998f51ee1aa48ab24276fe303a697b004e31ff542b192c088d5630a5" +checksum = "495b0abdce3dc1f8fd27240651c9e68890c14e9d9c61527b1ce44d8a5a7bd3d5" dependencies = [ "cfg-if", - "p12", + "p12-keystore", "rustls-connector", - "rustls-pemfile 1.0.4", + "rustls-pemfile", ] [[package]] @@ -4294,8 +4649,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.0.1", - "rustix 0.38.32", + "fastrand 2.1.0", + "rustix 0.38.34", "windows-sys 0.52.0", ] @@ -4310,22 +4665,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -4349,9 +4704,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -4370,9 +4725,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -4404,9 +4759,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -4416,7 +4771,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.6", + "socket2 0.5.7", "tokio-macros", "windows-sys 0.48.0", ] @@ -4434,13 +4789,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -4481,61 +4836,60 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.9", + "toml_edit 0.22.14", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.6", + "winnow 0.6.13", ] [[package]] @@ -4610,7 +4964,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] @@ -4798,9 +5152,9 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "want" @@ -4838,7 +5192,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", "wasm-bindgen-shared", ] @@ -4872,7 +5226,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4903,6 +5257,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.34", +] + [[package]] name = "winapi" version = "0.3.9" @@ -4921,11 +5287,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -4940,7 +5306,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -4958,7 +5324,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -4978,17 +5344,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -4999,9 +5366,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -5011,9 +5378,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -5023,9 +5390,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -5035,9 +5408,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -5047,9 +5420,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -5059,9 +5432,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -5071,9 +5444,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" @@ -5086,9 +5459,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.6" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] @@ -5128,36 +5501,58 @@ dependencies = [ ] [[package]] -name = "yasna" -version = "0.5.2" +name = "x509-cert" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" +dependencies = [ + "const-oid", + "der", + "spki", +] + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -5170,5 +5565,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.66", ] diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index f04cfc579..ab4daba05 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -44,10 +44,16 @@ async fn main() -> Result<()> { if let Some((major_minor, _)) = pkg_ver.as_ref().and_then(|s| s.rsplit_once('.')) { let circuits_version = format!("{}.x", major_minor); // Set the environment variable for the evm_arithmetization package version - env::set_var("EVM_ARITHMETIZATION_PKG_VER", circuits_version); + #[allow(unused_unsafe)] + unsafe { + env::set_var("EVM_ARITHMETIZATION_PKG_VER", circuits_version); + } } else { // Set to "NA" if version extraction fails - env::set_var("EVM_ARITHMETIZATION_PKG_VER", "NA"); + #[allow(unused_unsafe)] + unsafe { + env::set_var("EVM_ARITHMETIZATION_PKG_VER", "NA"); + } } } diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 9fbbe122e..0098c1496 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -2,7 +2,7 @@ use alloy::primitives::B256; use alloy::rpc::types::eth::BlockNumberOrTag; use alloy::{ providers::Provider, - rpc::types::eth::{Block, BlockId, Withdrawal}, + rpc::types::eth::{Block, BlockId, BlockTransactionsKind, Withdrawal}, transports::Transport, }; use anyhow::Context as _; @@ -37,20 +37,20 @@ pub struct ZeroBlockWitness(TrieCompact); /// - Just the hash. /// /// We only need the latter. -const BLOCK_WITH_FULL_TRANSACTIONS: bool = false; +const BLOCK_WITH_HASHES_ONLY: BlockTransactionsKind = BlockTransactionsKind::Hashes; /// Retrieve block information from the provider pub async fn get_block( provider: &mut ProviderT, target_block_id: BlockId, - full_transaction_data: bool, + block_transaction_kind: BlockTransactionsKind, ) -> anyhow::Result where ProviderT: Provider, TransportT: Transport + Clone, { provider - .get_block(target_block_id, full_transaction_data) + .get_block(target_block_id, block_transaction_kind) .await? .context("block does not exist") } @@ -79,7 +79,7 @@ where // Grab block info let target_block = provider - .get_block(target_block_id, BLOCK_WITH_FULL_TRANSACTIONS) + .get_block(target_block_id, BLOCK_WITH_HASHES_ONLY) .await? .context("target block does not exist")?; let target_block_number = target_block @@ -101,7 +101,7 @@ where let provider = &provider; async move { let block = provider - .get_block(n.into(), BLOCK_WITH_FULL_TRANSACTIONS) + .get_block(n.into(), BLOCK_WITH_HASHES_ONLY) .await .context("couldn't get block")? .context("no such block")?; @@ -181,14 +181,11 @@ where TransportT: Transport + Clone, { // Grab interval checkpoint block state trie - let checkpoint_state_trie_root = get_block( - &mut provider, - checkpoint_block_id, - BLOCK_WITH_FULL_TRANSACTIONS, - ) - .await? - .header - .state_root; + let checkpoint_state_trie_root = + get_block(&mut provider, checkpoint_block_id, BLOCK_WITH_HASHES_ONLY) + .await? + .header + .state_root; let mut block_proofs = Vec::new(); let mut block_interval = block_interval.into_bounded_stream()?; From aa12938e5ad7aee16e8cad18ef418659a7df8606 Mon Sep 17 00:00:00 2001 From: frisitano <35734660+frisitano@users.noreply.github.com> Date: Tue, 18 Jun 2024 01:11:11 +0800 Subject: [PATCH 170/184] Introduce native tracer support (#81) * Introduce native tracer support * remove arc and refactor code * merge upstream * update README * remove unecessary tools * use reference for provider * refactor prove_rpc tool * remove prove_jerigon tool * update README for prove_rpc.sh script changes * remove dead code --- zero_bin/.gitignore | 3 + zero_bin/Cargo.lock | 9 +- zero_bin/Cargo.toml | 13 +- zero_bin/README.md | 79 +++- zero_bin/leader/src/cli.rs | 52 ++- zero_bin/leader/src/{jerigon.rs => client.rs} | 34 +- zero_bin/leader/src/main.rs | 30 +- zero_bin/rpc/Cargo.toml | 7 +- zero_bin/rpc/src/compat.rs | 67 ++++ zero_bin/rpc/src/jerigon.rs | 61 ++++ zero_bin/rpc/src/lib.rs | 276 +++++--------- zero_bin/rpc/src/main.rs | 71 ++-- zero_bin/rpc/src/native/mod.rs | 62 ++++ zero_bin/rpc/src/native/state.rs | 188 ++++++++++ zero_bin/rpc/src/native/txn.rs | 342 ++++++++++++++++++ zero_bin/rpc/src/retry.rs | 148 ++++++++ .../tools/{prove_jerigon.sh => prove_rpc.sh} | 20 +- 17 files changed, 1219 insertions(+), 243 deletions(-) rename zero_bin/leader/src/{jerigon.rs => client.rs} (77%) create mode 100644 zero_bin/rpc/src/compat.rs create mode 100644 zero_bin/rpc/src/jerigon.rs create mode 100644 zero_bin/rpc/src/native/mod.rs create mode 100644 zero_bin/rpc/src/native/state.rs create mode 100644 zero_bin/rpc/src/native/txn.rs create mode 100644 zero_bin/rpc/src/retry.rs rename zero_bin/tools/{prove_jerigon.sh => prove_rpc.sh} (80%) diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index b50b613e3..7fd20496c 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -17,3 +17,6 @@ verifier_state_* # Ignore IntelliJ IDEA/RustRover/Clion metadata .idea/ + +# System files +.DS_Store diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 64740e5f9..51497afd5 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -65,9 +65,11 @@ dependencies = [ "alloy-core", "alloy-eips", "alloy-genesis", + "alloy-json-rpc", "alloy-provider", "alloy-rpc-client", "alloy-rpc-types", + "alloy-rpc-types-trace", "alloy-serde", "alloy-transport", "alloy-transport-http", @@ -106,6 +108,7 @@ dependencies = [ "alloy-dyn-abi", "alloy-json-abi", "alloy-primitives", + "alloy-rlp", "alloy-sol-types", ] @@ -3989,12 +3992,14 @@ dependencies = [ "hex", "hex-literal", "itertools 0.13.0", + "mpt_trie", "primitive-types 0.12.2", "prover", "serde", "serde_json", "thiserror", "tokio", + "tower", "trace_decoder", "tracing", "tracing-subscriber", @@ -5092,9 +5097,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 8433d3326..2dd5caf4f 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -17,7 +17,13 @@ thiserror = "1.0.50" futures = "0.3.29" keccak-hash = "0.10.0" alloy = { git = "https://github.com/alloy-rs/alloy", features = [ + "consensus", + "json-rpc", + "rlp", + "rpc", + "rpc-client", "rpc-types-eth", + "rpc-types-trace", "providers", "transports", "transport-http", @@ -26,9 +32,10 @@ alloy = { git = "https://github.com/alloy-rs/alloy", features = [ # zk-evm dependencies plonky2 = "0.2.2" -evm_arithmetization = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } -trace_decoder = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } -proof_gen = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } +evm_arithmetization = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } +mpt_trie = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } +trace_decoder = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } +proof_gen = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } [workspace.package] edition = "2021" diff --git a/zero_bin/README.md b/zero_bin/README.md index 39329809d..aecba5dee 100644 --- a/zero_bin/README.md +++ b/zero_bin/README.md @@ -85,6 +85,7 @@ Usage: leader [OPTIONS] Commands: stdio Reads input from stdin and writes output to stdout jerigon Reads input from a Jerigon node and writes output to stdout + native Reads input from a native node and writes output to stdout http Reads input from HTTP and writes output to a directory help Print this message or the help of the given subcommand(s) @@ -205,23 +206,31 @@ cargo r --release --bin leader jerigon --help Reads input from a Jerigon node and writes output to stdout -Usage: leader jerigon [OPTIONS] --rpc-url --block-number +Usage: leader jerigon [OPTIONS] --rpc-url --block-interval Options: -u, --rpc-url - -b, --block-number - The block number for which to generate a proof + -i, --block-interval + The block interval for which to generate a proof -c, --checkpoint-block-number The checkpoint block number [default: 0] -f, --previous-proof The previous proof output - -o, --proof-output-path - If provided, write the generated proof to this file instead of stdout + -o, --proof-output-dir + If provided, write the generated proofs to this directory instead of stdout + -s, --save-inputs-on-error + If true, save the public inputs to disk on error + -b, --block-time + Network block time in milliseconds. This value is used to determine the blockchain node polling interval [env: ZERO_BIN_BLOCK_TIME=] [default: 2000] + -k, --keep-intermediate-proofs + Keep intermediate proofs. Default action is to delete them after the final proof is generated [env: ZERO_BIN_KEEP_INTERMEDIATE_PROOFS=] + --backoff + Backoff in milliseconds for request retries [default: 0] + --max-retries + The maximum number of retries [default: 0] -h, --help Print help - -s, --save-inputs-on-error - If provided, save the public inputs to disk on error ``` Prove a block. @@ -230,6 +239,48 @@ Prove a block. cargo r --release --bin leader -- -r in-memory jerigon -u -b 16 > ./output/proof_16.json ``` +### Native + +The native command reads proof input from a native node and writes output to stdout. + +``` +cargo r --release --bin leader native --help + +Reads input from a native node and writes output to stdout + +Usage: leader native [OPTIONS] --rpc-url --block-interval + +Options: + -u, --rpc-url + + -i, --block-interval + The block interval for which to generate a proof + -c, --checkpoint-block-number + The checkpoint block number [default: 0] + -f, --previous-proof + The previous proof output + -o, --proof-output-dir + If provided, write the generated proofs to this directory instead of stdout + -s, --save-inputs-on-error + If true, save the public inputs to disk on error + -b, --block-time + Network block time in milliseconds. This value is used to determine the blockchain node polling interval [env: ZERO_BIN_BLOCK_TIME=] [default: 2000] + -k, --keep-intermediate-proofs + Keep intermediate proofs. Default action is to delete them after the final proof is generated [env: ZERO_BIN_KEEP_INTERMEDIATE_PROOFS=] + --backoff + Backoff in milliseconds for request retries [default: 0] + --max-retries + The maximum number of retries [default: 0] + -h, --help + Print help +``` + +Prove a block. + +```bash +cargo r --release --bin leader -- -r in-memory native -u -b 16 > ./output/proof_16.json +``` + ### HTTP The HTTP command reads proof input from HTTP and writes output to a directory. @@ -343,7 +394,7 @@ Options: Example: ```bash -cargo r --release --bin rpc fetch --rpc-url --block-number 16 > ./output/block-16.json +cargo r --release --bin rpc fetch --start-block --end-block --rpc-url --block-number 16 > ./output/block-16.json ``` ## Docker @@ -364,16 +415,16 @@ For testing proof generation for blocks, the `testing` branch should be used. ### Proving Blocks -If you want to generate a full block proof, you can use `tools/prove_jerigon.sh`: +If you want to generate a full block proof, you can use `tools/prove_rpc.sh`: ```sh -./prove_jerigon.sh +./prove_rpc.sh ``` Which may look like this: ```sh -./prove_jerigon.sh 17 18 http://127.0.0.1:8545 false +./prove_rpc.sh 17 18 http://127.0.0.1:8545 jerigon false ``` Which will attempt to generate proofs for blocks `17` & `18` consecutively and incorporate the previous block proof during generation. @@ -385,16 +436,16 @@ A few other notes: ### Generating Witnesses Only -If you want to test a block without the high CPU & memory requirements that come with creating a full proof, you can instead generate only the witness using `tools/prove_jerigon.sh` in the `test_only` mode: +If you want to test a block without the high CPU & memory requirements that come with creating a full proof, you can instead generate only the witness using `tools/prove_rpc.sh` in the `test_only` mode: ```sh -./prove_jerigon.sh test_only +./prove_rpc.sh test_only ``` Filled in: ```sh -./prove_jerigon.sh 18299898 18299899 http://34.89.57.138:8545 true test_only +./prove_rpc.sh 18299898 18299899 http://34.89.57.138:8545 jerigon true 0 0 test_only ``` Finally, note that both of these testing scripts force proof generation to be sequential by allowing only one worker. Because of this, this is not a realistic representation of performance but makes the debugging logs much easier to follow. diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 96f2c0725..48b2e537f 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -1,5 +1,6 @@ use std::path::PathBuf; +use alloy::transports::http::reqwest::Url; use clap::{Parser, Subcommand, ValueHint}; use common::prover_state::cli::CliProverStateConfig; @@ -18,7 +19,7 @@ pub(crate) struct Cli { pub(crate) prover_state_config: CliProverStateConfig, } -#[derive(Subcommand)] +#[derive(Subcommand, Clone)] pub(crate) enum Command { /// Reads input from stdin and writes output to stdout. Stdio { @@ -33,7 +34,7 @@ pub(crate) enum Command { Jerigon { // The Jerigon RPC URL. #[arg(long, short = 'u', value_hint = ValueHint::Url)] - rpc_url: String, + rpc_url: Url, /// The block interval for which to generate a proof. #[arg(long, short = 'i')] block_interval: String, @@ -63,6 +64,53 @@ pub(crate) enum Command { default_value_t = false )] keep_intermediate_proofs: bool, + /// Backoff in milliseconds for request retries + #[arg(long, default_value_t = 0)] + backoff: u64, + /// The maximum number of retries + #[arg(long, default_value_t = 0)] + max_retries: u32, + }, + /// Reads input from a native node and writes output to stdout. + Native { + // The native RPC URL. + #[arg(long, short = 'u', value_hint = ValueHint::Url)] + rpc_url: Url, + /// The block interval for which to generate a proof. + #[arg(long, short = 'i')] + block_interval: String, + /// The checkpoint block number. + #[arg(short, long, default_value_t = 0)] + checkpoint_block_number: u64, + /// The previous proof output. + #[arg(long, short = 'f', value_hint = ValueHint::FilePath)] + previous_proof: Option, + /// If provided, write the generated proofs to this directory instead of + /// stdout. + #[arg(long, short = 'o', value_hint = ValueHint::FilePath)] + proof_output_dir: Option, + /// If true, save the public inputs to disk on error. + #[arg(short, long, default_value_t = false)] + save_inputs_on_error: bool, + /// Network block time in milliseconds. This value is used + /// to determine the blockchain node polling interval. + #[arg(short, long, env = "ZERO_BIN_BLOCK_TIME", default_value_t = 2000)] + block_time: u64, + /// Keep intermediate proofs. Default action is to + /// delete them after the final proof is generated. + #[arg( + short, + long, + env = "ZERO_BIN_KEEP_INTERMEDIATE_PROOFS", + default_value_t = false + )] + keep_intermediate_proofs: bool, + /// Backoff in milliseconds for request retries + #[arg(long, default_value_t = 0)] + backoff: u64, + /// The maximum number of retries + #[arg(long, default_value_t = 0)] + max_retries: u32, }, /// Reads input from HTTP and writes output to a directory. Http { diff --git a/zero_bin/leader/src/jerigon.rs b/zero_bin/leader/src/client.rs similarity index 77% rename from zero_bin/leader/src/jerigon.rs rename to zero_bin/leader/src/client.rs index a19dd45c1..5dd3fba32 100644 --- a/zero_bin/leader/src/jerigon.rs +++ b/zero_bin/leader/src/client.rs @@ -1,14 +1,23 @@ use std::io::Write; use std::path::PathBuf; -use alloy::providers::RootProvider; +use alloy::transports::http::reqwest::Url; use anyhow::Result; use common::block_interval::BlockInterval; use common::fs::generate_block_proof_file_name; use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; +use rpc::{retry::build_http_retry_provider, RpcType}; use tracing::{error, info, warn}; +#[derive(Debug)] +pub struct RpcParams { + pub rpc_url: Url, + pub rpc_type: RpcType, + pub backoff: u64, + pub max_retries: u32, +} + #[derive(Debug, Default)] pub struct ProofParams { pub checkpoint_block_number: u64, @@ -18,17 +27,22 @@ pub struct ProofParams { pub keep_intermediate_proofs: bool, } -/// The main function for the jerigon mode. -pub(crate) async fn jerigon_main( +/// The main function for the client. +pub(crate) async fn client_main( runtime: Runtime, - rpc_url: &str, + rpc_params: RpcParams, block_interval: BlockInterval, mut params: ProofParams, ) -> Result<()> { let prover_input = rpc::prover_input( - RootProvider::new_http(rpc_url.parse()?), + &build_http_retry_provider( + rpc_params.rpc_url, + rpc_params.backoff, + rpc_params.max_retries, + ), block_interval, params.checkpoint_block_number.into(), + rpc_params.rpc_type, ) .await?; @@ -92,3 +106,13 @@ pub(crate) async fn jerigon_main( Ok(()) } + +impl From for RpcType { + fn from(command: super::cli::Command) -> Self { + match command { + super::cli::Command::Native { .. } => RpcType::Native, + super::cli::Command::Jerigon { .. } => RpcType::Jerigon, + _ => panic!("Unsupported command type"), + } + } +} diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index ab4daba05..f99841048 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -4,6 +4,7 @@ use std::{fs::File, path::PathBuf}; use anyhow::Result; use clap::Parser; use cli::Command; +use client::RpcParams; use common::block_interval::BlockInterval; use dotenvy::dotenv; use ops::register; @@ -11,13 +12,13 @@ use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; use tracing::info; -use crate::jerigon::{jerigon_main, ProofParams}; +use crate::client::{client_main, ProofParams}; use crate::utils::get_package_version; mod cli; +mod client; mod http; mod init; -mod jerigon; mod stdio; mod utils; @@ -68,7 +69,7 @@ async fn main() -> Result<()> { let runtime = Runtime::from_config(&args.paladin, register()).await?; - match args.command { + match args.command.clone() { Command::Stdio { previous_proof, save_inputs_on_error, @@ -101,6 +102,20 @@ async fn main() -> Result<()> { save_inputs_on_error, block_time, keep_intermediate_proofs, + backoff, + max_retries, + } + | Command::Native { + rpc_url, + block_interval, + checkpoint_block_number, + previous_proof, + proof_output_dir, + save_inputs_on_error, + block_time, + keep_intermediate_proofs, + backoff, + max_retries, } => { let previous_proof = get_previous_proof(previous_proof)?; let mut block_interval = BlockInterval::new(&block_interval)?; @@ -114,9 +129,14 @@ async fn main() -> Result<()> { } info!("Proving interval {block_interval}"); - jerigon_main( + client_main( runtime, - &rpc_url, + RpcParams { + rpc_url, + rpc_type: args.command.into(), + backoff, + max_retries, + }, block_interval, ProofParams { checkpoint_block_number, diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 330b0643a..477b739ef 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -18,6 +18,7 @@ trace_decoder = { workspace = true } serde_json = { workspace = true } clap = { workspace = true } evm_arithmetization = { workspace = true } +mpt_trie = { workspace = true } thiserror = { workspace = true } alloy.workspace = true futures = { workspace = true } @@ -25,6 +26,10 @@ hex = "0.4.3" hex-literal = "0.4.1" itertools = "0.13.0" url = "2.5.0" +__compat_primitive_types = { version = "0.12.2", package = "primitive-types" } +tower = { version = "0.4" , features = ["retry"] } + +# Local dependencies common = { path = "../common" } prover = { path = "../prover" } -__compat_primitive-types = { version = "0.12.2", package = "primitive-types" } + diff --git a/zero_bin/rpc/src/compat.rs b/zero_bin/rpc/src/compat.rs new file mode 100644 index 000000000..7fb0a1563 --- /dev/null +++ b/zero_bin/rpc/src/compat.rs @@ -0,0 +1,67 @@ +pub trait Compat { + fn compat(self) -> Out; +} + +impl Compat<__compat_primitive_types::H160> for alloy::primitives::Address { + fn compat(self) -> __compat_primitive_types::H160 { + let alloy::primitives::Address(alloy::primitives::FixedBytes(arr)) = self; + __compat_primitive_types::H160(arr) + } +} + +impl Compat<__compat_primitive_types::H256> for alloy::primitives::B256 { + fn compat(self) -> __compat_primitive_types::H256 { + let alloy::primitives::FixedBytes(arr) = self; + __compat_primitive_types::H256(arr) + } +} + +impl Compat<[__compat_primitive_types::U256; 8]> for alloy::primitives::Bloom { + fn compat(self) -> [__compat_primitive_types::U256; 8] { + let alloy::primitives::Bloom(alloy::primitives::FixedBytes(src)) = self; + // have u8 * 256 + // want U256 * 8 + // (no unsafe, no unstable) + let mut chunks = src.chunks_exact(32); + let dst = core::array::from_fn(|_ix| { + // This is a bit spicy because we're going from an uninterpeted array of bytes + // to wide integers, but we trust this `From` impl to do the right thing + __compat_primitive_types::U256::from( + <[u8; 32]>::try_from(chunks.next().unwrap()).unwrap(), + ) + }); + assert_eq!(chunks.len(), 0); + dst + } +} + +impl Compat<__compat_primitive_types::U256> for alloy::primitives::U256 { + fn compat(self) -> __compat_primitive_types::U256 { + __compat_primitive_types::U256(self.into_limbs()) + } +} + +impl Compat>> for Vec { + fn compat(self) -> Vec> { + self.into_iter().map(|x| x.to_vec()).collect() + } +} + +impl Compat for __compat_primitive_types::H160 { + fn compat(self) -> alloy::primitives::Address { + let __compat_primitive_types::H160(arr) = self; + alloy::primitives::Address(alloy::primitives::FixedBytes(arr)) + } +} + +impl Compat for __compat_primitive_types::H256 { + fn compat(self) -> alloy::primitives::StorageKey { + let __compat_primitive_types::H256(arr) = self; + alloy::primitives::FixedBytes(arr) + } +} + +#[test] +fn bloom() { + let _did_not_panic = alloy::primitives::Bloom::ZERO.compat(); +} diff --git a/zero_bin/rpc/src/jerigon.rs b/zero_bin/rpc/src/jerigon.rs new file mode 100644 index 000000000..d1d29ed00 --- /dev/null +++ b/zero_bin/rpc/src/jerigon.rs @@ -0,0 +1,61 @@ +use alloy::{ + primitives::B256, providers::Provider, rpc::types::eth::BlockId, transports::Transport, +}; +use prover::BlockProverInput; +use serde::Deserialize; +use serde_json::json; +use trace_decoder::trace_protocol::{ + BlockTrace, BlockTraceTriePreImages, CombinedPreImages, TrieCompact, TxnInfo, +}; + +use super::fetch_other_block_data; + +/// Transaction traces retrieved from Erigon zeroTracer. +#[derive(Debug, Deserialize)] +pub struct ZeroTxResult { + #[serde(rename(deserialize = "txHash"))] + pub tx_hash: alloy::primitives::TxHash, + pub result: TxnInfo, +} + +/// Block witness retrieved from Erigon zeroTracer. +#[derive(Debug, Deserialize)] +pub struct ZeroBlockWitness(TrieCompact); + +pub async fn block_prover_input( + provider: ProviderT, + target_block_id: BlockId, + checkpoint_state_trie_root: B256, +) -> anyhow::Result +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + // Grab trace information + let tx_results = provider + .raw_request::<_, Vec>( + "debug_traceBlockByNumber".into(), + (target_block_id, json!({"tracer": "zeroTracer"})), + ) + .await?; + + // Grab block witness info (packed as combined trie pre-images) + let block_witness = provider + .raw_request::<_, ZeroBlockWitness>("eth_getWitness".into(), vec![target_block_id]) + .await?; + + let other_data = + fetch_other_block_data(provider, target_block_id, checkpoint_state_trie_root).await?; + + // Assemble + Ok(BlockProverInput { + block_trace: BlockTrace { + trie_pre_images: BlockTraceTriePreImages::Combined(CombinedPreImages { + compact: block_witness.0, + }), + txn_info: tx_results.into_iter().map(|it| it.result).collect(), + code_db: Default::default(), + }, + other_data, + }) +} diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 0098c1496..22ac0ec6b 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -1,85 +1,83 @@ -use alloy::primitives::B256; -use alloy::rpc::types::eth::BlockNumberOrTag; use alloy::{ + primitives::B256, providers::Provider, - rpc::types::eth::{Block, BlockId, BlockTransactionsKind, Withdrawal}, + rpc::types::eth::{BlockId, BlockNumberOrTag, BlockTransactionsKind, Withdrawal}, transports::Transport, }; use anyhow::Context as _; +use clap::ValueEnum; use common::block_interval::BlockInterval; use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; use futures::{StreamExt as _, TryStreamExt as _}; -use prover::{BlockProverInput, ProverInput}; -use serde::Deserialize; -use serde_json::json; -use trace_decoder::{ - trace_protocol::{ - BlockTrace, BlockTraceTriePreImages, CombinedPreImages, TrieCompact, TxnInfo, - }, - types::{BlockLevelData, OtherBlockData}, -}; +use prover::ProverInput; +use trace_decoder::types::{BlockLevelData, OtherBlockData}; -/// Transaction traces retrieved from Erigon zeroTracer. -#[derive(Debug, Deserialize)] -pub struct ZeroTxResult { - #[serde(rename(deserialize = "txHash"))] - pub tx_hash: alloy::primitives::TxHash, - pub result: TxnInfo, -} +mod compat; +pub mod jerigon; +pub mod native; +pub mod retry; -/// Block witness retrieved from Erigon zeroTracer. -#[derive(Debug, Deserialize)] -pub struct ZeroBlockWitness(TrieCompact); +use compat::Compat; -/// When [fetching a block over RPC](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber), -/// we can choose the transaction format, between: -/// - Full JSON. -/// - Just the hash. -/// -/// We only need the latter. -const BLOCK_WITH_HASHES_ONLY: BlockTransactionsKind = BlockTransactionsKind::Hashes; +/// The RPC type. +#[derive(ValueEnum, Clone, Debug)] +pub enum RpcType { + Jerigon, + Native, +} -/// Retrieve block information from the provider -pub async fn get_block( - provider: &mut ProviderT, - target_block_id: BlockId, - block_transaction_kind: BlockTransactionsKind, -) -> anyhow::Result +/// Obtain the prover input for a given block interval +pub async fn prover_input( + provider: &ProviderT, + block_interval: BlockInterval, + checkpoint_block_id: BlockId, + rpc_type: RpcType, +) -> anyhow::Result where ProviderT: Provider, TransportT: Transport + Clone, { - provider - .get_block(target_block_id, block_transaction_kind) + // Grab interval checkpoint block state trie + let checkpoint_state_trie_root = provider + .get_block(checkpoint_block_id, BlockTransactionsKind::Hashes) .await? - .context("block does not exist") + .context("block does not exist")? + .header + .state_root; + + let mut block_proofs = Vec::new(); + let mut block_interval = block_interval.into_bounded_stream()?; + + while let Some(block_num) = block_interval.next().await { + let block_id = BlockId::Number(BlockNumberOrTag::Number(block_num)); + let block_prover_input = match rpc_type { + RpcType::Jerigon => { + jerigon::block_prover_input(&provider, block_id, checkpoint_state_trie_root).await? + } + RpcType::Native => { + native::block_prover_input(&provider, block_id, checkpoint_state_trie_root).await? + } + }; + + block_proofs.push(block_prover_input); + } + Ok(ProverInput { + blocks: block_proofs, + }) } -pub async fn block_prover_input( +/// Fetches other block data +async fn fetch_other_block_data( provider: ProviderT, target_block_id: BlockId, checkpoint_state_trie_root: B256, -) -> anyhow::Result +) -> anyhow::Result where ProviderT: Provider, TransportT: Transport + Clone, { - // Grab trace information - let tx_results = provider - .raw_request::<_, Vec>( - "debug_traceBlockByNumber".into(), - (target_block_id, json!({"tracer": "zeroTracer"})), - ) - .await?; - - // Grab block witness info (packed as combined trie pre-images) - let block_witness = provider - .raw_request::<_, ZeroBlockWitness>("eth_getWitness".into(), vec![target_block_id]) - .await?; - - // Grab block info let target_block = provider - .get_block(target_block_id, BLOCK_WITH_HASHES_ONLY) + .get_block(target_block_id, BlockTransactionsKind::Hashes) .await? .context("target block does not exist")?; let target_block_number = target_block @@ -101,7 +99,7 @@ where let provider = &provider; async move { let block = provider - .get_block(n.into(), BLOCK_WITH_HASHES_ONLY) + .get_block(n.into(), BlockTransactionsKind::Hashes) .await .context("couldn't get block")? .context("no such block")?; @@ -115,130 +113,48 @@ where .await .context("couldn't fill previous hashes")?; - // Assemble - Ok(BlockProverInput { - block_trace: BlockTrace { - trie_pre_images: BlockTraceTriePreImages::Combined(CombinedPreImages { - compact: block_witness.0, - }), - txn_info: tx_results.into_iter().map(|it| it.result).collect(), - code_db: Default::default(), - }, - other_data: OtherBlockData { - b_data: BlockLevelData { - b_meta: BlockMetadata { - block_beneficiary: target_block.header.miner.compat(), - block_timestamp: target_block.header.timestamp.into(), - block_number: target_block_number.into(), - block_difficulty: target_block.header.difficulty.into(), - block_random: target_block - .header - .mix_hash - .context("target block is missing field `mix_hash`")? - .compat(), - block_gaslimit: target_block.header.gas_limit.into(), - block_chain_id: chain_id.into(), - block_base_fee: target_block - .header - .base_fee_per_gas - .context("target block is missing field `base_fee_per_gas`")? - .into(), - block_gas_used: target_block.header.gas_used.into(), - block_bloom: target_block.header.logs_bloom.compat(), - }, - b_hashes: BlockHashes { - prev_hashes: prev_hashes.map(|it| it.compat()).into(), - cur_hash: target_block - .header - .hash - .context("target block is missing field `hash`")? - .compat(), - }, - withdrawals: target_block - .withdrawals - .into_iter() - .flatten() - .map( - |Withdrawal { - address, amount, .. - }| { (address.compat(), amount.into()) }, - ) - .collect(), + let other_data = OtherBlockData { + b_data: BlockLevelData { + b_meta: BlockMetadata { + block_beneficiary: target_block.header.miner.compat(), + block_timestamp: target_block.header.timestamp.into(), + block_number: target_block_number.into(), + block_difficulty: target_block.header.difficulty.into(), + block_random: target_block + .header + .mix_hash + .context("target block is missing field `mix_hash`")? + .compat(), + block_gaslimit: target_block.header.gas_limit.into(), + block_chain_id: chain_id.into(), + block_base_fee: target_block + .header + .base_fee_per_gas + .context("target block is missing field `base_fee_per_gas`")? + .into(), + block_gas_used: target_block.header.gas_used.into(), + block_bloom: target_block.header.logs_bloom.compat(), }, - checkpoint_state_trie_root: checkpoint_state_trie_root.compat(), + b_hashes: BlockHashes { + prev_hashes: prev_hashes.map(|it| it.compat()).into(), + cur_hash: target_block + .header + .hash + .context("target block is missing field `hash`")? + .compat(), + }, + withdrawals: target_block + .withdrawals + .into_iter() + .flatten() + .map( + |Withdrawal { + address, amount, .. + }| { (address.compat(), amount.into()) }, + ) + .collect(), }, - }) -} - -/// Obtain the prover input for a given block interval -pub async fn prover_input( - mut provider: ProviderT, - block_interval: BlockInterval, - checkpoint_block_id: BlockId, -) -> anyhow::Result -where - ProviderT: Provider, - TransportT: Transport + Clone, -{ - // Grab interval checkpoint block state trie - let checkpoint_state_trie_root = - get_block(&mut provider, checkpoint_block_id, BLOCK_WITH_HASHES_ONLY) - .await? - .header - .state_root; - - let mut block_proofs = Vec::new(); - let mut block_interval = block_interval.into_bounded_stream()?; - - while let Some(block_num) = block_interval.next().await { - let block_id = BlockId::Number(BlockNumberOrTag::Number(block_num)); - let block_prover_input = - block_prover_input(&provider, block_id, checkpoint_state_trie_root).await?; - block_proofs.push(block_prover_input); - } - Ok(ProverInput { - blocks: block_proofs, - }) -} - -trait Compat { - fn compat(self) -> Out; -} - -impl Compat<__compat_primitive_types::H160> for alloy::primitives::Address { - fn compat(self) -> __compat_primitive_types::H160 { - let alloy::primitives::Address(alloy::primitives::FixedBytes(arr)) = self; - __compat_primitive_types::H160(arr) - } -} - -impl Compat<__compat_primitive_types::H256> for alloy::primitives::B256 { - fn compat(self) -> __compat_primitive_types::H256 { - let alloy::primitives::FixedBytes(arr) = self; - __compat_primitive_types::H256(arr) - } -} - -impl Compat<[__compat_primitive_types::U256; 8]> for alloy::primitives::Bloom { - fn compat(self) -> [__compat_primitive_types::U256; 8] { - let alloy::primitives::Bloom(alloy::primitives::FixedBytes(src)) = self; - // have u8 * 256 - // want U256 * 8 - // (no unsafe, no unstable) - let mut chunks = src.chunks_exact(32); - let dst = core::array::from_fn(|_ix| { - // This is a bit spicy because we're going from an uninterpeted array of bytes - // to wide integers, but we trust this `From` impl to do the right thing - __compat_primitive_types::U256::from( - <[u8; 32]>::try_from(chunks.next().unwrap()).unwrap(), - ) - }); - assert_eq!(chunks.len(), 0); - dst - } -} - -#[test] -fn bloom() { - let _did_not_panic = alloy::primitives::Bloom::ZERO.compat(); + checkpoint_state_trie_root: checkpoint_state_trie_root.compat(), + }; + Ok(other_data) } diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs index bd84b113e..ccab182a2 100644 --- a/zero_bin/rpc/src/main.rs +++ b/zero_bin/rpc/src/main.rs @@ -1,14 +1,15 @@ use std::io; -use alloy::{providers::RootProvider, rpc::types::eth::BlockId}; +use alloy::rpc::types::eth::BlockId; use clap::{Parser, ValueHint}; use common::block_interval::BlockInterval; +use rpc::{retry::build_http_retry_provider, RpcType}; use tracing_subscriber::{prelude::*, EnvFilter}; use url::Url; #[derive(Parser)] -pub enum Args { - /// Fetch and generate prover input from the RPC endpoint. +pub enum Cli { + /// Fetch and generate prover input from the RPC endpoint Fetch { // Starting block of interval to fetch #[arg(short, long)] @@ -19,13 +20,55 @@ pub enum Args { /// The RPC URL. #[arg(short = 'u', long, value_hint = ValueHint::Url)] rpc_url: Url, + /// The RPC Tracer Type + #[arg(short = 't', long, default_value = "jerigon")] + rpc_type: RpcType, /// The checkpoint block number. If not provided, /// block before the `start_block` is the checkpoint #[arg(short, long)] checkpoint_block_number: Option, + /// Backoff in milliseconds for request retries + #[arg(long, default_value_t = 0)] + backoff: u64, + /// The maximum number of retries + #[arg(long, default_value_t = 0)] + max_retries: u32, }, } +impl Cli { + /// Execute the cli command. + pub async fn execute(self) -> anyhow::Result<()> { + match self { + Self::Fetch { + start_block, + end_block, + rpc_url, + rpc_type, + checkpoint_block_number, + backoff, + max_retries, + } => { + let checkpoint_block_number = + checkpoint_block_number.unwrap_or((start_block - 1).into()); + let block_interval = BlockInterval::Range(start_block..end_block + 1); + + // Retrieve prover input from the Erigon node + let prover_input = rpc::prover_input( + &build_http_retry_provider(rpc_url, backoff, max_retries), + block_interval, + checkpoint_block_number, + rpc_type, + ) + .await?; + + serde_json::to_writer_pretty(io::stdout(), &prover_input.blocks)?; + } + } + Ok(()) + } +} + #[tokio::main] async fn main() -> anyhow::Result<()> { tracing_subscriber::Registry::default() @@ -37,25 +80,5 @@ async fn main() -> anyhow::Result<()> { ) .init(); - let Args::Fetch { - start_block, - end_block, - rpc_url, - checkpoint_block_number, - } = Args::parse(); - - let checkpoint_block_number = checkpoint_block_number.unwrap_or((start_block - 1).into()); - let block_interval = BlockInterval::Range(start_block..end_block + 1); - - // Retrieve prover input from the Erigon node - let prover_input = rpc::prover_input( - RootProvider::new_http(rpc_url), - block_interval, - checkpoint_block_number, - ) - .await?; - - serde_json::to_writer_pretty(io::stdout(), &prover_input.blocks)?; - - Ok(()) + Cli::parse().execute().await } diff --git a/zero_bin/rpc/src/native/mod.rs b/zero_bin/rpc/src/native/mod.rs new file mode 100644 index 000000000..75de3d5de --- /dev/null +++ b/zero_bin/rpc/src/native/mod.rs @@ -0,0 +1,62 @@ +use std::collections::HashMap; + +use alloy::{ + primitives::B256, + providers::Provider, + rpc::types::eth::{BlockId, BlockTransactionsKind}, + transports::Transport, +}; +use anyhow::Context as _; +use futures::try_join; +use prover::BlockProverInput; +use trace_decoder::trace_protocol::BlockTrace; + +mod state; +mod txn; + +type CodeDb = HashMap<__compat_primitive_types::H256, Vec>; + +/// Fetches the prover input for the given BlockId. +pub async fn block_prover_input( + provider: &ProviderT, + block_number: BlockId, + checkpoint_state_trie_root: B256, +) -> anyhow::Result +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let (block_trace, other_data) = try_join!( + process_block_trace(&provider, block_number), + crate::fetch_other_block_data(&provider, block_number, checkpoint_state_trie_root,) + )?; + + Ok(BlockProverInput { + block_trace, + other_data, + }) +} + +/// Processes the block with the given block number and returns the block trace. +async fn process_block_trace( + provider: &ProviderT, + block_number: BlockId, +) -> anyhow::Result +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let block = provider + .get_block(block_number, BlockTransactionsKind::Full) + .await? + .context("target block does not exist")?; + + let (code_db, txn_info) = txn::process_transactions(&block, provider).await?; + let trie_pre_images = state::process_state_witness(provider, block, &txn_info).await?; + + Ok(BlockTrace { + txn_info, + code_db: Option::from(code_db).filter(|x| !x.is_empty()), + trie_pre_images, + }) +} diff --git a/zero_bin/rpc/src/native/state.rs b/zero_bin/rpc/src/native/state.rs new file mode 100644 index 000000000..b4992848f --- /dev/null +++ b/zero_bin/rpc/src/native/state.rs @@ -0,0 +1,188 @@ +use std::collections::{HashMap, HashSet}; + +use alloy::{ + primitives::{keccak256, Address, StorageKey, B256}, + providers::Provider, + rpc::types::eth::{Block, BlockTransactionsKind, EIP1186AccountProofResponse}, + transports::Transport, +}; +use anyhow::Context as _; +use futures::future::{try_join, try_join_all}; +use mpt_trie::{builder::PartialTrieBuilder, partial_trie::HashedPartialTrie}; +use trace_decoder::trace_protocol::{ + BlockTraceTriePreImages, SeparateStorageTriesPreImage, SeparateTriePreImage, + SeparateTriePreImages, TrieDirect, TxnInfo, +}; + +use crate::compat::Compat; + +/// Processes the state witness for the given block. +pub async fn process_state_witness( + provider: &ProviderT, + block: Block, + txn_infos: &[TxnInfo], +) -> anyhow::Result +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let state_access = process_states_access(txn_infos, &block)?; + + let block_number = block + .header + .number + .context("Block number not returned with block")?; + let prev_state_root = provider + .get_block((block_number - 1).into(), BlockTransactionsKind::Hashes) + .await? + .context("Failed to get previous block")? + .header + .state_root; + + let (state, storage_proofs) = + generate_state_witness(prev_state_root, state_access, provider, block_number).await?; + + Ok(BlockTraceTriePreImages::Separate(SeparateTriePreImages { + state: SeparateTriePreImage::Direct(TrieDirect(state.build())), + storage: SeparateStorageTriesPreImage::MultipleTries( + storage_proofs + .into_iter() + .map(|(a, m)| { + ( + a.compat(), + SeparateTriePreImage::Direct(TrieDirect(m.build())), + ) + }) + .collect(), + ), + })) +} + +/// Iterate over the tx_infos and process the state access for each address. +/// Also includes the state access for withdrawals and the block author. +/// +/// Returns a map from address to the set of storage keys accessed by that +/// address. +pub fn process_states_access( + tx_infos: &[TxnInfo], + block: &Block, +) -> anyhow::Result>> { + let mut state_access = HashMap::>::new(); + + if let Some(w) = block.withdrawals.as_ref() { + w.iter().for_each(|w| { + state_access.insert(w.address, Default::default()); + }) + }; + state_access.insert(block.header.miner, Default::default()); + + for txn_info in tx_infos { + for (address, trace) in txn_info.traces.iter() { + let address_storage_access = state_access.entry((*address).compat()).or_default(); + + if let Some(read_keys) = trace.storage_read.as_ref() { + address_storage_access.extend(read_keys.iter().copied().map(Compat::compat)); + } + + if let Some(written_keys) = trace.storage_written.as_ref() { + address_storage_access.extend(written_keys.keys().copied().map(Compat::compat)); + } + } + } + + Ok(state_access) +} + +/// Generates the state witness for the given block. +async fn generate_state_witness( + prev_state_root: B256, + accounts_state: HashMap>, + provider: &ProviderT, + block_number: u64, +) -> anyhow::Result<( + PartialTrieBuilder, + HashMap>, +)> +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let mut state = PartialTrieBuilder::new(prev_state_root.compat(), Default::default()); + let mut storage_proofs = HashMap::>::new(); + + let (account_proofs, next_account_proofs) = + fetch_proof_data(accounts_state, provider, block_number).await?; + + // Insert account proofs + for (address, proof) in account_proofs.into_iter() { + state.insert_proof(proof.account_proof.compat()); + + let storage_mpt = + storage_proofs + .entry(keccak256(address)) + .or_insert(PartialTrieBuilder::new( + proof.storage_hash.compat(), + Default::default(), + )); + for proof in proof.storage_proof { + storage_mpt.insert_proof(proof.proof.compat()); + } + } + + // Insert short node variants from next proofs + for (address, proof) in next_account_proofs.into_iter() { + state.insert_short_node_variants_from_proof(proof.account_proof.compat()); + + if let Some(storage_mpt) = storage_proofs.get_mut(&keccak256(address)) { + for proof in proof.storage_proof { + storage_mpt.insert_short_node_variants_from_proof(proof.proof.compat()); + } + } + } + + Ok((state, storage_proofs)) +} + +/// Fetches the proof data for the given accounts and associated storage keys. +async fn fetch_proof_data( + accounts_state: HashMap>, + provider: &ProviderT, + block_number: u64, +) -> anyhow::Result<( + Vec<(Address, EIP1186AccountProofResponse)>, + Vec<(Address, EIP1186AccountProofResponse)>, +)> +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let account_proofs_fut = accounts_state + .clone() + .into_iter() + .map(|(address, keys)| async move { + let proof = provider + .get_proof(address, keys.into_iter().collect()) + .block_id((block_number - 1).into()) + .await + .context("Failed to get proof for account")?; + anyhow::Result::Ok((address, proof)) + }) + .collect::>(); + + let next_account_proofs_fut = accounts_state + .into_iter() + .map(|(address, keys)| async move { + let proof = provider + .get_proof(address, keys.into_iter().collect()) + .block_id(block_number.into()) + .await + .context("Failed to get proof for account")?; + anyhow::Result::Ok((address, proof)) + }); + + try_join( + try_join_all(account_proofs_fut), + try_join_all(next_account_proofs_fut), + ) + .await +} diff --git a/zero_bin/rpc/src/native/txn.rs b/zero_bin/rpc/src/native/txn.rs new file mode 100644 index 000000000..7c55e1fb7 --- /dev/null +++ b/zero_bin/rpc/src/native/txn.rs @@ -0,0 +1,342 @@ +use std::collections::{HashMap, HashSet}; + +use __compat_primitive_types::{H256, U256}; +use alloy::{ + primitives::{keccak256, Address, B256}, + providers::{ + ext::DebugApi as _, + network::{eip2718::Encodable2718, Ethereum, Network}, + Provider, + }, + rpc::types::{ + eth::Transaction, + eth::{AccessList, Block}, + trace::geth::{ + AccountState, DiffMode, GethDebugBuiltInTracerType, GethTrace, PreStateConfig, + PreStateFrame, PreStateMode, + }, + trace::geth::{GethDebugTracerType, GethDebugTracingOptions}, + }, + transports::Transport, +}; +use anyhow::Context as _; +use futures::stream::{FuturesOrdered, TryStreamExt}; +use trace_decoder::trace_protocol::{ContractCodeUsage, TxnInfo, TxnMeta, TxnTrace}; + +use super::CodeDb; +use crate::compat::Compat; + +/// Processes the transactions in the given block and updates the code db. +pub(super) async fn process_transactions( + block: &Block, + provider: &ProviderT, +) -> anyhow::Result<(CodeDb, Vec)> +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + block + .transactions + .as_transactions() + .context("No transactions in block")? + .iter() + .map(|tx| super::txn::process_transaction(provider, tx)) + .collect::>() + .try_fold( + (HashMap::new(), Vec::new()), + |(mut code_db, mut txn_infos), (tx_code_db, txn_info)| async move { + code_db.extend(tx_code_db); + txn_infos.push(txn_info); + Ok((code_db, txn_infos)) + }, + ) + .await +} + +/// Processes the transaction with the given transaction hash and updates the +/// accounts state. +async fn process_transaction( + provider: &ProviderT, + tx: &Transaction, +) -> anyhow::Result<(CodeDb, TxnInfo)> +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let (tx_receipt, pre_trace, diff_trace) = fetch_tx_data(provider, &tx.hash).await?; + let tx_receipt = tx_receipt.map_inner(rlp::map_receipt_envelope); + let access_list = parse_access_list(tx.access_list.as_ref()); + + let tx_meta = TxnMeta { + byte_code: ::TxEnvelope::try_from(tx.clone())?.encoded_2718(), + new_txn_trie_node_byte: vec![], + new_receipt_trie_node_byte: alloy::rlp::encode(tx_receipt.inner), + gas_used: tx_receipt.gas_used as u64, + }; + + let (code_db, tx_traces) = match (pre_trace, diff_trace) { + ( + GethTrace::PreStateTracer(PreStateFrame::Default(read)), + GethTrace::PreStateTracer(PreStateFrame::Diff(diff)), + ) => process_tx_traces(access_list, read, diff).await?, + _ => unreachable!(), + }; + + Ok(( + code_db, + TxnInfo { + meta: tx_meta, + traces: tx_traces + .into_iter() + .map(|(k, v)| (k.compat(), v)) + .collect(), + }, + )) +} + +/// Fetches the transaction data for the given transaction hash. +async fn fetch_tx_data( + provider: &ProviderT, + tx_hash: &B256, +) -> anyhow::Result<(::ReceiptResponse, GethTrace, GethTrace), anyhow::Error> +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let tx_receipt_fut = provider.get_transaction_receipt(*tx_hash); + let pre_trace_fut = provider.debug_trace_transaction(*tx_hash, prestate_tracing_options(false)); + let diff_trace_fut = provider.debug_trace_transaction(*tx_hash, prestate_tracing_options(true)); + + let (tx_receipt, pre_trace, diff_trace) = + futures::try_join!(tx_receipt_fut, pre_trace_fut, diff_trace_fut,)?; + + Ok(( + tx_receipt.context("Transaction receipt not found.")?, + pre_trace, + diff_trace, + )) +} + +/// Parse the access list data into a hashmap. +fn parse_access_list(access_list: Option<&AccessList>) -> HashMap> { + let mut result = HashMap::new(); + + if let Some(access_list) = access_list { + for item in access_list.0.clone() { + result + .entry(item.address) + .or_insert_with(HashSet::new) + .extend(item.storage_keys.into_iter().map(Compat::compat)); + } + } + + result +} + +/// Processes the transaction traces and updates the accounts state. +async fn process_tx_traces( + mut access_list: HashMap>, + read_trace: PreStateMode, + diff_trace: DiffMode, +) -> anyhow::Result<(CodeDb, HashMap)> { + let DiffMode { + pre: pre_trace, + post: post_trace, + } = diff_trace; + + let addresses: HashSet<_> = read_trace + .0 + .keys() + .chain(post_trace.keys()) + .chain(pre_trace.keys()) + .chain(access_list.keys()) + .copied() + .collect(); + + let mut traces = HashMap::new(); + let mut code_db: CodeDb = HashMap::new(); + + for address in addresses { + let read_state = read_trace.0.get(&address); + let pre_state = pre_trace.get(&address); + let post_state = post_trace.get(&address); + + let balance = post_state.and_then(|x| x.balance.map(Compat::compat)); + let (storage_read, storage_written) = process_storage( + access_list.remove(&address).unwrap_or_default(), + read_state, + post_state, + pre_state, + ); + let code = process_code(post_state, read_state, &mut code_db).await; + let nonce = process_nonce(post_state, &code); + let self_destructed = process_self_destruct(post_state, pre_state); + + let result = TxnTrace { + balance, + nonce, + storage_read, + storage_written, + code_usage: code, + self_destructed, + }; + + traces.insert(address, result); + } + + Ok((code_db, traces)) +} + +/// Processes the nonce for the given account state. +/// +/// If a contract is created, the nonce is set to 1. +fn process_nonce( + post_state: Option<&AccountState>, + code_usage: &Option, +) -> Option { + post_state + .and_then(|x| x.nonce.map(Into::into)) + .or_else(|| { + if let Some(ContractCodeUsage::Write(_)) = code_usage.as_ref() { + Some(U256::from(1)) + } else { + None + } + }) +} + +/// Processes the storage for the given account state. +/// +/// Returns the storage read and written for the given account in the +/// transaction and updates the storage keys. +fn process_storage( + access_list: HashSet<__compat_primitive_types::H256>, + acct_state: Option<&AccountState>, + post_acct: Option<&AccountState>, + pre_acct: Option<&AccountState>, +) -> (Option>, Option>) { + let mut storage_read = access_list; + storage_read.extend( + acct_state + .map(|acct| { + acct.storage + .keys() + .copied() + .map(Compat::compat) + .collect::>() + }) + .unwrap_or_default(), + ); + + let mut storage_written: HashMap = post_acct + .map(|x| { + x.storage + .iter() + .map(|(k, v)| ((*k).compat(), U256::from_big_endian(&v.0))) + .collect() + }) + .unwrap_or_default(); + + // Add the deleted keys to the storage written + if let Some(pre_acct) = pre_acct { + for key in pre_acct.storage.keys() { + storage_written + .entry((*key).compat()) + .or_insert(U256::zero()); + } + }; + + ( + Option::from(storage_read.into_iter().collect::>()).filter(|v| !v.is_empty()), + Option::from(storage_written).filter(|v| !v.is_empty()), + ) +} + +/// Processes the code usage for the given account state. +async fn process_code( + post_state: Option<&AccountState>, + read_state: Option<&AccountState>, + code_db: &mut CodeDb, +) -> Option { + match ( + post_state.and_then(|x| x.code.as_ref()), + read_state.and_then(|x| x.code.as_ref()), + ) { + (Some(post_code), _) => { + let code_hash = keccak256(post_code).compat(); + code_db.insert(code_hash, post_code.to_vec()); + Some(ContractCodeUsage::Write(post_code.to_vec().into())) + } + (_, Some(read_code)) => { + let code_hash = keccak256(read_code).compat(); + code_db.insert(code_hash, read_code.to_vec()); + + Some(ContractCodeUsage::Read(code_hash)) + } + _ => None, + } +} + +/// Processes the self destruct for the given account state. +fn process_self_destruct( + post_state: Option<&AccountState>, + pre_state: Option<&AccountState>, +) -> Option { + if post_state.is_none() && pre_state.is_some() { + Some(true) + } else { + None + } +} + +mod rlp { + use alloy::consensus::{Receipt, ReceiptEnvelope}; + use alloy::rpc::types::eth::ReceiptWithBloom; + + pub fn map_receipt_envelope( + rpc: ReceiptEnvelope, + ) -> ReceiptEnvelope { + match rpc { + ReceiptEnvelope::Legacy(it) => ReceiptEnvelope::Legacy(map_receipt_with_bloom(it)), + ReceiptEnvelope::Eip2930(it) => ReceiptEnvelope::Eip2930(map_receipt_with_bloom(it)), + ReceiptEnvelope::Eip1559(it) => ReceiptEnvelope::Eip1559(map_receipt_with_bloom(it)), + ReceiptEnvelope::Eip4844(it) => ReceiptEnvelope::Eip4844(map_receipt_with_bloom(it)), + other => panic!("unsupported receipt type: {:?}", other), + } + } + fn map_receipt_with_bloom( + rpc: ReceiptWithBloom, + ) -> ReceiptWithBloom { + let ReceiptWithBloom { + receipt: + Receipt { + status, + cumulative_gas_used, + logs, + }, + logs_bloom, + } = rpc; + ReceiptWithBloom { + receipt: Receipt { + status, + cumulative_gas_used, + logs: logs.into_iter().map(|it| it.inner).collect(), + }, + logs_bloom, + } + } +} + +/// Tracing options for the debug_traceTransaction call. +fn prestate_tracing_options(diff_mode: bool) -> GethDebugTracingOptions { + GethDebugTracingOptions { + tracer_config: PreStateConfig { + diff_mode: Some(diff_mode), + } + .into(), + tracer: Some(GethDebugTracerType::BuiltInTracer( + GethDebugBuiltInTracerType::PreStateTracer, + )), + ..GethDebugTracingOptions::default() + } +} diff --git a/zero_bin/rpc/src/retry.rs b/zero_bin/rpc/src/retry.rs new file mode 100644 index 000000000..0c6db2291 --- /dev/null +++ b/zero_bin/rpc/src/retry.rs @@ -0,0 +1,148 @@ +use std::{ + future::Future, + pin::Pin, + task::{Context, Poll}, +}; + +use alloy::{ + providers::{ProviderBuilder, RootProvider}, + rpc::{ + client::ClientBuilder, + json_rpc::{RequestPacket, ResponsePacket}, + }, + transports::TransportError, +}; +use tower::{retry::Policy, Layer, Service}; + +#[derive(Debug)] +pub struct RetryPolicy { + backoff: tokio::time::Duration, + retries: u32, + max_retries: u32, +} + +impl Clone for RetryPolicy { + fn clone(&self) -> Self { + Self { + backoff: self.backoff, + retries: self.retries, + max_retries: self.max_retries, + } + } +} + +impl RetryPolicy { + pub fn new(backoff: tokio::time::Duration, max_retries: u32) -> Self { + Self { + backoff, + retries: 0, + max_retries, + } + } + + pub fn backoff(&self) -> tokio::time::Sleep { + tokio::time::sleep(self.backoff) + } +} + +impl Policy for RetryPolicy { + type Future = Pin + Send + 'static>>; + + fn retry( + &self, + _req: &RequestPacket, + result: Result<&ResponsePacket, &TransportError>, + ) -> Option { + // TODO: Use rate-limit specific errors/codes and retry accordingly. + if result.is_err() && self.retries < self.max_retries { + let mut policy = self.clone(); + Some(Box::pin(async move { + policy.backoff().await; + policy.retries += 1; + policy + })) + } else { + None + } + } + + fn clone_request(&self, req: &RequestPacket) -> Option { + Some(req.clone()) + } +} + +/// RetryLayer +pub struct RetryLayer { + policy: RetryPolicy, +} + +impl RetryLayer { + pub const fn new(policy: RetryPolicy) -> Self { + Self { policy } + } +} + +impl Layer for RetryLayer { + type Service = RetryService; + + fn layer(&self, inner: S) -> Self::Service { + RetryService { + inner, + policy: self.policy.clone(), + } + } +} + +/// RetryService +#[derive(Debug, Clone)] +pub struct RetryService { + inner: S, + policy: RetryPolicy, +} + +impl Service for RetryService +where + S: Service + + Send + + 'static + + Clone, + S::Future: Send + 'static, +{ + type Response = ResponsePacket; + type Error = TransportError; + type Future = Pin> + Send>>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, req: RequestPacket) -> Self::Future { + let inner = self.inner.clone(); + let mut policy = self.policy.clone(); + + let mut inner = std::mem::replace(&mut self.inner, inner); + Box::pin(async move { + let mut res = inner.call(req.clone()).await; + + while let Some(new_policy) = policy.retry(&req, res.as_ref()) { + policy = new_policy.await; + res = inner.call(req.clone()).await; + } + + res + }) + } +} + +pub fn build_http_retry_provider( + rpc_url: url::Url, + backoff: u64, + max_retries: u32, +) -> RootProvider> { + let retry_policy = RetryLayer::new(RetryPolicy::new( + tokio::time::Duration::from_millis(backoff), + max_retries, + )); + let client = ClientBuilder::default().layer(retry_policy).http(rpc_url); + ProviderBuilder::new().on_client(client) +} diff --git a/zero_bin/tools/prove_jerigon.sh b/zero_bin/tools/prove_rpc.sh similarity index 80% rename from zero_bin/tools/prove_jerigon.sh rename to zero_bin/tools/prove_rpc.sh index 409cbf331..9c511600d 100755 --- a/zero_bin/tools/prove_jerigon.sh +++ b/zero_bin/tools/prove_rpc.sh @@ -4,8 +4,11 @@ # 1 --> Start block idx # 2 --> End block index (inclusive) # 3 --> Rpc endpoint:port (eg. http://35.246.1.96:8545) -# 4 --> Ignore previous proofs (boolean) -# 5 --> Test run only flag `test_only` (optional) +# 4 --> Rpc type (eg. jerigon / native) +# 5 --> Ignore previous proofs (boolean) +# 6 --> Backoff in milliseconds (optional [default: 0]) +# 7 --> Number of retries (optional [default: 0]) +# 8 --> Test run only flag `test_only` (optional) export RUST_MIN_STACK=33554432 export RUST_BACKTRACE=1 @@ -15,7 +18,7 @@ export RUST_LOG=info # https://github.com/dtolnay/linkme/pull/88 export RUSTFLAGS='-C target-cpu=native -Zlinker-features=-lld' -if [[ $5 == "test_only" ]]; then +if [[ $8 == "test_only" ]]; then # Circuit sizes don't matter in test_only mode, so we keep them minimal. export ARITHMETIC_CIRCUIT_SIZE="16..17" export BYTE_PACKING_CIRCUIT_SIZE="9..10" @@ -42,7 +45,10 @@ TOT_BLOCKS=$(($2-$1+1)) START_BLOCK=$1 END_BLOCK=$2 NODE_RPC_URL=$3 -IGNORE_PREVIOUS_PROOFS=$4 +NODE_RPC_TYPE=$4 +IGNORE_PREVIOUS_PROOFS=$5 +BACKOFF=${6:-0} +RETRIES=${7:-0} mkdir -p $PROOF_OUTPUT_DIR @@ -78,10 +84,10 @@ fi # If we set test_only flag, we'll generate a dummy # proof. This is useful for quickly testing decoding and all of the # other non-proving code. -if [[ $5 == "test_only" ]]; then +if [[ $8 == "test_only" ]]; then # test only run echo "Proving blocks ${BLOCK_INTERVAL} in a test_only mode now... (Total: ${TOT_BLOCKS})" - cargo r --release --features test_only --bin leader -- --runtime in-memory --load-strategy on-demand jerigon --rpc-url "$NODE_RPC_URL" --block-interval $BLOCK_INTERVAL --proof-output-dir $PROOF_OUTPUT_DIR $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 + cargo r --release --features test_only --bin leader -- --runtime in-memory --load-strategy on-demand "$NODE_RPC_TYPE" --rpc-url "$NODE_RPC_URL" --block-interval $BLOCK_INTERVAL --proof-output-dir $PROOF_OUTPUT_DIR $PREV_PROOF_EXTRA_ARG --backoff "$BACKOFF" --max-retries "$RETRIES" > $OUT_LOG_PATH 2>&1 if grep -q 'All proof witnesses have been generated successfully.' $OUT_LOG_PATH; then echo -e "Success - Note this was just a test, not a proof" # Remove the log on success if we don't want to keep it. @@ -96,7 +102,7 @@ if [[ $5 == "test_only" ]]; then else # normal run echo "Proving blocks ${BLOCK_INTERVAL} now... (Total: ${TOT_BLOCKS})" - cargo r --release --bin leader -- --runtime in-memory --load-strategy on-demand jerigon --rpc-url "$3" --block-interval $BLOCK_INTERVAL --proof-output-dir $PROOF_OUTPUT_DIR $PREV_PROOF_EXTRA_ARG > $OUT_LOG_PATH 2>&1 + cargo r --release --bin leader -- --runtime in-memory --load-strategy on-demand "$NODE_RPC_TYPE" --rpc-url "$3" --block-interval $BLOCK_INTERVAL --proof-output-dir $PROOF_OUTPUT_DIR $PREV_PROOF_EXTRA_ARG --backoff "$BACKOFF" --max-retries "$RETRIES" > $OUT_LOG_PATH 2>&1 retVal=$? if [ $retVal -ne 0 ]; then From 91c665aa58731bdf728d38251522e84a09459166 Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Mon, 17 Jun 2024 20:03:13 +0200 Subject: [PATCH 171/184] chore: bump alloy to v0.1.1 (#111) --- zero_bin/Cargo.lock | 162 ++++++++++++++++---------------------------- zero_bin/Cargo.toml | 4 +- 2 files changed, 60 insertions(+), 106 deletions(-) diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock index 51497afd5..42ad74a56 100644 --- a/zero_bin/Cargo.lock +++ b/zero_bin/Cargo.lock @@ -58,19 +58,15 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-consensus", "alloy-core", - "alloy-eips", - "alloy-genesis", "alloy-json-rpc", "alloy-provider", "alloy-rpc-client", "alloy-rpc-types", - "alloy-rpc-types-trace", - "alloy-serde", "alloy-transport", "alloy-transport-http", "reqwest", @@ -78,9 +74,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fd095a9d70f4b1c5c102c84a4c782867a5c6416dbf6dcd42a63e7c7a89d3c8" +checksum = "d2feb5f466b3a786d5a622d8926418bc6a0d38bf632909f6ee9298a4a1d8c6e0" dependencies = [ "num_enum", "strum", @@ -88,8 +84,8 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-eips", "alloy-primitives", @@ -101,38 +97,18 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b8b8d8c4e84449ce8f310ed48e09ce38b8290b163e3d0df68ea445a9ccce3a" +checksum = "5af3faff14c12c8b11037e0a093dd157c3702becb8435577a2408534d0758315" dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", "alloy-primitives", "alloy-rlp", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd2404399cb1b50572758e66e9b4bf088e5a3df9007be7126456c7e50af935f" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow 0.6.13", ] [[package]] name = "alloy-eips" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -143,33 +119,10 @@ dependencies = [ "sha2", ] -[[package]] -name = "alloy-genesis" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-abi" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3abf6446a292e19853aaca43590eeb48bf435dfd2c74200259e8f4872f6ce3" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - [[package]] name = "alloy-json-rpc" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-primitives", "serde", @@ -180,14 +133,15 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-json-rpc", "alloy-primitives", - "alloy-rpc-types", + "alloy-rpc-types-eth", + "alloy-serde", "alloy-signer", "alloy-sol-types", "async-trait", @@ -198,9 +152,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5277af0cbcc483ee6ad2c1e818090b5928d27f04fd6580680f31c1cf8068bcc2" +checksum = "f783611babedbbe90db3478c120fb5f5daacceffc210b39adc0af4fe0da70bad" dependencies = [ "alloy-rlp", "bytes", @@ -220,8 +174,8 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-chains", "alloy-consensus", @@ -230,7 +184,7 @@ dependencies = [ "alloy-network", "alloy-primitives", "alloy-rpc-client", - "alloy-rpc-types", + "alloy-rpc-types-eth", "alloy-rpc-types-trace", "alloy-transport", "alloy-transport-http", @@ -274,8 +228,8 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -294,17 +248,26 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-genesis", "alloy-primitives", "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.12.1", + "itertools 0.13.0", "serde", "serde_json", "thiserror", @@ -312,11 +275,11 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-primitives", - "alloy-rpc-types", + "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", @@ -324,8 +287,8 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-primitives", "serde", @@ -334,8 +297,8 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-primitives", "async-trait", @@ -347,9 +310,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30708a79919b082f2692423c8cc72fc250477e4a2ecb0d4a7244cd3cdb299965" +checksum = "4bad41a7c19498e3f6079f7744656328699f8ea3e783bdd10d85788cd439f572" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -361,9 +324,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a679ac01774ab7e00a567a918d4231ae692c5c8cedaf4e16956c3116d7896" +checksum = "fd9899da7d011b4fe4c406a524ed3e3f963797dbc93b45479d60341d3a27b252" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -379,9 +342,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356da0c2228aa6675a5faaa08a3e4061b967f924753983d72b9a18d9a3fad44e" +checksum = "d32d595768fdc61331a132b6f65db41afae41b9b97d36c21eb1b955c422a7e60" dependencies = [ "const-hex", "dunce", @@ -392,31 +355,21 @@ dependencies = [ "syn-solidity", ] -[[package]] -name = "alloy-sol-type-parser" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fd4783b0a5840479013e9ce960d2eb7b3be381f722e0fe3d1f7c3bb6bd4ebd" -dependencies = [ - "winnow 0.6.13", -] - [[package]] name = "alloy-sol-types" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb5e6234c0b62514992589fe1578f64d418dbc8ef5cd1ab2d7f2f568f599698" +checksum = "a49042c6d3b66a9fe6b2b5a8bf0d39fc2ae1ee0310a2a26ffedd79fb097878dd" dependencies = [ "alloy-primitives", "alloy-sol-macro", "const-hex", - "serde", ] [[package]] name = "alloy-transport" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-json-rpc", "base64", @@ -428,13 +381,12 @@ dependencies = [ "tokio", "tower", "url", - "wasm-bindgen-futures", ] [[package]] name = "alloy-transport-http" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy#506edee985b7b3786759d2d834e426738f21161a" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -4596,9 +4548,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6fe08d08d84f2c0a77f1e7c46518789d745c2e87a2721791ed7c3c9bc78df28" +checksum = "8d71e19bca02c807c9faa67b5a47673ff231b6e7449b251695188522f1dc44b2" dependencies = [ "paste", "proc-macro2", diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml index 2dd5caf4f..4ed57d2c3 100644 --- a/zero_bin/Cargo.toml +++ b/zero_bin/Cargo.toml @@ -16,8 +16,9 @@ serde_json = "1.0.107" thiserror = "1.0.50" futures = "0.3.29" keccak-hash = "0.10.0" -alloy = { git = "https://github.com/alloy-rs/alloy", features = [ +alloy = { git = "https://github.com/alloy-rs/alloy", tag='v0.1.1', default-features = false, features = [ "consensus", + "reqwest", "json-rpc", "rlp", "rpc", @@ -27,6 +28,7 @@ alloy = { git = "https://github.com/alloy-rs/alloy", features = [ "providers", "transports", "transport-http", + "rpc-types-debug" ] } From 236e2a426401e984c6d3e2fc09fdda83372a26e8 Mon Sep 17 00:00:00 2001 From: BGluth Date: Mon, 17 Jun 2024 14:53:57 -0600 Subject: [PATCH 172/184] A few dep updates to get `zero-bin` to build --- Cargo.toml | 45 +- evm_arithmetization/Cargo.toml | 4 +- proof_gen/Cargo.toml | 2 +- trace_decoder/Cargo.toml | 4 +- zero_bin/Cargo.lock | 5526 -------------------------------- zero_bin/Cargo.toml | 54 - zero_bin/common/Cargo.toml | 2 +- zero_bin/leader/Cargo.toml | 2 +- zero_bin/ops/Cargo.toml | 2 +- zero_bin/prover/Cargo.toml | 2 +- zero_bin/rpc/Cargo.toml | 2 +- zero_bin/verifier/Cargo.toml | 1 + zero_bin/worker/Cargo.toml | 2 +- 13 files changed, 48 insertions(+), 5600 deletions(-) delete mode 100644 zero_bin/Cargo.lock delete mode 100644 zero_bin/Cargo.toml diff --git a/Cargo.toml b/Cargo.toml index 61db35cd5..d13ad5dee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,34 +1,61 @@ [workspace] -members = ["mpt_trie", "proof_gen", "trace_decoder", "evm_arithmetization"] +members = ["mpt_trie", "proof_gen", "trace_decoder", "evm_arithmetization", "zero_bin/leader", "zero_bin/worker", "zero_bin/common", "zero_bin/ops", "zero_bin/verifier", "zero_bin/rpc", "zero_bin/prover"] resolver = "2" +[workspace.package] +edition = "2021" +license = "MIT OR Apache-2.0" +repository = "https://github.com/0xPolygonZero/zk_evm" +homepage = "https://github.com/0xPolygonZero/zk_evm" +keywords = ["cryptography", "STARK", "plonky2", "ethereum", "zk"] +categories = ["cryptography::cryptocurrencies"] + [workspace.dependencies] +anyhow = "1.0.40" +alloy = { git = "https://github.com/alloy-rs/alloy", tag='v0.1.1', default-features = false, features = [ + "consensus", + "reqwest", + "json-rpc", + "rlp", + "rpc", + "rpc-client", + "rpc-types-eth", + "rpc-types-trace", + "providers", + "transports", + "transport-http", + "rpc-types-debug" +] } bytes = "1.5.0" +clap = { version = "4.4.6", features = ["derive", "env"] } +dotenvy = "0.15.7" enum-as-inner = "0.6.0" env_logger = "0.10.0" ethereum-types = "0.14.1" +evm_arithmetization = { path = "evm_arithmetization" } +futures = "0.3.29" hex = "0.4.3" hex-literal = "0.4.1" keccak-hash = "0.10.0" log = "0.4.20" +mpt_trie = { path = "mpt_trie", version = "0.3.0" } num = "0.4.1" +paladin-core = "0.4.2" +proof_gen = { path = "proof_gen", version = "0.2.0" } rand = "0.8.5" rlp = "0.5.2" rlp-derive = "0.1.0" serde = "1.0.166" serde_json = "1.0.96" +serde_path_to_error = "0.1.14" thiserror = "1.0.49" +tokio = { version = "1.33.0", features = ["full"] } +trace_decoder = { path = "trace_decoder" } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } # plonky2-related dependencies plonky2 = "0.2.2" plonky2_maybe_rayon = "0.2.0" plonky2_util = "0.2.0" starky = "0.4.0" - - -[workspace.package] -edition = "2021" -license = "MIT OR Apache-2.0" -repository = "https://github.com/0xPolygonZero/zk_evm" -homepage = "https://github.com/0xPolygonZero/zk_evm" -keywords = ["cryptography", "STARK", "plonky2", "ethereum", "zk"] diff --git a/evm_arithmetization/Cargo.toml b/evm_arithmetization/Cargo.toml index cce95977f..71af63411 100644 --- a/evm_arithmetization/Cargo.toml +++ b/evm_arithmetization/Cargo.toml @@ -12,7 +12,7 @@ homepage.workspace = true keywords.workspace = true [dependencies] -anyhow = "1.0.40" +anyhow = { workspace = true } bytes = { workspace = true } env_logger = { workspace = true } ethereum-types = { workspace = true } @@ -41,7 +41,7 @@ tiny-keccak = "2.0.2" serde_json = { workspace = true } # Local dependencies -mpt_trie = { version = "0.3.0", path = "../mpt_trie" } +mpt_trie = { workspace = true } [target.'cfg(not(target_env = "msvc"))'.dependencies] jemallocator = "0.5.0" diff --git a/proof_gen/Cargo.toml b/proof_gen/Cargo.toml index b4866da4e..e05c4bce1 100644 --- a/proof_gen/Cargo.toml +++ b/proof_gen/Cargo.toml @@ -17,4 +17,4 @@ plonky2 = { workspace = true } serde = { workspace = true } # Local dependencies -evm_arithmetization = { version = "0.2.0", path = "../evm_arithmetization" } +evm_arithmetization = { workspace = true } diff --git a/trace_decoder/Cargo.toml b/trace_decoder/Cargo.toml index f162a8ec3..1e7d7142f 100644 --- a/trace_decoder/Cargo.toml +++ b/trace_decoder/Cargo.toml @@ -27,8 +27,8 @@ serde_with = "3.4.0" thiserror = { workspace = true } # Local dependencies -mpt_trie = { version = "0.3.0", path = "../mpt_trie" } -evm_arithmetization = { version = "0.2.0", path = "../evm_arithmetization" } +mpt_trie = { workspace = true } +evm_arithmetization = { workspace = true } [dev-dependencies] criterion = "0.5.1" diff --git a/zero_bin/Cargo.lock b/zero_bin/Cargo.lock deleted file mode 100644 index 42ad74a56..000000000 --- a/zero_bin/Cargo.lock +++ /dev/null @@ -1,5526 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "const-random", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "alloy" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-consensus", - "alloy-core", - "alloy-json-rpc", - "alloy-provider", - "alloy-rpc-client", - "alloy-rpc-types", - "alloy-transport", - "alloy-transport-http", - "reqwest", -] - -[[package]] -name = "alloy-chains" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2feb5f466b3a786d5a622d8926418bc6a0d38bf632909f6ee9298a4a1d8c6e0" -dependencies = [ - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "serde", -] - -[[package]] -name = "alloy-core" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5af3faff14c12c8b11037e0a093dd157c3702becb8435577a2408534d0758315" -dependencies = [ - "alloy-primitives", - "alloy-rlp", -] - -[[package]] -name = "alloy-eips" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "thiserror", -] - -[[package]] -name = "alloy-primitives" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f783611babedbbe90db3478c120fb5f5daacceffc210b39adc0af4fe0da70bad" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "hex-literal", - "itoa", - "k256", - "keccak-asm", - "proptest", - "rand", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-provider" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-primitives", - "alloy-rpc-client", - "alloy-rpc-types-eth", - "alloy-rpc-types-trace", - "alloy-transport", - "alloy-transport-http", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8037e03c7f462a063f28daec9fda285a9a89da003c552f8637a80b9c8fd96241" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "alloy-transport-http", - "futures", - "pin-project", - "reqwest", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-rpc-types-eth", - "alloy-rpc-types-trace", - "alloy-serde", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "itertools 0.13.0", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "alloy-rpc-types-trace" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bad41a7c19498e3f6079f7744656328699f8ea3e783bdd10d85788cd439f572" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9899da7d011b4fe4c406a524ed3e3f963797dbc93b45479d60341d3a27b252" -dependencies = [ - "alloy-sol-macro-input", - "const-hex", - "heck 0.5.0", - "indexmap 2.2.6", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.66", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32d595768fdc61331a132b6f65db41afae41b9b97d36c21eb1b955c422a7e60" -dependencies = [ - "const-hex", - "dunce", - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.66", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-types" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49042c6d3b66a9fe6b2b5a8bf0d39fc2ae1ee0310a2a26ffedd79fb097878dd" -dependencies = [ - "alloy-primitives", - "alloy-sol-macro", - "const-hex", -] - -[[package]] -name = "alloy-transport" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-json-rpc", - "base64", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "url", -] - -[[package]] -name = "alloy-transport-http" -version = "0.1.1" -source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "amq-protocol" -version = "7.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051d4d77904272e9be7e292607378dc9900d15b8d314bfd3ed4b82fdd84f125" -dependencies = [ - "amq-protocol-tcp", - "amq-protocol-types", - "amq-protocol-uri", - "cookie-factory", - "nom", - "serde", -] - -[[package]] -name = "amq-protocol-tcp" -version = "7.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3d51dd36e67d757c9ba80a7b2a2a2a69254c1dbe4d8c631824ec7f5b69f60e" -dependencies = [ - "amq-protocol-uri", - "tcp-stream", - "tracing", -] - -[[package]] -name = "amq-protocol-types" -version = "7.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0acdd47054ced8b9bc89ee0dbb42ccc8028de48d8658b24de4c255a226c9bfec" -dependencies = [ - "cookie-factory", - "nom", - "serde", - "serde_json", -] - -[[package]] -name = "amq-protocol-uri" -version = "7.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17881b7575dab3e71403f28a3e50b71f0d1bd026829abca3c48664522ce0df0" -dependencies = [ - "amq-protocol-types", - "percent-encoding", - "url", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" -dependencies = [ - "backtrace", -] - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.0", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -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 = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "asn1-rs" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand 2.1.0", - "futures-lite 2.3.0", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel", - "async-executor", - "async-io 2.3.3", - "async-lock 3.4.0", - "blocking", - "futures-lite 2.3.0", - "once_cell", -] - -[[package]] -name = "async-global-executor-trait" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33dd14c5a15affd2abcff50d84efd4009ada28a860f01c14f9d654f3e81b3f75" -dependencies = [ - "async-global-executor", - "async-trait", - "executor-trait", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", -] - -[[package]] -name = "async-io" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" -dependencies = [ - "async-lock 3.4.0", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite 2.3.0", - "parking", - "polling 3.7.1", - "rustix 0.38.34", - "slab", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener 5.3.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-reactor-trait" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6012d170ad00de56c9ee354aef2e358359deb1ec504254e0e5a3774771de0e" -dependencies = [ - "async-io 1.13.0", - "async-trait", - "futures-core", - "reactor-trait", -] - -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "atomic-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "auto_impl" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "aws-lc-rs" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "474d7cec9d0a1126fad1b224b767fcbf351c23b0309bb21ec210bcfd379926a5" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7505fc3cb7acbf42699a43a79dd9caa4ed9e99861dfbb837c5c0fb5a0a8d2980" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - -[[package]] -name = "axum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" -dependencies = [ - "async-trait", - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper 0.1.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "futures-core", - "getrandom", - "instant", - "pin-project-lite", - "rand", - "tokio", -] - -[[package]] -name = "backtrace" -version = "0.3.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" -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.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.66", - "which", -] - -[[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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - -[[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 = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blocking" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite 2.3.0", - "piper", -] - -[[package]] -name = "blst" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf100c4cea8f207e883ff91ca886d621d8a166cb04971dfaa9bb8fd99ed95df" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "serde", -] - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cc" -version = "1.0.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" -dependencies = [ - "jobserver", - "libc", - "once_cell", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[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.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets 0.52.5", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[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 = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9689a29b593160de5bc4aacab7b5d54fb52231de70122626c178e6a368994c7" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5387378c84f6faa26890ebf9f0a92989f8873d4d380467bcd0d8d8620424df" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "clap_lex" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "cms" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b77c319abfd5219629c45c34c89ba945ed3c5e49fcde9d16b6c3885f118a730" -dependencies = [ - "const-oid", - "der", - "spki", - "x509-cert", -] - -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "common" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "async-stream", - "clap", - "evm_arithmetization", - "futures", - "plonky2", - "proof_gen", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-hex" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "cookie-factory" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "critical-section" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" - -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-skiplist" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "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", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.66", -] - -[[package]] -name = "darling_macro" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "der_derive", - "flagset", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "9.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "der_derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[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 = "des" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" -dependencies = [ - "cipher", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "enum-as-inner" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "enumn" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "env_logger" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" -dependencies = [ - "humantime", - "is-terminal", - "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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash 0.8.0", - "impl-rlp", - "impl-serde", - "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 0.8.0", - "impl-rlp", - "impl-serde", - "primitive-types 0.12.2", - "uint", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener 5.3.1", - "pin-project-lite", -] - -[[package]] -name = "evm_arithmetization" -version = "0.2.0" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.4.0#46eb449a5a97438ade3f22e2555d7f266b54b290" -dependencies = [ - "anyhow", - "bytes", - "env_logger", - "ethereum-types", - "hashbrown 0.14.5", - "hex-literal", - "itertools 0.11.0", - "jemallocator", - "keccak-hash 0.10.0", - "log", - "mpt_trie", - "num", - "num-bigint", - "once_cell", - "pest", - "pest_derive", - "plonky2", - "plonky2_maybe_rayon", - "plonky2_util", - "rand", - "rand_chacha", - "rlp", - "rlp-derive", - "serde", - "serde_json", - "starky", - "static_assertions", - "tiny-keccak", -] - -[[package]] -name = "executor-trait" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a1052dd43212a7777ec6a69b117da52f5e52f07aec47d00c1a2b33b85d06b08" -dependencies = [ - "async-trait", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[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 = [ - "rand_core", - "subtle", -] - -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "static_assertions", -] - -[[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 = "flagset" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb3aa5e95cf9aabc17f060cfa0ced7b83f042390760ca53bf09df9968acaa1" - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[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.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-lite" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" -dependencies = [ - "fastrand 2.1.0", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[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.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[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 = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if", - "crunchy", -] - -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", - "rayon", - "serde", -] - -[[package]] -name = "heapless" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" -dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version 0.4.0", - "serde", - "spin", - "stable_deref_trait", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[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.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "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 = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2 0.5.7", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -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-num-traits" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" -dependencies = [ - "integer-sqrt", - "num-traits", - "uint", -] - -[[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 = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.5", - "serde", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "integer-sqrt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is-terminal" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jemalloc-sys" -version = "0.5.4+5.3.0-patched" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "jemallocator" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc" -dependencies = [ - "jemalloc-sys", - "libc", -] - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", -] - -[[package]] -name = "keccak-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "keccak-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2bd4c29270e724d3eaadf7bdc8700af4221fc0ed771b855eadcd1b98d52851" -dependencies = [ - "primitive-types 0.10.1", - "tiny-keccak", -] - -[[package]] -name = "keccak-hash" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b286e6b663fb926e1eeb68528e69cb70ed46c6d65871a21b2215ae8154c6d3c" -dependencies = [ - "primitive-types 0.12.2", - "tiny-keccak", -] - -[[package]] -name = "lapin" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fae02c316a8a5922ce7518afa6b6c00e9a099f8e59587567e3331efdd11b8ceb" -dependencies = [ - "amq-protocol", - "async-global-executor-trait", - "async-reactor-trait", - "async-trait", - "executor-trait", - "flume", - "futures-core", - "futures-io", - "parking_lot", - "pinky-swear", - "reactor-trait", - "serde", - "tracing", - "waker-fn", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "leader" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "axum", - "clap", - "common", - "dotenvy", - "futures", - "ops", - "paladin-core", - "proof_gen", - "prover", - "rpc", - "serde", - "serde_json", - "serde_path_to_error", - "tokio", - "toml", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets 0.52.5", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linkme" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb76662d78edc9f9bf56360d6919bdacc8b7761227727e5082f128eeb90bbf5" -dependencies = [ - "linkme-impl", -] - -[[package]] -name = "linkme-impl" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dccda732e04fa3baf2e17cf835bfe2601c7c2edafd64417c627dabae3a8cda" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", - "serde", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "lru" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[package]] -name = "mpt_trie" -version = "0.3.0" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.4.0#46eb449a5a97438ade3f22e2555d7f266b54b290" -dependencies = [ - "bytes", - "enum-as-inner", - "ethereum-types", - "hex", - "impl-codec", - "impl-num-traits", - "impl-rlp", - "impl-serde", - "keccak-hash 0.10.0", - "log", - "num", - "num-traits", - "parking_lot", - "rlp", - "serde", - "thiserror", - "uint", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" -dependencies = [ - "num-integer", - "num-traits", - "rand", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", - "rand", -] - -[[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.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -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", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "object" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" -dependencies = [ - "memchr", -] - -[[package]] -name = "oid-registry" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl" -version = "0.10.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" -dependencies = [ - "bitflags 2.5.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.66", -] - -[[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.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ops" -version = "0.1.0" -dependencies = [ - "common", - "evm_arithmetization", - "keccak-hash 0.10.0", - "paladin-core", - "proof_gen", - "serde", - "tracing", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "p12-keystore" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7b60d0b2dcace322e6e8c4499c4c8bdf331c1bae046a54be5e4191c3610286" -dependencies = [ - "cbc", - "cms", - "der", - "des", - "hex", - "hmac", - "pkcs12", - "pkcs5", - "rand", - "rc2", - "sha1", - "sha2", - "thiserror", - "x509-parser", -] - -[[package]] -name = "paladin-core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5af1955eaab1506a43d046628c218b7b3915539554838feb85ed31f54aace2f2" -dependencies = [ - "anyhow", - "async-trait", - "backoff", - "bytes", - "ciborium", - "clap", - "crossbeam", - "crossbeam-skiplist", - "dashmap", - "dotenvy", - "futures", - "lapin", - "linkme", - "paladin-opkind-derive", - "pin-project", - "postcard", - "serde", - "thiserror", - "tokio", - "tokio-executor-trait", - "tokio-reactor-trait", - "tokio-util", - "tracing", - "tracing-subscriber", - "uuid", -] - -[[package]] -name = "paladin-opkind-derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25dcb10b7c0ce99abee8694e2e79e4787d7f778b9339dc5a50ba6fc45e5cc9" -dependencies = [ - "quote", - "syn 2.0.66", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[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", -] - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "pest_meta" -version = "2.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd" -dependencies = [ - "once_cell", - "pest", - "sha2", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pinky-swear" -version = "6.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cfae3ead413ca051a681152bd266438d3bfa301c9bdf836939a14c721bb2a21" -dependencies = [ - "doc-comment", - "flume", - "parking_lot", - "tracing", -] - -[[package]] -name = "piper" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" -dependencies = [ - "atomic-waker", - "fastrand 2.1.0", - "futures-io", -] - -[[package]] -name = "pkcs12" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695b3df3d3cc1015f12d70235e35b6b79befc5fa7a9b95b951eab1dd07c9efc2" -dependencies = [ - "cms", - "const-oid", - "der", - "digest 0.10.7", - "spki", - "x509-cert", - "zeroize", -] - -[[package]] -name = "pkcs5" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" -dependencies = [ - "aes", - "cbc", - "der", - "pbkdf2", - "scrypt", - "sha2", - "spki", -] - -[[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.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "plonky2" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85f26b090b989aebdeaf6a4eed748c1fbcabf67e7273a22e4e0c877b63846d0f" -dependencies = [ - "ahash", - "anyhow", - "getrandom", - "hashbrown 0.14.5", - "itertools 0.11.0", - "keccak-hash 0.8.0", - "log", - "num", - "plonky2_field", - "plonky2_maybe_rayon", - "plonky2_util", - "rand", - "rand_chacha", - "serde", - "static_assertions", - "unroll", - "web-time", -] - -[[package]] -name = "plonky2_field" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1dca60ad900d81b1fe2df3d0b88d43345988e2935e6709176e96573f4bcf5d" -dependencies = [ - "anyhow", - "itertools 0.11.0", - "num", - "plonky2_util", - "rand", - "serde", - "static_assertions", - "unroll", -] - -[[package]] -name = "plonky2_maybe_rayon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ff44a90aaca13e10e7ddf8fab815ba1b404c3f7c3ca82aaf11c46beabaa923" -dependencies = [ - "rayon", -] - -[[package]] -name = "plonky2_util" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16136f5f3019c1e83035af76cccddd56d789a5e2933306270185c3f99f12259" - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - -[[package]] -name = "polling" -version = "3.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6a007746f34ed64099e88783b0ae369eaa3da6392868ba262e2af9b8fbaea1" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 0.38.34", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "postcard" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" -dependencies = [ - "cobs", - "embedded-io", - "heapless", - "serde", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.66", -] - -[[package]] -name = "primitive-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" -dependencies = [ - "fixed-hash 0.7.0", - "uint", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash 0.8.0", - "impl-codec", - "impl-rlp", - "impl-serde", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit 0.21.1", -] - -[[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.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proof_gen" -version = "0.2.0" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.4.0#46eb449a5a97438ade3f22e2555d7f266b54b290" -dependencies = [ - "ethereum-types", - "evm_arithmetization", - "log", - "paste", - "plonky2", - "serde", -] - -[[package]] -name = "proptest" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.5.0", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax 0.8.3", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "prover" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "common", - "futures", - "num-traits", - "ops", - "paladin-core", - "proof_gen", - "ruint", - "serde", - "serde_json", - "tokio", - "trace_decoder", - "tracing", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -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.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "rc2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" -dependencies = [ - "cipher", -] - -[[package]] -name = "reactor-trait" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "438a4293e4d097556730f4711998189416232f009c137389e0f961d2bc0ddc58" -dependencies = [ - "async-trait", - "futures-core", - "futures-io", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.3", -] - -[[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.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "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 = "rpc" -version = "0.1.0" -dependencies = [ - "alloy", - "anyhow", - "clap", - "common", - "evm_arithmetization", - "futures", - "hex", - "hex-literal", - "itertools 0.13.0", - "mpt_trie", - "primitive-types 0.12.2", - "prover", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "trace_decoder", - "tracing", - "tracing-subscriber", - "url", -] - -[[package]] -name = "ruint" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint", - "num-traits", - "parity-scale-codec", - "primitive-types 0.12.2", - "proptest", - "rand", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[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" -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.23", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.23.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a218f0f6d05669de4eabfb24f31ce802035c952429d037507b4a4a39f0e60c5b" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-connector" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727a826801254b6cfcd2508a0508c01b7c1bca21d3673e84d86da084781b83d5" -dependencies = [ - "log", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "rustls-webpki", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.102.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scrypt" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" -dependencies = [ - "pbkdf2", - "salsa20", - "sha2", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[package]] -name = "serde" -version = "1.0.203" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.203" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" -dependencies = [ - "itoa", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" -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 = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.2.6", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3-asm" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core", -] - -[[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 = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "starky" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a8480ca5b8eedf83ad070a780783b4e21a56c6ef66b4c0d1b7520b72bdfda1b" -dependencies = [ - "ahash", - "anyhow", - "hashbrown 0.14.5", - "itertools 0.11.0", - "log", - "num-bigint", - "plonky2", - "plonky2_maybe_rayon", - "plonky2_util", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.66", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[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.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d71e19bca02c807c9faa67b5a47673ff231b6e7449b251695188522f1dc44b2" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tcp-stream" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495b0abdce3dc1f8fd27240651c9e68890c14e9d9c61527b1ce44d8a5a7bd3d5" -dependencies = [ - "cfg-if", - "p12-keystore", - "rustls-connector", - "rustls-pemfile", -] - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand 2.1.0", - "rustix 0.38.34", - "windows-sys 0.52.0", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "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.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.5.7", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-executor-trait" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "802ccf58e108fe16561f35348fabe15ff38218968f033d587e399a84937533cc" -dependencies = [ - "async-trait", - "executor-trait", - "tokio", -] - -[[package]] -name = "tokio-macros" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[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-reactor-trait" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9481a72f36bd9cbb8d6dd349227c4783e234e4332cfe806225bc929c4b92486" -dependencies = [ - "async-trait", - "futures-core", - "futures-io", - "reactor-trait", - "tokio", - "tokio-stream", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.22.14", -] - -[[package]] -name = "toml_datetime" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" -dependencies = [ - "indexmap 2.2.6", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.6.13", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "trace_decoder" -version = "0.4.0" -source = "git+https://github.com/0xPolygonZero/zk_evm.git?tag=v0.4.0#46eb449a5a97438ade3f22e2555d7f266b54b290" -dependencies = [ - "bytes", - "ciborium", - "ciborium-io", - "enum-as-inner", - "enumn", - "ethereum-types", - "evm_arithmetization", - "hex", - "hex-literal", - "keccak-hash 0.10.0", - "log", - "mpt_trie", - "rlp", - "rlp-derive", - "serde", - "serde_with", - "thiserror", -] - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[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.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unroll" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad948c1cb799b1a70f836077721a92a35ac177d4daddf4c20a633786d4cf618" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" -dependencies = [ - "getrandom", - "rand", - "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 = "verifier" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "common", - "dotenvy", - "proof_gen", - "serde", - "serde_json", - "serde_path_to_error", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[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.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.66", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.34", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[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-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[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_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[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_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[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_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[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_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "worker" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "common", - "dotenvy", - "ops", - "paladin-core", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x509-cert" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" -dependencies = [ - "const-oid", - "der", - "spki", -] - -[[package]] -name = "x509-parser" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" -dependencies = [ - "asn1-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror", - "time", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -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.66", -] diff --git a/zero_bin/Cargo.toml b/zero_bin/Cargo.toml deleted file mode 100644 index 4ed57d2c3..000000000 --- a/zero_bin/Cargo.toml +++ /dev/null @@ -1,54 +0,0 @@ -[workspace] -members = ["leader", "worker", "common", "ops", "verifier", "rpc", "prover"] -resolver = "2" - -[workspace.dependencies] -paladin-core = "0.4.2" -anyhow = { version = "1.0.75", features = ["backtrace"] } -dotenvy = "0.15.7" -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } -clap = { version = "4.4.6", features = ["derive", "env"] } -tokio = { version = "1.33.0", features = ["full"] } -serde = "1.0.183" -serde_path_to_error = "0.1.14" -serde_json = "1.0.107" -thiserror = "1.0.50" -futures = "0.3.29" -keccak-hash = "0.10.0" -alloy = { git = "https://github.com/alloy-rs/alloy", tag='v0.1.1', default-features = false, features = [ - "consensus", - "reqwest", - "json-rpc", - "rlp", - "rpc", - "rpc-client", - "rpc-types-eth", - "rpc-types-trace", - "providers", - "transports", - "transport-http", - "rpc-types-debug" -] } - - -# zk-evm dependencies -plonky2 = "0.2.2" -evm_arithmetization = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } -mpt_trie = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } -trace_decoder = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } -proof_gen = { git = "https://github.com/0xPolygonZero/zk_evm.git", tag = "v0.4.0" } - -[workspace.package] -edition = "2021" -license = "MIT OR Apache-2.0" -repository = "https://github.com/0xPolygonZero/zero-bin" -authors = ["Polygon Zero "] -keywords = ["cryptography", "SNARK", "PLONK", "FRI", "plonky2"] -categories = ["cryptography::cryptocurrencies"] - -[profile.release] -opt-level = 3 -incremental = true -lto = "fat" -codegen-units = 1 diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 679897447..18d34be02 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "common" +authors = ["Polygon Zero "] version = "0.1.0" edition.workspace = true license.workspace = true -authors.workspace = true repository.workspace = true keywords.workspace = true categories.workspace = true diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index b1ca703a0..dc4e57dff 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "leader" +authors = ["Polygon Zero "] version = "0.1.0" edition.workspace = true license.workspace = true -authors.workspace = true repository.workspace = true keywords.workspace = true categories.workspace = true diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 11c265aa8..9418db15a 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "ops" version = "0.1.0" +authors = ["Polygon Zero "] edition.workspace = true license.workspace = true -authors.workspace = true repository.workspace = true keywords.workspace = true categories.workspace = true diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index ff5c1227c..e411e13f3 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "prover" +authors = ["Polygon Zero "] version = "0.1.0" edition.workspace = true license.workspace = true -authors.workspace = true repository.workspace = true keywords.workspace = true categories.workspace = true diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 477b739ef..37ad7769d 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "rpc" +authors = ["Polygon Zero "] version = "0.1.0" edition.workspace = true license.workspace = true -authors.workspace = true repository.workspace = true keywords.workspace = true categories.workspace = true diff --git a/zero_bin/verifier/Cargo.toml b/zero_bin/verifier/Cargo.toml index cbd76b150..243c18691 100644 --- a/zero_bin/verifier/Cargo.toml +++ b/zero_bin/verifier/Cargo.toml @@ -1,5 +1,6 @@ [package] name = "verifier" +authors = ["Polygon Zero "] version = "0.1.0" edition = "2021" diff --git a/zero_bin/worker/Cargo.toml b/zero_bin/worker/Cargo.toml index 9b08cec35..41fd0596a 100644 --- a/zero_bin/worker/Cargo.toml +++ b/zero_bin/worker/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "worker" +authors = ["Polygon Zero "] version = "0.1.0" edition.workspace = true license.workspace = true -authors.workspace = true repository.workspace = true keywords.workspace = true categories.workspace = true From 9b61f59c4729e5e203285f1cd56b769601d98d0e Mon Sep 17 00:00:00 2001 From: BGluth Date: Mon, 17 Jun 2024 14:58:41 -0600 Subject: [PATCH 173/184] cargo `autoinherit` pass - Also manually sorted dep names. --- Cargo.toml | 34 +++++++++++++++++++++++++++++++++- evm_arithmetization/Cargo.toml | 22 +++++++++++----------- mpt_trie/Cargo.toml | 18 +++++++++--------- proof_gen/Cargo.toml | 2 +- trace_decoder/Cargo.toml | 12 ++++++------ zero_bin/common/Cargo.toml | 2 +- zero_bin/leader/Cargo.toml | 4 ++-- zero_bin/prover/Cargo.toml | 4 ++-- zero_bin/rpc/Cargo.toml | 8 ++++---- 9 files changed, 69 insertions(+), 37 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d13ad5dee..d8f16ff97 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,6 @@ keywords = ["cryptography", "STARK", "plonky2", "ethereum", "zk"] categories = ["cryptography::cryptocurrencies"] [workspace.dependencies] -anyhow = "1.0.40" alloy = { git = "https://github.com/alloy-rs/alloy", tag='v0.1.1', default-features = false, features = [ "consensus", "reqwest", @@ -26,33 +25,66 @@ alloy = { git = "https://github.com/alloy-rs/alloy", tag='v0.1.1', default-featu "transport-http", "rpc-types-debug" ] } +anyhow = "1.0.40" +async-stream = "0.3.5" +axum = "0.7.4" bytes = "1.5.0" +ciborium = "0.2.1" +ciborium-io = "0.2.1" clap = { version = "4.4.6", features = ["derive", "env"] } +__compat_primitive_types = "0.12.2" +criterion = "0.5.1" dotenvy = "0.15.7" enum-as-inner = "0.6.0" +enumn = "0.1.12" env_logger = "0.10.0" ethereum-types = "0.14.1" +eth_trie = "0.4.0" evm_arithmetization = { path = "evm_arithmetization" } futures = "0.3.29" +hashbrown = "0.14.0" hex = "0.4.3" hex-literal = "0.4.1" +impl-codec = "0.6.0" +impl-num-traits = "0.1.2" +impl-rlp = "0.3.0" +impl-serde = "0.4.0" keccak-hash = "0.10.0" log = "0.4.20" mpt_trie = { path = "mpt_trie", version = "0.3.0" } num = "0.4.1" +num-bigint = "0.4.3" +num-traits = "0.2.19" +once_cell = "1.13.0" paladin-core = "0.4.2" +parking_lot = "0.12.1" +paste = "1.0.14" +pest = "2.1.3" +pest_derive = "2.1.0" +pretty_env_logger = "0.5.0" proof_gen = { path = "proof_gen", version = "0.2.0" } rand = "0.8.5" +rand_chacha = "0.3.1" +ripemd = "0.1.3" rlp = "0.5.2" rlp-derive = "0.1.0" +ruint = "1.12.1" serde = "1.0.166" serde_json = "1.0.96" serde_path_to_error = "0.1.14" +serde_with = "3.4.0" +sha2 = "0.10.6" +static_assertions = "1.1.0" thiserror = "1.0.49" +tiny-keccak = "2.0.2" tokio = { version = "1.33.0", features = ["full"] } +toml = "0.8.12" +tower = "0.4" trace_decoder = { path = "trace_decoder" } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } +uint = "0.9.5" +url = "2.5.0" # plonky2-related dependencies plonky2 = "0.2.2" diff --git a/evm_arithmetization/Cargo.toml b/evm_arithmetization/Cargo.toml index 71af63411..c72865593 100644 --- a/evm_arithmetization/Cargo.toml +++ b/evm_arithmetization/Cargo.toml @@ -23,21 +23,21 @@ keccak-hash = { workspace = true } log = { workspace = true } plonky2_maybe_rayon = { workspace = true } num = { workspace = true } -num-bigint = "0.4.3" -once_cell = "1.13.0" -pest = "2.1.3" -pest_derive = "2.1.0" +num-bigint = { workspace = true } +once_cell = { workspace = true } +pest = { workspace = true } +pest_derive = { workspace = true } plonky2 = { workspace = true } plonky2_util = { workspace = true } starky = { workspace = true } rand = { workspace = true } -rand_chacha = "0.3.1" +rand_chacha = { workspace = true } rlp = { workspace = true } rlp-derive = { workspace = true } serde = { workspace = true, features = ["derive"] } -static_assertions = "1.1.0" -hashbrown = { version = "0.14.0" } -tiny-keccak = "2.0.2" +static_assertions = { workspace = true } +hashbrown = { workspace = true } +tiny-keccak = { workspace = true } serde_json = { workspace = true } # Local dependencies @@ -47,10 +47,10 @@ mpt_trie = { workspace = true } jemallocator = "0.5.0" [dev-dependencies] -criterion = "0.5.1" +criterion = { workspace = true } hex = { workspace = true } -ripemd = "0.1.3" -sha2 = "0.10.6" +ripemd = { workspace = true } +sha2 = { workspace = true } [features] default = ["parallel"] diff --git a/mpt_trie/Cargo.toml b/mpt_trie/Cargo.toml index 180cfb3a6..a2038fc86 100644 --- a/mpt_trie/Cargo.toml +++ b/mpt_trie/Cargo.toml @@ -19,22 +19,22 @@ enum-as-inner = { workspace = true } ethereum-types = { workspace = true } hex = { workspace = true } keccak-hash = { workspace = true } -parking_lot = { version = "0.12.1", features = ["serde"] } +parking_lot = { workspace = true, features = ["serde"] } thiserror = { workspace = true } log = { workspace = true } num = { workspace = true, optional = true } -num-traits = "0.2.15" -uint = "0.9.5" +num-traits = { workspace = true } +uint = { workspace = true } rlp = { workspace = true } serde = { workspace = true, features = ["derive", "rc"] } -impl-rlp = "0.3.0" -impl-codec = "0.6.0" -impl-serde = "0.4.0" -impl-num-traits = "0.1.2" +impl-rlp = { workspace = true } +impl-codec = { workspace = true } +impl-serde = { workspace = true } +impl-num-traits = { workspace = true } [dev-dependencies] -eth_trie = "0.4.0" -pretty_env_logger = "0.5.0" +eth_trie = { workspace = true } +pretty_env_logger = { workspace = true } rand = { workspace = true } rlp-derive = { workspace = true } serde_json = { workspace = true } diff --git a/proof_gen/Cargo.toml b/proof_gen/Cargo.toml index e05c4bce1..11f5fe319 100644 --- a/proof_gen/Cargo.toml +++ b/proof_gen/Cargo.toml @@ -12,7 +12,7 @@ keywords.workspace = true [dependencies] ethereum-types = { workspace = true } log = { workspace = true } -paste = "1.0.14" +paste = { workspace = true } plonky2 = { workspace = true } serde = { workspace = true } diff --git a/trace_decoder/Cargo.toml b/trace_decoder/Cargo.toml index 1e7d7142f..d4a3629b3 100644 --- a/trace_decoder/Cargo.toml +++ b/trace_decoder/Cargo.toml @@ -11,10 +11,10 @@ keywords.workspace = true [dependencies] bytes = { workspace = true } -ciborium = "0.2.1" -ciborium-io = "0.2.1" +ciborium = { workspace = true } +ciborium-io = { workspace = true } enum-as-inner = { workspace = true } -enumn = "0.1.12" +enumn = { workspace = true } ethereum-types = { workspace = true } hex = { workspace = true } hex-literal = { workspace = true } @@ -23,7 +23,7 @@ log = { workspace = true } rlp = { workspace = true } rlp-derive = { workspace = true } serde = { workspace = true } -serde_with = "3.4.0" +serde_with = { workspace = true } thiserror = { workspace = true } # Local dependencies @@ -31,8 +31,8 @@ mpt_trie = { workspace = true } evm_arithmetization = { workspace = true } [dev-dependencies] -criterion = "0.5.1" -pretty_env_logger = "0.5.0" +criterion = { workspace = true } +pretty_env_logger = { workspace = true } serde_json = { workspace = true } [[bench]] diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 18d34be02..6113a8bf7 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -21,4 +21,4 @@ serde_json = { workspace = true } futures = { workspace = true } tokio = { workspace = true } alloy = { workspace = true } -async-stream = "0.3.5" +async-stream = { workspace = true } diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index dc4e57dff..64853d9b7 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -22,8 +22,8 @@ serde_json = { workspace = true } serde_path_to_error = { workspace = true } futures = { workspace = true } alloy.workspace = true -axum = "0.7.4" -toml = "0.8.12" +axum = { workspace = true } +toml = { workspace = true } # Local dependencies ops = { path = "../ops" } diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index e411e13f3..8c035dcdb 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -19,10 +19,10 @@ futures = { workspace = true } alloy.workspace = true tokio = {workspace = true} serde_json = {workspace = true} -ruint = { version = "1.12.1", features = ["num-traits", "primitive-types"] } +ruint = { workspace = true, features = ["num-traits", "primitive-types"] } ops = { path = "../ops" } common = { path = "../common" } -num-traits = "0.2.19" +num-traits = { workspace = true } [features] default = [] diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index 37ad7769d..e61e335de 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -22,12 +22,12 @@ mpt_trie = { workspace = true } thiserror = { workspace = true } alloy.workspace = true futures = { workspace = true } -hex = "0.4.3" -hex-literal = "0.4.1" +hex = { workspace = true } +hex-literal = { workspace = true } itertools = "0.13.0" -url = "2.5.0" +url = { workspace = true } __compat_primitive_types = { version = "0.12.2", package = "primitive-types" } -tower = { version = "0.4" , features = ["retry"] } +tower = { workspace = true, features = ["retry"] } # Local dependencies common = { path = "../common" } From 1bafd90645e2db18618b9afeda70d1fe090db5cd Mon Sep 17 00:00:00 2001 From: BGluth Date: Mon, 17 Jun 2024 15:10:47 -0600 Subject: [PATCH 174/184] A few more dep changes to move to `workspace` deps - Switched all internal deps to use workspace deps where possible. - Also needed to move `zero_bin/common` --> `zero_bin/zero_bin_common` because having a dep name of just "common" wasn't really clear that this dep was just for `zero-bin`. --- Cargo.toml | 7 +++++++ evm_arithmetization/Cargo.toml | 2 +- zero_bin/common/Cargo.toml | 2 +- zero_bin/leader/Cargo.toml | 8 ++++---- zero_bin/leader/src/cli.rs | 2 +- zero_bin/leader/src/client.rs | 4 ++-- zero_bin/leader/src/main.rs | 2 +- zero_bin/ops/Cargo.toml | 2 +- zero_bin/ops/src/lib.rs | 6 +++--- zero_bin/prover/Cargo.toml | 4 ++-- zero_bin/prover/src/lib.rs | 2 +- zero_bin/rpc/Cargo.toml | 6 +++--- zero_bin/rpc/src/lib.rs | 2 +- zero_bin/rpc/src/main.rs | 2 +- zero_bin/verifier/Cargo.toml | 2 +- zero_bin/verifier/src/cli.rs | 2 +- zero_bin/worker/Cargo.toml | 4 ++-- zero_bin/worker/src/main.rs | 2 +- 18 files changed, 34 insertions(+), 27 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d8f16ff97..346af7153 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,7 @@ impl-codec = "0.6.0" impl-num-traits = "0.1.2" impl-rlp = "0.3.0" impl-serde = "0.4.0" +itertools = "0.13.0" keccak-hash = "0.10.0" log = "0.4.20" mpt_trie = { path = "mpt_trie", version = "0.3.0" } @@ -86,6 +87,12 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } uint = "0.9.5" url = "2.5.0" +# zero-bin releated deps +ops = { path = "zero_bin/ops" } +prover = { path = "zero_bin/prover" } +rpc = { path = "zero_bin/rpc" } +zero_bin_common = { path = "zero_bin/common" } + # plonky2-related dependencies plonky2 = "0.2.2" plonky2_maybe_rayon = "0.2.0" diff --git a/evm_arithmetization/Cargo.toml b/evm_arithmetization/Cargo.toml index c72865593..86e2962d0 100644 --- a/evm_arithmetization/Cargo.toml +++ b/evm_arithmetization/Cargo.toml @@ -18,7 +18,7 @@ env_logger = { workspace = true } ethereum-types = { workspace = true } hex = { workspace = true, optional = true } hex-literal = { workspace = true } -itertools = "0.11.0" +itertools = { workspace = true } keccak-hash = { workspace = true } log = { workspace = true } plonky2_maybe_rayon = { workspace = true } diff --git a/zero_bin/common/Cargo.toml b/zero_bin/common/Cargo.toml index 6113a8bf7..9ee2ac5fe 100644 --- a/zero_bin/common/Cargo.toml +++ b/zero_bin/common/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "common" +name = "zero_bin_common" authors = ["Polygon Zero "] version = "0.1.0" edition.workspace = true diff --git a/zero_bin/leader/Cargo.toml b/zero_bin/leader/Cargo.toml index 64853d9b7..10a3e20f5 100644 --- a/zero_bin/leader/Cargo.toml +++ b/zero_bin/leader/Cargo.toml @@ -26,10 +26,10 @@ axum = { workspace = true } toml = { workspace = true } # Local dependencies -ops = { path = "../ops" } -prover = { path = "../prover" } -rpc = { path = "../rpc" } -common = { path = "../common" } +ops = { workspace = true } +prover = { workspace = true } +rpc = { workspace = true } +zero_bin_common ={ workspace = true } [features] default = [] diff --git a/zero_bin/leader/src/cli.rs b/zero_bin/leader/src/cli.rs index 48b2e537f..2450e7341 100644 --- a/zero_bin/leader/src/cli.rs +++ b/zero_bin/leader/src/cli.rs @@ -2,7 +2,7 @@ use std::path::PathBuf; use alloy::transports::http::reqwest::Url; use clap::{Parser, Subcommand, ValueHint}; -use common::prover_state::cli::CliProverStateConfig; +use zero_bin_common::prover_state::cli::CliProverStateConfig; /// zero-bin leader config #[derive(Parser)] diff --git a/zero_bin/leader/src/client.rs b/zero_bin/leader/src/client.rs index 5dd3fba32..c6dc44847 100644 --- a/zero_bin/leader/src/client.rs +++ b/zero_bin/leader/src/client.rs @@ -3,8 +3,8 @@ use std::path::PathBuf; use alloy::transports::http::reqwest::Url; use anyhow::Result; -use common::block_interval::BlockInterval; -use common::fs::generate_block_proof_file_name; +use zero_bin_common::block_interval::BlockInterval; +use zero_bin_common::fs::generate_block_proof_file_name; use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; use rpc::{retry::build_http_retry_provider, RpcType}; diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index f99841048..8a8edf750 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -5,7 +5,7 @@ use anyhow::Result; use clap::Parser; use cli::Command; use client::RpcParams; -use common::block_interval::BlockInterval; +use zero_bin_common::block_interval::BlockInterval; use dotenvy::dotenv; use ops::register; use paladin::runtime::Runtime; diff --git a/zero_bin/ops/Cargo.toml b/zero_bin/ops/Cargo.toml index 9418db15a..e1b5dc9e1 100644 --- a/zero_bin/ops/Cargo.toml +++ b/zero_bin/ops/Cargo.toml @@ -16,7 +16,7 @@ proof_gen = { workspace = true } tracing = { workspace = true } keccak-hash = { workspace = true } -common = { path = "../common" } +zero_bin_common ={ path = "../common" } [features] default = [] diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index 5b6caf69e..be7d309eb 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,6 +1,6 @@ use std::time::Instant; -use common::{debug_utils::save_inputs_to_disk, prover_state::p_state}; +use zero_bin_common::{debug_utils::save_inputs_to_disk, prover_state::p_state}; use evm_arithmetization::{proof::PublicValues, GenerationInputs}; use keccak_hash::keccak; use paladin::{ @@ -29,7 +29,7 @@ impl Operation for TxProof { fn execute(&self, input: Self::Input) -> Result { let _span = TxProofSpan::new(&input); let proof = if self.save_inputs_on_error { - common::prover_state::p_manager() + zero_bin_common::prover_state::p_manager() .generate_txn_proof(input.clone()) .map_err(|err| { if let Err(write_err) = save_inputs_to_disk( @@ -45,7 +45,7 @@ impl Operation for TxProof { FatalError::from_anyhow(err, FatalStrategy::Terminate) })? } else { - common::prover_state::p_manager() + zero_bin_common::prover_state::p_manager() .generate_txn_proof(input) .map_err(|err| FatalError::from_anyhow(err, FatalStrategy::Terminate))? }; diff --git a/zero_bin/prover/Cargo.toml b/zero_bin/prover/Cargo.toml index 8c035dcdb..f57b2a3d3 100644 --- a/zero_bin/prover/Cargo.toml +++ b/zero_bin/prover/Cargo.toml @@ -20,8 +20,8 @@ alloy.workspace = true tokio = {workspace = true} serde_json = {workspace = true} ruint = { workspace = true, features = ["num-traits", "primitive-types"] } -ops = { path = "../ops" } -common = { path = "../common" } +ops = { workspace = true } +zero_bin_common ={ workspace = true } num-traits = { workspace = true } [features] diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index 7666d3e38..c3eef0983 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use alloy::primitives::{BlockNumber, U256}; use anyhow::{Context, Result}; -use common::fs::generate_block_proof_file_name; +use zero_bin_common::fs::generate_block_proof_file_name; use futures::{future::BoxFuture, stream::FuturesOrdered, FutureExt, TryFutureExt, TryStreamExt}; use num_traits::ToPrimitive as _; use ops::TxProof; diff --git a/zero_bin/rpc/Cargo.toml b/zero_bin/rpc/Cargo.toml index e61e335de..9551348b8 100644 --- a/zero_bin/rpc/Cargo.toml +++ b/zero_bin/rpc/Cargo.toml @@ -24,12 +24,12 @@ alloy.workspace = true futures = { workspace = true } hex = { workspace = true } hex-literal = { workspace = true } -itertools = "0.13.0" +itertools = { workspace = true } url = { workspace = true } __compat_primitive_types = { version = "0.12.2", package = "primitive-types" } tower = { workspace = true, features = ["retry"] } # Local dependencies -common = { path = "../common" } -prover = { path = "../prover" } +zero_bin_common ={ workspace = true } +prover = { workspace = true } diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 22ac0ec6b..759e66d3d 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -6,7 +6,7 @@ use alloy::{ }; use anyhow::Context as _; use clap::ValueEnum; -use common::block_interval::BlockInterval; +use zero_bin_common::block_interval::BlockInterval; use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; use futures::{StreamExt as _, TryStreamExt as _}; use prover::ProverInput; diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs index ccab182a2..130caffe6 100644 --- a/zero_bin/rpc/src/main.rs +++ b/zero_bin/rpc/src/main.rs @@ -2,7 +2,7 @@ use std::io; use alloy::rpc::types::eth::BlockId; use clap::{Parser, ValueHint}; -use common::block_interval::BlockInterval; +use zero_bin_common::block_interval::BlockInterval; use rpc::{retry::build_http_retry_provider, RpcType}; use tracing_subscriber::{prelude::*, EnvFilter}; use url::Url; diff --git a/zero_bin/verifier/Cargo.toml b/zero_bin/verifier/Cargo.toml index 243c18691..cbfb0123c 100644 --- a/zero_bin/verifier/Cargo.toml +++ b/zero_bin/verifier/Cargo.toml @@ -16,4 +16,4 @@ serde_path_to_error = { workspace = true } proof_gen = { workspace = true } # Local dependencies -common = { path = "../common" } +zero_bin_common ={ path = "../common" } diff --git a/zero_bin/verifier/src/cli.rs b/zero_bin/verifier/src/cli.rs index 62d9a2feb..76306ec41 100644 --- a/zero_bin/verifier/src/cli.rs +++ b/zero_bin/verifier/src/cli.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use clap::{Parser, ValueHint}; -use common::prover_state::cli::CliProverStateConfig; +use zero_bin_common::prover_state::cli::CliProverStateConfig; #[derive(Parser)] pub(crate) struct Cli { diff --git a/zero_bin/worker/Cargo.toml b/zero_bin/worker/Cargo.toml index 41fd0596a..080c280ec 100644 --- a/zero_bin/worker/Cargo.toml +++ b/zero_bin/worker/Cargo.toml @@ -18,5 +18,5 @@ clap = { workspace = true } tokio = { workspace = true } # Local dependencies -ops = { path = "../ops" } -common = { path = "../common" } +ops ={ workspace = true } +zero_bin_common ={ workspace = true } diff --git a/zero_bin/worker/src/main.rs b/zero_bin/worker/src/main.rs index d24ee23ad..429e60886 100644 --- a/zero_bin/worker/src/main.rs +++ b/zero_bin/worker/src/main.rs @@ -1,6 +1,6 @@ use anyhow::Result; use clap::Parser; -use common::prover_state::cli::CliProverStateConfig; +use zero_bin_common::prover_state::cli::CliProverStateConfig; use dotenvy::dotenv; use ops::register; use paladin::runtime::WorkerRuntime; From 0fb571db9f9616930515aed9a36c827c56d079f1 Mon Sep 17 00:00:00 2001 From: BGluth Date: Tue, 18 Jun 2024 01:10:26 -0600 Subject: [PATCH 175/184] Requested PR changes for #279 - Also a `clippy` pass. --- zero_bin/.env => .env | 0 .github/workflows/ci.yml | 64 ++++++++++ .gitignore | 4 + Cargo.toml | 4 +- zero_bin/.github/CODEOWNERS | 1 - zero_bin/.github/workflows/ci.yml | 105 ---------------- zero_bin/.gitignore | 13 -- zero_bin/LICENSE-APACHE | 201 ------------------------------ zero_bin/LICENSE-MIT | 21 ---- zero_bin/leader/src/client.rs | 4 +- zero_bin/leader/src/main.rs | 2 +- zero_bin/ops/src/lib.rs | 2 +- zero_bin/prover/src/lib.rs | 2 +- zero_bin/rpc/src/lib.rs | 2 +- zero_bin/rpc/src/main.rs | 2 +- zero_bin/rust-toolchain.toml | 2 - zero_bin/rustfmt.toml | 3 - zero_bin/worker/src/main.rs | 2 +- 18 files changed, 78 insertions(+), 356 deletions(-) rename zero_bin/.env => .env (100%) delete mode 100644 zero_bin/.github/CODEOWNERS delete mode 100644 zero_bin/.github/workflows/ci.yml delete mode 100644 zero_bin/LICENSE-APACHE delete mode 100644 zero_bin/LICENSE-MIT delete mode 100644 zero_bin/rust-toolchain.toml delete mode 100644 zero_bin/rustfmt.toml diff --git a/zero_bin/.env b/.env similarity index 100% rename from zero_bin/.env rename to .env diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b5e77e9b..8ac236c5f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,6 +118,70 @@ jobs: CARGO_INCREMENTAL: 1 RUST_BACKTRACE: 1 + test_zero_bin: + name: Test zero_bin + runs-on: ubuntu-latest + timeout-minutes: 30 + if: "! contains(toJSON(github.event.commits.*.message), '[skip-ci]')" + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Install nightly toolchain + uses: dtolnay/rust-toolchain@nightly + + - name: Set up rust cache + uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + + - name: Test in zero_bin subdirectory + run: cargo test --manifest-path zero_bin/Cargo.toml + env: + RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 + RUST_LOG: 1 + CARGO_INCREMENTAL: 1 + RUST_BACKTRACE: 1 + + simple_proof_regular: + name: Execute bash script to generate and verify a proof for a small block. + runs-on: zero-ci + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Run the script + run: | + pushd zero_bin/tools + ./prove_stdio.sh artifacts/witness_b19240705.json + + simple_proof_witness_only: + name: Execute bash script to generate the proof witness for a small block. + runs-on: zero-ci + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Run the script + run: | + pushd zero_bin/tools + ./prove_stdio.sh artifacts/witness_b19240705.json test_only + + multi_blocks_proof_regular: + name: Execute bash script to generate and verify a proof for multiple blocks using parallel proving. + runs-on: zero-ci + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Run the script + run: | + pushd zero_bin/tools + ./prove_stdio.sh artifacts/witness_b2_b7.json + lints: name: Rustdoc, Formatting and Clippy runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 9e58bc287..98c0a1736 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,7 @@ Cargo.lock *.iml .idea/ .vscode + +# Serialized generated prover & verifier state used by plonky2 +prover_state_* +verifier_state_* diff --git a/Cargo.toml b/Cargo.toml index 346af7153..776fed6b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,7 @@ enumn = "0.1.12" env_logger = "0.10.0" ethereum-types = "0.14.1" eth_trie = "0.4.0" -evm_arithmetization = { path = "evm_arithmetization" } +evm_arithmetization = { path = "evm_arithmetization", version = "0.2.0" } futures = "0.3.29" hashbrown = "0.14.0" hex = "0.4.3" @@ -81,7 +81,7 @@ tiny-keccak = "2.0.2" tokio = { version = "1.33.0", features = ["full"] } toml = "0.8.12" tower = "0.4" -trace_decoder = { path = "trace_decoder" } +trace_decoder = { path = "trace_decoder", version = "0.4.0" } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } uint = "0.9.5" diff --git a/zero_bin/.github/CODEOWNERS b/zero_bin/.github/CODEOWNERS deleted file mode 100644 index 20e2b14b8..000000000 --- a/zero_bin/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @cpubot @muursh @Nashtare diff --git a/zero_bin/.github/workflows/ci.yml b/zero_bin/.github/workflows/ci.yml deleted file mode 100644 index 1b20aefdd..000000000 --- a/zero_bin/.github/workflows/ci.yml +++ /dev/null @@ -1,105 +0,0 @@ -name: Continuous Integration - -on: - push: - branches: - - main - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - branches: - - "**" - workflow_dispatch: - branches: - - "**" - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - CARGO_TERM_COLOR: always - -jobs: - test: - name: Run tests - runs-on: ubuntu-latest - timeout-minutes: 30 - if: "! contains(toJSON(github.event.commits.*.message), '[skip-ci]')" - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Install nightly toolchain - uses: dtolnay/rust-toolchain@nightly - - - name: Set up rust cache - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - - name: Test - run: cargo test - - lints: - name: Formatting and Clippy - runs-on: ubuntu-latest - timeout-minutes: 10 - if: "! contains(toJSON(github.event.commits.*.message), '[skip-ci]')" - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Install nightly toolchain - uses: dtolnay/rust-toolchain@nightly - with: - components: rustfmt, clippy - - - name: Set up rust cache - uses: Swatinem/rust-cache@v2 - with: - cache-on-failure: true - - - name: Run cargo fmt - run: cargo fmt --all --check - - - name: Run cargo clippy - run: cargo clippy --all-targets -- -D warnings - - simple_proof_regular: - name: Execute bash script to generate and verify a proof for a small block. - runs-on: zero-ci - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Run the script - run: | - pushd tools - ./prove_stdio.sh artifacts/witness_b19240705.json - - simple_proof_witness_only: - name: Execute bash script to generate the proof witness for a small block. - runs-on: zero-ci - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Run the script - run: | - pushd tools - ./prove_stdio.sh artifacts/witness_b19240705.json test_only - - multi_blocks_proof_regular: - name: Execute bash script to generate and verify a proof for multiple blocks using parallel proving. - runs-on: zero-ci - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Run the script - run: | - pushd tools - ./prove_stdio.sh artifacts/witness_b2_b7.json \ No newline at end of file diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index 7fd20496c..2b66810f8 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -1,5 +1,3 @@ -/target - # Default extension for generated block proofs *.zkproof @@ -9,14 +7,3 @@ circuits/ # Folders containing logs from the utility scripts in tools/ debug/ proofs/ - -# Serialized generated prover & verifier state used by plonky2 -prover_state_* -verifier_state_* - - -# Ignore IntelliJ IDEA/RustRover/Clion metadata -.idea/ - -# System files -.DS_Store diff --git a/zero_bin/LICENSE-APACHE b/zero_bin/LICENSE-APACHE deleted file mode 100644 index 85d8ae519..000000000 --- a/zero_bin/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright 2023 Polygon Zero - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file diff --git a/zero_bin/LICENSE-MIT b/zero_bin/LICENSE-MIT deleted file mode 100644 index f6c940ef3..000000000 --- a/zero_bin/LICENSE-MIT +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2023 PT Services DMCC - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/zero_bin/leader/src/client.rs b/zero_bin/leader/src/client.rs index c6dc44847..863da9870 100644 --- a/zero_bin/leader/src/client.rs +++ b/zero_bin/leader/src/client.rs @@ -3,12 +3,12 @@ use std::path::PathBuf; use alloy::transports::http::reqwest::Url; use anyhow::Result; -use zero_bin_common::block_interval::BlockInterval; -use zero_bin_common::fs::generate_block_proof_file_name; use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; use rpc::{retry::build_http_retry_provider, RpcType}; use tracing::{error, info, warn}; +use zero_bin_common::block_interval::BlockInterval; +use zero_bin_common::fs::generate_block_proof_file_name; #[derive(Debug)] pub struct RpcParams { diff --git a/zero_bin/leader/src/main.rs b/zero_bin/leader/src/main.rs index 8a8edf750..1855c762d 100644 --- a/zero_bin/leader/src/main.rs +++ b/zero_bin/leader/src/main.rs @@ -5,12 +5,12 @@ use anyhow::Result; use clap::Parser; use cli::Command; use client::RpcParams; -use zero_bin_common::block_interval::BlockInterval; use dotenvy::dotenv; use ops::register; use paladin::runtime::Runtime; use proof_gen::proof_types::GeneratedBlockProof; use tracing::info; +use zero_bin_common::block_interval::BlockInterval; use crate::client::{client_main, ProofParams}; use crate::utils::get_package_version; diff --git a/zero_bin/ops/src/lib.rs b/zero_bin/ops/src/lib.rs index be7d309eb..eca3f8013 100644 --- a/zero_bin/ops/src/lib.rs +++ b/zero_bin/ops/src/lib.rs @@ -1,6 +1,5 @@ use std::time::Instant; -use zero_bin_common::{debug_utils::save_inputs_to_disk, prover_state::p_state}; use evm_arithmetization::{proof::PublicValues, GenerationInputs}; use keccak_hash::keccak; use paladin::{ @@ -13,6 +12,7 @@ use proof_gen::{ }; use serde::{Deserialize, Serialize}; use tracing::{error, event, info_span, Level}; +use zero_bin_common::{debug_utils::save_inputs_to_disk, prover_state::p_state}; registry!(); diff --git a/zero_bin/prover/src/lib.rs b/zero_bin/prover/src/lib.rs index c3eef0983..da787ede2 100644 --- a/zero_bin/prover/src/lib.rs +++ b/zero_bin/prover/src/lib.rs @@ -3,7 +3,6 @@ use std::path::PathBuf; use alloy::primitives::{BlockNumber, U256}; use anyhow::{Context, Result}; -use zero_bin_common::fs::generate_block_proof_file_name; use futures::{future::BoxFuture, stream::FuturesOrdered, FutureExt, TryFutureExt, TryStreamExt}; use num_traits::ToPrimitive as _; use ops::TxProof; @@ -21,6 +20,7 @@ use trace_decoder::{ types::{CodeHash, OtherBlockData}, }; use tracing::info; +use zero_bin_common::fs::generate_block_proof_file_name; #[derive(Debug, Deserialize, Serialize)] pub struct BlockProverInput { diff --git a/zero_bin/rpc/src/lib.rs b/zero_bin/rpc/src/lib.rs index 759e66d3d..750908c54 100644 --- a/zero_bin/rpc/src/lib.rs +++ b/zero_bin/rpc/src/lib.rs @@ -6,11 +6,11 @@ use alloy::{ }; use anyhow::Context as _; use clap::ValueEnum; -use zero_bin_common::block_interval::BlockInterval; use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; use futures::{StreamExt as _, TryStreamExt as _}; use prover::ProverInput; use trace_decoder::types::{BlockLevelData, OtherBlockData}; +use zero_bin_common::block_interval::BlockInterval; mod compat; pub mod jerigon; diff --git a/zero_bin/rpc/src/main.rs b/zero_bin/rpc/src/main.rs index 130caffe6..8e26498a6 100644 --- a/zero_bin/rpc/src/main.rs +++ b/zero_bin/rpc/src/main.rs @@ -2,10 +2,10 @@ use std::io; use alloy::rpc::types::eth::BlockId; use clap::{Parser, ValueHint}; -use zero_bin_common::block_interval::BlockInterval; use rpc::{retry::build_http_retry_provider, RpcType}; use tracing_subscriber::{prelude::*, EnvFilter}; use url::Url; +use zero_bin_common::block_interval::BlockInterval; #[derive(Parser)] pub enum Cli { diff --git a/zero_bin/rust-toolchain.toml b/zero_bin/rust-toolchain.toml deleted file mode 100644 index 5d56faf9a..000000000 --- a/zero_bin/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "nightly" diff --git a/zero_bin/rustfmt.toml b/zero_bin/rustfmt.toml deleted file mode 100644 index bccbdb6fc..000000000 --- a/zero_bin/rustfmt.toml +++ /dev/null @@ -1,3 +0,0 @@ -unstable_features = true -group_imports = "StdExternalCrate" -wrap_comments = true diff --git a/zero_bin/worker/src/main.rs b/zero_bin/worker/src/main.rs index 429e60886..c2d571f59 100644 --- a/zero_bin/worker/src/main.rs +++ b/zero_bin/worker/src/main.rs @@ -1,9 +1,9 @@ use anyhow::Result; use clap::Parser; -use zero_bin_common::prover_state::cli::CliProverStateConfig; use dotenvy::dotenv; use ops::register; use paladin::runtime::WorkerRuntime; +use zero_bin_common::prover_state::cli::CliProverStateConfig; mod init; From a9eff886020b73cdd9257ba2f27f6a1ce407d1b4 Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Tue, 18 Jun 2024 11:29:20 +0200 Subject: [PATCH 176/184] fix: formatting --- Cargo.toml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 776fed6b1..3d16964db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,15 @@ [workspace] -members = ["mpt_trie", "proof_gen", "trace_decoder", "evm_arithmetization", "zero_bin/leader", "zero_bin/worker", "zero_bin/common", "zero_bin/ops", "zero_bin/verifier", "zero_bin/rpc", "zero_bin/prover"] +members = ["mpt_trie", + "proof_gen", + "trace_decoder", + "evm_arithmetization", + "zero_bin/leader", + "zero_bin/worker", + "zero_bin/common", + "zero_bin/ops", + "zero_bin/verifier", + "zero_bin/rpc", + "zero_bin/prover"] resolver = "2" [workspace.package] From a38af27a79b177f835b6865c2ac4d23e0addcce2 Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Tue, 18 Jun 2024 11:36:56 +0200 Subject: [PATCH 177/184] fix: ci tests --- .github/workflows/ci.yml | 11 ++++++++++- zero_bin/tools/prove_stdio.sh | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ac236c5f..592006aa7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -136,7 +136,16 @@ jobs: cache-on-failure: true - name: Test in zero_bin subdirectory - run: cargo test --manifest-path zero_bin/Cargo.toml + run: | + cargo test --manifest-path zero_bin/common/Cargo.toml + cargo test --manifest-path zero_bin/leader/Cargo.toml + cargo test --manifest-path zero_bin/ops/Cargo.toml + cargo test --manifest-path zero_bin/prover/Cargo.toml + cargo test --manifest-path zero_bin/rpc/Cargo.toml + cargo test --manifest-path zero_bin/tools/Cargo.toml + cargo test --manifest-path zero_bin/verifier/Cargo.toml + cargo test --manifest-path zero_bin/worker/Cargo.toml + env: RUSTFLAGS: -Copt-level=3 -Cdebug-assertions -Coverflow-checks=y -Cdebuginfo=0 RUST_LOG: 1 diff --git a/zero_bin/tools/prove_stdio.sh b/zero_bin/tools/prove_stdio.sh index b99df289b..1f93adbcf 100755 --- a/zero_bin/tools/prove_stdio.sh +++ b/zero_bin/tools/prove_stdio.sh @@ -80,12 +80,12 @@ fi cargo build --release --jobs "$num_procs" start_time=$(date +%s%N) -../target/release/leader --runtime in-memory --load-strategy on-demand stdio < $INPUT_FILE | tee leader.out +../../target/release/leader --runtime in-memory --load-strategy on-demand stdio < $INPUT_FILE | tee leader.out end_time=$(date +%s%N) tail -n 1 leader.out > proofs.json -../target/release/verifier -f proofs.json | tee verify.out +../../target/release/verifier -f proofs.json | tee verify.out if grep -q 'All proofs verified successfully!' verify.out; then duration_ns=$((end_time - start_time)) From 8de4e4f31989d95a39cc7a996175c9b8b7a44343 Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Tue, 18 Jun 2024 11:51:13 +0200 Subject: [PATCH 178/184] fix: ci tests 2 --- .github/workflows/ci.yml | 1 - zero_bin/common/src/block_interval.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 592006aa7..628d15ad7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -142,7 +142,6 @@ jobs: cargo test --manifest-path zero_bin/ops/Cargo.toml cargo test --manifest-path zero_bin/prover/Cargo.toml cargo test --manifest-path zero_bin/rpc/Cargo.toml - cargo test --manifest-path zero_bin/tools/Cargo.toml cargo test --manifest-path zero_bin/verifier/Cargo.toml cargo test --manifest-path zero_bin/worker/Cargo.toml diff --git a/zero_bin/common/src/block_interval.rs b/zero_bin/common/src/block_interval.rs index 5d0e3c1e5..dfb307c93 100644 --- a/zero_bin/common/src/block_interval.rs +++ b/zero_bin/common/src/block_interval.rs @@ -40,7 +40,7 @@ impl BlockInterval { /// /// ```rust /// # use alloy::rpc::types::eth::BlockId; - /// # use common::block_interval::BlockInterval; + /// # use zero_bin_common::block_interval::BlockInterval; /// assert_eq!(BlockInterval::new("0..10").unwrap(), BlockInterval::Range(0..10)); /// assert_eq!(BlockInterval::new("0..=10").unwrap(), BlockInterval::Range(0..11)); /// assert_eq!(BlockInterval::new("32141").unwrap(), BlockInterval::SingleBlockId(BlockId::Number(32141.into()))); From 5c0c165762d09a8cf188a82736a67fd3c075a78c Mon Sep 17 00:00:00 2001 From: Marko Atanasievski Date: Tue, 18 Jun 2024 14:34:26 +0200 Subject: [PATCH 179/184] fix: .gitignore --- .gitignore | 3 --- zero_bin/.gitignore | 6 ++++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 98c0a1736..64bab6c5e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,3 @@ Cargo.lock .idea/ .vscode -# Serialized generated prover & verifier state used by plonky2 -prover_state_* -verifier_state_* diff --git a/zero_bin/.gitignore b/zero_bin/.gitignore index 2b66810f8..ab214fd70 100644 --- a/zero_bin/.gitignore +++ b/zero_bin/.gitignore @@ -7,3 +7,9 @@ circuits/ # Folders containing logs from the utility scripts in tools/ debug/ proofs/ + +# Files generated from the tools script tests +test.out +proofs.json +verify.out +leader.out From 01cbe6c264cefab0b31c19297920931179fc3912 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:37:44 -0400 Subject: [PATCH 180/184] fix: Bring back Cargo.lock (#280) * fix: Bring back Cargo.lock * fix: Typo --- .gitignore | 1 - Cargo.lock | 5881 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 +- 3 files changed, 5882 insertions(+), 2 deletions(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index 64bab6c5e..3d1dc8c49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -Cargo.lock /**/target /target **/*.rs.bk diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 000000000..8fe4835ac --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5881 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "const-random", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "alloy" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-json-rpc", + "alloy-provider", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-transport", + "alloy-transport-http", + "reqwest", +] + +[[package]] +name = "alloy-chains" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd47e5f8545bdf53beb545d3c039b4afa16040bdf69c50100581579b08776afd" +dependencies = [ + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "serde", +] + +[[package]] +name = "alloy-core" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5af3faff14c12c8b11037e0a093dd157c3702becb8435577a2408534d0758315" +dependencies = [ + "alloy-primitives", + "alloy-rlp", +] + +[[package]] +name = "alloy-eips" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "thiserror", +] + +[[package]] +name = "alloy-primitives" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f783611babedbbe90db3478c120fb5f5daacceffc210b39adc0af4fe0da70bad" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b155716bab55763c95ba212806cf43d05bcc70e5f35b02bad20cf5ec7fe11fed" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8037e03c7f462a063f28daec9fda285a9a89da003c552f8637a80b9c8fd96241" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.13.0", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "alloy-rpc-types-trace" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bad41a7c19498e3f6079f7744656328699f8ea3e783bdd10d85788cd439f572" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd9899da7d011b4fe4c406a524ed3e3f963797dbc93b45479d60341d3a27b252" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.2.6", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.66", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32d595768fdc61331a132b6f65db41afae41b9b97d36c21eb1b955c422a7e60" +dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.66", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-types" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a49042c6d3b66a9fe6b2b5a8bf0d39fc2ae1ee0310a2a26ffedd79fb097878dd" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", +] + +[[package]] +name = "alloy-transport" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-json-rpc", + "base64", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "url", +] + +[[package]] +name = "alloy-transport-http" +version = "0.1.1" +source = "git+https://github.com/alloy-rs/alloy?tag=v0.1.1#f04a704ac5be9cb21b4b1f6c35f925607f1aa939" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "amq-protocol" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051d4d77904272e9be7e292607378dc9900d15b8d314bfd3ed4b82fdd84f125" +dependencies = [ + "amq-protocol-tcp", + "amq-protocol-types", + "amq-protocol-uri", + "cookie-factory", + "nom", + "serde", +] + +[[package]] +name = "amq-protocol-tcp" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3d51dd36e67d757c9ba80a7b2a2a2a69254c1dbe4d8c631824ec7f5b69f60e" +dependencies = [ + "amq-protocol-uri", + "tcp-stream", + "tracing", +] + +[[package]] +name = "amq-protocol-types" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0acdd47054ced8b9bc89ee0dbb42ccc8028de48d8658b24de4c255a226c9bfec" +dependencies = [ + "cookie-factory", + "nom", + "serde", + "serde_json", +] + +[[package]] +name = "amq-protocol-uri" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17881b7575dab3e71403f28a3e50b71f0d1bd026829abca3c48664522ce0df0" +dependencies = [ + "amq-protocol-types", + "percent-encoding", + "url", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstream" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" + +[[package]] +name = "anstyle-parse" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +dependencies = [ + "backtrace", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.0", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +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 = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "asn1-rs" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.1.0", + "futures-lite 2.3.0", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel", + "async-executor", + "async-io 2.3.3", + "async-lock 3.4.0", + "blocking", + "futures-lite 2.3.0", + "once_cell", +] + +[[package]] +name = "async-global-executor-trait" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33dd14c5a15affd2abcff50d84efd4009ada28a860f01c14f9d654f3e81b3f75" +dependencies = [ + "async-global-executor", + "async-trait", + "executor-trait", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.7.2", + "rustix 0.38.34", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-reactor-trait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6012d170ad00de56c9ee354aef2e358359deb1ec504254e0e5a3774771de0e" +dependencies = [ + "async-io 1.13.0", + "async-trait", + "futures-core", + "reactor-trait", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "aws-lc-rs" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7d844e282b4b56750b2d4e893b2205581ded8709fddd2b6aa5418c150ca877" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a2c29203f6bf296d01141cc8bb9dbd5ecd4c27843f2ee0767bcd5985a927da" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] + +[[package]] +name = "axum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 0.1.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "futures-core", + "getrandom", + "instant", + "pin-project-lite", + "rand", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +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.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.5.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.66", + "which", +] + +[[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.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[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 = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite 2.3.0", + "piper", +] + +[[package]] +name = "blst" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf100c4cea8f207e883ff91ca886d621d8a166cb04971dfaa9bb8fd99ed95df" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "serde", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[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.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.5", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[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 = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "clap_lex" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + +[[package]] +name = "cms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b77c319abfd5219629c45c34c89ba945ed3c5e49fcde9d16b6c3885f118a730" +dependencies = [ + "const-oid", + "der", + "spki", + "x509-cert", +] + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "colorchoice" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-hex" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie-factory" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + +[[package]] +name = "critical-section" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-skiplist" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "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", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.66", +] + +[[package]] +name = "darling_macro" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "der_derive", + "flagset", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.0", + "syn 2.0.66", +] + +[[package]] +name = "des" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" +dependencies = [ + "cipher", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "enumn" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eth_trie" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3aeb0284b473041df2419a28e3cdf0c64a78d2b9511af4b6e40bad3964b172" +dependencies = [ + "ethereum-types", + "hashbrown 0.14.5", + "keccak-hash 0.10.0", + "log", + "parking_lot", + "rlp", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash 0.8.0", + "impl-rlp", + "impl-serde", + "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 0.8.0", + "impl-rlp", + "impl-serde", + "primitive-types 0.12.2", + "uint", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + +[[package]] +name = "evm_arithmetization" +version = "0.2.0" +dependencies = [ + "anyhow", + "bytes", + "criterion", + "env_logger", + "ethereum-types", + "hashbrown 0.14.5", + "hex", + "hex-literal", + "itertools 0.13.0", + "jemallocator", + "keccak-hash 0.10.0", + "log", + "mpt_trie", + "num", + "num-bigint", + "once_cell", + "pest", + "pest_derive", + "plonky2", + "plonky2_maybe_rayon", + "plonky2_util", + "rand", + "rand_chacha", + "ripemd", + "rlp", + "rlp-derive", + "serde", + "serde_json", + "sha2", + "starky", + "static_assertions", + "tiny-keccak", +] + +[[package]] +name = "executor-trait" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a1052dd43212a7777ec6a69b117da52f5e52f07aec47d00c1a2b33b85d06b08" +dependencies = [ + "async-trait", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[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 = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "static_assertions", +] + +[[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 = "flagset" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb3aa5e95cf9aabc17f060cfa0ced7b83f042390760ca53bf09df9968acaa1" + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.1.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[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 = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "rayon", + "serde", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version 0.4.0", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[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.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[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 = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f8ac670d7422d7f76b32e17a5db556510825b29ec9154f235977c9caba61036" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed" +dependencies = [ + "icu_normalizer", + "icu_properties", + "smallvec", + "utf8_iter", +] + +[[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-num-traits" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" +dependencies = [ + "integer-sqrt", + "num-traits", + "uint", +] + +[[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 = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jemalloc-sys" +version = "0.5.4+5.3.0-patched" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "jemallocator" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc" +dependencies = [ + "jemalloc-sys", + "libc", +] + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + +[[package]] +name = "keccak-asm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "keccak-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2bd4c29270e724d3eaadf7bdc8700af4221fc0ed771b855eadcd1b98d52851" +dependencies = [ + "primitive-types 0.10.1", + "tiny-keccak", +] + +[[package]] +name = "keccak-hash" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b286e6b663fb926e1eeb68528e69cb70ed46c6d65871a21b2215ae8154c6d3c" +dependencies = [ + "primitive-types 0.12.2", + "tiny-keccak", +] + +[[package]] +name = "lapin" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fae02c316a8a5922ce7518afa6b6c00e9a099f8e59587567e3331efdd11b8ceb" +dependencies = [ + "amq-protocol", + "async-global-executor-trait", + "async-reactor-trait", + "async-trait", + "executor-trait", + "flume", + "futures-core", + "futures-io", + "parking_lot", + "pinky-swear", + "reactor-trait", + "serde", + "tracing", + "waker-fn", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "leader" +version = "0.1.0" +dependencies = [ + "alloy", + "anyhow", + "axum", + "clap", + "dotenvy", + "futures", + "ops", + "paladin-core", + "proof_gen", + "prover", + "rpc", + "serde", + "serde_json", + "serde_path_to_error", + "tokio", + "toml", + "tracing", + "tracing-subscriber", + "zero_bin_common", +] + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "linkme" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb76662d78edc9f9bf56360d6919bdacc8b7761227727e5082f128eeb90bbf5" +dependencies = [ + "linkme-impl", +] + +[[package]] +name = "linkme-impl" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dccda732e04fa3baf2e17cf835bfe2601c7c2edafd64417c627dabae3a8cda" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", + "serde", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + +[[package]] +name = "mpt_trie" +version = "0.3.0" +dependencies = [ + "bytes", + "enum-as-inner", + "eth_trie", + "ethereum-types", + "hex", + "impl-codec", + "impl-num-traits", + "impl-rlp", + "impl-serde", + "keccak-hash 0.10.0", + "log", + "num", + "num-traits", + "parking_lot", + "pretty_env_logger", + "rand", + "rlp", + "rlp-derive", + "serde", + "serde_json", + "thiserror", + "uint", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +dependencies = [ + "num-integer", + "num-traits", + "rand", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", + "rand", +] + +[[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.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +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.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "object" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.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.66", +] + +[[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.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ops" +version = "0.1.0" +dependencies = [ + "evm_arithmetization", + "keccak-hash 0.10.0", + "paladin-core", + "proof_gen", + "serde", + "tracing", + "zero_bin_common", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p12-keystore" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df7b60d0b2dcace322e6e8c4499c4c8bdf331c1bae046a54be5e4191c3610286" +dependencies = [ + "cbc", + "cms", + "der", + "des", + "hex", + "hmac", + "pkcs12", + "pkcs5", + "rand", + "rc2", + "sha1", + "sha2", + "thiserror", + "x509-parser", +] + +[[package]] +name = "paladin-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5af1955eaab1506a43d046628c218b7b3915539554838feb85ed31f54aace2f2" +dependencies = [ + "anyhow", + "async-trait", + "backoff", + "bytes", + "ciborium", + "clap", + "crossbeam", + "crossbeam-skiplist", + "dashmap", + "dotenvy", + "futures", + "lapin", + "linkme", + "paladin-opkind-derive", + "pin-project", + "postcard", + "serde", + "thiserror", + "tokio", + "tokio-executor-trait", + "tokio-reactor-trait", + "tokio-util", + "tracing", + "tracing-subscriber", + "uuid", +] + +[[package]] +name = "paladin-opkind-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25dcb10b7c0ce99abee8694e2e79e4787d7f778b9339dc5a50ba6fc45e5cc9" +dependencies = [ + "quote", + "syn 2.0.66", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.5", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[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", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "pest_meta" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pinky-swear" +version = "6.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cfae3ead413ca051a681152bd266438d3bfa301c9bdf836939a14c721bb2a21" +dependencies = [ + "doc-comment", + "flume", + "parking_lot", + "tracing", +] + +[[package]] +name = "piper" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +dependencies = [ + "atomic-waker", + "fastrand 2.1.0", + "futures-io", +] + +[[package]] +name = "pkcs12" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "695b3df3d3cc1015f12d70235e35b6b79befc5fa7a9b95b951eab1dd07c9efc2" +dependencies = [ + "cms", + "const-oid", + "der", + "digest 0.10.7", + "spki", + "x509-cert", + "zeroize", +] + +[[package]] +name = "pkcs5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +dependencies = [ + "aes", + "cbc", + "der", + "pbkdf2", + "scrypt", + "sha2", + "spki", +] + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "plonky2" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85f26b090b989aebdeaf6a4eed748c1fbcabf67e7273a22e4e0c877b63846d0f" +dependencies = [ + "ahash", + "anyhow", + "getrandom", + "hashbrown 0.14.5", + "itertools 0.11.0", + "keccak-hash 0.8.0", + "log", + "num", + "plonky2_field", + "plonky2_maybe_rayon", + "plonky2_util", + "rand", + "rand_chacha", + "serde", + "static_assertions", + "unroll", + "web-time", +] + +[[package]] +name = "plonky2_field" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a1dca60ad900d81b1fe2df3d0b88d43345988e2935e6709176e96573f4bcf5d" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "num", + "plonky2_util", + "rand", + "serde", + "static_assertions", + "unroll", +] + +[[package]] +name = "plonky2_maybe_rayon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ff44a90aaca13e10e7ddf8fab815ba1b404c3f7c3ca82aaf11c46beabaa923" +dependencies = [ + "rayon", +] + +[[package]] +name = "plonky2_util" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16136f5f3019c1e83035af76cccddd56d789a5e2933306270185c3f99f12259" + +[[package]] +name = "plotters" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" + +[[package]] +name = "plotters-svg" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix 0.38.34", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "postcard" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" +dependencies = [ + "cobs", + "embedded-io", + "heapless", + "serde", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "pretty_env_logger" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.66", +] + +[[package]] +name = "primitive-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" +dependencies = [ + "fixed-hash 0.7.0", + "uint", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash 0.8.0", + "impl-codec", + "impl-rlp", + "impl-serde", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[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.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proof_gen" +version = "0.2.0" +dependencies = [ + "ethereum-types", + "evm_arithmetization", + "log", + "paste", + "plonky2", + "serde", +] + +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.4", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prover" +version = "0.1.0" +dependencies = [ + "alloy", + "anyhow", + "futures", + "num-traits", + "ops", + "paladin-core", + "proof_gen", + "ruint", + "serde", + "serde_json", + "tokio", + "trace_decoder", + "tracing", + "zero_bin_common", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +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.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rc2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" +dependencies = [ + "cipher", +] + +[[package]] +name = "reactor-trait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "438a4293e4d097556730f4711998189416232f009c137389e0f961d2bc0ddc58" +dependencies = [ + "async-trait", + "futures-core", + "futures-io", +] + +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.4", +] + +[[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.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "reqwest" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[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", + "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 = "rpc" +version = "0.1.0" +dependencies = [ + "alloy", + "anyhow", + "clap", + "evm_arithmetization", + "futures", + "hex", + "hex-literal", + "itertools 0.13.0", + "mpt_trie", + "primitive-types 0.12.2", + "prover", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "trace_decoder", + "tracing", + "tracing-subscriber", + "url", + "zero_bin_common", +] + +[[package]] +name = "ruint" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types 0.12.2", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[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" +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.23", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys 0.4.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-connector" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727a826801254b6cfcd2508a0508c01b7c1bca21d3673e84d86da084781b83d5" +dependencies = [ + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "rustls-webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-webpki" +version = "0.102.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[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 = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +dependencies = [ + "pbkdf2", + "salsa20", + "sha2", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.5.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +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.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "serde_json" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +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 = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3-asm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core", +] + +[[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 = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "starky" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a8480ca5b8eedf83ad070a780783b4e21a56c6ef66b4c0d1b7520b72bdfda1b" +dependencies = [ + "ahash", + "anyhow", + "hashbrown 0.14.5", + "itertools 0.11.0", + "log", + "num-bigint", + "plonky2", + "plonky2_maybe_rayon", + "plonky2_util", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.66", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[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.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d71e19bca02c807c9faa67b5a47673ff231b6e7449b251695188522f1dc44b2" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tcp-stream" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "495b0abdce3dc1f8fd27240651c9e68890c14e9d9c61527b1ce44d8a5a7bd3d5" +dependencies = [ + "cfg-if", + "p12-keystore", + "rustls-connector", + "rustls-pemfile", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand 2.1.0", + "rustix 0.38.34", + "windows-sys 0.52.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "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 = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tokio" +version = "1.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.7", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-executor-trait" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "802ccf58e108fe16561f35348fabe15ff38218968f033d587e399a84937533cc" +dependencies = [ + "async-trait", + "executor-trait", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[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-reactor-trait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9481a72f36bd9cbb8d6dd349227c4783e234e4332cfe806225bc929c4b92486" +dependencies = [ + "async-trait", + "futures-core", + "futures-io", + "reactor-trait", + "tokio", + "tokio-stream", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.14", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.13", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "trace_decoder" +version = "0.4.0" +dependencies = [ + "bytes", + "ciborium", + "ciborium-io", + "criterion", + "enum-as-inner", + "enumn", + "ethereum-types", + "evm_arithmetization", + "hex", + "hex-literal", + "keccak-hash 0.10.0", + "log", + "mpt_trie", + "pretty_env_logger", + "rlp", + "rlp-derive", + "serde", + "serde_json", + "serde_with", + "thiserror", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[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-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unroll" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad948c1cb799b1a70f836077721a92a35ac177d4daddf4c20a633786d4cf618" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c25da092f0a868cdf09e8674cd3b7ef3a7d92a24253e663a2fb85e2496de56" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +dependencies = [ + "getrandom", + "rand", + "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 = "verifier" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "dotenvy", + "proof_gen", + "serde", + "serde_json", + "serde_path_to_error", + "tracing", + "tracing-subscriber", + "zero_bin_common", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +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.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.34", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[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-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[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_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[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_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[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_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[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_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "worker" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "dotenvy", + "ops", + "paladin-core", + "tokio", + "tracing", + "tracing-subscriber", + "zero_bin_common", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x509-cert" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" +dependencies = [ + "const-oid", + "der", + "spki", +] + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + +[[package]] +name = "zero_bin_common" +version = "0.1.0" +dependencies = [ + "alloy", + "anyhow", + "async-stream", + "clap", + "evm_arithmetization", + "futures", + "plonky2", + "proof_gen", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.66", +] + +[[package]] +name = "zerovec" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] diff --git a/Cargo.toml b/Cargo.toml index 3d16964db..30ee73a25 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -97,7 +97,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } uint = "0.9.5" url = "2.5.0" -# zero-bin releated deps +# zero-bin related dependencies ops = { path = "zero_bin/ops" } prover = { path = "zero_bin/prover" } rpc = { path = "zero_bin/rpc" } From 45b57d0637821ad53d54dafb25fff555d715bcb8 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:56:16 -0400 Subject: [PATCH 181/184] ci: add labeler flag for new `zero-bin` crate + update `CODEOWNERS` (#281) * ci: add labeler flag for new zero-bin crate * chore: update CODEOWNERS --- .github/CODEOWNERS | 4 ++-- .github/labeler.yml | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b0c2d81e6..9c7403044 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,2 @@ -* @muursh @Nashtare @cpubot -/evm_arithmetization/ @wborgeaud @muursh @Nashtare @cpubot +* @muursh @Nashtare +/evm_arithmetization/ @wborgeaud @muursh @Nashtare diff --git a/.github/labeler.yml b/.github/labeler.yml index 4c1141a73..4805743d5 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -18,6 +18,11 @@ - changed-files: - any-glob-to-any-file: proof_gen/** +# Add 'crate: zero_bin' label to any changes within 'zero_bin' folder. +'crate: zero_bin': +- changed-files: + - any-glob-to-any-file: zero_bin/** + # Add 'specs' label to any changes within 'docs' folder. 'specs': - changed-files: From 34e98cbf9d5b8413f65c480bd234fdd13a0de26d Mon Sep 17 00:00:00 2001 From: 0xaatif <169152398+0xaatif@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:05:24 +0100 Subject: [PATCH 182/184] fix: only executables should choose a global allocator (#301) * mark: 0xaatif/allocator * fix: only executables should choose a global allocator * doc: debt --- Cargo.lock | 2 +- evm_arithmetization/Cargo.toml | 10 +++++----- evm_arithmetization/src/lib.rs | 7 ------- zero_bin/worker/Cargo.toml | 7 +++++-- zero_bin/worker/src/main.rs | 6 ++++++ 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8fe4835ac..f288caab7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1920,7 +1920,6 @@ dependencies = [ "hex", "hex-literal", "itertools 0.13.0", - "jemallocator", "keccak-hash 0.10.0", "log", "mpt_trie", @@ -5697,6 +5696,7 @@ dependencies = [ "anyhow", "clap", "dotenvy", + "jemallocator", "ops", "paladin-core", "tokio", diff --git a/evm_arithmetization/Cargo.toml b/evm_arithmetization/Cargo.toml index 86e2962d0..9ae67e0f0 100644 --- a/evm_arithmetization/Cargo.toml +++ b/evm_arithmetization/Cargo.toml @@ -2,7 +2,10 @@ name = "evm_arithmetization" description = "Implementation of STARKs for the Ethereum Virtual Machine" version = "0.2.0" -authors = ["Daniel Lubarov ", "William Borgeaud "] +authors = [ + "Daniel Lubarov ", + "William Borgeaud ", +] readme = "README.md" categories = ["cryptography"] edition.workspace = true @@ -43,9 +46,6 @@ serde_json = { workspace = true } # Local dependencies mpt_trie = { workspace = true } -[target.'cfg(not(target_env = "msvc"))'.dependencies] -jemallocator = "0.5.0" - [dev-dependencies] criterion = { workspace = true } hex = { workspace = true } @@ -58,7 +58,7 @@ asmtools = ["hex"] parallel = [ "plonky2/parallel", "plonky2_maybe_rayon/parallel", - "starky/parallel" + "starky/parallel", ] [[bin]] diff --git a/evm_arithmetization/src/lib.rs b/evm_arithmetization/src/lib.rs index bd4f20147..b9236ae96 100644 --- a/evm_arithmetization/src/lib.rs +++ b/evm_arithmetization/src/lib.rs @@ -211,15 +211,8 @@ pub mod curve_pairings; pub mod extension_tower; pub mod util; -// Set up Jemalloc -#[cfg(not(target_env = "msvc"))] -use jemallocator::Jemalloc; use mpt_trie::partial_trie::HashedPartialTrie; -#[cfg(not(target_env = "msvc"))] -#[global_allocator] -static GLOBAL: Jemalloc = Jemalloc; - // Public definitions and re-exports pub type Node = mpt_trie::partial_trie::Node; diff --git a/zero_bin/worker/Cargo.toml b/zero_bin/worker/Cargo.toml index 080c280ec..90f13bd14 100644 --- a/zero_bin/worker/Cargo.toml +++ b/zero_bin/worker/Cargo.toml @@ -18,5 +18,8 @@ clap = { workspace = true } tokio = { workspace = true } # Local dependencies -ops ={ workspace = true } -zero_bin_common ={ workspace = true } +ops = { workspace = true } +zero_bin_common = { workspace = true } + +[target.'cfg(not(target_env = "msvc"))'.dependencies] +jemallocator = "0.5.0" diff --git a/zero_bin/worker/src/main.rs b/zero_bin/worker/src/main.rs index c2d571f59..4fb8675ff 100644 --- a/zero_bin/worker/src/main.rs +++ b/zero_bin/worker/src/main.rs @@ -7,6 +7,12 @@ use zero_bin_common::prover_state::cli::CliProverStateConfig; mod init; +// TODO: https://github.com/0xPolygonZero/zk_evm/issues/302 +// this should probably be removed. +#[cfg(not(target_env = "msvc"))] +#[global_allocator] +static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc; + #[derive(Parser, Debug)] struct Cli { #[clap(flatten)] From 27199645bc11b7b16848d240511623db92bdaad0 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:33:33 -0400 Subject: [PATCH 183/184] doc: fix typos (#298) --- docs/arithmetization/tables/cpu.tex | 2 +- docs/arithmetization/tables/memory.tex | 2 +- evm_arithmetization/src/arithmetic/shift.rs | 2 +- evm_arithmetization/src/cpu/jumps.rs | 4 ++-- .../src/cpu/kernel/asm/core/access_lists.asm | 8 ++++---- evm_arithmetization/src/cpu/kernel/asm/core/call.asm | 2 +- evm_arithmetization/src/generation/prover_input.rs | 6 +++--- evm_arithmetization/src/proof.rs | 2 +- mpt_trie/src/partial_trie.rs | 2 +- mpt_trie/src/utils.rs | 2 +- trace_decoder/README.md | 2 +- trace_decoder/src/decoding.rs | 2 +- trace_decoder/src/trace_protocol.rs | 2 +- zero_bin/tools/prove_rpc.sh | 2 +- zero_bin/tools/prove_stdio.sh | 2 +- zero_bin/verifier/src/main.rs | 4 ++-- 16 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/arithmetization/tables/cpu.tex b/docs/arithmetization/tables/cpu.tex index 7bca5a9f5..c7bfc1d82 100644 --- a/docs/arithmetization/tables/cpu.tex +++ b/docs/arithmetization/tables/cpu.tex @@ -37,7 +37,7 @@ \subsubsection{CPU columns} \paragraph*{Operation flags:} Boolean flags. During CPU cycles phase, each row executes a single instruction, which sets one and only one operation flag. No flag is set during padding. The decoding constraints ensure that the flag set corresponds to the opcode being read. -There isn't a 1-to-1 correspondance between instructions and flags. For efficiency, the same flag can be set by different, unrelated instructions (e.g. \texttt{eq\_iszero}, which represents +There isn't a 1-to-1 correspondence between instructions and flags. For efficiency, the same flag can be set by different, unrelated instructions (e.g. \texttt{eq\_iszero}, which represents the \texttt{EQ} and the \texttt{ISZERO} instructions). When there is a need to differentiate them in constraints, we filter them with their respective opcode: since the first bit of \texttt{EQ}'s opcode (resp. \texttt{ISZERO}'s opcode) is 0 (resp. 1), we can filter a constraint for an EQ instruction with \texttt{eq\_iszero * (1 - opcode\_bits[0])} (resp. \texttt{eq\_iszero * opcode\_bits[0]}). diff --git a/docs/arithmetization/tables/memory.tex b/docs/arithmetization/tables/memory.tex index d39e99b23..d6f3267c3 100644 --- a/docs/arithmetization/tables/memory.tex +++ b/docs/arithmetization/tables/memory.tex @@ -48,7 +48,7 @@ \subsection{Memory} \subsubsection{Virtual memory} -In the EVM, each contract call has its own address space. Within that address space, there are separate segments for code, main memory, stack memory, calldata, and returndata. Thus each address actually has three compoments: +In the EVM, each contract call has its own address space. Within that address space, there are separate segments for code, main memory, stack memory, calldata, and returndata. Thus each address actually has three components: \begin{enumerate} \item an execution context, representing a contract call, \item a segment ID, used to separate code, main memory, and so forth, and so on diff --git a/evm_arithmetization/src/arithmetic/shift.rs b/evm_arithmetization/src/arithmetic/shift.rs index eba9fb884..d96002bbf 100644 --- a/evm_arithmetization/src/arithmetic/shift.rs +++ b/evm_arithmetization/src/arithmetic/shift.rs @@ -94,7 +94,7 @@ fn eval_packed_shl( } /// Evaluates the constraints for an SHR opcode. -/// The logic is tha same as the one for DIV. The only difference is that +/// The logic is the same as the one for DIV. The only difference is that /// the inputs are in `INPUT_REGISTER_1` and `INPUT_REGISTER_2` instead of /// `INPUT_REGISTER_0` and `INPUT_REGISTER_1`. fn eval_packed_shr( diff --git a/evm_arithmetization/src/cpu/jumps.rs b/evm_arithmetization/src/cpu/jumps.rs index b6706035d..2a8df148a 100644 --- a/evm_arithmetization/src/cpu/jumps.rs +++ b/evm_arithmetization/src/cpu/jumps.rs @@ -101,7 +101,7 @@ pub(crate) fn eval_packed_jump_jumpi( let empty_stack_filter = filter * (lv.general.stack().stack_inv_aux - P::ONES); yield_constr.constraint_transition(empty_stack_filter * channel.used); - // If `JUMP`, re-use the `JUMPI` logic, but setting the second input (the + // If `JUMP`, reuse the `JUMPI` logic, but setting the second input (the // predicate) to be 1. In other words, we implement `JUMP(dst)` as // `JUMPI(dst, cond=1)`. yield_constr.constraint(is_jump * (cond[0] - P::ONES)); @@ -236,7 +236,7 @@ pub(crate) fn eval_ext_circuit_jump_jumpi, const D: yield_constr.constraint_transition(builder, constr); } - // If `JUMP`, re-use the `JUMPI` logic, but setting the second input (the + // If `JUMP`, reuse the `JUMPI` logic, but setting the second input (the // predicate) to be 1. In other words, we implement `JUMP(dst)` as // `JUMPI(dst, cond=1)`. { diff --git a/evm_arithmetization/src/cpu/kernel/asm/core/access_lists.asm b/evm_arithmetization/src/cpu/kernel/asm/core/access_lists.asm index f89938326..73b9401ca 100644 --- a/evm_arithmetization/src/cpu/kernel/asm/core/access_lists.asm +++ b/evm_arithmetization/src/cpu/kernel/asm/core/access_lists.asm @@ -12,7 +12,7 @@ // Initialize SEGMENT_ACCESSED_ADDRESSES global init_access_lists: // stack: (empty) - // Store @U256_MAX at the beggining of the segment + // Store @U256_MAX at the beginning of the segment PUSH @SEGMENT_ACCESSED_ADDRESSES // ctx == virt == 0 DUP1 PUSH @U256_MAX @@ -29,7 +29,7 @@ global init_access_lists: // stack: (empty) // Initialize SEGMENT_ACCESSED_STORAGE_KEYS - // Store @U256_MAX at the beggining of the segment + // Store @U256_MAX at the beginning of the segment PUSH @SEGMENT_ACCESSED_STORAGE_KEYS // ctx == virt == 0 DUP1 PUSH @U256_MAX @@ -65,7 +65,7 @@ global init_access_lists: // Multiply the value at the top of the stack, denoted by ptr/2, by 2 // and abort if ptr/2 >= mem[@GLOBAL_METADATA_ACCESSED_ADDRESSES_LEN]/2 -// In this way 2*ptr/2 must be pointing to the begining of a node. +// In this way 2*ptr/2 must be pointing to the beginning of a node. %macro get_valid_addr_ptr // stack: ptr/2 DUP1 @@ -170,7 +170,7 @@ insert_new_address: /// Otherwise it guesses the node before the address (pred) /// such that (pred)->(next)->(next_next), where the (next) node /// stores the address. It writes the link (pred)->(next_next) -/// and (next) is marked as deleted by writting U256_MAX in its +/// and (next) is marked as deleted by writing U256_MAX in its /// next node pointer. global remove_accessed_addresses: // stack: addr, retdest diff --git a/evm_arithmetization/src/cpu/kernel/asm/core/call.asm b/evm_arithmetization/src/cpu/kernel/asm/core/call.asm index b5b893547..c6f91459e 100644 --- a/evm_arithmetization/src/cpu/kernel/asm/core/call.asm +++ b/evm_arithmetization/src/cpu/kernel/asm/core/call.asm @@ -386,7 +386,7 @@ call_too_deep: SET_CONTEXT %checkpoint // Checkpoint %increment_call_depth - // Perform jumpdest analyis + // Perform jumpdest analysis %mload_context_metadata(@CTX_METADATA_CODE_SIZE) GET_CONTEXT // stack: ctx, code_size, retdest diff --git a/evm_arithmetization/src/generation/prover_input.rs b/evm_arithmetization/src/generation/prover_input.rs index 002fc1d4a..904524be2 100644 --- a/evm_arithmetization/src/generation/prover_input.rs +++ b/evm_arithmetization/src/generation/prover_input.rs @@ -312,7 +312,7 @@ impl GenerationState { /// Returns a non-jumpdest proof for the address on the top of the stack. A /// non-jumpdest proof is the closest address to the address on the top of - /// the stack, if the closses address is >= 32, or zero otherwise. + /// the stack, if the closest address is >= 32, or zero otherwise. fn run_next_non_jumpdest_proof(&mut self) -> Result { let code = self.get_current_code()?; let address = u256_to_usize(stack_peek(self, 0)?)?; @@ -452,7 +452,7 @@ impl GenerationState { pub(crate) fn get_addresses_access_list(&self) -> Result { // `GlobalMetadata::AccessedAddressesLen` stores the value of the next available // virtual address in the segment. In order to get the length we need - // to substract `Segment::AccessedAddresses` as usize. + // to subtract `Segment::AccessedAddresses` as usize. let acc_addr_len = u256_to_usize(self.get_global_metadata(GlobalMetadata::AccessedAddressesLen))? - Segment::AccessedAddresses as usize; @@ -474,7 +474,7 @@ impl GenerationState { pub(crate) fn get_storage_keys_access_list(&self) -> Result { // GlobalMetadata::AccessedStorageKeysLen stores the value of the next available // virtual address in the segment. In order to get the length we need - // to substract Segment::AccessedStorageKeys as usize + // to subtract Segment::AccessedStorageKeys as usize let acc_storage_len = u256_to_usize( self.memory.get_with_init(MemoryAddress::new( 0, diff --git a/evm_arithmetization/src/proof.rs b/evm_arithmetization/src/proof.rs index 0a1f09d4e..338eda2fa 100644 --- a/evm_arithmetization/src/proof.rs +++ b/evm_arithmetization/src/proof.rs @@ -435,7 +435,7 @@ impl PublicValuesTarget { } } - /// Returns the public values in `pv0` or `pv1` depening on `condition`. + /// Returns the public values in `pv0` or `pv1` depending on `condition`. pub(crate) fn select, const D: usize>( builder: &mut CircuitBuilder, condition: BoolTarget, diff --git a/mpt_trie/src/partial_trie.rs b/mpt_trie/src/partial_trie.rs index f03f3d2fa..27027eeae 100644 --- a/mpt_trie/src/partial_trie.rs +++ b/mpt_trie/src/partial_trie.rs @@ -107,7 +107,7 @@ pub trait PartialTrie: } /// Part of the trait that is not really part of the public interface but -/// implementor of other node types still need to implement. +/// implementer of other node types still need to implement. pub trait TrieNodeIntern { /// Returns the hash of the rlp encoding of self. fn hash_intern(&self) -> EncodedNode; diff --git a/mpt_trie/src/utils.rs b/mpt_trie/src/utils.rs index c38c78a94..5d530878e 100644 --- a/mpt_trie/src/utils.rs +++ b/mpt_trie/src/utils.rs @@ -97,7 +97,7 @@ pub enum TrieSegment { /// Extension node along with the key piece of the node. Extension(Nibbles), - /// Leaf node along wth the key piece of the node. + /// Leaf node along with the key piece of the node. Leaf(Nibbles), } diff --git a/trace_decoder/README.md b/trace_decoder/README.md index 948caa603..6c996a310 100644 --- a/trace_decoder/README.md +++ b/trace_decoder/README.md @@ -6,7 +6,7 @@ A flexible protocol that clients (eg. full nodes) can use to easily generate blo Temporary [high-level overview](docs/usage_seq_diagrams.md). The specification itself is in the repo [here](trace_decoder/src/trace_protocol.rs). -Because processing the incoming proof protocol payload is not a resource bottleneck, the design is not worrying too much about performance. Instead, the core focus is flexibility in clients creating their own implementation, where the protocol supports multiple ways to provide different pieces of data. For example, there are multiple different formats available to provide the trie pre-images in, and the implementor can choose whichever is closest to its own internal data structures. +Because processing the incoming proof protocol payload is not a resource bottleneck, the design is not worrying too much about performance. Instead, the core focus is flexibility in clients creating their own implementation, where the protocol supports multiple ways to provide different pieces of data. For example, there are multiple different formats available to provide the trie pre-images in, and the implementer can choose whichever is closest to its own internal data structures. TODO diff --git a/trace_decoder/src/decoding.rs b/trace_decoder/src/decoding.rs index 950a67984..97170fbf1 100644 --- a/trace_decoder/src/decoding.rs +++ b/trace_decoder/src/decoding.rs @@ -483,7 +483,7 @@ impl ProcessedBlockTrace { /// If a branch collapse occurred after a delete, then we must ensure that /// the other single child that remains also is not hashed when passed into - /// plonky2. Returns the key to the remaining child if a collapse occured. + /// plonky2. Returns the key to the remaining child if a collapse occurred. fn delete_node_and_report_remaining_key_if_branch_collapsed( trie: &mut HashedPartialTrie, delete_k: &Nibbles, diff --git a/trace_decoder/src/trace_protocol.rs b/trace_decoder/src/trace_protocol.rs index 23f836a6b..7d76797bd 100644 --- a/trace_decoder/src/trace_protocol.rs +++ b/trace_decoder/src/trace_protocol.rs @@ -4,7 +4,7 @@ //! generation latency & throughput, the overall priority of this protocol is //! ease of implementation for clients. The flexibility comes from giving //! multiple ways to the client to provide the data for the protocol, where the -//! implementors can pick whichever way is the most convenient for them. +//! implementers can pick whichever way is the most convenient for them. //! //! It might not be obvious why we need traces for each txn in order to generate //! proofs. While it's true that we could just run all the txns of a block in an diff --git a/zero_bin/tools/prove_rpc.sh b/zero_bin/tools/prove_rpc.sh index 9c511600d..1d63325f7 100755 --- a/zero_bin/tools/prove_rpc.sh +++ b/zero_bin/tools/prove_rpc.sh @@ -106,7 +106,7 @@ else retVal=$? if [ $retVal -ne 0 ]; then - # Some error occured. + # Some error occurred. echo "Block ${i} errored. See ${OUT_LOG_PATH} for more details." exit $retVal else diff --git a/zero_bin/tools/prove_stdio.sh b/zero_bin/tools/prove_stdio.sh index 1f93adbcf..b16dd4e5f 100755 --- a/zero_bin/tools/prove_stdio.sh +++ b/zero_bin/tools/prove_stdio.sh @@ -8,7 +8,7 @@ # 1 --> Input witness json file # 2 --> Test run only flag `test_only` (optional) -# We're going to set the paralellism in line with the total cpu count +# We're going to set the parallelism in line with the total cpu count num_procs=$(nproc) # Configured Rayon and Tokio with rough defaults diff --git a/zero_bin/verifier/src/main.rs b/zero_bin/verifier/src/main.rs index 06a0ecebd..0c072fed9 100644 --- a/zero_bin/verifier/src/main.rs +++ b/zero_bin/verifier/src/main.rs @@ -19,13 +19,13 @@ fn main() -> Result<()> { let des = &mut Deserializer::from_reader(&file); let input_proofs: Vec = serde_path_to_error::deserialize(des)?; - let verifer = args + let verifier = args .prover_state_config .into_prover_state_manager() .verifier()?; if input_proofs.into_iter().all(|block_proof| { - verifer + verifier .verify(&block_proof.intern) .map_err(|e| { info!("Proof verification failed with error: {:?}", e); From baecefcbaa411c77fb5135c626a954c7d88f3028 Mon Sep 17 00:00:00 2001 From: Robin Salen <30937548+Nashtare@users.noreply.github.com> Date: Thu, 20 Jun 2024 10:04:18 -0400 Subject: [PATCH 184/184] misc: fix logging filename (#305) --- zero_bin/tools/prove_rpc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zero_bin/tools/prove_rpc.sh b/zero_bin/tools/prove_rpc.sh index 1d63325f7..316d29c84 100755 --- a/zero_bin/tools/prove_rpc.sh +++ b/zero_bin/tools/prove_rpc.sh @@ -38,7 +38,7 @@ else fi PROOF_OUTPUT_DIR="proofs" -OUT_LOG_PATH="${PROOF_OUTPUT_DIR}/b${i}.log" +OUT_LOG_PATH="${PROOF_OUTPUT_DIR}/b$1_$2.log" ALWAYS_WRITE_LOGS=0 # Change this to `1` if you always want logs to be written. TOT_BLOCKS=$(($2-$1+1))