From bcd83cc0f7b6a93495fda2c89d74c6d193f4e94e Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 25 Dec 2024 17:09:42 +0700 Subject: [PATCH 1/6] feat: rewrite to alloy --- user-ops-indexer/Cargo.lock | 5300 ++++++++--------- user-ops-indexer/README.md | 1 + .../user-ops-indexer-logic/Cargo.toml | 21 +- .../src/indexer/base_indexer.rs | 295 +- .../src/indexer/common.rs | 81 +- .../src/indexer/common_transport.rs | 80 - .../user-ops-indexer-logic/src/indexer/mod.rs | 1 - .../src/indexer/rpc_utils.rs | 191 +- .../src/indexer/settings.rs | 6 +- .../src/indexer/v06/mod.rs | 93 +- .../src/indexer/v07/mod.rs | 88 +- .../src/repository/account.rs | 24 +- .../src/repository/bundle.rs | 17 +- .../src/repository/bundler.rs | 15 +- .../src/repository/factory.rs | 13 +- .../src/repository/paymaster.rs | 13 +- .../src/repository/user_op.rs | 70 +- .../src/types/account.rs | 21 +- .../src/types/bundle.rs | 13 +- .../src/types/bundler.rs | 4 +- .../src/types/common.rs | 22 +- .../src/types/factory.rs | 4 +- .../src/types/paymaster.rs | 4 +- .../src/types/user_op.rs | 120 +- .../user-ops-indexer-proto/src/lib.rs | 2 +- .../swagger/user-ops-indexer.swagger.yaml | 7 + .../user-ops-indexer-server/Cargo.toml | 18 +- .../user-ops-indexer-server/src/indexer.rs | 34 +- .../src/services/user_ops.rs | 22 +- 29 files changed, 3205 insertions(+), 3375 deletions(-) delete mode 100644 user-ops-indexer/user-ops-indexer-logic/src/indexer/common_transport.rs diff --git a/user-ops-indexer/Cargo.lock b/user-ops-indexer/Cargo.lock index 7eb3b8376..64f95512c 100644 --- a/user-ops-indexer/Cargo.lock +++ b/user-ops-indexer/Cargo.lock @@ -1,24 +1,14 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] +version = 4 [[package]] name = "actix-codec" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "bytes", "futures-core", "futures-sink", @@ -37,7 +27,7 @@ checksum = "0346d8c1f762b41b458ed3145eea914966bb9ad20b9be0d6d463b20d45586370" dependencies = [ "actix-utils", "actix-web", - "derive_more", + "derive_more 0.99.18", "futures-util", "log", "once_cell", @@ -46,26 +36,26 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.4.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9" +checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", - "ahash 0.8.6", - "base64 0.21.5", - "bitflags 2.4.1", + "ahash 0.8.11", + "base64 0.22.1", + "bitflags 2.6.0", "brotli", "bytes", "bytestring", - "derive_more", + "derive_more 0.99.18", "encoding_rs", "flate2", "futures-core", "h2", - "http", + "http 0.2.12", "httparse", "httpdate", "itoa", @@ -80,7 +70,7 @@ dependencies = [ "tokio", "tokio-util", "tracing", - "zstd 0.12.4", + "zstd", ] [[package]] @@ -90,18 +80,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "actix-prost" version = "0.1.0" -source = "git+https://github.com/blockscout/actix-prost#a060c2fe886d4551ed7350fa445d3d2bc02758f4" +source = "git+https://github.com/blockscout/actix-prost#ec0aa8dc449ed42ab89d0e34d2a08bc73f5c7473" dependencies = [ "actix-http", "actix-web", - "http", - "prost", + "http 0.2.12", + "prost 0.11.9", "serde", "serde_json", "serde_with 2.3.3", @@ -111,22 +101,23 @@ dependencies = [ [[package]] name = "actix-prost-build" version = "0.1.0" -source = "git+https://github.com/blockscout/actix-prost#85a6450ee7e8b90944ecfcdc81c28e1373780fc2" +source = "git+https://github.com/blockscout/actix-prost#ec0aa8dc449ed42ab89d0e34d2a08bc73f5c7473" dependencies = [ - "prettyplease 0.1.25", + "prettyplease 0.2.25", "proc-macro2", "prost-build", + "prost-reflect", "quote", "serde", "serde_yaml", - "syn 1.0.109", - "thiserror", + "syn 2.0.91", + "thiserror 1.0.69", ] [[package]] name = "actix-prost-macros" -version = "0.1.0" -source = "git+https://github.com/blockscout/actix-prost#a060c2fe886d4551ed7350fa445d3d2bc02758f4" +version = "0.1.1" +source = "git+https://github.com/blockscout/actix-prost#ec0aa8dc449ed42ab89d0e34d2a08bc73f5c7473" dependencies = [ "proc-macro2", "quote", @@ -135,22 +126,24 @@ dependencies = [ [[package]] name = "actix-router" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" dependencies = [ "bytestring", - "http", + "cfg-if", + "http 0.2.12", "regex", + "regex-lite", "serde", "tracing", ] [[package]] name = "actix-rt" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" dependencies = [ "futures-core", "tokio", @@ -158,9 +151,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" +checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" dependencies = [ "actix-rt", "actix-service", @@ -168,7 +161,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2 0.5.5", + "socket2", "tokio", "tracing", ] @@ -196,9 +189,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.4.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9" +checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" dependencies = [ "actix-codec", "actix-http", @@ -209,15 +202,16 @@ dependencies = [ "actix-service", "actix-utils", "actix-web-codegen", - "ahash 0.8.6", + "ahash 0.8.11", "bytes", "bytestring", "cfg-if", "cookie", - "derive_more", + "derive_more 0.99.18", "encoding_rs", "futures-core", "futures-util", + "impl-more", "itoa", "language-tags", "log", @@ -225,25 +219,26 @@ dependencies = [ "once_cell", "pin-project-lite", "regex", + "regex-lite", "serde", "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.5", + "socket2", "time", "url", ] [[package]] name = "actix-web-codegen" -version = "4.2.2" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] @@ -260,35 +255,24 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aes" -version = "0.8.3" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", @@ -297,9 +281,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", @@ -310,9 +294,9 @@ 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", ] @@ -340,321 +324,1030 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] -name = "amplify" -version = "3.14.2" +name = "alloy" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ec14f4fb838e9ddace42fa5944bb1ee4dff8477494ba48c5f874e16caf27a" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" dependencies = [ - "amplify_derive", - "amplify_num", - "wasm-bindgen", + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", ] [[package]] -name = "amplify_derive" -version = "2.11.3" +name = "alloy-chains" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c3de270e75f27a4468a7c344070109046656e85cb522141f7d40ab4b83803ac" +checksum = "d4e0f0136c085132939da6b753452ebed4efaa73fe523bb855b10c199c2ebfaf" dependencies = [ - "amplify_syn", - "proc-macro2", - "quote", - "syn 1.0.109", + "alloy-primitives", + "num_enum", + "strum 0.26.3", ] [[package]] -name = "amplify_num" -version = "0.4.1" +name = "alloy-consensus" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27d3d00d3d115395a7a8a4dc045feb7aa82b641e485f7e15f4e67ac16f4f56d" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "k256", + "serde", +] [[package]] -name = "amplify_syn" -version = "1.1.6" +name = "alloy-consensus-any" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da24db1445cc7bc3842fa072c2d51fe5b25b812b6a572d65842a4c72e87221ac" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "alloy-contract" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror 2.0.9", +] [[package]] -name = "android_system_properties" -version = "0.1.5" +name = "alloy-core" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "c618bd382f0bc2ac26a7e4bfae01c9b015ca8f21b37ca40059ae35a7e62b3dc6" dependencies = [ - "libc", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", ] [[package]] -name = "anstream" -version = "0.6.4" +name = "alloy-dyn-abi" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "41056bde53ae10ffbbf11618efbe1e0290859e5eab0fe9ef82ebdb62f12a866f" dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", ] [[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" +name = "alloy-eip2930" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "utf8parse", + "alloy-primitives", + "alloy-rlp", + "serde", ] [[package]] -name = "anstyle-query" -version = "1.0.0" +name = "alloy-eip7702" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" dependencies = [ - "windows-sys 0.48.0", + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "k256", + "serde", ] [[package]] -name = "anstyle-wincon" -version = "3.0.1" +name = "alloy-eips" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" dependencies = [ - "anstyle", - "windows-sys 0.48.0", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", ] [[package]] -name = "anyhow" -version = "1.0.75" +name = "alloy-genesis" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] [[package]] -name = "arrayvec" -version = "0.7.4" +name = "alloy-json-abi" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "c357da577dfb56998d01f574d81ad7a1958d248740a7981b205d69d65a7da404" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] [[package]] -name = "ascii-canvas" -version = "3.0.0" +name = "alloy-json-rpc" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" dependencies = [ - "term", + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.9", + "tracing", ] [[package]] -name = "async-attributes" -version = "1.1.2" +name = "alloy-network" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote", - "syn 1.0.109", +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.9", ] [[package]] -name = "async-channel" -version = "1.9.0" +name = "alloy-network-primitives" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", ] [[package]] -name = "async-channel" -version = "2.1.1" +name = "alloy-primitives" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" dependencies = [ - "concurrent-queue", - "event-listener 4.0.0", - "event-listener-strategy", - "futures-core", - "pin-project-lite", + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 1.0.0", + "foldhash", + "hashbrown 0.15.2", + "hex-literal", + "indexmap 2.7.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", ] [[package]] -name = "async-executor" -version = "1.8.0" +name = "alloy-provider" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" -dependencies = [ - "async-lock 3.1.2", - "async-task", - "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.0.1", - "slab", +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-debug", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap 6.1.0", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest", + "schnellru", + "serde", + "serde_json", + "thiserror 2.0.9", + "tokio", + "tracing", + "url", + "wasmtimer", ] [[package]] -name = "async-global-executor" -version = "2.4.0" +name = "alloy-pubsub" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4353121d5644cdf2beb5726ab752e79a8db1ebb52031770ec47db31d245526" +checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" dependencies = [ - "async-channel 2.1.1", - "async-executor", - "async-io 2.2.1", - "async-lock 3.1.2", - "blocking", - "futures-lite 2.0.1", - "once_cell", + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", ] [[package]] -name = "async-io" -version = "1.13.0" +name = "alloy-rlp" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097" 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", + "alloy-rlp-derive", + "arrayvec", + "bytes", ] [[package]] -name = "async-io" -version = "2.2.1" +name = "alloy-rlp-derive" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff" +checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" dependencies = [ - "async-lock 3.1.2", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite 2.0.1", - "parking", - "polling 3.3.1", - "rustix 0.38.24", - "slab", - "tracing", - "windows-sys 0.52.0", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "async-lock" -version = "2.8.0" +name = "alloy-rpc-client" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" dependencies = [ - "event-listener 2.5.3", + "alloy-json-rpc", + "alloy-primitives", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", ] [[package]] -name = "async-lock" -version = "3.1.2" +name = "alloy-rpc-types" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea8b3453dd7cc96711834b75400d671b73e3656975fa68d9f277163b7f7e316" +checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" dependencies = [ - "event-listener 4.0.0", - "event-listener-strategy", - "pin-project-lite", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-serde", + "serde", ] [[package]] -name = "async-std" -version = "1.12.0" +name = "alloy-rpc-types-any" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" dependencies = [ - "async-attributes", - "async-channel 1.9.0", - "async-global-executor", - "async-io 1.13.0", - "async-lock 2.8.0", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite 1.13.0", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", ] [[package]] -name = "async-stream" -version = "0.3.5" +name = "alloy-rpc-types-debug" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "e1dec1c1b65614ebd5834a7dfddf525a186962082023718e10f4f64ed2d02514" dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", + "alloy-primitives", + "serde", ] [[package]] -name = "async-stream-impl" -version = "0.3.5" +name = "alloy-rpc-types-engine" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.50", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "derive_more 1.0.0", + "serde", + "strum 0.26.3", ] [[package]] -name = "async-task" -version = "4.5.0" +name = "alloy-rpc-types-eth" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more 1.0.0", + "itertools 0.13.0", + "serde", + "serde_json", +] [[package]] -name = "async-trait" -version = "0.1.77" +name = "alloy-rpc-types-trace" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db14a83665cd28ffd01939f04c2adf0e0fd9bb648b73ca651dcaa0869dae027f" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", + "thiserror 2.0.9", +] + +[[package]] +name = "alloy-serde" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 2.0.9", +] + +[[package]] +name = "alloy-signer-local" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand", + "thiserror 2.0.9", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9d64f851d95619233f74b310f12bcf16e0cbc27ee3762b6115c14a84809280a" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf7ed1574b699f48bf17caab4e6e54c6d12bc3c006ab33d58b1e227c1c3559f" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.7.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.91", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c02997ccef5f34f9c099277d4145f183b422938ed5322dc57a089fe9b9ad9ee" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck 0.5.0", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.91", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce13ff37285b0870d0a0746992a4ae48efaf34b766ae4c2640fa15e5305f8e73" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1174cafd6c6d810711b4e00383037bdb458efc4fe3dbafafa16567e0320c54d8" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.9", + "tokio", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower 0.5.2", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http 1.2.0", + "rustls 0.23.20", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + +[[package]] +name = "alloy-trie" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e428104b2445a4f929030891b3dbf8c94433a8349ba6480946bf6af7975c2f6" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + +[[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.1", + "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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[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 2.5.3", + "futures-core", +] + +[[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.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "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 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", + "tokio", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[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-std" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +dependencies = [ + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[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.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] @@ -665,7 +1358,7 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version", + "rustc_version 0.4.1", ] [[package]] @@ -683,33 +1376,22 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atomic-write-file" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c232177ba50b16fe7a4588495bd474a62a9e45a8e4ca6fd7d0b7ac29d164631e" -dependencies = [ - "nix", - "rand", -] - [[package]] name = "auto_impl" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" @@ -722,9 +1404,9 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "itoa", "matchit", "memchr", @@ -733,8 +1415,8 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper", - "tower", + "sync_wrapper 0.1.2", + "tower 0.4.13", "tower-layer", "tower-service", ] @@ -748,8 +1430,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", @@ -758,17 +1440,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -785,21 +1467,21 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[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 = "base64ct" -version = "1.6.0" +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "bech32" -version = "0.9.1" +name = "base64ct" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bigdecimal" @@ -812,6 +1494,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + [[package]] name = "bit-set" version = "0.5.3" @@ -835,9 +1523,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -865,18 +1553,15 @@ 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 2.1.1", - "async-lock 3.1.2", + "async-channel 2.3.1", "async-task", - "fastrand 2.0.1", "futures-io", - "futures-lite 2.0.1", + "futures-lite", "piper", - "tracing", ] [[package]] @@ -905,18 +1590,6 @@ dependencies = [ "sea-orm-migration", ] -[[package]] -name = "blockscout-display-bytes" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4acc2bb1d1de55a55f818c10cdbc4a698f778666a7b17d2eab737aa6ed1b5e" -dependencies = [ - "bytes", - "hex", - "serde", - "thiserror", -] - [[package]] name = "blockscout-service-launcher" version = "0.13.2" @@ -946,7 +1619,7 @@ dependencies = [ "tracing-opentelemetry", "tracing-subscriber", "url", - "uuid 1.6.1", + "uuid", ] [[package]] @@ -959,14 +1632,26 @@ dependencies = [ "mutually_exclusive_features", "pin-project", "tracing", - "uuid 1.6.1", + "uuid", +] + +[[package]] +name = "blst" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", ] [[package]] name = "borsh" -version = "1.2.0" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf617fabf5cdbdc92f774bfe5062d870f228b80056d41180797abf48bed4056e" +checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" dependencies = [ "borsh-derive", "cfg_aliases", @@ -974,23 +1659,22 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.2.0" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f404657a7ea7b5249e36808dff544bc88a28f26e0ac40009f674b7a009d14be3" +checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" dependencies = [ "once_cell", - "proc-macro-crate 2.0.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.50", - "syn_derive", + "syn 2.0.91", ] [[package]] name = "brotli" -version = "3.4.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -999,29 +1683,19 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] -[[package]] -name = "bs58" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" -dependencies = [ - "sha2", - "tinyvec", -] - [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-slice-cast" @@ -1031,9 +1705,9 @@ checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "bytecheck" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -1042,9 +1716,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ "proc-macro2", "quote", @@ -1059,83 +1733,46 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] [[package]] name = "bytestring" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" dependencies = [ "bytes", ] [[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" +name = "c-kzg" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" dependencies = [ + "blst", "cc", + "glob", + "hex", "libc", - "pkg-config", -] - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver", + "once_cell", "serde", - "serde_json", - "thiserror", ] [[package]] name = "cc" -version = "1.0.83" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -1146,15 +1783,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1162,24 +1799,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", + "windows-targets 0.52.6", ] [[package]] name = "clap" -version = "4.4.8" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -1187,9 +1814,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.8" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -1199,85 +1826,33 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "clap_lex" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" - -[[package]] -name = "coins-bip32" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" -dependencies = [ - "bs58", - "coins-core", - "digest", - "hmac", - "k256", - "serde", - "sha2", - "thiserror", -] - -[[package]] -name = "coins-bip39" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" -dependencies = [ - "bitvec", - "coins-bip32", - "hmac", - "once_cell", - "pbkdf2 0.12.2", - "rand", - "sha2", - "thiserror", -] - -[[package]] -name = "coins-core" -version = "0.8.7" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" -dependencies = [ - "base64 0.21.5", - "bech32", - "bs58", - "digest", - "generic-array", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2", - "sha3", - "thiserror", -] +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -1297,15 +1872,15 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml 0.5.11", + "toml", "yaml-rust", ] [[package]] name = "const-hex" -version = "1.10.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" dependencies = [ "cfg-if", "cpufeatures", @@ -1316,15 +1891,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" - -[[package]] -name = "constant_time_eq" -version = "0.1.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "convert_case" @@ -1345,9 +1914,9 @@ dependencies = [ [[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", @@ -1355,24 +1924,24 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.0.1" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ "crc-catalog", ] @@ -1385,65 +1954,36 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -1473,20 +2013,11 @@ dependencies = [ "typenum", ] -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - [[package]] name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -1494,27 +2025,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] @@ -1524,23 +2055,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.2", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.9", + "parking_lot_core", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "pem-rfc7468", @@ -1549,9 +2094,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", @@ -1570,81 +2115,74 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version", - "syn 1.0.109", + "rustc_version 0.4.1", + "syn 2.0.91", ] [[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "difflib" -version = "0.4.0" +name = "derive_more" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] [[package]] -name = "digest" -version = "0.10.7" +name = "derive_more-impl" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", + "proc-macro2", + "quote", + "syn 2.0.91", + "unicode-xid", ] [[package]] -name = "dirs" -version = "5.0.1" +name = "diff" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] -name = "dirs-next" -version = "2.0.0" +name = "digest" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "cfg-if", - "dirs-sys-next", + "generic-array", ] [[package]] -name = "dirs-sys" -version = "0.4.1" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", + "block-buffer", + "const-oid", + "crypto-common", + "subtle", ] [[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "libc", - "redox_users", - "winapi", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] @@ -1654,445 +2192,99 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" [[package]] -name = "dotenvy" -version = "0.15.7" +name = "doctest-file" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" [[package]] -name = "downcast" -version = "0.11.0" +name = "dotenvy" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" +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", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" -dependencies = [ - "serde", -] - -[[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", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "ena" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" -dependencies = [ - "log", -] - -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" -dependencies = [ - "base64 0.21.5", - "bytes", - "hex", - "k256", - "log", - "rand", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest", - "hex", - "hmac", - "pbkdf2 0.11.0", - "rand", - "scrypt", - "serde", - "serde_json", - "sha2", - "sha3", - "thiserror", - "uuid 0.8.2", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5344eea9b20effb5efeaad29418215c4d27017639fd1f908260f59cbbd226e" -dependencies = [ - "ethers-addressbook", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-middleware", - "ethers-providers", - "ethers-signers", - "ethers-solc", -] - -[[package]] -name = "ethers-addressbook" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09" -dependencies = [ - "ethers-core", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "ethers-contract" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" -dependencies = [ - "const-hex", - "ethers-contract-abigen", - "ethers-contract-derive", - "ethers-core", - "ethers-providers", - "futures-util", - "once_cell", - "pin-project", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "ethers-contract-abigen" -version = "2.0.11" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" -dependencies = [ - "Inflector", - "const-hex", - "dunce", - "ethers-core", - "ethers-etherscan", - "eyre", - "prettyplease 0.2.15", - "proc-macro2", - "quote", - "regex", - "reqwest", - "serde", - "serde_json", - "syn 2.0.50", - "toml 0.8.8", - "walkdir", -] +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] -name = "ethers-contract-derive" -version = "2.0.11" +name = "ecdsa" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "Inflector", - "const-hex", - "ethers-contract-abigen", - "ethers-core", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.50", + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", ] [[package]] -name = "ethers-core" -version = "2.0.11" +name = "either" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array", - "k256", - "num_enum", - "once_cell", - "open-fastrlp", - "rand", - "rlp", "serde", - "serde_json", - "strum", - "syn 2.0.50", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", ] [[package]] -name = "ethers-etherscan" -version = "2.0.11" +name = "elliptic-curve" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "chrono", - "ethers-core", - "reqwest", - "semver", - "serde", - "serde_json", - "thiserror", - "tracing", + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", ] [[package]] -name = "ethers-middleware" -version = "2.0.11" +name = "encoding_rs" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-providers", - "ethers-signers", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "url", + "cfg-if", ] [[package]] -name = "ethers-providers" -version = "2.0.11" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.5", - "bytes", - "const-hex", - "enr", - "ethers-core", - "futures-channel", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "http", - "instant", - "jsonwebtoken", - "once_cell", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "ethers-signers" -version = "2.0.11" +name = "errno" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "const-hex", - "elliptic-curve", - "eth-keystore", - "ethers-core", - "rand", - "sha2", - "thiserror", - "tracing", + "libc", + "windows-sys 0.59.0", ] [[package]] -name = "ethers-solc" -version = "2.0.11" +name = "etcetera" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64f710586d147864cff66540a6d64518b9ff37d73ef827fee430538265b595f" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" dependencies = [ "cfg-if", - "const-hex", - "dirs", - "dunce", - "ethers-core", - "glob", "home", - "md-5", - "num_cpus", - "once_cell", - "path-slash", - "rayon", - "regex", - "semver", - "serde", - "serde_json", - "solang-parser", - "svm-rs", - "thiserror", - "tiny-keccak", - "tokio", - "tracing", - "walkdir", - "yansi", + "windows-sys 0.48.0", ] [[package]] @@ -2103,9 +2295,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "4.0.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -2114,38 +2306,41 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "event-listener 4.0.0", + "event-listener 5.3.1", "pin-project-lite", ] [[package]] -name = "eyre" -version = "0.6.9" +name = "fastrand" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" -dependencies = [ - "indenter", - "once_cell", -] +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] -name = "fastrand" -version = "1.9.0" +name = "fastrlp" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" dependencies = [ - "instant", + "arrayvec", + "auto_impl", + "bytes", ] [[package]] -name = "fastrand" -version = "2.0.1" +name = "fastrlp" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] [[package]] name = "ff" @@ -2157,12 +2352,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - [[package]] name = "fixed-hash" version = "0.8.0" @@ -2183,32 +2372,23 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", ] -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin", ] [[package]] @@ -2217,6 +2397,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2234,29 +2420,13 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[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", ] -[[package]] -name = "fragile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "funty" version = "2.0.0" @@ -2265,9 +2435,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2280,9 +2450,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2290,15 +2460,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2313,92 +2483,56 @@ checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.1", + "parking_lot", ] [[package]] name = "futures-io" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" - -[[package]] -name = "futures-lite" -version = "1.13.0" +version = "0.3.31" 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", -] +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.0.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 2.0.1", + "fastrand", "futures-core", "futures-io", - "memchr", "parking", "pin-project-lite", ] -[[package]] -name = "futures-locks" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" -dependencies = [ - "futures-channel", - "futures-task", -] - [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" - -[[package]] -name = "futures-timer" -version = "3.0.2" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2413,13 +2547,10 @@ dependencies = [ ] [[package]] -name = "fxhash" -version = "0.2.1" +name = "futures-utils-wasm" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" [[package]] name = "generic-array" @@ -2434,22 +2565,20 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.28.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2459,9 +2588,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "gloo-timers" -version = "0.2.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" dependencies = [ "futures-channel", "futures-core", @@ -2482,17 +2611,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 1.9.3", + "http 0.2.12", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -2505,26 +2634,35 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + +[[package]] +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.11", "allocator-api2", ] [[package]] -name = "hashers" -version = "1.0.1" +name = "hashbrown" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "fxhash", + "allocator-api2", + "equivalent", + "foldhash", + "serde", ] [[package]] @@ -2533,7 +2671,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.2", + "hashbrown 0.14.5", ] [[package]] @@ -2545,23 +2683,44 @@ dependencies = [ "unicode-segmentation", ] +[[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 = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +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 = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -2570,47 +2729,81 @@ dependencies = [ name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ - "digest", + "bytes", + "fnv", + "itoa", ] [[package]] -name = "home" -version = "0.5.5" +name = "http-body" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ - "windows-sys 0.48.0", + "bytes", + "http 0.2.12", + "pin-project-lite", ] [[package]] -name = "http" -version = "0.2.11" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "fnv", - "itoa", + "http 1.2.0", ] [[package]] -name = "http-body" -version = "0.4.5" +name = "http-body-util" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "http", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2620,22 +2813,22 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2", "tokio", "tower-service", "tracing", @@ -2643,17 +2836,22 @@ dependencies = [ ] [[package]] -name = "hyper-rustls" -version = "0.24.2" +name = "hyper" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ + "bytes", + "futures-channel", "futures-util", - "http", - "hyper", - "rustls 0.21.9", + "http 1.2.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", "tokio", - "tokio-rustls 0.24.1", + "want", ] [[package]] @@ -2662,7 +2860,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.32", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -2670,22 +2868,44 @@ dependencies = [ [[package]] name = "hyper-tls" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", - "hyper", + "http-body-util", + "hyper 1.5.2", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.5.2", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2705,117 +2925,207 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] [[package]] -name = "idna" -version = "0.4.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "impl-codec" -version = "0.6.0" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ - "parity-scale-codec", + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "impl-rlp" -version = "0.3.0" +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 = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ - "rlp", + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", ] [[package]] -name = "impl-serde" -version = "0.4.0" +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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ - "serde", + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" +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 = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] -name = "indenter" -version = "0.3.3" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "indexmap" -version = "1.9.3" +name = "idna" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "indexmap" -version = "2.1.0" +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "equivalent", - "hashbrown 0.14.2", - "serde", + "icu_normalizer", + "icu_properties", ] [[package]] -name = "inherent" -version = "1.0.10" +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-more" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce243b1bfa62ffc028f1cc3b6034ec63d649f3031bc8a4fbbb004e1ac17d1f68" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] -name = "inout" -version = "0.1.3" +name = "indexmap" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "generic-array", + "autocfg", + "hashbrown 0.12.3", + "serde", ] [[package]] -name = "instant" -version = "0.1.12" +name = "indexmap" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "inherent" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] @@ -2825,32 +3135,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" [[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "interprocess" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +checksum = "894148491d817cb36b6f778017b8ac46b17408d522dd90f539d677ea938362eb" dependencies = [ - "hermit-abi", + "doctest-file", + "futures-core", "libc", - "windows-sys 0.48.0", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", ] [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] -name = "is-terminal" -version = "0.4.9" +name = "is_terminal_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix 0.38.24", - "windows-sys 0.48.0", -] +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -2863,34 +3172,44 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +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 = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2905,43 +3224,38 @@ dependencies = [ "serde", ] -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.5", - "pem", - "ring 0.16.20", - "serde", - "serde_json", - "simple_asn1", -] - [[package]] name = "k256" -version = "0.13.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", "once_cell", "sha2", - "signature", ] [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "keccak-hash" version = "0.10.0" @@ -2961,34 +3275,6 @@ dependencies = [ "log", ] -[[package]] -name = "lalrpop" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" -dependencies = [ - "ascii-canvas", - "bit-set", - "diff", - "ena", - "is-terminal", - "itertools 0.10.5", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax 0.7.5", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "lalrpop-util" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" - [[package]] name = "language-tags" version = "0.3.2" @@ -2997,35 +3283,24 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] name = "libc" -version = "0.2.150" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libredox" -version = "0.0.1" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" -dependencies = [ - "bitflags 2.4.1", - "libc", - "redox_syscall 0.4.1", -] +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libsqlite3-sys" @@ -3046,15 +3321,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] -name = "linux-raw-sys" -version = "0.4.11" +name = "litemap" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "local-channel" @@ -3075,9 +3350,9 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[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", @@ -3085,106 +3360,58 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" dependencies = [ "value-bag", ] [[package]] name = "lru" -version = "0.12.2" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.2", + "hashbrown 0.15.2", ] [[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 = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.9.0" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "autocfg", + "regex-automata 0.1.10", ] [[package]] -name = "mime" -version = "0.3.17" +name = "matchit" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] -name = "mime_guess" -version = "2.0.4" +name = "md-5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "mime", - "unicase", + "cfg-if", + "digest 0.10.7", ] [[package]] -name = "minicbor" -version = "0.18.0" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a20020e8e2d1881d8736f64011bb5ff99f1db9947ce3089706945c8915695cb" -dependencies = [ - "minicbor-derive", -] +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "minicbor-derive" -version = "0.12.0" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8608fb1c805b5b6b3d5ab7bd95c40c396df622b64d77b2d621a5eae1eed050ee" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -3194,59 +3421,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.9" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "log", "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mismatch" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7703ac44509e7daa98776efae839db0d6835ffb742bec050c62b28a958d465bd" -dependencies = [ - "thiserror", -] - -[[package]] -name = "mockall" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" -dependencies = [ - "cfg-if", - "downcast", - "fragile", - "lazy_static", - "mockall_derive", - "predicates", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 1.0.109", + "windows-sys 0.52.0", ] [[package]] @@ -3263,11 +3454,10 @@ checksum = "6d02c0b00610773bb7fc61d85e13d86c7858cbdf00e1a120bfc41bc055dbaa0e" [[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", @@ -3279,25 +3469,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "new_debug_unreachable" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" - -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", - "pin-utils", -] - [[package]] name = "nom" version = "7.1.3" @@ -3308,12 +3479,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "normalize-line-endings" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -3326,11 +3491,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -3360,19 +3524,18 @@ 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.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -3381,9 +3544,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -3395,78 +3558,65 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] [[package]] name = "num_enum" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] -name = "object" -version = "0.32.1" +name = "nybbles" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "55a62e678a89501192cc5ebf47dcbc656b608ae5e1c61c9251fe35230f119fe3" dependencies = [ - "memchr", + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", ] [[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "open-fastrlp" -version = "0.1.4" +name = "object" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", + "memchr", ] [[package]] -name = "open-fastrlp-derive" -version = "0.1.1" +name = "once_cell" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.60" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -3483,7 +3633,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] @@ -3494,9 +3644,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.96" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -3526,7 +3676,7 @@ dependencies = [ "once_cell", "opentelemetry", "opentelemetry-semantic-conventions", - "thiserror", + "thiserror 1.0.69", "thrift", "tokio", ] @@ -3552,7 +3702,7 @@ dependencies = [ "indexmap 1.9.3", "once_cell", "pin-project-lite", - "thiserror", + "thiserror 1.0.69", "urlencoding", ] @@ -3564,7 +3714,7 @@ checksum = "8b3a2a91fdbfdd4d212c0dcc2ab540de2c2bcbbd90be17de7a7daf8822d010c1" dependencies = [ "async-trait", "crossbeam-channel", - "dashmap", + "dashmap 5.5.3", "fnv", "futures-channel", "futures-executor", @@ -3573,17 +3723,11 @@ dependencies = [ "opentelemetry_api", "percent-encoding", "rand", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - [[package]] name = "ordered-float" version = "2.10.1" @@ -3629,11 +3773,11 @@ version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] @@ -3644,9 +3788,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arrayvec", "bitvec", @@ -3658,11 +3802,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro2", "quote", "syn 1.0.109", @@ -3670,117 +3814,44 @@ dependencies = [ [[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.11.2" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[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 0.9.9", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[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 0.4.1", + "redox_syscall", "smallvec", - "windows-targets 0.48.5", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core", - "subtle", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "path-slash" -version = "0.2.1" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest", - "hmac", - "password-hash", - "sha2", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest", - "hmac", -] - -[[package]] -name = "pem" -version = "1.1.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pem-rfc7468" @@ -3793,26 +3864,26 @@ dependencies = [ [[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.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror", + "thiserror 2.0.9", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.5" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" dependencies = [ "pest", "pest_generator", @@ -3820,22 +3891,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.5" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "pest_meta" -version = "2.7.5" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" dependencies = [ "once_cell", "pest", @@ -3844,12 +3915,12 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.7.0", ] [[package]] @@ -3859,85 +3930,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared 0.11.2", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared 0.11.2", - "proc-macro2", - "quote", - "syn 2.0.50", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", + "rustc_version 0.4.1", ] [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -3947,12 +3967,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand", "futures-io", ] @@ -3979,38 +3999,23 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "polling" -version = "2.8.0" +version = "0.3.31" 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", -] +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polling" -version = "3.3.1" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.24", + "rustix", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4021,51 +4026,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "predicates" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" -dependencies = [ - "difflib", - "float-cmp", - "itertools 0.10.5", - "normalize-line-endings", - "predicates-core", - "regex", -] - -[[package]] -name = "predicates-core" -version = "1.0.6" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" - -[[package]] -name = "predicates-tree" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "predicates-core", - "termtree", + "zerocopy", ] [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", @@ -4083,12 +4055,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.15" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] @@ -4098,30 +4070,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "impl-codec", + "uint", ] [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.20.7", + "toml_edit", ] [[package]] @@ -4148,43 +4107,69 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "prometheus" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" dependencies = [ "cfg-if", "fnv", "lazy_static", "memchr", - "parking_lot 0.12.1", + "parking_lot", "protobuf", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "proptest" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ - "bitflags 2.4.1", + "bit-set", + "bit-vec", + "bitflags 2.6.0", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.2", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", "unarray", ] @@ -4195,7 +4180,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive 0.12.6", ] [[package]] @@ -4205,15 +4200,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" dependencies = [ "bytes", - "heck", + "heck 0.4.1", "itertools 0.10.5", "lazy_static", "log", "multimap", "petgraph", "prettyplease 0.1.25", - "prost", - "prost-types", + "prost 0.11.9", + "prost-types 0.11.9", "regex", "syn 1.0.109", "tempfile", @@ -4233,13 +4228,46 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "prost-reflect" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057237efdb71cf4b3f9396302a3d6599a92fa94063ba537b66130980ea9909f3" +dependencies = [ + "once_cell", + "prost 0.12.6", + "prost-types 0.12.6", +] + [[package]] name = "prost-types" version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" dependencies = [ - "prost", + "prost 0.11.9", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost 0.12.6", ] [[package]] @@ -4268,11 +4296,17 @@ dependencies = [ "syn 1.0.109", ] +[[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" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -4292,6 +4326,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -4323,64 +4358,30 @@ dependencies = [ ] [[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.2.16" +name = "recvmsg" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" [[package]] name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.4" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "getrandom", - "libredox", - "thiserror", + "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -4394,139 +4395,79 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.5", ] [[package]] -name = "regex-syntax" -version = "0.6.29" +name = "regex-lite" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "relative-path" -version = "1.9.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c707298afce11da2efef2f600116fa93ffa7a032b5d7b628aa17711ec81383ca" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rend" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ "bytecheck", ] [[package]] name = "reqwest" -version = "0.11.22" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ - "base64 0.21.5", + "base64 0.22.1", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.2", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", "mime", - "mime_guess", "native-tls", "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.9", - "rustls-pemfile", + "rustls-pemfile 2.2.0", "serde", "serde_json", "serde_urlencoded", - "system-configuration", + "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", - "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", - "winreg", -] - -[[package]] -name = "reqwest-middleware" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a3e86aa6053e59030e7ce2d2a3b258dd08fc2d337d52f73f6cb480f5858690" -dependencies = [ - "anyhow", - "async-trait", - "http", - "reqwest", - "serde", - "task-local-extensions", - "thiserror", -] - -[[package]] -name = "reqwest-retry" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9af20b65c2ee9746cc575acb6bd28a05ffc0d15e25c992a8f4462d8686aacb4f" -dependencies = [ - "anyhow", - "async-trait", - "chrono", - "futures", - "getrandom", - "http", - "hyper", - "parking_lot 0.11.2", - "reqwest", - "reqwest-middleware", - "retry-policies", - "task-local-extensions", - "tokio", - "tracing", - "wasm-timer", -] - -[[package]] -name = "retry-policies" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17dd00bff1d737c40dbcd47d4375281bf4c17933f9eef0a185fc7bacca23ecbd" -dependencies = [ - "anyhow", - "chrono", - "rand", + "windows-registry", ] [[package]] @@ -4541,64 +4482,42 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[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 0.9.8", - "untrusted 0.9.0", - "windows-sys 0.48.0", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest", + "spin", + "untrusted", + "windows-sys 0.52.0", ] [[package]] name = "rkyv" -version = "0.7.42" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" dependencies = [ "bitvec", "bytecheck", + "bytes", "hashbrown 0.12.3", "ptr_meta", "rend", "rkyv_derive", "seahash", "tinyvec", - "uuid 1.6.1", + "uuid", ] [[package]] name = "rkyv_derive" -version = "0.7.42" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ "proc-macro2", "quote", @@ -4612,21 +4531,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", - "rlp-derive", "rustc-hex", ] -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "ron" version = "0.7.1" @@ -4640,12 +4547,12 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.3" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ef35bf3e7fe15a53c4ab08a998e42271eab13eb0db224126bc7bc4c4bad96d" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", - "digest", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-traits", @@ -4659,33 +4566,36 @@ dependencies = [ ] [[package]] -name = "rstest" -version = "0.18.2" +name = "ruint" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" +checksum = "f5ef8fb1dd8de3870cb8400d51b4c2023854bbafd5431a3ac7e7317243e22d2f" dependencies = [ - "futures", - "futures-timer", - "rstest_macros", - "rustc_version", + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", ] [[package]] -name = "rstest_macros" -version = "0.18.2" +name = "ruint-macro" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" -dependencies = [ - "cfg-if", - "glob", - "proc-macro2", - "quote", - "regex", - "relative-path", - "rustc_version", - "syn 2.0.50", - "unicode-ident", -] +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rust-ini" @@ -4699,9 +4609,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.33.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06676aec5ccb8fc1da723cc8c0f9a46549f21ebb8753d3915c6c41db1e7f1dc4" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" dependencies = [ "arrayvec", "borsh", @@ -4715,9 +4625,15 @@ dependencies = [ [[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 = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc-hex" @@ -4727,156 +4643,147 @@ checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" dependencies = [ - "semver", + "semver 0.11.0", ] [[package]] -name = "rustix" -version = "0.37.27" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", + "semver 1.0.24", ] [[package]] name = "rustix" -version = "0.38.24" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.11", - "windows-sys 0.48.0", + "linux-raw-sys", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.20.9" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ - "log", - "ring 0.16.20", + "ring", + "rustls-webpki 0.101.7", "sct", - "webpki", ] [[package]] name = "rustls" -version = "0.21.9" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ - "log", - "ring 0.17.5", - "rustls-webpki", - "sct", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", ] [[package]] -name = "rustls-native-certs" -version = "0.6.3" +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", + "base64 0.21.7", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.5", + "rustls-pki-types", ] +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + [[package]] name = "rustls-webpki" version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.15" +name = "rustls-webpki" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] [[package]] -name = "salsa20" -version = "0.10.2" +name = "rustversion" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] -name = "same-file" -version = "1.0.6" +name = "rusty-fork" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" dependencies = [ - "winapi-util", + "fnv", + "quick-error", + "tempfile", + "wait-timeout", ] [[package]] -name = "scale-info" -version = "2.10.0" +name = "ryu" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] -name = "scale-info-derive" -version = "2.10.0" +name = "schannel" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", + "windows-sys 0.59.0", ] [[package]] -name = "schannel" -version = "0.1.22" +name = "schnellru" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" dependencies = [ - "windows-sys 0.48.0", + "ahash 0.8.11", + "cfg-if", + "hashbrown 0.13.2", ] [[package]] @@ -4885,46 +4792,34 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "pbkdf2 0.11.0", - "salsa20", - "sha2", -] - [[package]] name = "sct" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] name = "sea-bae" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" +checksum = "f694a6ab48f14bc063cfadff30ab551d3c7e46d8f81836c51989d548f44a2a25" dependencies = [ - "heck", - "proc-macro-error", + "heck 0.4.1", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "sea-orm" -version = "0.12.7" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a7b021d2dbc5d04a5d9f6a177e7d5ab36e31b3f27d20a3655ac9181366eaad4" +checksum = "c8814e37dc25de54398ee62228323657520b7f29713b8e238649385dbe473ee0" dependencies = [ "async-stream", "async-trait", @@ -4940,19 +4835,19 @@ dependencies = [ "serde", "serde_json", "sqlx", - "strum", - "thiserror", + "strum 0.25.0", + "thiserror 1.0.69", "time", "tracing", "url", - "uuid 1.6.1", + "uuid", ] [[package]] name = "sea-orm-cli" -version = "0.12.6" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507c2b99f83129f4d5d511012ab47c9f40d1c7923fd4698c19fae23f0bf62913" +checksum = "620bc560062ae251b1366bde43b3f1508445cab5c2c8cbdb397034638ab1b357" dependencies = [ "chrono", "clap", @@ -4967,23 +4862,23 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "0.12.6" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816183a751bf9c22087679b20b6142da0b5c6d8981835ebb7b99bf1bf924640a" +checksum = "5e115c6b078e013aa963cc2d38c196c2c40b05f03d0ac872fe06b6e0d5265603" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "sea-bae", - "syn 2.0.50", + "syn 2.0.91", "unicode-ident", ] [[package]] name = "sea-orm-migration" -version = "0.12.6" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d45937e5d4869a0dcf0222bb264df564c077cbe9b312265f3717401d023a633" +checksum = "ee8269bc6ff71afd6b78aa4333ac237a69eebd2cdb439036291e64fb4b8db23c" dependencies = [ "async-trait", "clap", @@ -4998,9 +4893,9 @@ dependencies = [ [[package]] name = "sea-query" -version = "0.30.3" +version = "0.30.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3472e143a83f7f03d306dcc62af88c5afdcd7e35f96ef0001a806fe244b3b15a" +checksum = "4166a1e072292d46dc91f31617c2a1cdaf55a8be4b5c9f4bf2ba248e3ac4999b" dependencies = [ "bigdecimal", "chrono", @@ -5011,7 +4906,7 @@ dependencies = [ "sea-query-derive", "serde_json", "time", - "uuid 1.6.1", + "uuid", ] [[package]] @@ -5027,27 +4922,28 @@ dependencies = [ "serde_json", "sqlx", "time", - "uuid 1.6.1", + "uuid", ] [[package]] name = "sea-query-derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a82fcb49253abcb45cdcb2adf92956060ec0928635eb21b4f7a6d8f25ab0bc" +checksum = "9834af2c4bd8c5162f00c89f1701fb6886119a88062cf76fe842ea9e232b9839" dependencies = [ - "heck", + "darling", + "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.50", - "thiserror", + "syn 2.0.91", + "thiserror 1.0.69", ] [[package]] name = "sea-schema" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cd9561232bd1b82ea748b581f15909d11de0db6563ddcf28c5d908aee8282f1" +checksum = "30d148608012d25222442d1ebbfafd1228dbc5221baf4ec35596494e27a2394e" dependencies = [ "futures", "sea-query", @@ -5060,7 +4956,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f686050f76bffc4f635cda8aea6df5548666b830b52387e8bc7de11056d11e" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "syn 1.0.109", @@ -5088,11 +4984,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -5101,9 +4997,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -5111,18 +5007,27 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "serde", + "semver-parser", ] [[package]] -name = "send_wrapper" -version = "0.4.0" +name = "semver" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" + +[[package]] +name = "semver-parser" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] [[package]] name = "send_wrapper" @@ -5132,44 +5037,36 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -5200,19 +5097,19 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.6.1" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64 0.21.5", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", - "serde_with_macros 3.6.1", + "serde_with_macros 3.11.0", "time", ] @@ -5225,28 +5122,28 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "serde_with_macros" -version = "3.6.1" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "serde_yaml" -version = "0.9.27" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -5261,7 +5158,7 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -5272,7 +5169,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -5281,10 +5178,20 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -5294,48 +5201,36 @@ 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", ] [[package]] name = "signature" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe458c98333f9c8152221191a77e2a44e8325d0193484af2e9421a53019e57d" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] [[package]] name = "simdutf8" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" - -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror", - "time", -] - -[[package]] -name = "siphasher" -version = "0.3.11" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slab" @@ -5348,80 +5243,23 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" - -[[package]] -name = "socket2" -version = "0.4.10" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" dependencies = [ - "libc", - "winapi", + "serde", ] [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "solang-parser" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" -dependencies = [ - "itertools 0.11.0", - "lalrpop", - "lalrpop-util", - "phf", - "thiserror", - "unicode-xid", -] - -[[package]] -name = "solidity-metadata" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18f0ee752c2f80c87498dba10c2120492c42073f73b37ffb49e79fcd1e91bff3" -dependencies = [ - "blockscout-display-bytes", - "minicbor", - "semver", - "thiserror", -] - -[[package]] -name = "sourcify" -version = "0.1.0" -source = "git+https://github.com/blockscout/blockscout-rs?rev=34827ae#34827ae1c21407e8712a788bf1c7ccef5fca3920" -dependencies = [ - "anyhow", - "blockscout-display-bytes", - "bytes", - "reqwest", - "reqwest-middleware", - "reqwest-retry", - "serde", - "serde_json", - "thiserror", - "tracing", - "url", + "windows-sys 0.52.0", ] -[[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" @@ -5433,9 +5271,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -5443,20 +5281,19 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.2" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7b278788e7be4d0d29c0f39497a0eef3fba6bbc8e70d8bf7fde46edeaa9e85" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ - "itertools 0.11.0", "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" dependencies = [ "sqlx-core", "sqlx-macros", @@ -5467,11 +5304,11 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.11", "atoi", "bigdecimal", "byteorder", @@ -5479,7 +5316,6 @@ dependencies = [ "chrono", "crc", "crossbeam-queue", - "dotenvy", "either", "event-listener 2.5.3", "futures-channel", @@ -5489,35 +5325,35 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.1.0", + "indexmap 2.7.0", "log", "memchr", "once_cell", "paste", "percent-encoding", "rust_decimal", - "rustls 0.21.9", - "rustls-pemfile", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", "serde_json", "sha2", "smallvec", "sqlformat", - "thiserror", + "thiserror 1.0.69", "time", "tokio", "tokio-stream", "tracing", "url", - "uuid 1.6.1", - "webpki-roots", + "uuid", + "webpki-roots 0.25.4", ] [[package]] name = "sqlx-macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" dependencies = [ "proc-macro2", "quote", @@ -5528,14 +5364,13 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" dependencies = [ - "atomic-write-file", "dotenvy", "either", - "heck", + "heck 0.4.1", "hex", "once_cell", "proc-macro2", @@ -5555,19 +5390,19 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", - "base64 0.21.5", + "base64 0.21.7", "bigdecimal", - "bitflags 2.4.1", + "bitflags 2.6.0", "byteorder", "bytes", "chrono", "crc", - "digest", + "digest 0.10.7", "dotenvy", "either", "futures-channel", @@ -5593,23 +5428,23 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 1.0.69", "time", "tracing", - "uuid 1.6.1", + "uuid", "whoami", ] [[package]] name = "sqlx-postgres" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", - "base64 0.21.5", + "base64 0.21.7", "bigdecimal", - "bitflags 2.4.1", + "bitflags 2.6.0", "byteorder", "chrono", "crc", @@ -5633,23 +5468,22 @@ dependencies = [ "rust_decimal", "serde", "serde_json", - "sha1", "sha2", "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 1.0.69", "time", "tracing", - "uuid 1.6.1", + "uuid", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" dependencies = [ "atoi", "chrono", @@ -5668,92 +5502,71 @@ dependencies = [ "tracing", "url", "urlencoding", - "uuid 1.6.1", + "uuid", ] [[package]] -name = "static_assertions" -version = "1.1.0" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] -name = "string_cache" -version = "0.8.7" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" -dependencies = [ - "new_debug_unreachable", - "once_cell", - "parking_lot 0.12.1", - "phf_shared 0.10.0", - "precomputed-hash", -] +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[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 = "strum" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "svm-rs" -version = "0.3.3" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20689c7d03b6461b502d0b95d6c24874c7d24dea2688af80486a130a06af3b07" -dependencies = [ - "dirs", - "fs2", - "hex", - "once_cell", - "reqwest", - "semver", - "serde", - "serde_json", - "sha2", - "thiserror", - "url", - "zip", -] +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -5768,9 +5581,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.50" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -5778,15 +5591,15 @@ dependencies = [ ] [[package]] -name = "syn_derive" -version = "0.1.8" +name = "syn-solidity" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "219389c1ebe89f8333df8bdfb871f6631c552ff399c23cac02480b6088aad8f0" dependencies = [ - "proc-macro-error", + "paste", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] @@ -5796,24 +5609,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] -name = "system-configuration" -version = "0.5.1" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", + "futures-core", ] [[package]] -name = "system-configuration-sys" -version = "0.5.0" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "core-foundation-sys", - "libc", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] @@ -5822,70 +5634,64 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "task-local-extensions" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" -dependencies = [ - "pin-utils", -] - [[package]] name = "tempfile" -version = "3.8.1" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.0.1", - "redox_syscall 0.4.1", - "rustix 0.38.24", - "windows-sys 0.48.0", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", ] [[package]] -name = "term" -version = "0.7.0" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "dirs-next", - "rustversion", - "winapi", + "thiserror-impl 1.0.69", ] [[package]] -name = "termtree" -version = "0.4.1" +name = "thiserror" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", +] [[package]] -name = "thiserror" -version = "1.0.50" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[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", @@ -5915,9 +5721,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -5936,9 +5742,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -5953,11 +5759,21 @@ 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 = "tinyvec" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -5970,21 +5786,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", - "parking_lot 0.12.1", + "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5999,13 +5814,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] @@ -6020,126 +5835,77 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.9", - "tokio", - "webpki", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.21.9", + "rustls 0.23.20", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", ] [[package]] name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "rustls 0.21.9", - "tokio", - "tokio-rustls 0.24.1", - "tungstenite", - "webpki-roots", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.8.8" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.21.0", +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "rustls 0.23.20", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.7", ] [[package]] -name = "toml_datetime" -version = "0.6.5" +name = "tokio-util" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ - "serde", + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] -name = "toml_edit" -version = "0.19.15" +name = "toml" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "indexmap 2.1.0", - "toml_datetime", - "winnow", + "serde", ] [[package]] -name = "toml_edit" -version = "0.20.7" +name = "toml_datetime" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap 2.1.0", - "toml_datetime", - "winnow", -] +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.1.0", - "serde", - "serde_spanned", + "indexmap 2.7.0", "toml_datetime", "winnow", ] @@ -6158,21 +5924,18 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "hyper-timeout", "percent-encoding", "pin-project", - "prost", - "prost-derive", - "rustls-native-certs", - "rustls-pemfile", + "prost 0.11.9", + "prost-derive 0.11.9", "tokio", - "tokio-rustls 0.23.4", "tokio-stream", "tokio-util", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -6212,23 +5975,37 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -6238,20 +6015,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -6305,9 +6082,9 @@ dependencies = [ [[package]] name = "tracing-serde" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", @@ -6315,9 +6092,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -6336,27 +6113,27 @@ 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 = "tungstenite" -version = "0.20.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 1.2.0", "httparse", "log", "rand", - "rustls 0.21.9", + "rustls 0.23.20", + "rustls-pki-types", "sha1", - "thiserror", - "url", + "thiserror 1.0.69", "utf-8", ] @@ -6368,9 +6145,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -6390,47 +6167,44 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unicode_categories" @@ -6440,15 +6214,9 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "unsafe-libyaml" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" - -[[package]] -name = "untrusted" -version = "0.7.1" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" @@ -6458,9 +6226,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -6484,43 +6252,24 @@ dependencies = [ name = "user-ops-indexer-logic" version = "0.1.0" dependencies = [ + "alloy", "anyhow", "async-trait", "atoi", "blockscout-db", - "blockscout-display-bytes", "blockscout-service-launcher", - "bytes", "chrono", - "ethabi", - "ethers", - "ethers-core", "futures", - "hex", - "itertools 0.11.0", - "keccak-hash", "lazy_static", "lru", - "mismatch", - "mockall", "num-traits", "pretty_assertions", - "prometheus", - "reqwest", - "rstest", "sea-orm", - "semver", "serde", "serde_json", - "serde_with 3.6.1", - "solidity-metadata", - "thiserror", + "serde_with 3.11.0", "tokio", - "tokio-stream", - "tonic", "tracing", - "tracing-subscriber", - "url", "user-ops-indexer-entity", "user-ops-indexer-migration", "user-ops-indexer-proto", @@ -6543,7 +6292,7 @@ dependencies = [ "actix-prost-macros", "actix-web", "async-trait", - "prost", + "prost 0.11.9", "prost-build", "serde", "serde_with 2.3.3", @@ -6556,34 +6305,18 @@ name = "user-ops-indexer-server" version = "0.1.0" dependencies = [ "actix-web", - "amplify", + "alloy", "anyhow", "async-trait", - "blockscout-display-bytes", "blockscout-service-launcher", - "bytes", - "config", - "ethers", - "hex", - "keccak-hash", - "mockall", - "pretty_assertions", - "rand", - "reqwest", - "rstest", "sea-orm", "serde", - "serde_json", - "serde_with 2.3.3", - "sourcify", "tokio", - "tokio-stream", "tonic", "tracing", "user-ops-indexer-logic", "user-ops-indexer-migration", "user-ops-indexer-proto", - "uuid 1.6.1", ] [[package]] @@ -6593,26 +6326,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "utf8parse" -version = "0.2.1" +name = "utf16_iter" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" [[package]] -name = "uuid" -version = "0.8.2" +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom", - "serde", -] +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.6.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", "serde", @@ -6626,9 +6361,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.4.2" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" [[package]] name = "vcpkg" @@ -6638,24 +6373,17 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "waker-fn" -version = "1.1.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "walkdir" -version = "2.4.0" +name = "wait-timeout" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" dependencies = [ - "same-file", - "winapi-util", + "libc", ] [[package]] @@ -6673,48 +6401,55 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6722,63 +6457,61 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] -name = "wasm-timer" -version = "0.2.5" +name = "wasmtimer" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" dependencies = [ "futures", "js-sys", - "parking_lot 0.11.2", + "parking_lot", "pin-utils", + "slab", "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", ] [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] -name = "webpki" -version = "0.22.4" +name = "webpki-roots" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" -dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "which" @@ -6789,14 +6522,24 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.24", + "rustix", ] [[package]] name = "whoami" -version = "1.4.1" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", +] + +[[package]] +name = "widestring" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -6815,27 +6558,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] -name = "winapi-util" -version = "0.1.6" +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 = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "winapi", + "windows-targets 0.52.6", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] [[package]] -name = "windows-core" -version = "0.51.1" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -6853,7 +6617,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -6873,17 +6646,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -6894,9 +6668,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -6906,9 +6680,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -6918,9 +6692,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -6930,9 +6710,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -6942,9 +6722,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -6954,9 +6734,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -6966,28 +6746,30 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] [[package]] -name = "winreg" -version = "0.50.0" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "ws_stream_wasm" @@ -7000,9 +6782,9 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version", - "send_wrapper 0.6.0", - "thiserror", + "rustc_version 0.4.1", + "send_wrapper", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -7028,99 +6810,141 @@ dependencies = [ [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", +] [[package]] name = "zerocopy" -version = "0.7.26" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.26" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.91", + "synstructure", ] [[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", +] [[package]] -name = "zip" -version = "0.6.6" +name = "zeroize_derive" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd 0.11.2+zstd.1.5.2", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" +name = "zerovec" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ - "zstd-safe 5.0.2+zstd.1.5.2", + "yoke", + "zerofrom", + "zerovec-derive", ] [[package]] -name = "zstd" -version = "0.12.4" +name = "zerovec-derive" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ - "zstd-safe 6.0.6", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" +name = "zstd" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ - "libc", - "zstd-sys", + "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.6" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ - "libc", "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/user-ops-indexer/README.md b/user-ops-indexer/README.md index ff68d389e..6045bcac5 100644 --- a/user-ops-indexer/README.md +++ b/user-ops-indexer/README.md @@ -71,6 +71,7 @@ found [here](../docs/common-envs.md). | `USER_OPS_INDEXER__INDEXER__PAST_DB_LOGS_INDEXER__ENABLED` | | Enable one-time reindex of missed user operations from core Blockscout DB. Will query relevant events from `logs` Postgres table | `false` | | `USER_OPS_INDEXER__INDEXER__PAST_DB_LOGS_INDEXER__START_BLOCK` | | Block range start for one-time DB reindex. Use positive number for static block number, or zero/negative number to count backwards from `latest` | `0` | | `USER_OPS_INDEXER__INDEXER__PAST_DB_LOGS_INDEXER__END_BLOCK` | | Block range end for one-time DB reindex. Use positive number for static block number, or zero/negative number to count backwards from `latest` | `0` | +| `USER_OPS_INDEXER__INDEXER__TRACE_CLIENT` | | Node client variant to use for tracing transactions, `Geth` for using `debug_traceTransaction`, `Parity` for using `trace_transaction` | Depends on `web3_clientVersion` | | `USER_OPS_INDEXER__DATABASE__CONNECT__URL` | true | Postgres connect URL to Blockscout DB with read/write access | (empty) | | `USER_OPS_INDEXER__DATABASE__CREATE_DATABASE` | | Create database if doesn't exist | `false` | | `USER_OPS_INDEXER__DATABASE__RUN_MIGRATIONS` | | Run database migrations | `false` | diff --git a/user-ops-indexer/user-ops-indexer-logic/Cargo.toml b/user-ops-indexer/user-ops-indexer-logic/Cargo.toml index d99c10e3f..03a18bd4b 100644 --- a/user-ops-indexer/user-ops-indexer-logic/Cargo.toml +++ b/user-ops-indexer/user-ops-indexer-logic/Cargo.toml @@ -12,12 +12,6 @@ blockscout-db = { git = "https://github.com/blockscout/blockscout-rs", rev = "bb atoi = "2.0.0" anyhow = "1.0" -blockscout-display-bytes = "1.0" -bytes = "1.2" -ethabi = "18.0" -ethers-core = "2.0.0" -hex = "0.4" -mismatch = "1.0" sea-orm = { version = "0.12.2", features = [ "sqlx-postgres", "runtime-tokio-rustls", @@ -25,37 +19,24 @@ sea-orm = { version = "0.12.2", features = [ "postgres-array", ] } futures = "0.3" -keccak-hash = "0.10.0" lazy_static = "1" -prometheus = "0.13" -reqwest = "0.11.18" -semver = "1.0" serde = "1.0" serde_json = "1.0" -solidity-metadata = "1.0" -thiserror = "1.0" tokio = { version = "1.22", features = ["sync"] } -tonic = { version = "0.8", features = ["tls-roots"] } tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } -ethers = { version = "2.0.11", features = ["ws"] } num-traits = "0.2.17" -itertools = "0.11.0" chrono = "0.4.31" lru = "0.12.2" async-trait = "0.1.77" serde_with = "3.6.1" +alloy = { version = "0.8.2", features = ["full", "provider-debug-api", "provider-trace-api"] } [dev-dependencies] async-trait = "0.1" blockscout-service-launcher = { workspace = true, features = ["test-database", "database-0_12"] } user-ops-indexer-migration = { path = "../user-ops-indexer-migration" } -mockall = "0.11" pretty_assertions = "1.3" -rstest = "0.18.0" sea-orm = { version = "*", features = ["mock"] } -tokio-stream = { version = "0.1", features = ["net"] } -url = "2.4.0" [features] # When activated includes helper methods for tests and benchmarking diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs index c9f6c3cfc..f37406ce1 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs @@ -1,19 +1,19 @@ use crate::{ indexer::{ - common_transport::CommonTransport, - rpc_utils::{to_string, CallTracer, TraceType}, + rpc_utils::{CallTracer, TraceClient, TraceType}, settings::IndexerSettings, }, repository, types::user_op::UserOp, }; -use anyhow::{anyhow, bail}; -use ethers::prelude::{ - abi::{AbiEncode, Error}, - parse_log, - types::{Address, Bytes, Filter, Log, TransactionReceipt}, - EthEvent, Middleware, NodeClient, Provider, ProviderError, WsClientError, H256, +use alloy::{ + consensus::Transaction, + primitives::{Address, BlockHash, Bytes, TxHash, B256}, + providers::Provider, + rpc::types::{Filter, Log, TransactionReceipt}, + sol_types::SolEvent, }; +use anyhow::{anyhow, bail}; use futures::{ stream, stream::{repeat_with, BoxStream}, @@ -26,15 +26,15 @@ use tracing::instrument; #[derive(Hash, Eq, PartialEq)] struct Job { - tx_hash: H256, - block_hash: H256, + tx_hash: TxHash, + block_hash: BlockHash, } -impl From for Job { - fn from(hash: H256) -> Self { +impl From for Job { + fn from(hash: TxHash) -> Self { Self { tx_hash: hash, - block_hash: H256::zero(), + block_hash: BlockHash::ZERO, } } } @@ -43,7 +43,7 @@ impl TryFrom for Job { type Error = anyhow::Error; fn try_from(log: Log) -> Result { - if log.removed == Some(true) { + if log.removed { bail!("unexpected pending log") } let tx_hash = log @@ -63,9 +63,9 @@ pub trait IndexerLogic { fn entry_point(&self) -> Address; fn version() -> &'static str; - fn user_operation_event_signature() -> H256; + fn user_operation_event_signature() -> B256; - fn before_execution_signature() -> H256; + fn before_execution_signature() -> B256; fn matches_handler_calldata(calldata: &Bytes) -> bool; @@ -77,18 +77,18 @@ pub trait IndexerLogic { log_bundle: &[&[Log]], ) -> anyhow::Result>; fn user_operation_event_matcher(&self, log: &Log) -> bool { - log.address == self.entry_point() - && log.topics.first() == Some(&Self::user_operation_event_signature()) + log.address() == self.entry_point() + && log.topics().first() == Some(&Self::user_operation_event_signature()) } fn before_execution_matcher(&self, log: &Log) -> bool { - log.address == self.entry_point() - && log.topics.first() == Some(&Self::before_execution_signature()) + log.address() == self.entry_point() + && log.topics().first() == Some(&Self::before_execution_signature()) } - fn match_and_parse(&self, log: &Log) -> Option> { - if log.address == self.entry_point() && log.topics.first() == Some(&T::signature()) { - Some(parse_log::(log.clone())) + fn match_and_parse(&self, log: &Log) -> Option> { + if log.address() == self.entry_point() && log.topic0() == Some(&T::SIGNATURE_HASH) { + Some(T::decode_log(&log.inner, true).map(|l| l.data)) } else { None } @@ -96,12 +96,12 @@ pub trait IndexerLogic { fn base_tx_logs_filter(&self) -> Filter { Filter::new() .address(self.entry_point()) - .topic0(Self::before_execution_signature()) + .event_signature(Self::before_execution_signature()) } } -pub struct Indexer { - client: Provider, +pub struct Indexer { + client: P, db: Arc, @@ -110,9 +110,9 @@ pub struct Indexer { logic: L, } -impl Indexer { +impl Indexer { pub fn new( - client: Provider, + client: P, db: Arc, settings: IndexerSettings, logic: L, @@ -127,20 +127,27 @@ impl Indexer { #[instrument(name = "indexer", skip_all, level = "info", fields(version = L::version()))] pub async fn start(&self) -> anyhow::Result<()> { - tracing::debug!("fetching node client"); - let variant = self.client.node_client().await.unwrap_or(NodeClient::Geth); - tracing::info!(variant = to_string(variant), "fetched node client"); + let trace_client = match self.settings.trace_client { + Some(client) => client, + None => { + tracing::debug!("fetching node client"); + let client_version = self.client.get_client_version().await?; + tracing::info!(client_version, "fetched node client"); + client_version.into() + } + }; let mut stream_jobs = stream::SelectAll::>::new(); if self.settings.realtime.enabled { - if self.client.as_ref().supports_subscriptions() { + if self.client.client().pubsub_frontend().is_some() { // subscribe to a stream of new logs starting at the current block tracing::info!("subscribing to BeforeExecution logs from rpc"); let realtime_stream_jobs = self .client .subscribe_logs(&self.logic.base_tx_logs_filter()) .await? + .into_stream() .filter_map(|log| async { Job::try_from(log).ok() }); // That's the only infinite stream in the SelectAll set. If the ws connection @@ -157,23 +164,24 @@ impl Indexer { } tracing::debug!("fetching latest block number"); - let block_number = self.client.get_block_number().await?.as_u32(); + let block_number = self.client.get_block_number().await?; tracing::info!(block_number, "latest block number"); let rpc_refetch_block_number = - block_number.saturating_sub(self.settings.past_rpc_logs_indexer.block_range); + block_number.saturating_sub(self.settings.past_rpc_logs_indexer.block_range as u64); if self.settings.past_db_logs_indexer.enabled { let past_db_logs_start_block = self.settings.past_db_logs_indexer.start_block; let past_db_logs_end_block = self.settings.past_db_logs_indexer.end_block; let from_block = if past_db_logs_start_block > 0 { past_db_logs_start_block as u64 } else { - rpc_refetch_block_number.saturating_add_signed(past_db_logs_start_block) as u64 + rpc_refetch_block_number.saturating_add_signed(past_db_logs_start_block as i64) + as u64 }; let to_block = if past_db_logs_end_block > 0 { past_db_logs_end_block as u64 } else { - rpc_refetch_block_number.saturating_add_signed(past_db_logs_end_block) as u64 + rpc_refetch_block_number.saturating_add_signed(past_db_logs_end_block as i64) as u64 }; tracing::info!(from_block, to_block, "fetching missed tx hashes in db"); let missed_txs = repository::user_op::stream_unprocessed_logs_tx_hashes( @@ -219,13 +227,7 @@ impl Indexer { .map(Ok) .try_for_each_concurrent(Some(self.settings.concurrency as usize), |tx| async move { let mut backoff = vec![5, 20, 120].into_iter().map(Duration::from_secs); - while let Err(err) = self.handle_tx(tx, variant).await { - // terminate stream if WS connection is closed, indexer will be restarted - if self.client.as_ref().supports_subscriptions() && err.to_string() == WsClientError::UnexpectedClose.to_string() { - tracing::error!(error = ?err, tx_hash = ?tx, "tx handler failed, ws connection closed, exiting"); - return Err(err); - } - + while let Err(err) = self.handle_tx(tx, trace_client).await { match backoff.next() { None => { tracing::error!(error = ?err, tx_hash = ?tx, "tx handler failed, skipping"); @@ -244,9 +246,9 @@ impl Indexer { async fn fetch_jobs_for_block_range( &self, - from_block: u32, - to_block: u32, - ) -> Result, ProviderError> { + from_block: u64, + to_block: u64, + ) -> Result, alloy::transports::TransportError> { let filter = self .logic .base_tx_logs_filter() @@ -274,16 +276,16 @@ impl Indexer { repeat_with(|| async { sleep(self.settings.realtime.polling_interval).await; tracing::debug!("fetching latest block number"); - let block_number = self.client.get_block_number().await?.as_u32(); + let block_number = self.client.get_block_number().await?; tracing::info!(block_number, "latest block number"); let from_block = - block_number.saturating_sub(self.settings.realtime.polling_block_range); + block_number.saturating_sub(self.settings.realtime.polling_block_range as u64); let jobs = self .fetch_jobs_for_block_range(from_block, block_number) .await?; - Ok::, ProviderError>(jobs) + Ok::, alloy::transports::TransportError>(jobs) }) .filter_map(|fut| async { fut.await @@ -293,11 +295,11 @@ impl Indexer { .flat_map(stream::iter) } - #[instrument(name = "indexer::handle_tx", skip(self, variant), level = "info")] - async fn handle_tx(&self, tx_hash: H256, variant: NodeClient) -> anyhow::Result<()> { + #[instrument(name = "indexer::handle_tx", skip(self, trace_client), level = "info")] + async fn handle_tx(&self, tx_hash: TxHash, trace_client: TraceClient) -> anyhow::Result<()> { let tx = self .client - .get_transaction(tx_hash) + .get_transaction_by_hash(tx_hash) .await? .ok_or(anyhow!("empty transaction returned from rpc"))?; @@ -310,7 +312,8 @@ impl Indexer { // we split by bundles using BeforeExecution event as a beacon, almost all transaction will contain a single bundle only // then we split each bundle into logs batches for respective user operations let log_bundles: Vec> = receipt - .logs + .inner + .logs() .split(|log| self.logic.before_execution_matcher(log)) .skip(1) .map(|logs| { @@ -325,14 +328,14 @@ impl Indexer { tracing::info!(bundles_count = log_bundles.len(), "found user op bundles"); let calldatas: Vec = - if log_bundles.len() == 1 && tx.to == Some(self.logic.entry_point()) { - vec![tx.input] + if log_bundles.len() == 1 && tx.to() == Some(self.logic.entry_point()) { + vec![tx.input().clone()] } else { tracing::info!( "tx contains more than one bundle or was sent indirectly, fetching tx trace" ); self.client - .common_trace_transaction(tx_hash, variant) + .common_trace_transaction(tx_hash, trace_client) .await? .into_iter() .filter_map(|t| { @@ -351,7 +354,7 @@ impl Indexer { if calldatas.len() != log_bundles.len() { bail!( "number of calls to entrypoint and log batches don't match for {}: {} != {}", - tx_hash.encode_hex(), + tx_hash, calldatas.len(), log_bundles.len() ) @@ -392,40 +395,43 @@ impl Indexer { mod tests { use super::*; use crate::{ - indexer::{v06, v07}, + indexer::{settings::EntrypointsSettings, v06, v07}, repository::tests::get_shared_db, }; + use alloy::{primitives::U256, providers::ProviderBuilder}; use entity::sea_orm_active_enums::{EntryPointVersion, SponsorType}; - use ethers::prelude::{MockProvider, Provider}; - use ethers_core::types::{Transaction, TransactionReceipt, U256}; + use sea_orm::EntityTrait; use std::str::FromStr; + const ETH_RPC_URL: &str = "https://eth.drpc.org"; + #[tokio::test] async fn handle_tx_v06_ok() { let db = get_shared_db().await; - let client = MockProvider::new(); + // TODO: use mocked connection, alloy::transports::ipc::MockIpcServer from alloy seems broken at v0.8.3 + let client = ProviderBuilder::new() + .on_http(ETH_RPC_URL.parse().unwrap()) + .boxed(); // just some random tx from mainnet let tx_hash = - H256::from_str("0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e") + TxHash::from_str("0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e") .unwrap(); - let tx: Transaction = serde_json::from_str(r#"{"accessList":[],"blockHash":"0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4","blockNumber":"0x11e7bd0","chainId":"0x1","from":"0x2df993cd76bb8dbda50546eef00eee2e6331a2c8","gas":"0x64633","gasPrice":"0x8b539dcf3","hash":"0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e","input":"0x1fad948c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000002df993cd76bb8dbda50546eef00eee2e6331a2c800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000eae4d85f7733ad522f601ce7ad4f595704a2d67700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000169b7000000000000000000000000000000000000000000000000000000000001546d000000000000000000000000000000000000000000000000000000000000c2ec0000000000000000000000000000000000000000000000000000000c88385240000000000000000000000000000000000000000000000000000000001dcd650000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e470641a22000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001e0049783f008a0085193e00003d00cd54003c71ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000065793a092c25c7a7c5e4bc46467324e2845caf1ccae767786e07806ca720f8a6b83356bc7d43a63a96b34507cfe7c424db37f351d71851ae9318e8d5c3d9f17c8bdb744c1c000000000000000000000000000000000000000000000000000000000000","maxFeePerGas":"0xc88385240","maxPriorityFeePerGas":"0x1dcd6500","nonce":"0x143","r":"0x1c2b5eb48f71d803de3557309428decfa63f639a97ab98ab6b52667b9c415aa0","s":"0x54a110c5f7db8ce7a488080249d3eab77e426300cd36b78cf82156ded86b26ee","to":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","transactionIndex":"0x63","type":"0x2","v":"0x0","value":"0x0","yParity":"0x0"}"#).unwrap(); - let receipt: TransactionReceipt = serde_json::from_str(r#"{"blockHash":"0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4","blockNumber":"0x11e7bd0","contractAddress":null,"cumulativeGasUsed":"0xca9e14","effectiveGasPrice":"0x8b539dcf3","from":"0x2df993cd76bb8dbda50546eef00eee2e6331a2c8","gasUsed":"0x27a21","logs":[{"address":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","blockHash":"0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4","blockNumber":"0x11e7bd0","data":"0x000000000000000000000000000000000000000000000000002bea15dbb76400","logIndex":"0x10a","removed":false,"topics":["0x2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4","0x000000000000000000000000eae4d85f7733ad522f601ce7ad4f595704a2d677"],"transactionHash":"0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e","transactionIndex":"0x63"},{"address":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","blockHash":"0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4","blockNumber":"0x11e7bd0","data":"0x","logIndex":"0x10b","removed":false,"topics":["0xbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972"],"transactionHash":"0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e","transactionIndex":"0x63"},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","blockHash":"0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4","blockNumber":"0x11e7bd0","data":"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","logIndex":"0x10c","removed":false,"topics":["0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","0x000000000000000000000000eae4d85f7733ad522f601ce7ad4f595704a2d677","0x0000000000000000000000001e0049783f008a0085193e00003d00cd54003c71"],"transactionHash":"0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e","transactionIndex":"0x63"},{"address":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","blockHash":"0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4","blockNumber":"0x11e7bd0","data":"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000015ed8b1358919200000000000000000000000000000000000000000000000000000000000284a6","logIndex":"0x10d","removed":false,"topics":["0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f","0x2d5f7a884e9a99cfe2445db2af140a8851fbd860852b668f2f199190f68adf87","0x000000000000000000000000eae4d85f7733ad522f601ce7ad4f595704a2d677","0x0000000000000000000000000000000000000000000000000000000000000000"],"transactionHash":"0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e","transactionIndex":"0x63"}],"logsBloom":"0x000000000400000000000000000000000000000000000000000000000000000000080000000000000002000100000000021000000800000000000200002000000000008000000000200000000000000020000000000000000000000000002000000000000a0000000000000000000800000000000000000000000000000200000000000000002000000000000000000000000000000000000000000000000000020001000000400000400000000000000000000020000000000002000000000000000000000000000001000000000000000000000000000000000000000020000050200000000000000000000000000000000000000000000010000000000000","status":"0x1","to":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","transactionHash":"0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e","transactionIndex":"0x63","type":"0x2"}"#).unwrap(); - let entry_point = Address::from_str("0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789").unwrap(); - - client.push(receipt).unwrap(); - client.push(tx).unwrap(); + let entry_point = EntrypointsSettings::default().v06_entry_point; let indexer = Indexer::new( - Provider::new(CommonTransport::Mock(client)), + client, db.clone(), Default::default(), v06::IndexerV06 { entry_point }, ); - indexer.handle_tx(tx_hash, NodeClient::Geth).await.unwrap(); + indexer + .handle_tx(tx_hash, TraceClient::Parity) + .await + .unwrap(); let op_hash = - H256::from_str("0x2d5f7a884e9a99cfe2445db2af140a8851fbd860852b668f2f199190f68adf87") + B256::from_str("0x2d5f7a884e9a99cfe2445db2af140a8851fbd860852b668f2f199190f68adf87") .unwrap(); let user_op = repository::user_op::find_user_op_by_op_hash(&db, op_hash) .await @@ -434,7 +440,7 @@ mod tests { assert_eq!(user_op, UserOp { hash: op_hash, sender: Address::from_str("0xeae4d85f7733ad522f601ce7ad4f595704a2d677").unwrap(), - nonce: H256::zero(), + nonce: B256::ZERO, init_code: None, call_data: Bytes::from_str("0x70641a22000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001e0049783f008a0085193e00003d00cd54003c71ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000").unwrap(), call_gas_limit: U256::from(92599), @@ -450,7 +456,7 @@ mod tests { entry_point_version: EntryPointVersion::V06, transaction_hash: tx_hash, block_number: 18774992, - block_hash: H256::from_str("0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4").unwrap(), + block_hash: BlockHash::from_str("0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4").unwrap(), bundler: Address::from_str("0x2df993cd76bb8dbda50546eef00eee2e6331a2c8").unwrap(), bundle_index: 0, index: 0, @@ -469,33 +475,108 @@ mod tests { timestamp: None, }) } + #[tokio::test] + async fn handle_tx_v06_with_tracing_ok() { + let db = get_shared_db().await; + // TODO: use mocked connection, alloy::transports::ipc::MockIpcServer from alloy seems broken at v0.8.3 + let client = ProviderBuilder::new() + .on_http(ETH_RPC_URL.parse().unwrap()) + .boxed(); + + // just some random tx from mainnet + let tx_hash = + TxHash::from_str("0xd69a2233e7ff9034d21f588ffde16ef30dee6ddc4814fa4ecd4a1355630b1730") + .unwrap(); + let entry_point = EntrypointsSettings::default().v06_entry_point; + let op_hash = + B256::from_str("0xe5df829d25b3b0a043a658eb460cf74898eb0ad72a526dba0cd509ed2b83f796") + .unwrap(); + + let indexer = Indexer::new( + client, + db.clone(), + Default::default(), + v06::IndexerV06 { entry_point }, + ); + for trace_client in [TraceClient::Geth, TraceClient::Parity] { + entity::user_operations::Entity::delete_by_id(op_hash.to_vec()) + .exec(db.as_ref()) + .await + .expect("failed to delete"); + + indexer.handle_tx(tx_hash, trace_client).await.unwrap(); + + let user_op = repository::user_op::find_user_op_by_op_hash(&db, op_hash) + .await + .unwrap() + .unwrap(); + assert_eq!(user_op, UserOp { + hash: op_hash, + sender: Address::from_str("0xc09521aa72df1f93e36c776d5464f8bf2ae7b37d").unwrap(), + nonce: B256::from_str("0x0000000000000000000000000000000000000000000021050000000000000002").unwrap(), + init_code: None, + call_data: Bytes::from_str("0x2c2abd1e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000240f0f3f240000000000000000000000005ecd0d3a7f69c73d86f634b52cb9a4c0eb4df7ae00000000000000000000000000000000000000000000000000000000").unwrap(), + call_gas_limit: U256::from(89016), + verification_gas_limit: U256::from(578897), + pre_verification_gas: U256::from(107592), + max_fee_per_gas: U256::ZERO, + max_priority_fee_per_gas: U256::ZERO, + paymaster_and_data: None, + signature: Bytes::from_str("0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000013259e664945ba8945c3198dfbfc83dd1c654a7d284dd48b3f4c80544a281938960d7a8386af33457c88801d6e59aa95f374978f0cf400952eea08a15ad68aa7d0000000000000000000000000000000000000000000000000000000000000025f198086b2db17256731bc456673b96bcef23f51d1fbacdd7c4379ef65465572f1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a224d624230784b7177593773684c3461574c31714f5f315668794c4773433632764354682d544342464c704d222c226f726967696e223a2268747470733a2f2f6b6579732e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000").unwrap(), + aggregator: None, + aggregator_signature: None, + entry_point, + entry_point_version: EntryPointVersion::V06, + transaction_hash: tx_hash, + block_number: 21478047, + block_hash: BlockHash::from_str("0x2389d13b5294f5c38f5120671adf870468d892e60e637cb65e0eb47c455160f9").unwrap(), + bundler: Address::from_str("0xc09521aa72df1f93e36c776d5464f8bf2ae7b37d").unwrap(), + bundle_index: 0, + index: 0, + factory: None, + paymaster: None, + status: true, + revert_reason: None, + gas: U256::from(775505), + gas_price: U256::ZERO, + gas_used: U256::from(428635), + sponsor_type: SponsorType::WalletBalance, + user_logs_start_index: 126, + user_logs_count: 1, + fee: U256::from(0), + consensus: None, + timestamp: None, + }) + } + } #[tokio::test] async fn handle_tx_v07_ok() { let db = get_shared_db().await; - let client = MockProvider::new(); + // TODO: use mocked connection, alloy::transports::ipc::MockIpcServer from alloy seems broken at v0.8.3 + let client = ProviderBuilder::new() + .on_http(ETH_RPC_URL.parse().unwrap()) + .boxed(); - // just some random tx from sepolia + // just some random tx from mainnet let tx_hash = - H256::from_str("0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12") + TxHash::from_str("0x4a6702f8ef5b7754f5b54dfb00ccba181603e3a6fff77c93e7d0d40148f09ad0") .unwrap(); - let tx: Transaction = serde_json::from_str(r#"{"blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","blockNumber":"0x519c6b","from":"0x43d1089285a94bf481e1f6b1a7a114acbc833796","gas":"0x4c4b40","gasPrice":"0xbb3e00f1","maxPriorityFeePerGas":"0xb2d05e00","maxFeePerGas":"0xc20d353e","hash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","input":"0x765e827f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000043d1089285a94bf481e1f6b1a7a114acbc83379600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000f4240000000000000000000000000001e8480000000000000000000000000000000000000000000000000000000000007a120000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000002d81f5806eafab78028b6e29ab65208f54cfdd4ce45a1aafc9e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000244ac27308a000000000000000000000000000000000000000000000000000000000000008000000000000000000000000080ee560d57f4b1d2acfeb2174d09d54879c7408800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000598991c9d726cbac7eb023ca974fe6e7e7a57ce80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003479096622cf141e3cc93126bbccc3ef10b952c1ef000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074115cff9c5b847b402c382f066cf275ab6440b75aaa1b881c164e5d43131cfb3895759573bc597baf526002f8d1943f1aaa67dbf7fa99cd30d12a235169eef4f3d5c96fc1619c60bc9d8028dfea0f89c7ec5e3f27000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014434fcd5be00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000094a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001b637a3008dc1f86d92031a97fc4b5ac0803329e00000000000000000000000000000000000000000000000000000002540be400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000741b637a3008dc1f86d92031a97fc4b5ac0803329e00000000000000000000000000061a8000000000000000000000000000061a8000000000000000000000000094a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c800000000000000000000000000000000000000000000000000000002540be400000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a89d0e2cdece3d2f2e2497f2b68c5f96ef073c1800000004200775c0e5049afa24e5370a754faade91452b89dfc97907588ac49b441bcf43d06067f220a252454360907199ae8dfdc7fef2caf6c2aae03e4e0676b2c1ae351601b000000000000","nonce":"0x6","to":"0x0000000071727de22e5e9d8baf0edac6f37da032","transactionIndex":"0x6b","value":"0x0","type":"0x2","accessList":[],"chainId":"0xaa36a7","v":"0x0","r":"0x708c8520e17da32765f6270908ec9961023380a115f6c2a3bbf100f7ef39b68a","s":"0x4730c2959f785391db89cb2cc23db9782054db7d650e7a8df04836e954271d5e"}"#).unwrap(); - let receipt: TransactionReceipt = serde_json::from_str(r#"{"blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","blockNumber":"0x519c6b","contractAddress":null,"cumulativeGasUsed":"0x43e83a","effectiveGasPrice":"0xbb3e00f1","from":"0x43d1089285a94bf481e1f6b1a7a114acbc833796","gasUsed":"0xd0fbb","logs":[{"address":"0xf098c91823f1ef080f22645d030a7196e72d31eb","topics":["0x76329674d4361897f3154af54261c4cc05a0d5964509aeedce71949fa0d34725","0x000000000000000000000000598991c9d726cbac7eb023ca974fe6e7e7a57ce8"],"data":"0x","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x1f","removed":false},{"address":"0xf098c91823f1ef080f22645d030a7196e72d31eb","topics":["0xf80f6dfd1cac76f4ebc9005d547d88739ba90991e2c432ac74b18536c9e72af2"],"data":"0x00000000000000000000000089d0e2cdece3d2f2e2497f2b68c5f96ef073c180","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x20","removed":false},{"address":"0x79096622cf141e3cc93126bbccc3ef10b952c1ef","topics":["0xcdddfb4e53d2f7d725fae607b33383443789359047546dbdbd01f85d21adf61c","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb"],"data":"0x","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x21","removed":false},{"address":"0xf098c91823f1ef080f22645d030a7196e72d31eb","topics":["0xb4a437488482177b2d124ce7c50e57d8f8d42a9896b525c9c497ee0d533a95de"],"data":"0x00000000000000000000000079096622cf141e3cc93126bbccc3ef10b952c1ef","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x22","removed":false},{"address":"0x115cff9c5b847b402c382f066cf275ab6440b75a","topics":["0x18c5105ca36f183d9b8ee510786b13e3e58916d2525c72884d40ada1a6112e74","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb"],"data":"0xaa1b881c164e5d43131cfb3895759573bc597baf526002f8d1943f1aaa67dbf7fa99cd30d12a235169eef4f3d5c96fc1619c60bc9d8028dfea0f89c7ec5e3f27000000000000000000000000000000000000000000000000000000000002a300","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x23","removed":false},{"address":"0x115cff9c5b847b402c382f066cf275ab6440b75a","topics":["0xcdddfb4e53d2f7d725fae607b33383443789359047546dbdbd01f85d21adf61c","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb"],"data":"0x","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x24","removed":false},{"address":"0xf098c91823f1ef080f22645d030a7196e72d31eb","topics":["0xb4a437488482177b2d124ce7c50e57d8f8d42a9896b525c9c497ee0d533a95de"],"data":"0x000000000000000000000000115cff9c5b847b402c382f066cf275ab6440b75a","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x25","removed":false},{"address":"0xf098c91823f1ef080f22645d030a7196e72d31eb","topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x26","removed":false},{"address":"0x1f5806eafab78028b6e29ab65208f54cfdd4ce45","topics":["0x48df5b960943935df47b5ee244b72a9ea791c73f9d518287bf46d17c8bbe1259","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb"],"data":"0x","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x27","removed":false},{"address":"0x0000000071727de22e5e9d8baf0edac6f37da032","topics":["0xd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d","0x02bfece5db8c1bd400049c14e20ee988e62c057d296e9aefa34bd9b7f146033e","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb"],"data":"0x0000000000000000000000001f5806eafab78028b6e29ab65208f54cfdd4ce450000000000000000000000001b637a3008dc1f86d92031a97fc4b5ac0803329e","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x28","removed":false},{"address":"0x0000000071727de22e5e9d8baf0edac6f37da032","topics":["0xbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972"],"data":"0x","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x29","removed":false},{"address":"0x94a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8","topics":["0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb","0x0000000000000000000000001b637a3008dc1f86d92031a97fc4b5ac0803329e"],"data":"0x00000000000000000000000000000000000000000000000000000002540be400","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x2a","removed":false},{"address":"0x94a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb","0x0000000000000000000000001b637a3008dc1f86d92031a97fc4b5ac0803329e"],"data":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x2b","removed":false},{"address":"0x94a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8","topics":["0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb","0x0000000000000000000000001b637a3008dc1f86d92031a97fc4b5ac0803329e"],"data":"0x00000000000000000000000000000000000000000000000000000002540be400","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x2c","removed":false},{"address":"0x1b637a3008dc1f86d92031a97fc4b5ac0803329e","topics":["0x17ffde6359ce255c678a17b62fba7f276b9187996206563daaab42c2d836d675","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb"],"data":"0x00000000000000000000000094a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012f4e9","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x2d","removed":false},{"address":"0x0000000071727de22e5e9d8baf0edac6f37da032","topics":["0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f","0x02bfece5db8c1bd400049c14e20ee988e62c057d296e9aefa34bd9b7f146033e","0x000000000000000000000000f098c91823f1ef080f22645d030a7196e72d31eb","0x0000000000000000000000001b637a3008dc1f86d92031a97fc4b5ac0803329e"],"data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000001768630000000000000000000000000000000000000000000000000000000000176863","blockNumber":"0x519c6b","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","blockHash":"0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b","logIndex":"0x2e","removed":false}],"logsBloom":"0x02000400001000000200000000010000000180800030000000040000008000000008008801200000004000010000000090000001000000000000020000240000000900080000000000000008000000000040000000000000000008000000900280000000000800000000001000000000000000000000200000000010000002000000000000000000000800404000000000000200000480000000000000000001020000000100400000404000000000000000000004000000000002000010000000002002000000400001008000100400000000040004010000000000000000000010400010100000000000000000000000000000000000000000040000000010","status":"0x1","to":"0x0000000071727de22e5e9d8baf0edac6f37da032","transactionHash":"0xfce54378732b4fdf41a3c65b3b93c6bdabcd0b841bc24969d3593f65ca730f12","transactionIndex":"0x6b","type":"0x2"}"#).unwrap(); - let entry_point = Address::from_str("0x0000000071727De22E5E9d8BAf0edAc6f37da032").unwrap(); - - client.push(receipt).unwrap(); - client.push(tx).unwrap(); + let entry_point = EntrypointsSettings::default().v07_entry_point; let indexer = Indexer::new( - Provider::new(CommonTransport::Mock(client)), + client, db.clone(), Default::default(), v07::IndexerV07 { entry_point }, ); - indexer.handle_tx(tx_hash, NodeClient::Geth).await.unwrap(); + indexer + .handle_tx(tx_hash, TraceClient::Parity) + .await + .unwrap(); let op_hash = - H256::from_str("0x02bfece5db8c1bd400049c14e20ee988e62c057d296e9aefa34bd9b7f146033e") + B256::from_str("0xbd48a68e7dd39891fe7f139fe11bfb82d934a5deceb98f0c6fc4ebc7eeca58da") .unwrap(); let user_op = repository::user_op::find_user_op_by_op_hash(&db, op_hash) .await @@ -503,38 +584,38 @@ mod tests { .unwrap(); assert_eq!(user_op, UserOp { hash: op_hash, - sender: Address::from_str("0xf098c91823f1ef080f22645d030a7196e72d31eb").unwrap(), - nonce: H256::zero(), - init_code: Some(Bytes::from_str("0x1f5806eafab78028b6e29ab65208f54cfdd4ce45a1aafc9e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000244ac27308a000000000000000000000000000000000000000000000000000000000000008000000000000000000000000080ee560d57f4b1d2acfeb2174d09d54879c7408800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000598991c9d726cbac7eb023ca974fe6e7e7a57ce80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003479096622cf141e3cc93126bbccc3ef10b952c1ef000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074115cff9c5b847b402c382f066cf275ab6440b75aaa1b881c164e5d43131cfb3895759573bc597baf526002f8d1943f1aaa67dbf7fa99cd30d12a235169eef4f3d5c96fc1619c60bc9d8028dfea0f89c7ec5e3f27000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()), - call_data: Bytes::from_str("0x34fcd5be00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000094a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001b637a3008dc1f86d92031a97fc4b5ac0803329e00000000000000000000000000000000000000000000000000000002540be40000000000000000000000000000000000000000000000000000000000").unwrap(), - call_gas_limit: U256::from(2000000), - verification_gas_limit: U256::from(1000000), - pre_verification_gas: U256::from(500000), - max_fee_per_gas: U256::from(1), - max_priority_fee_per_gas: U256::from(1), - paymaster_and_data: Some(Bytes::from_str("0x1b637a3008dc1f86d92031a97fc4b5ac0803329e00000000000000000000000000061a8000000000000000000000000000061a8000000000000000000000000094a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c800000000000000000000000000000000000000000000000000000002540be400").unwrap()), - signature: Bytes::from_str("0x89d0e2cdece3d2f2e2497f2b68c5f96ef073c1800000004200775c0e5049afa24e5370a754faade91452b89dfc97907588ac49b441bcf43d06067f220a252454360907199ae8dfdc7fef2caf6c2aae03e4e0676b2c1ae351601b").unwrap(), + sender: Address::from_str("0x4a7EFb490b2D34D1962f365C5647D84FAdD3Bd6A").unwrap(), + nonce: B256::from_str("0x00005c97aa67ba578e3c54ec5942a7563ea9130e4f5f4c300000000000000000").unwrap(), + init_code: None, + call_data: Bytes::from_str("0xe9ae5c530100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000000000027d9000000000000000000000000000000000000000000000000000000000000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c44666fc80394356b4034c6f447b20899cff26af1d6d4520e9e3d7616ac0408daeb3cba94a00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000003c170744609c21c313473e3811563073c850c9f500000000000000000000000000000000000000000000000000000000009032d20000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000b44656669417070486f6d65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a30783030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000000000000000000000000000000000000000000000000000f2614a233c7c3e7f08b1f887ba133a13f1eb2c55000000000000000000000000f2614a233c7c3e7f08b1f887ba133a13f1eb2c550000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000027d900000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001442646478b0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000000000000000000000000000000000000000027d9000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000009032d20000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000045022260fac5e5542a773aa44fbcfedf7c193bc2c59901ffff00004375dff511095cc5a197a54140a24efef3a416011231deb6f5749ef6ce6943a275a1d3e7486f4eae000bb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000056eb4bf8b7510323b89fde249d1fb660ae30d2ee00000000000000000000000000000000000000000000000000000000000e7e2700000000000000000000000000000000000000000000000000000000").unwrap(), + call_gas_limit: U256::from(375068), + verification_gas_limit: U256::from(166784), + pre_verification_gas: U256::from(69185), + max_fee_per_gas: U256::from(1000000), + max_priority_fee_per_gas: U256::from(5095252459u64), + paymaster_and_data: Some(Bytes::from_str("0x0000000000000039cd5e8ae05257ce51c473ddd10000000000000000000000000001440600000000000000000000000000000001000000676b732f000000000000bc8f0c8fbbdaa38053b974afd0fe66cc7be40c0941f4ac58304ddda97ee5ba6e14c11f01cbd2c7c46401448bb9615bf29449ead5da1c4755989910524828a2461c").unwrap()), + signature: Bytes::from_str("0xf59f5f4d934312578dbd0c7a8a464cd8c73c1cbbb267b1dcae103d0e2d8f3971314b169eac449874652d7f6cb83de63422c762c4dfbca02629f94fc3a478141d1c").unwrap(), aggregator: None, aggregator_signature: None, entry_point, entry_point_version: EntryPointVersion::V07, transaction_hash: tx_hash, - block_number: 5348459, - block_hash: H256::from_str("0x65940368797f7f65885f86fdb367467b2c942aee60ddf9a3fb149a8924ac073b").unwrap(), - bundler: Address::from_str("0x43d1089285A94bf481E1F6B1a7A114aCBC833796").unwrap(), + block_number: 21476573, + block_hash: BlockHash::from_str("0x54f26503211219a84c1c25d8f5c61d6e1a2f253b97508fb88a6e2e13bffee0b3").unwrap(), + bundler: Address::from_str("0x4337003fcD2F56DE3977cCb806383E9161628D0E").unwrap(), bundle_index: 0, index: 0, - factory: Some(Address::from_str("0x1f5806eAFab78028B6E29Ab65208F54CFdD4ce45").unwrap()), - paymaster: Some(Address::from_str("0x1b637a3008dc1f86d92031a97FC4B5aC0803329e").unwrap()), + factory: None, + paymaster: Some(Address::from_str("0x0000000000000039cd5e8aE05257CE51C473ddd1").unwrap()), status: true, revert_reason: None, - gas: U256::from(4300000), - gas_price: U256::from(1), - gas_used: U256::from(1534051), + gas: U256::from(693988), + gas_price: U256::from(3582831922u64), + gas_used: U256::from(442171), sponsor_type: SponsorType::PaymasterSponsor, - user_logs_start_index: 42, - user_logs_count: 3, - fee: U256::from(1534051), + user_logs_start_index: 458, + user_logs_count: 11, + fee: U256::from(1584224373782662u64), consensus: None, timestamp: None, }) diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs index cfd84657e..1e0796543 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs @@ -1,12 +1,15 @@ -use entity::sea_orm_active_enums::SponsorType; -use ethers::prelude::{ - abi::{decode, parse_abi, ParamType, Token}, - Address, Bytes, Log, U256, +use alloy::{ + json_abi::JsonAbi, + primitives::{Address, Bytes, Selector, U256}, + rpc::types::Log, + sol_types, + sol_types::SolValue, }; +use entity::sea_orm_active_enums::SponsorType; use lazy_static::lazy_static; lazy_static! { - pub static ref EXECUTE_SELECTORS: Vec<[u8; 4]> = parse_abi(&[ + pub static ref EXECUTE_SELECTORS: Vec = JsonAbi::parse([ "function execute(address,uint256,bytes,uint8) external", "function execute(address,uint256,bytes) external", "function execute_ncC(address,uint256,bytes) external", @@ -16,8 +19,7 @@ lazy_static! { "function execTransactionFromEntrypoint(address,uint256,bytes,uint8,address,address,uint256)", "function executeCall(address,uint256,bytes)", "function executeUserOp(address,uint256,bytes,uint8)", - "struct ExecStruct { address arg1; address arg2; uint256 arg3;}", - "function execFromEntryPointWithFee(address,uint256,bytes,ExecStruct)", + "function execFromEntryPointWithFee(address,uint256,bytes,tuple(address,address,uint256))", "function execTransactionFromEntrypoint(address,uint256,bytes,uint8)", "function send(address,uint256,bytes)", "function execute(address,uint256,bytes,bytes)", @@ -26,7 +28,7 @@ lazy_static! { ]) .unwrap() .functions() - .map(|f| f.short_signature()) + .map(|f| f.selector()) .collect(); } @@ -59,24 +61,24 @@ pub fn extract_user_logs_boundaries( paymaster: Option
, ) -> (u32, u32) { let (mut l, mut r) = (0usize, logs.len()); - while l < r && (logs[r - 1].address == entry_point || Some(logs[r - 1].address) == paymaster) { + while l < r + && (logs[r - 1].address() == entry_point || Some(logs[r - 1].address()) == paymaster) + { r -= 1 } - while l < r && logs[l].address == entry_point { + while l < r && logs[l].address() == entry_point { l += 1 } ( - logs.get(l) - .and_then(|l| l.log_index) - .map_or(0, |v| v.as_u32()), + logs.get(l).and_then(|l| l.log_index).unwrap_or(0) as u32, (r - l) as u32, ) } pub fn unpack_uints(data: &[u8]) -> (U256, U256) { ( - U256::from_big_endian(&data[..16]), - U256::from_big_endian(&data[16..]), + U256::from_be_slice(&data[..16]), + U256::from_be_slice(&data[16..]), ) } @@ -91,24 +93,13 @@ pub fn none_if_empty(b: Bytes) -> Option { pub fn decode_execute_call_data(call_data: &Bytes) -> (Option
, Option) { if EXECUTE_SELECTORS .iter() - .any(|sig| call_data.starts_with(sig)) + .any(|sig| call_data.starts_with(sig.as_slice())) { - match decode( - &[ParamType::Address, ParamType::Uint(256), ParamType::Bytes], - &call_data[4..], - ) - .as_deref() - { - Ok([Token::Address(execute_target), _, Token::Bytes(execute_call_data)]) => ( - Some(*execute_target), - Some(Bytes::from(execute_call_data.clone())), - ), - Ok(_) => { - tracing::warn!( - call_data = call_data.to_string(), - "failed to match call_data parsing result" - ); - (None, None) + let res: sol_types::Result<(Address, U256, Bytes)> = + SolValue::abi_decode_params(&call_data[4..], false); + match res { + Ok((execute_target, _, execute_call_data)) => { + (Some(execute_target), Some(execute_call_data)) } Err(err) => { tracing::warn!(error = ?err, call_data = call_data.to_string(), "failed to parse call_data"); @@ -123,15 +114,17 @@ pub fn decode_execute_call_data(call_data: &Bytes) -> (Option
, Option>(); diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/common_transport.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/common_transport.rs deleted file mode 100644 index 35a59b426..000000000 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/common_transport.rs +++ /dev/null @@ -1,80 +0,0 @@ -use async_trait::async_trait; -use ethabi::ethereum_types::U256; -use ethers::prelude::{Http, JsonRpcClient, ProviderError, PubsubClient, Ws}; -use serde::{de::DeserializeOwned, Serialize}; -use std::{fmt::Debug, str::FromStr}; - -#[cfg(test)] -use ethers::prelude::MockProvider; - -#[derive(Clone, Debug)] -pub enum CommonTransport { - Ws(Ws), - Http(Http), - #[cfg(test)] - Mock(MockProvider), -} - -impl CommonTransport { - pub async fn new(rpc_url: String) -> Result { - if rpc_url.trim().starts_with("ws") { - // ethers-rs does not handle ws reconnects well, neither it can guarantee that no - // events would be lost even if reconnect is successful, so it's better to restart - // the whole indexer at once instead of trying to reconnect. - Ok(Self::Ws(Ws::connect_with_reconnects(rpc_url, 0).await?)) - } else { - Ok(Self::Http( - Http::from_str(&rpc_url).map_err(|e| ProviderError::CustomError(e.to_string()))?, - )) - } - } - - pub fn supports_subscriptions(&self) -> bool { - matches!(self, CommonTransport::Ws(_)) - } -} - -#[async_trait] -impl JsonRpcClient for CommonTransport { - type Error = ProviderError; - - async fn request(&self, method: &str, params: T) -> Result - where - T: Debug + Serialize + Send + Sync, - R: DeserializeOwned + Send, - { - match self { - CommonTransport::Ws(ws) => ws - .request(method, params) - .await - .map_err(ProviderError::from), - CommonTransport::Http(http) => http - .request(method, params) - .await - .map_err(ProviderError::from), - #[cfg(test)] - CommonTransport::Mock(mock) => mock - .request(method, params) - .await - .map_err(ProviderError::from), - } - } -} - -impl PubsubClient for CommonTransport { - type NotificationStream = ::NotificationStream; - - fn subscribe>(&self, id: T) -> Result { - match self { - CommonTransport::Ws(ws) => ws.subscribe(id).map_err(ProviderError::from), - _ => Err(ProviderError::UnsupportedRPC), - } - } - - fn unsubscribe>(&self, id: T) -> Result<(), Self::Error> { - match self { - CommonTransport::Ws(ws) => ws.unsubscribe(id).map_err(ProviderError::from), - _ => Err(ProviderError::UnsupportedRPC), - } - } -} diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/mod.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/mod.rs index 5c3ddbe88..eb4f411a1 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/mod.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/mod.rs @@ -1,6 +1,5 @@ mod base_indexer; pub mod common; -pub mod common_transport; pub mod rpc_utils; pub mod settings; pub mod v06; diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/rpc_utils.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/rpc_utils.rs index ca084176e..276f6896f 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/rpc_utils.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/rpc_utils.rs @@ -1,9 +1,42 @@ -use async_trait::async_trait; -use ethers::prelude::{ - Action, Address, Bytes, CallFrame, CallType, GethDebugBuiltInTracerType, GethDebugTracerType, - GethDebugTracingOptions, GethTrace, GethTraceFrame, JsonRpcClient, Middleware, NodeClient, - Provider, ProviderError, TxHash, +use alloy::{ + primitives::{Address, Bytes, TxHash}, + providers::{ + ext::{DebugApi, TraceApi}, + Provider, + }, + rpc::types::trace::{ + geth::{ + CallFrame, GethDebugBuiltInTracerType, GethDebugTracerConfig, GethDebugTracerType, + GethDebugTracingOptions, GethDefaultTracingOptions, GethTrace, + }, + parity::{Action, CallType}, + }, + transports::{RpcError, TransportErrorKind}, }; +use async_trait::async_trait; +use serde::Deserialize; + +#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize)] +pub enum TraceClient { + Geth, + Parity, +} + +impl From for TraceClient { + fn from(value: String) -> Self { + if value.contains("Geth/") { + Self::Geth + } else { + Self::Parity + } + } +} + +impl Default for TraceClient { + fn default() -> Self { + Self::Parity + } +} #[derive(Debug, PartialEq)] pub enum TraceType { @@ -27,75 +60,76 @@ pub trait CallTracer { async fn common_trace_transaction( &self, tx_hash: TxHash, - variant: NodeClient, - ) -> Result, ProviderError>; + client: TraceClient, + ) -> Result, RpcError>; } #[async_trait] -impl CallTracer for Provider { +impl CallTracer for T { async fn common_trace_transaction( &self, tx_hash: TxHash, - variant: NodeClient, - ) -> Result, ProviderError> { - match variant { - NodeClient::Geth => { - let geth_trace = self - .debug_trace_transaction( - tx_hash, - GethDebugTracingOptions { - disable_storage: Some(true), - disable_stack: Some(true), + client: TraceClient, + ) -> Result, RpcError> { + if client == TraceClient::Geth { + let geth_trace = self + .debug_trace_transaction( + tx_hash, + GethDebugTracingOptions { + config: GethDefaultTracingOptions { enable_memory: Some(false), + disable_memory: Some(true), + disable_stack: Some(true), + disable_storage: Some(true), enable_return_data: Some(false), - tracer: Some(GethDebugTracerType::BuiltInTracer( - GethDebugBuiltInTracerType::CallTracer, - )), - tracer_config: None, - timeout: Some("60s".to_string()), + disable_return_data: Some(true), + debug: None, + limit: None, }, - ) - .await?; - - match geth_trace { - GethTrace::Known(GethTraceFrame::CallTracer(root)) => { - Ok(flatten_geth_trace(root)) - } - _ => Err(ProviderError::CustomError( - "can't parse geth trace result".to_string(), - )), - } - } - _ => { - let traces = self - .trace_transaction(tx_hash) - .await? - .into_iter() - .filter_map(|t| match t.action { - Action::Call(call) => Some(CommonCallTrace { - typ: match call.call_type { - CallType::Call => TraceType::Call, - CallType::CallCode => TraceType::CallCode, - CallType::DelegateCall => TraceType::DelegateCall, - CallType::StaticCall => TraceType::StaticCall, - CallType::None => TraceType::Other, - }, - from: call.from, - to: Some(call.to), - input: call.input, - }), - Action::Create(create) => Some(CommonCallTrace { - typ: TraceType::Create, - from: create.from, - to: None, - input: create.init, - }), - _ => None, - }) - .collect(); - - Ok(traces) + tracer: Some(GethDebugTracerType::BuiltInTracer( + GethDebugBuiltInTracerType::CallTracer, + )), + tracer_config: GethDebugTracerConfig::default(), + timeout: Some("60s".to_string()), + }, + ) + .await?; + + match geth_trace { + GethTrace::CallTracer(root) => Ok(flatten_geth_trace(root)), + _ => Err(TransportErrorKind::custom_str( + "can't parse geth trace result", + )), } + } else { + let traces = self + .trace_transaction(tx_hash) + .await? + .into_iter() + .filter_map(|t| match t.trace.action { + Action::Call(call) => Some(CommonCallTrace { + typ: match call.call_type { + CallType::Call => TraceType::Call, + CallType::CallCode => TraceType::CallCode, + CallType::DelegateCall => TraceType::DelegateCall, + CallType::StaticCall => TraceType::StaticCall, + _ => TraceType::Other, + }, + from: call.from, + to: Some(call.to), + input: call.input, + }), + Action::Create(create) => Some(CommonCallTrace { + typ: TraceType::Create, + from: create.from, + to: None, + input: create.init, + }), + _ => None, + }) + .collect(); + + Ok(traces) } } } @@ -117,38 +151,25 @@ fn flatten_geth_trace(root: CallFrame) -> Vec { _ => TraceType::Other, }, from: frame.from, - to: frame.to.as_ref().and_then(|to| to.as_address().cloned()), + to: frame.to, input: frame.input.clone(), }); } - if let Some(calls) = &frame.calls { - if calls.len() > idx { - path.push((frame, idx + 1)); - path.push((&calls[idx], 0)); - } + if frame.calls.len() > idx { + path.push((frame, idx + 1)); + path.push((&frame.calls[idx], 0)); } } res } -pub fn to_string(node_client: NodeClient) -> String { - match node_client { - NodeClient::Geth => "geth", - NodeClient::Erigon => "erigon", - NodeClient::OpenEthereum => "openethereum", - NodeClient::Nethermind => "nethermind", - NodeClient::Besu => "besu", - } - .to_string() -} - #[cfg(test)] mod tests { use crate::indexer::rpc_utils::{flatten_geth_trace, TraceType}; - use ethers::{ - prelude::{Address, Bytes, CallFrame}, - utils::to_checksum, + use alloy::{ + primitives::{Address, Bytes}, + rpc::types::trace::geth::CallFrame, }; use std::str::FromStr; @@ -172,7 +193,7 @@ mod tests { assert_eq!( res.iter() - .map(|t| to_checksum(&t.from, None).to_lowercase()) + .map(|t| t.from.to_string().to_lowercase()) .collect::>(), [ "0x42fdd562221741a1db62a0f69a5a680367f07e33", diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/settings.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/settings.rs index 27af787f8..b9f817635 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/settings.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/settings.rs @@ -1,4 +1,5 @@ -use ethers::prelude::Address; +use crate::indexer::rpc_utils::TraceClient; +use alloy::primitives::Address; use serde::Deserialize; use serde_with::serde_as; use std::time; @@ -29,6 +30,8 @@ pub struct IndexerSettings { #[serde(default = "default_restart_delay")] #[serde_as(as = "serde_with::DurationSeconds")] pub restart_delay: time::Duration, + + pub trace_client: Option, } #[derive(Debug, Clone, Deserialize, PartialEq, Eq)] @@ -115,6 +118,7 @@ impl Default for IndexerSettings { deduplication_cache_size: default_deduplication_cache_size(), deduplication_interval: default_deduplication_interval(), restart_delay: default_restart_delay(), + trace_client: None, } } } diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs index 7a41160b7..7815b5bef 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs @@ -4,20 +4,21 @@ use crate::{ common::{ extract_address, extract_sponsor_type, extract_user_logs_boundaries, none_if_empty, }, + v06::IEntrypointV06::{IEntrypointV06Calls, UserOperation}, }, types::user_op::UserOp, }; +use alloy::{ + primitives::{Address, BlockHash, Bytes, B256, U256}, + rpc::types::{Log, TransactionReceipt}, + sol, + sol_types::{SolCall, SolEvent, SolInterface}, +}; use anyhow::{anyhow, bail}; use entity::sea_orm_active_enums::EntryPointVersion; -use ethers::prelude::{ - abi::{AbiDecode, Address}, - abigen, - types::{Bytes, Log, TransactionReceipt, H256}, - BigEndianHash, EthEvent, -}; use std::ops::Div; -abigen!(IEntrypointV06, "./src/indexer/v06/abi.json"); +sol!(IEntrypointV06, "./src/indexer/v06/abi.json"); #[derive(Debug, Clone)] pub struct IndexerV06 { @@ -40,16 +41,17 @@ impl IndexerLogic for IndexerV06 { "v0.6" } - fn user_operation_event_signature() -> H256 { - UserOperationEventFilter::signature() + fn user_operation_event_signature() -> B256 { + IEntrypointV06::UserOperationEvent::SIGNATURE_HASH } - fn before_execution_signature() -> H256 { - BeforeExecutionFilter::signature() + fn before_execution_signature() -> B256 { + IEntrypointV06::BeforeExecution::SIGNATURE_HASH } fn matches_handler_calldata(calldata: &Bytes) -> bool { - HandleOpsCall::decode(calldata).is_ok() || HandleAggregatedOpsCall::decode(calldata).is_ok() + IEntrypointV06::handleOpsCall::abi_decode(calldata, true).is_ok() + || IEntrypointV06::handleAggregatedOpsCall::abi_decode(calldata, true).is_ok() } fn parse_user_ops( @@ -59,14 +61,14 @@ impl IndexerLogic for IndexerV06 { calldata: &Bytes, log_bundle: &[&[Log]], ) -> anyhow::Result> { - let decoded_calldata = IEntrypointV06Calls::decode(calldata)?; + let decoded_calldata = IEntrypointV06Calls::abi_decode(calldata, true)?; let user_ops: Vec = match decoded_calldata { - IEntrypointV06Calls::HandleAggregatedOps(cd) => cd - .ops_per_aggregator + IEntrypointV06Calls::handleAggregatedOps(cd) => cd + .opsPerAggregator .into_iter() .flat_map(|agg_ops| { agg_ops - .user_ops + .userOps .into_iter() .map(move |op| ExtendedUserOperation { user_op: op, @@ -76,7 +78,7 @@ impl IndexerLogic for IndexerV06 { }) }) .collect(), - IEntrypointV06Calls::HandleOps(cd) => cd + IEntrypointV06Calls::handleOps(cd) => cd .ops .into_iter() .map(|op| ExtendedUserOperation { @@ -109,8 +111,7 @@ impl IndexerLogic for IndexerV06 { ) { Ok(model) => Some(model), Err(err) => { - let logs_start_index = - logs.first().and_then(|l| l.log_index).map(|i| i.as_u64()); + let logs_start_index = logs.first().and_then(|l| l.log_index); let logs_count = logs.len(); tracing::error!( tx_hash = ?receipt.transaction_hash, @@ -140,65 +141,65 @@ impl IndexerV06 { ) -> anyhow::Result { let user_op_event = logs .last() - .and_then(|log| self.match_and_parse::(log)) + .and_then(|log| self.match_and_parse::(log)) .transpose()? .ok_or(anyhow!("last log doesn't match UserOperationEvent"))?; let revert_event = logs .iter() - .find_map(|log| self.match_and_parse::(log)) + .find_map(|log| self.match_and_parse::(log)) .transpose()?; let tx_deposits: Vec
= receipt - .logs + .inner + .logs() .iter() - .filter_map(|log| self.match_and_parse::(log)) + .filter_map(|log| self.match_and_parse::(log)) .filter_map(Result::ok) .map(|e| e.account) .collect(); - let factory = extract_address(&user_op.user_op.init_code); - let paymaster = extract_address(&user_op.user_op.paymaster_and_data); + let factory = extract_address(&user_op.user_op.initCode); + let paymaster = extract_address(&user_op.user_op.paymasterAndData); let sender = user_op.user_op.sender; let (user_logs_start_index, user_logs_count) = extract_user_logs_boundaries(logs, self.entry_point, paymaster); Ok(UserOp { - hash: H256::from(user_op_event.user_op_hash), + hash: B256::from(user_op_event.userOpHash), sender, - nonce: H256::from_uint(&user_op.user_op.nonce), - init_code: none_if_empty(user_op.user_op.init_code), - call_data: user_op.user_op.call_data, - call_gas_limit: user_op.user_op.call_gas_limit, - verification_gas_limit: user_op.user_op.verification_gas_limit, - pre_verification_gas: user_op.user_op.pre_verification_gas, - max_fee_per_gas: user_op.user_op.max_fee_per_gas, - max_priority_fee_per_gas: user_op.user_op.max_priority_fee_per_gas, - paymaster_and_data: none_if_empty(user_op.user_op.paymaster_and_data), + nonce: B256::from(user_op.user_op.nonce), + init_code: none_if_empty(user_op.user_op.initCode), + call_data: user_op.user_op.callData, + call_gas_limit: user_op.user_op.callGasLimit, + verification_gas_limit: user_op.user_op.verificationGasLimit, + pre_verification_gas: user_op.user_op.preVerificationGas, + max_fee_per_gas: user_op.user_op.maxFeePerGas, + max_priority_fee_per_gas: user_op.user_op.maxPriorityFeePerGas, + paymaster_and_data: none_if_empty(user_op.user_op.paymasterAndData), signature: user_op.user_op.signature, aggregator: user_op.aggregator, aggregator_signature: user_op.aggregator_signature, entry_point: self.entry_point, entry_point_version: EntryPointVersion::V06, transaction_hash: receipt.transaction_hash, - block_number: receipt.block_number.map_or(0, |n| n.as_u64()), - block_hash: receipt.block_hash.unwrap_or(H256::zero()), + block_number: receipt.block_number.unwrap_or(0), + block_hash: receipt.block_hash.unwrap_or(BlockHash::ZERO), bundler: user_op.bundler, bundle_index, index, factory, paymaster, status: user_op_event.success, - revert_reason: revert_event.map(|e| e.revert_reason), - gas: user_op.user_op.call_gas_limit - + user_op.user_op.verification_gas_limit * if paymaster.is_none() { 1 } else { 3 } - + user_op.user_op.pre_verification_gas, - gas_price: user_op_event - .actual_gas_cost - .div(user_op_event.actual_gas_used), - gas_used: user_op_event.actual_gas_used, + revert_reason: revert_event.map(|e| e.revertReason), + gas: user_op.user_op.callGasLimit + + user_op.user_op.verificationGasLimit + * U256::from(if paymaster.is_none() { 1 } else { 3 }) + + user_op.user_op.preVerificationGas, + gas_price: user_op_event.actualGasCost.div(user_op_event.actualGasUsed), + gas_used: user_op_event.actualGasUsed, sponsor_type: extract_sponsor_type(sender, paymaster, &tx_deposits), user_logs_start_index, user_logs_count, - fee: user_op_event.actual_gas_cost, + fee: user_op_event.actualGasCost, consensus: None, timestamp: None, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs index 1da32ffc2..5bf452680 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs @@ -5,20 +5,21 @@ use crate::{ extract_address, extract_sponsor_type, extract_user_logs_boundaries, none_if_empty, unpack_uints, }, + v07::IEntrypointV07::{IEntrypointV07Calls, PackedUserOperation}, }, types::user_op::UserOp, }; +use alloy::{ + primitives::{Address, BlockHash, Bytes, B256, U256}, + rpc::types::{Log, TransactionReceipt}, + sol, + sol_types::{SolCall, SolEvent, SolInterface}, +}; use anyhow::{anyhow, bail}; use entity::sea_orm_active_enums::EntryPointVersion; -use ethers::prelude::{ - abi::{AbiDecode, Address}, - abigen, - types::{Bytes, Log, TransactionReceipt, H256}, - BigEndianHash, EthEvent, U256, -}; use std::ops::Div; -abigen!(IEntrypointV07, "./src/indexer/v07/abi.json"); +sol!(IEntrypointV07, "./src/indexer/v07/abi.json"); #[derive(Debug, Clone)] pub struct IndexerV07 { @@ -41,16 +42,17 @@ impl IndexerLogic for IndexerV07 { "v0.7" } - fn user_operation_event_signature() -> H256 { - UserOperationEventFilter::signature() + fn user_operation_event_signature() -> B256 { + IEntrypointV07::UserOperationEvent::SIGNATURE_HASH } - fn before_execution_signature() -> H256 { - BeforeExecutionFilter::signature() + fn before_execution_signature() -> B256 { + IEntrypointV07::BeforeExecution::SIGNATURE_HASH } fn matches_handler_calldata(calldata: &Bytes) -> bool { - HandleOpsCall::decode(calldata).is_ok() || HandleAggregatedOpsCall::decode(calldata).is_ok() + IEntrypointV07::handleOpsCall::abi_decode(calldata, true).is_ok() + || IEntrypointV07::handleAggregatedOpsCall::abi_decode(calldata, true).is_ok() } fn parse_user_ops( @@ -60,14 +62,14 @@ impl IndexerLogic for IndexerV07 { calldata: &Bytes, log_bundle: &[&[Log]], ) -> anyhow::Result> { - let decoded_calldata = IEntrypointV07Calls::decode(calldata)?; + let decoded_calldata = IEntrypointV07Calls::abi_decode(calldata, true)?; let user_ops: Vec = match decoded_calldata { - IEntrypointV07Calls::HandleAggregatedOps(cd) => cd - .ops_per_aggregator + IEntrypointV07Calls::handleAggregatedOps(cd) => cd + .opsPerAggregator .into_iter() .flat_map(|agg_ops| { agg_ops - .user_ops + .userOps .into_iter() .map(move |op| ExtendedUserOperation { user_op: op, @@ -77,7 +79,7 @@ impl IndexerLogic for IndexerV07 { }) }) .collect(), - IEntrypointV07Calls::HandleOps(cd) => cd + IEntrypointV07Calls::handleOps(cd) => cd .ops .into_iter() .map(|op| ExtendedUserOperation { @@ -110,8 +112,7 @@ impl IndexerLogic for IndexerV07 { ) { Ok(model) => Some(model), Err(err) => { - let logs_start_index = - logs.first().and_then(|l| l.log_index).map(|i| i.as_u64()); + let logs_start_index = logs.first().and_then(|l| l.log_index); let logs_count = logs.len(); tracing::error!( tx_hash = ?receipt.transaction_hash, @@ -141,30 +142,31 @@ impl IndexerV07 { ) -> anyhow::Result { let user_op_event = logs .last() - .and_then(|log| self.match_and_parse::(log)) + .and_then(|log| self.match_and_parse::(log)) .transpose()? .ok_or(anyhow!("last log doesn't match UserOperationEvent"))?; let revert_event = logs .iter() - .find_map(|log| self.match_and_parse::(log)) + .find_map(|log| self.match_and_parse::(log)) .transpose()?; let tx_deposits: Vec
= receipt - .logs + .inner + .logs() .iter() - .filter_map(|log| self.match_and_parse::(log)) + .filter_map(|log| self.match_and_parse::(log)) .filter_map(Result::ok) .map(|e| e.account) .collect(); let (verification_gas_limit, call_gas_limit) = - unpack_uints(&user_op.user_op.account_gas_limits[..]); - let pre_verification_gas = user_op.user_op.pre_verification_gas; + unpack_uints(&user_op.user_op.accountGasLimits[..]); + let pre_verification_gas = user_op.user_op.preVerificationGas; let (paymaster_verification_gas_limit, paymaster_post_op_gas_limit) = - if user_op.user_op.paymaster_and_data.len() >= 52 { - unpack_uints(&user_op.user_op.paymaster_and_data[20..52]) + if user_op.user_op.paymasterAndData.len() >= 52 { + unpack_uints(&user_op.user_op.paymasterAndData[20..52]) } else { - (U256::zero(), U256::zero()) + (U256::ZERO, U256::ZERO) }; let gas = call_gas_limit + verification_gas_limit @@ -173,49 +175,47 @@ impl IndexerV07 { + paymaster_post_op_gas_limit; let (max_fee_per_gas, max_priority_fee_per_gas) = - unpack_uints(&user_op.user_op.gas_fees[..]); + unpack_uints(&user_op.user_op.gasFees[..]); - let factory = extract_address(&user_op.user_op.init_code); - let paymaster = extract_address(&user_op.user_op.paymaster_and_data); + let factory = extract_address(&user_op.user_op.initCode); + let paymaster = extract_address(&user_op.user_op.paymasterAndData); let sender = user_op.user_op.sender; let (user_logs_start_index, user_logs_count) = extract_user_logs_boundaries(logs, self.entry_point, paymaster); Ok(UserOp { - hash: H256::from(user_op_event.user_op_hash), + hash: B256::from(user_op_event.userOpHash), sender, - nonce: H256::from_uint(&user_op.user_op.nonce), - init_code: none_if_empty(user_op.user_op.init_code), - call_data: user_op.user_op.call_data, + nonce: B256::from(user_op.user_op.nonce), + init_code: none_if_empty(user_op.user_op.initCode), + call_data: user_op.user_op.callData, call_gas_limit, verification_gas_limit, pre_verification_gas, max_fee_per_gas, max_priority_fee_per_gas, - paymaster_and_data: none_if_empty(user_op.user_op.paymaster_and_data), + paymaster_and_data: none_if_empty(user_op.user_op.paymasterAndData), signature: user_op.user_op.signature, aggregator: user_op.aggregator, aggregator_signature: user_op.aggregator_signature, entry_point: self.entry_point, entry_point_version: EntryPointVersion::V07, transaction_hash: receipt.transaction_hash, - block_number: receipt.block_number.map_or(0, |n| n.as_u64()), - block_hash: receipt.block_hash.unwrap_or(H256::zero()), + block_number: receipt.block_number.unwrap_or(0), + block_hash: receipt.block_hash.unwrap_or(BlockHash::ZERO), bundler: user_op.bundler, bundle_index, index, factory, paymaster, status: user_op_event.success, - revert_reason: revert_event.map(|e| e.revert_reason), + revert_reason: revert_event.map(|e| e.revertReason), gas, - gas_price: user_op_event - .actual_gas_cost - .div(user_op_event.actual_gas_used), - gas_used: user_op_event.actual_gas_used, + gas_price: user_op_event.actualGasCost.div(user_op_event.actualGasUsed), + gas_used: user_op_event.actualGasUsed, sponsor_type: extract_sponsor_type(sender, paymaster, &tx_deposits), user_logs_start_index, user_logs_count, - fee: user_op_event.actual_gas_cost, + fee: user_op_event.actualGasCost, consensus: None, timestamp: None, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/account.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/account.rs index bde314cbc..e6650f629 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/account.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/account.rs @@ -1,5 +1,5 @@ use crate::types::account::Account; -use ethers::prelude::Address; +use alloy::primitives::Address; use sea_orm::{prelude::DateTime, ConnectionTrait, DatabaseConnection, FromQueryResult, Statement}; #[derive(FromQueryResult)] @@ -35,7 +35,7 @@ SELECT account_total_cte.sender as address, account_creation_op_cte.timestamp as creation_timestamp FROM account_total_cte LEFT JOIN account_creation_op_cte ON account_total_cte.sender = account_creation_op_cte.sender"#, - [addr.as_bytes().into()], + [addr.as_slice().into()], )) .one(db) .await? @@ -79,8 +79,8 @@ SELECT accounts_cte.sender as address, FROM accounts_cte JOIN accounts_total_cte ON accounts_cte.sender = accounts_total_cte.sender"#, [ - factory_filter.map(|f| f.as_bytes().to_vec()).into(), - page_token.unwrap_or(Address::zero()).as_bytes().into(), + factory_filter.map(|f| f.to_vec()).into(), + page_token.unwrap_or(Address::ZERO).to_vec().into(), (limit + 1).into(), ], )) @@ -100,18 +100,18 @@ FROM accounts_cte mod tests { use super::*; use crate::repository::tests::get_shared_db; - use keccak_hash::H256; + use alloy::primitives::{B256, U160, U256}; use pretty_assertions::assert_eq; #[tokio::test] async fn find_account_by_address_ok() { let db = get_shared_db().await; - let addr = Address::from_low_u64_be(0xffff); + let addr = Address::from(U160::from(0xffff)); let item = find_account_by_address(&db, addr).await.unwrap(); assert_eq!(item, None); - let addr = Address::from_low_u64_be(0x0102); + let addr = Address::from(U160::from(0x0102)); let item = find_account_by_address(&db, addr).await.unwrap(); assert_eq!( item, @@ -125,15 +125,15 @@ mod tests { }) ); - let addr = Address::from_low_u64_be(0x3202); + let addr = Address::from(U160::from(0x3202)); let item = find_account_by_address(&db, addr).await.unwrap(); assert_eq!( item, Some(Account { address: addr, - factory: Some(Address::from_low_u64_be(0xf1)), - creation_transaction_hash: Some(H256::from_low_u64_be(0x3204)), - creation_op_hash: Some(H256::from_low_u64_be(0x3201)), + factory: Some(Address::from(U160::from(0xf1))), + creation_transaction_hash: Some(B256::from(U256::from(0x3204))), + creation_op_hash: Some(B256::from(U256::from(0x3201))), creation_timestamp: Some("2024-01-01T00:01:00.000000Z".to_string()), total_ops: 100, }) @@ -152,7 +152,7 @@ mod tests { assert_eq!(items.len(), 40); assert_eq!(next_page_token, None); - let factory = Some(Address::from_low_u64_be(0xf1)); + let factory = Some(Address::from(U160::from(0xf1))); let (items, next_page_token) = list_accounts(&db, factory, None, 60).await.unwrap(); assert_eq!(items.len(), 10); assert_eq!(next_page_token, None); diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/bundle.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/bundle.rs index b4cc191b8..4de7d7383 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/bundle.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/bundle.rs @@ -1,5 +1,5 @@ use crate::types::bundle::Bundle; -use ethers::prelude::{Address, H256}; +use alloy::primitives::{Address, B256}; use sea_orm::{prelude::DateTime, ConnectionTrait, DatabaseConnection, FromQueryResult, Statement}; #[derive(FromQueryResult)] @@ -16,10 +16,10 @@ pub async fn list_bundles( db: &DatabaseConnection, bundler_filter: Option
, entry_point_filter: Option
, - page_token: Option<(u64, H256, u32)>, + page_token: Option<(u64, B256, u32)>, limit: u64, -) -> Result<(Vec, Option<(u64, H256, u32)>), anyhow::Error> { - let page_token = page_token.unwrap_or((i64::MAX as u64, H256::zero(), 0)); +) -> Result<(Vec, Option<(u64, B256, u32)>), anyhow::Error> { + let page_token = page_token.unwrap_or((i64::MAX as u64, B256::ZERO, 0)); let bundles: Vec = BundleDB::find_by_statement(Statement::from_sql_and_values( db.get_database_backend(), r#" @@ -34,10 +34,10 @@ GROUP BY transaction_hash, bundle_index, block_number, bundler, blocks.timestamp ORDER BY block_number DESC, transaction_hash DESC, bundle_index DESC LIMIT $6"#, [ - bundler_filter.map(|f| f.as_bytes().to_vec()).into(), - entry_point_filter.map(|f| f.as_bytes().to_vec()).into(), + bundler_filter.map(|f| f.to_vec()).into(), + entry_point_filter.map(|f| f.to_vec()).into(), page_token.0.into(), - page_token.1.as_bytes().into(), + page_token.1.as_slice().into(), page_token.2.into(), (limit + 1).into(), ], @@ -61,6 +61,7 @@ LIMIT $6"#, mod tests { use super::*; use crate::repository::tests::get_shared_db; + use alloy::primitives::U160; use pretty_assertions::assert_eq; use std::str::FromStr; @@ -74,7 +75,7 @@ mod tests { let entrypoint = Some(Address::from_str("0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789").unwrap()); - let bundler = Some(Address::from_low_u64_be(0x0105)); + let bundler = Some(Address::from(U160::from(0x0105))); let (items, next_page_token) = list_bundles(&db, None, entrypoint, None, 100) .await diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/bundler.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/bundler.rs index 692c656c4..856905dea 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/bundler.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/bundler.rs @@ -1,5 +1,5 @@ use crate::types::bundler::Bundler; -use ethers::prelude::Address; +use alloy::primitives::Address; use sea_orm::{ConnectionTrait, DatabaseConnection, FromQueryResult, Statement}; #[derive(FromQueryResult, Clone)] @@ -24,7 +24,7 @@ WITH bundles_cte AS (SELECT bundler, count(*) as bundle_ops SELECT bundler, count(*) as total_bundles, sum(bundle_ops)::int8 as total_ops FROM bundles_cte GROUP BY bundler"#, - [addr.as_bytes().into()], + [addr.as_slice().into()], )) .one(db) .await? @@ -38,7 +38,7 @@ pub async fn list_bundlers( page_token: Option<(u64, Address)>, limit: u64, ) -> Result<(Vec, Option<(u64, Address)>), anyhow::Error> { - let page_token = page_token.unwrap_or((i64::MAX as u64, Address::zero())); + let page_token = page_token.unwrap_or((i64::MAX as u64, Address::ZERO)); let bundlers: Vec = BundlerDB::find_by_statement(Statement::from_sql_and_values( db.get_database_backend(), @@ -55,7 +55,7 @@ ORDER BY 2 DESC, 1 DESC LIMIT $3"#, [ page_token.0.into(), - page_token.1.as_bytes().into(), + page_token.1.as_slice().into(), (limit + 1).into(), ], )) @@ -78,17 +78,18 @@ LIMIT $3"#, mod tests { use super::*; use crate::repository::tests::get_shared_db; + use alloy::primitives::U160; use pretty_assertions::assert_eq; #[tokio::test] async fn find_bundler_by_address_ok() { let db = get_shared_db().await; - let addr = Address::from_low_u64_be(0xffff); + let addr = Address::from(U160::from(0xffff)); let item = find_bundler_by_address(&db, addr).await.unwrap(); assert_eq!(item, None); - let addr = Address::from_low_u64_be(0x0105); + let addr = Address::from(U160::from(0x0105)); let item = find_bundler_by_address(&db, addr).await.unwrap(); assert_eq!( item, @@ -99,7 +100,7 @@ mod tests { }) ); - let addr = Address::from_low_u64_be(0x0505); + let addr = Address::from(U160::from(0x0505)); let item = find_bundler_by_address(&db, addr).await.unwrap(); assert_eq!( item, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/factory.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/factory.rs index 7b71dafe2..07387637b 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/factory.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/factory.rs @@ -1,6 +1,6 @@ use crate::{repository::user_op::user_ops_blocks_rel, types::factory::Factory}; +use alloy::primitives::Address; use entity::user_operations::{Column, Entity}; -use ethers::prelude::Address; use sea_orm::{ prelude::Expr, sea_query::IntoCondition, ColumnTrait, DatabaseConnection, EntityTrait, FromQueryResult, IntoSimpleExpr, JoinType, QueryFilter, QueryOrder, QuerySelect, @@ -21,7 +21,7 @@ pub async fn find_factory_by_address( .column(Column::Factory) .column_as(Column::Factory.count(), "total_accounts") .join_rev(JoinType::Join, user_ops_blocks_rel()) - .filter(Column::Factory.eq(addr.as_bytes()).into_condition()) + .filter(Column::Factory.eq(addr.as_slice()).into_condition()) .group_by(Column::Factory) .into_model::() .one(db) @@ -36,7 +36,7 @@ pub async fn list_factories( page_token: Option<(u64, Address)>, limit: u64, ) -> Result<(Vec, Option<(u64, Address)>), anyhow::Error> { - let page_token = page_token.unwrap_or((i64::MAX as u64, Address::zero())); + let page_token = page_token.unwrap_or((i64::MAX as u64, Address::ZERO)); let factories: Vec = Entity::find() .select_only() @@ -47,7 +47,7 @@ pub async fn list_factories( .group_by(Column::Factory) .having( Expr::tuple([Column::Factory.count(), Column::Factory.into_simple_expr()]).lte( - Expr::tuple([page_token.0.into(), page_token.1.as_bytes().into()]), + Expr::tuple([page_token.0.into(), page_token.1.as_slice().into()]), ), ) .order_by_desc(Expr::cust("2")) @@ -73,17 +73,18 @@ pub async fn list_factories( mod tests { use super::*; use crate::repository::tests::get_shared_db; + use alloy::primitives::U160; use pretty_assertions::assert_eq; #[tokio::test] async fn find_factory_by_address_ok() { let db = get_shared_db().await; - let addr = Address::from_low_u64_be(0xf3); + let addr = Address::from(U160::from(0xf3)); let item = find_factory_by_address(&db, addr).await.unwrap(); assert_eq!(item, None); - let addr = Address::from_low_u64_be(0xf1); + let addr = Address::from(U160::from(0xf1)); let item = find_factory_by_address(&db, addr).await.unwrap(); assert_eq!( item, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/paymaster.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/paymaster.rs index dd4b3477f..312d9202d 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/paymaster.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/paymaster.rs @@ -1,6 +1,6 @@ use crate::{repository::user_op::user_ops_blocks_rel, types::paymaster::Paymaster}; +use alloy::primitives::Address; use entity::user_operations::{Column, Entity}; -use ethers::prelude::Address; use sea_orm::{ prelude::Expr, sea_query::IntoCondition, ColumnTrait, DatabaseConnection, EntityTrait, FromQueryResult, IntoSimpleExpr, JoinType, QueryFilter, QueryOrder, QuerySelect, @@ -21,7 +21,7 @@ pub async fn find_paymaster_by_address( .column(Column::Paymaster) .column_as(Column::Paymaster.count(), "total_ops") .join_rev(JoinType::Join, user_ops_blocks_rel()) - .filter(Column::Paymaster.eq(addr.as_bytes()).into_condition()) + .filter(Column::Paymaster.eq(addr.as_slice()).into_condition()) .group_by(Column::Paymaster) .into_model::() .one(db) @@ -36,7 +36,7 @@ pub async fn list_paymasters( page_token: Option<(u64, Address)>, limit: u64, ) -> Result<(Vec, Option<(u64, Address)>), anyhow::Error> { - let page_token = page_token.unwrap_or((i64::MAX as u64, Address::zero())); + let page_token = page_token.unwrap_or((i64::MAX as u64, Address::ZERO)); let paymasters: Vec = Entity::find() .select_only() @@ -52,7 +52,7 @@ pub async fn list_paymasters( ]) .lte(Expr::tuple([ page_token.0.into(), - page_token.1.as_bytes().into(), + page_token.1.as_slice().into(), ])), ) .order_by_desc(Expr::cust("2")) @@ -78,17 +78,18 @@ pub async fn list_paymasters( mod tests { use super::*; use crate::repository::tests::get_shared_db; + use alloy::primitives::U160; use pretty_assertions::assert_eq; #[tokio::test] async fn find_paymaster_by_address_ok() { let db = get_shared_db().await; - let addr = Address::from_low_u64_be(0xe3); + let addr = Address::from(U160::from(0xe3)); let item = find_paymaster_by_address(&db, addr).await.unwrap(); assert_eq!(item, None); - let addr = Address::from_low_u64_be(0xe1); + let addr = Address::from(U160::from(0xe1)); let item = find_paymaster_by_address(&db, addr).await.unwrap(); assert_eq!( item, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/user_op.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/user_op.rs index 1a9cd44eb..a0a9284b1 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/user_op.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/user_op.rs @@ -1,10 +1,10 @@ use crate::types::user_op::{ListUserOp, UserOp}; +use alloy::primitives::{Address, B256}; use blockscout_db::entity::blocks; use entity::{ sea_orm_active_enums::EntryPointVersion, user_operations::{ActiveModel, Column, Entity, Model}, }; -use ethers::prelude::{Address, H256}; use futures::{Stream, StreamExt}; use sea_orm::{ prelude::{BigDecimal, DateTime}, @@ -47,11 +47,11 @@ pub fn user_ops_blocks_rel() -> RelationDef { pub async fn find_user_op_by_op_hash( db: &DatabaseConnection, - op_hash: H256, + op_hash: B256, ) -> Result, anyhow::Error> { let res = db .query_one( - Entity::find_by_id(op_hash.as_bytes()) + Entity::find_by_id(op_hash.as_slice()) .column(blocks::Column::Consensus) .column(blocks::Column::Timestamp) .join_rev( @@ -89,14 +89,14 @@ pub async fn list_user_ops( bundler_filter: Option
, paymaster_filter: Option
, factory_filter: Option
, - tx_hash_filter: Option, + tx_hash_filter: Option, entry_point_filter: Option
, bundle_index_filter: Option, block_number_filter: Option, - page_token: Option<(u64, H256)>, + page_token: Option<(u64, B256)>, limit: u64, -) -> Result<(Vec, Option<(u64, H256)>), anyhow::Error> { - let page_token = page_token.unwrap_or((i64::MAX as u64, H256::zero())); +) -> Result<(Vec, Option<(u64, B256)>), anyhow::Error> { + let page_token = page_token.unwrap_or((i64::MAX as u64, B256::ZERO)); let mut q = Entity::find() .select_only() .columns([ @@ -113,25 +113,25 @@ pub async fn list_user_ops( .column(blocks::Column::Timestamp) .join_rev(JoinType::Join, user_ops_blocks_rel()); if let Some(sender) = sender_filter { - q = q.filter(Column::Sender.eq(sender.as_bytes())); + q = q.filter(Column::Sender.eq(sender.as_slice())); } if let Some(bundler) = bundler_filter { - q = q.filter(Column::Bundler.eq(bundler.as_bytes())); + q = q.filter(Column::Bundler.eq(bundler.as_slice())); } if let Some(paymaster) = paymaster_filter { - q = q.filter(Column::Paymaster.eq(paymaster.as_bytes())); + q = q.filter(Column::Paymaster.eq(paymaster.as_slice())); } if let Some(factory) = factory_filter { - q = q.filter(Column::Factory.eq(factory.as_bytes())); + q = q.filter(Column::Factory.eq(factory.as_slice())); } if let Some(tx_hash) = tx_hash_filter { - q = q.filter(Column::TransactionHash.eq(tx_hash.as_bytes())); + q = q.filter(Column::TransactionHash.eq(tx_hash.as_slice())); if let Some(bundle_index) = bundle_index_filter { q = q.filter(Column::BundleIndex.eq(bundle_index)); } } if let Some(entry_point) = entry_point_filter { - q = q.filter(Column::EntryPoint.eq(entry_point.as_bytes())); + q = q.filter(Column::EntryPoint.eq(entry_point.as_slice())); } if let Some(block_number) = block_number_filter { q = q.filter(Column::BlockNumber.eq(block_number)); @@ -144,7 +144,7 @@ pub async fn list_user_ops( ]) .lte(Expr::tuple([ page_token.0.into(), - page_token.1.as_bytes().into(), + page_token.1.as_slice().into(), ])), ) .order_by_desc(Column::BlockNumber) @@ -197,10 +197,10 @@ pub async fn upsert_many( pub async fn stream_unprocessed_logs_tx_hashes( db: &DatabaseConnection, addr: Address, - topic: H256, + topic: B256, from_block: u64, to_block: u64, -) -> Result + '_, anyhow::Error> { +) -> Result + '_, anyhow::Error> { let missed_tx_stream = TxHash::find_by_statement(Statement::from_sql_and_values( DbBackend::Postgres, r#" @@ -214,8 +214,8 @@ WHERE logs.address_hash = $1 AND logs.block_number <= $4 AND user_operations.hash IS NULL"#, [ - addr.as_bytes().into(), - topic.as_bytes().into(), + addr.as_slice().into(), + topic.as_slice().into(), from_block.into(), to_block.into(), ], @@ -224,7 +224,7 @@ WHERE logs.address_hash = $1 .await? .filter_map(|tx| async { match tx { - Ok(tx) => Some(H256::from_slice(&tx.transaction_hash)), + Ok(tx) => Some(B256::from_slice(&tx.transaction_hash)), Err(err) => { tracing::error!(error = ?err, "error during missed tx hash retrieval"); None @@ -239,7 +239,7 @@ WHERE logs.address_hash = $1 mod tests { use super::*; use crate::repository::tests::get_shared_db; - use ethers::prelude::U256; + use alloy::primitives::{U160, U256}; use pretty_assertions::assert_eq; use std::str::FromStr; @@ -247,25 +247,25 @@ mod tests { async fn find_user_op_by_op_hash_ok() { let db = get_shared_db().await; - let hash = H256::from_low_u64_be(0x0102); + let hash = B256::from(U256::from(0x0102)); let item = find_user_op_by_op_hash(&db, hash).await.unwrap(); assert_eq!(item, None); - let hash = H256::from_low_u64_be(0x0101); + let hash = B256::from(U256::from(0x0101)); let item = find_user_op_by_op_hash(&db, hash).await.unwrap(); assert_ne!(item, None); let item = item.unwrap(); assert_eq!(item.hash, hash); assert_eq!(item.consensus, Some(true)); - let hash = H256::from_low_u64_be(0x1a0401); + let hash = B256::from(U256::from(0x1a0401)); let item = find_user_op_by_op_hash(&db, hash).await.unwrap(); assert_ne!(item, None); let item = item.unwrap(); assert_eq!(item.hash, hash); assert_eq!(item.consensus, Some(false)); - let hash = H256::from_low_u64_be(0x1a0e01); + let hash = B256::from(U256::from(0x1a0e01)); let item = find_user_op_by_op_hash(&db, hash).await.unwrap(); assert_ne!(item, None); let item = item.unwrap(); @@ -312,11 +312,11 @@ mod tests { let (items, next_page_token) = list_user_ops( &db, - Some(Address::from_low_u64_be(0x0502)), + Some(Address::from(U160::from(0x0502))), None, None, None, - Some(H256::from_low_u64_be(0x0504)), + Some(B256::from(U256::from(0x0504))), None, Some(0), Some(0), @@ -330,23 +330,23 @@ mod tests { items, [ ListUserOp { - hash: H256::from_low_u64_be(0x6901), + hash: B256::from(U256::from(0x6901)), entry_point: entrypoint, entry_point_version: EntryPointVersion::V06, block_number: 0, - sender: Address::from_low_u64_be(0x0502), - transaction_hash: H256::from_low_u64_be(0x0504), + sender: Address::from(U160::from(0x0502)), + transaction_hash: B256::from(U256::from(0x0504)), timestamp: "2024-01-01T00:00:00.000000Z".to_string(), status: true, fee: U256::from(56001575011025u64), }, ListUserOp { - hash: H256::from_low_u64_be(0x0501), + hash: B256::from(U256::from(0x0501)), entry_point: entrypoint, entry_point_version: EntryPointVersion::V06, block_number: 0, - sender: Address::from_low_u64_be(0x0502), - transaction_hash: H256::from_low_u64_be(0x0504), + sender: Address::from(U160::from(0x0502)), + transaction_hash: B256::from(U256::from(0x0504)), timestamp: "2024-01-01T00:00:00.000000Z".to_string(), status: true, fee: U256::from(56000075000025u64), @@ -361,13 +361,13 @@ mod tests { let entrypoint = Address::from_str("0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789").unwrap(); let topic = - H256::from_str("0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f") + B256::from_str("0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f") .unwrap(); - let items: Vec = stream_unprocessed_logs_tx_hashes(&db, entrypoint, topic, 100, 150) + let items: Vec = stream_unprocessed_logs_tx_hashes(&db, entrypoint, topic, 100, 150) .await .unwrap() .collect() .await; - assert_eq!(items, [H256::from_low_u64_be(0xffff)]); + assert_eq!(items, [B256::from(U256::from(0xffff))]); } } diff --git a/user-ops-indexer/user-ops-indexer-logic/src/types/account.rs b/user-ops-indexer/user-ops-indexer-logic/src/types/account.rs index 47b5886b4..9200fed1f 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/types/account.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/types/account.rs @@ -1,15 +1,12 @@ use crate::repository::account::AccountDB; -use ethers::{ - prelude::{abi::AbiEncode, Address, H256}, - utils::to_checksum, -}; +use alloy::primitives::{Address, TxHash, B256}; #[derive(Clone, Debug, PartialEq)] pub struct Account { pub address: Address, pub factory: Option
, - pub creation_transaction_hash: Option, - pub creation_op_hash: Option, + pub creation_transaction_hash: Option, + pub creation_op_hash: Option, pub creation_timestamp: Option, pub total_ops: u32, } @@ -19,8 +16,8 @@ impl From for Account { Self { address: Address::from_slice(&v.address), factory: v.factory.map(|a| Address::from_slice(&a)), - creation_transaction_hash: v.creation_transaction_hash.map(|a| H256::from_slice(&a)), - creation_op_hash: v.creation_op_hash.map(|a| H256::from_slice(&a)), + creation_transaction_hash: v.creation_transaction_hash.map(|a| TxHash::from_slice(&a)), + creation_op_hash: v.creation_op_hash.map(|a| B256::from_slice(&a)), creation_timestamp: v.creation_timestamp.map(|t| { t.and_utc() .to_rfc3339_opts(chrono::SecondsFormat::Micros, true) @@ -33,10 +30,10 @@ impl From for Account { impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::Account { fn from(v: Account) -> Self { Self { - address: to_checksum(&v.address, None), - factory: v.factory.map(|a| to_checksum(&a, None)), - creation_transaction_hash: v.creation_transaction_hash.map(|a| a.encode_hex()), - creation_op_hash: v.creation_op_hash.map(|a| a.encode_hex()), + address: v.address.to_string(), + factory: v.factory.map(|a| a.to_string()), + creation_transaction_hash: v.creation_transaction_hash.map(|a| a.to_string()), + creation_op_hash: v.creation_op_hash.map(|a| a.to_string()), creation_timestamp: v.creation_timestamp, total_ops: v.total_ops, } diff --git a/user-ops-indexer/user-ops-indexer-logic/src/types/bundle.rs b/user-ops-indexer/user-ops-indexer-logic/src/types/bundle.rs index 56fd41382..fbd7efcd0 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/types/bundle.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/types/bundle.rs @@ -1,12 +1,9 @@ use crate::repository::bundle::BundleDB; -use ethers::{ - prelude::{abi::AbiEncode, Address, H256}, - utils::to_checksum, -}; +use alloy::primitives::{Address, TxHash}; #[derive(Clone, Debug, PartialEq)] pub struct Bundle { - pub transaction_hash: H256, + pub transaction_hash: TxHash, pub bundle_index: u32, pub block_number: u64, pub bundler: Address, @@ -17,7 +14,7 @@ pub struct Bundle { impl From for Bundle { fn from(v: BundleDB) -> Self { Self { - transaction_hash: H256::from_slice(&v.transaction_hash), + transaction_hash: TxHash::from_slice(&v.transaction_hash), bundle_index: v.bundle_index as u32, block_number: v.block_number as u64, bundler: Address::from_slice(&v.bundler), @@ -33,8 +30,8 @@ impl From for Bundle { impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::Bundle { fn from(v: Bundle) -> Self { Self { - transaction_hash: v.transaction_hash.encode_hex(), - bundler: to_checksum(&v.bundler, None), + transaction_hash: v.transaction_hash.to_string(), + bundler: v.bundler.to_string(), block_number: v.block_number, bundle_index: v.bundle_index, timestamp: v.timestamp, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/types/bundler.rs b/user-ops-indexer/user-ops-indexer-logic/src/types/bundler.rs index 5dd1258dc..ad329727a 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/types/bundler.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/types/bundler.rs @@ -1,5 +1,5 @@ use crate::repository::bundler::BundlerDB; -use ethers::{prelude::Address, utils::to_checksum}; +use alloy::primitives::Address; #[derive(Clone, Debug, PartialEq)] pub struct Bundler { @@ -21,7 +21,7 @@ impl From for Bundler { impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::Bundler { fn from(v: Bundler) -> Self { Self { - address: to_checksum(&v.bundler, None), + address: v.bundler.to_string(), total_bundles: v.total_bundles, total_ops: v.total_ops, } diff --git a/user-ops-indexer/user-ops-indexer-logic/src/types/common.rs b/user-ops-indexer/user-ops-indexer-logic/src/types/common.rs index b62ddb7be..5c62ca43d 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/types/common.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/types/common.rs @@ -1,7 +1,23 @@ -use atoi::FromRadix10; -use ethers::prelude::U256; +use alloy::primitives::U256; use sea_orm::prelude::BigDecimal; +use std::str::FromStr; pub fn u256_to_decimal(n: U256) -> BigDecimal { - BigDecimal::from_radix_10(n.to_string().as_bytes()).0 + BigDecimal::from_str(&n.to_string()).unwrap() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_u256_to_decimal() { + assert_eq!(u256_to_decimal(U256::from(0)), BigDecimal::from(0)); + assert_eq!(u256_to_decimal(U256::from(1)), BigDecimal::from(1)); + assert_eq!(u256_to_decimal(U256::from(1000)), BigDecimal::from(1000)); + assert_eq!( + u256_to_decimal(U256::MAX).to_string(), + "115792089237316195423570985008687907853269984665640564039457584007913129639935" + ); + } } diff --git a/user-ops-indexer/user-ops-indexer-logic/src/types/factory.rs b/user-ops-indexer/user-ops-indexer-logic/src/types/factory.rs index 02983d67e..a2a598988 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/types/factory.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/types/factory.rs @@ -1,5 +1,5 @@ use crate::repository::factory::FactoryDB; -use ethers::{prelude::Address, utils::to_checksum}; +use alloy::primitives::Address; #[derive(Clone, Debug, PartialEq)] pub struct Factory { @@ -19,7 +19,7 @@ impl From for Factory { impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::Factory { fn from(v: Factory) -> Self { Self { - address: to_checksum(&v.factory, None), + address: v.factory.to_string(), total_accounts: v.total_accounts, } } diff --git a/user-ops-indexer/user-ops-indexer-logic/src/types/paymaster.rs b/user-ops-indexer/user-ops-indexer-logic/src/types/paymaster.rs index 8080dd527..63c3d30ba 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/types/paymaster.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/types/paymaster.rs @@ -1,5 +1,5 @@ use crate::repository::paymaster::PaymasterDB; -use ethers::{prelude::Address, utils::to_checksum}; +use alloy::primitives::Address; #[derive(Clone, Debug, PartialEq)] pub struct Paymaster { @@ -19,7 +19,7 @@ impl From for Paymaster { impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::Paymaster { fn from(v: Paymaster) -> Self { Self { - address: to_checksum(&v.paymaster, None), + address: v.paymaster.to_string(), total_ops: v.total_ops, } } diff --git a/user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs b/user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs index c712c522b..411670f97 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs @@ -2,21 +2,19 @@ use crate::{ indexer::common::decode_execute_call_data, repository::user_op::ListUserOpDB, types::common::u256_to_decimal, }; +use alloy::primitives::ruint::UintTryTo; +use alloy::primitives::{Address, BlockHash, BlockNumber, Bytes, TxHash, B128, B256, U128, U256}; pub use entity::sea_orm_active_enums::{EntryPointVersion, SponsorType}; use entity::user_operations::Model; -use ethers::{ - prelude::{abi::AbiEncode, Address, BigEndianHash, Bytes, H256, U256}, - utils::to_checksum, -}; use num_traits::cast::ToPrimitive; use sea_orm::ActiveEnum; use std::ops::Mul; #[derive(Clone, Debug, PartialEq)] pub struct UserOp { - pub hash: H256, + pub hash: B256, pub sender: Address, - pub nonce: H256, + pub nonce: B256, pub init_code: Option, pub call_data: Bytes, pub call_gas_limit: U256, @@ -30,9 +28,9 @@ pub struct UserOp { pub aggregator_signature: Option, pub entry_point: Address, pub entry_point_version: EntryPointVersion, - pub transaction_hash: H256, - pub block_number: u64, - pub block_hash: H256, + pub transaction_hash: TxHash, + pub block_number: BlockNumber, + pub block_hash: BlockHash, pub bundler: Address, pub bundle_index: u32, pub index: u32, @@ -54,12 +52,12 @@ pub struct UserOp { #[derive(Clone, Debug, PartialEq)] pub struct ListUserOp { - pub hash: H256, + pub hash: B256, pub entry_point: Address, pub entry_point_version: EntryPointVersion, pub block_number: u64, pub sender: Address, - pub transaction_hash: H256, + pub transaction_hash: TxHash, pub timestamp: String, pub status: bool, pub fee: U256, @@ -68,9 +66,9 @@ pub struct ListUserOp { impl From for Model { fn from(v: UserOp) -> Self { Self { - hash: v.hash.as_bytes().to_vec(), - sender: v.sender.as_bytes().to_vec(), - nonce: v.nonce.as_bytes().to_vec(), + hash: v.hash.to_vec(), + sender: v.sender.to_vec(), + nonce: v.nonce.to_vec(), init_code: v.init_code.clone().map(|a| a.to_vec()), call_data: v.call_data.to_vec(), call_gas_limit: u256_to_decimal(v.call_gas_limit), @@ -80,18 +78,18 @@ impl From for Model { max_priority_fee_per_gas: u256_to_decimal(v.max_priority_fee_per_gas), paymaster_and_data: v.paymaster_and_data.clone().map(|a| a.to_vec()), signature: v.signature.to_vec(), - aggregator: v.aggregator.map(|a| a.as_bytes().to_vec()), + aggregator: v.aggregator.map(|a| a.to_vec()), aggregator_signature: v.aggregator_signature.clone().map(|a| a.to_vec()), - entry_point: v.entry_point.as_bytes().to_vec(), + entry_point: v.entry_point.to_vec(), entry_point_version: v.entry_point_version.clone(), - transaction_hash: v.transaction_hash.as_bytes().to_vec(), + transaction_hash: v.transaction_hash.to_vec(), block_number: v.block_number as i32, - block_hash: v.block_hash.as_bytes().to_vec(), - bundler: v.bundler.as_bytes().to_vec(), + block_hash: v.block_hash.to_vec(), + bundler: v.bundler.to_vec(), bundle_index: v.bundle_index as i32, index: v.index as i32, - factory: v.factory.map(|a| a.as_bytes().to_vec()), - paymaster: v.paymaster.map(|a| a.as_bytes().to_vec()), + factory: v.factory.map(|a| a.to_vec()), + paymaster: v.paymaster.map(|a| a.to_vec()), status: v.status, revert_reason: v.revert_reason.clone().map(|a| a.to_vec()), gas: u256_to_decimal(v.gas), @@ -109,9 +107,9 @@ impl From for Model { impl From for UserOp { fn from(v: Model) -> Self { Self { - hash: H256::from_slice(&v.hash), + hash: B256::from_slice(&v.hash), sender: Address::from_slice(&v.sender), - nonce: H256::from_slice(&v.nonce), + nonce: B256::from_slice(&v.nonce), init_code: v.init_code.clone().map(Bytes::from), call_data: Bytes::from(v.call_data.clone()), call_gas_limit: U256::from(v.call_gas_limit.to_u128().unwrap_or(0)), @@ -125,9 +123,9 @@ impl From for UserOp { aggregator_signature: v.aggregator_signature.clone().map(Bytes::from), entry_point: Address::from_slice(&v.entry_point), entry_point_version: v.entry_point_version.clone(), - transaction_hash: H256::from_slice(&v.transaction_hash), + transaction_hash: TxHash::from_slice(&v.transaction_hash), block_number: v.block_number as u64, - block_hash: H256::from_slice(&v.block_hash), + block_hash: BlockHash::from_slice(&v.block_hash), bundler: Address::from_slice(&v.bundler), bundle_index: v.bundle_index as u32, index: v.index as u32, @@ -155,8 +153,8 @@ impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1:: EntryPointVersion::V06 => { user_ops_indexer_proto::blockscout::user_ops_indexer::v1::user_op::Raw::RawV06( user_ops_indexer_proto::blockscout::user_ops_indexer::v1::RawUserOpV06 { - sender: to_checksum(&v.sender, None), - nonce: U256::from(v.nonce.as_fixed_bytes()).to_string(), + sender: v.sender.to_string(), + nonce: U256::from_be_slice(v.nonce.as_slice()).to_string(), init_code: v.init_code.map_or("0x".to_string(), |b| b.to_string()), call_data: v.call_data.to_string(), call_gas_limit: v.call_gas_limit.to_string(), @@ -174,29 +172,25 @@ impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1:: EntryPointVersion::V07 => { user_ops_indexer_proto::blockscout::user_ops_indexer::v1::user_op::Raw::RawV07( user_ops_indexer_proto::blockscout::user_ops_indexer::v1::RawUserOpV07 { - sender: to_checksum(&v.sender, None), - nonce: U256::from(v.nonce.as_fixed_bytes()).to_string(), + sender: v.sender.to_string(), + nonce: U256::from_be_slice(v.nonce.as_slice()).to_string(), init_code: v.init_code.map_or("0x".to_string(), |b| b.to_string()), call_data: v.call_data.to_string(), - account_gas_limits: H256::from_slice( - [ - &H256::from_uint(&v.verification_gas_limit).as_bytes()[16..], - &H256::from_uint(&v.call_gas_limit).as_bytes()[16..], - ] - .concat() - .as_slice(), + account_gas_limits: B128::from( + v.verification_gas_limit.uint_try_to().unwrap_or(U128::ZERO), ) - .encode_hex(), + .concat_const::<16, 32>(B128::from( + v.call_gas_limit.uint_try_to().unwrap_or(U128::ZERO), + )) + .to_string(), pre_verification_gas: v.pre_verification_gas.to_string(), - gas_fees: H256::from_slice( - [ - &H256::from_uint(&v.max_fee_per_gas).as_bytes()[16..], - &H256::from_uint(&v.max_priority_fee_per_gas).as_bytes()[16..], - ] - .concat() - .as_slice(), - ) - .encode_hex(), + gas_fees: B128::from(v.max_fee_per_gas.uint_try_to().unwrap_or(U128::ZERO)) + .concat_const::<16, 32>(B128::from( + v.max_priority_fee_per_gas + .uint_try_to() + .unwrap_or(U128::ZERO), + )) + .to_string(), paymaster_and_data: v .paymaster_and_data .map_or("0x".to_string(), |b| b.to_string()), @@ -209,9 +203,9 @@ impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1:: let (execute_target, execute_call_data) = decode_execute_call_data(&v.call_data); user_ops_indexer_proto::blockscout::user_ops_indexer::v1::UserOp { - hash: v.hash.encode_hex(), - sender: to_checksum(&v.sender, None), - nonce: v.nonce.encode_hex(), + hash: v.hash.to_string(), + sender: v.sender.to_string(), + nonce: v.nonce.to_string(), call_data: v.call_data.to_string(), call_gas_limit: v.call_gas_limit.to_string(), verification_gas_limit: v.verification_gas_limit.to_string(), @@ -220,18 +214,18 @@ impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1:: max_priority_fee_per_gas: v.max_priority_fee_per_gas.to_string(), signature: v.signature.to_string(), raw: Some(raw), - aggregator: v.aggregator.map(|a| to_checksum(&a, None)), + aggregator: v.aggregator.map(|a| a.to_string()), aggregator_signature: v.aggregator_signature.map(|b| b.to_string()), - entry_point: to_checksum(&v.entry_point, None), + entry_point: v.entry_point.to_string(), entry_point_version: v.entry_point_version.to_value().to_string(), - transaction_hash: v.transaction_hash.encode_hex(), + transaction_hash: v.transaction_hash.to_string(), block_number: v.block_number, - block_hash: v.block_hash.encode_hex(), - bundler: to_checksum(&v.bundler, None), + block_hash: v.block_hash.to_string(), + bundler: v.bundler.to_string(), bundle_index: v.bundle_index, index: v.index, - factory: v.factory.map(|a| to_checksum(&a, None)), - paymaster: v.paymaster.map(|a| to_checksum(&a, None)), + factory: v.factory.map(|a| a.to_string()), + paymaster: v.paymaster.map(|a| a.to_string()), status: v.status, revert_reason: v.revert_reason.map(|b| b.to_string()), gas: v.gas.to_string(), @@ -245,7 +239,7 @@ impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1:: consensus: v.consensus, timestamp: v.timestamp, - execute_target: execute_target.map(|a| to_checksum(&a, None)), + execute_target: execute_target.map(|a| a.to_string()), execute_call_data: execute_call_data.map(|b| b.to_string()), } } @@ -254,12 +248,12 @@ impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1:: impl From for ListUserOp { fn from(v: ListUserOpDB) -> Self { Self { - hash: H256::from_slice(&v.hash), + hash: B256::from_slice(&v.hash), entry_point: Address::from_slice(&v.entry_point), entry_point_version: v.entry_point_version.clone(), block_number: v.block_number as u64, sender: Address::from_slice(&v.sender), - transaction_hash: H256::from_slice(&v.transaction_hash), + transaction_hash: TxHash::from_slice(&v.transaction_hash), timestamp: v .timestamp .and_utc() @@ -273,12 +267,12 @@ impl From for ListUserOp { impl From for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::ListUserOp { fn from(v: ListUserOp) -> Self { user_ops_indexer_proto::blockscout::user_ops_indexer::v1::ListUserOp { - hash: v.hash.encode_hex(), - entry_point: to_checksum(&v.entry_point, None), + hash: v.hash.to_string(), + entry_point: v.entry_point.to_string(), entry_point_version: v.entry_point_version.to_value().to_string(), block_number: v.block_number, - transaction_hash: v.transaction_hash.encode_hex(), - address: to_checksum(&v.sender, None), + transaction_hash: v.transaction_hash.to_string(), + address: v.sender.to_string(), timestamp: v.timestamp, status: v.status, fee: v.fee.to_string(), diff --git a/user-ops-indexer/user-ops-indexer-proto/src/lib.rs b/user-ops-indexer/user-ops-indexer-proto/src/lib.rs index 701ffc511..e5bf65b84 100644 --- a/user-ops-indexer/user-ops-indexer-proto/src/lib.rs +++ b/user-ops-indexer/user-ops-indexer-proto/src/lib.rs @@ -1,4 +1,4 @@ -#![allow(clippy::derive_partial_eq_without_eq, unused_imports)] +#![allow(clippy::derive_partial_eq_without_eq, unused_imports, unreachable_patterns)] pub mod blockscout { pub mod user_ops_indexer { diff --git a/user-ops-indexer/user-ops-indexer-proto/swagger/user-ops-indexer.swagger.yaml b/user-ops-indexer/user-ops-indexer-proto/swagger/user-ops-indexer.swagger.yaml index 18ae38d8b..02a760736 100644 --- a/user-ops-indexer/user-ops-indexer-proto/swagger/user-ops-indexer.swagger.yaml +++ b/user-ops-indexer/user-ops-indexer-proto/swagger/user-ops-indexer.swagger.yaml @@ -344,6 +344,7 @@ definitions: details: type: array items: + type: object $ref: '#/definitions/protobufAny' v1Account: type: object @@ -409,6 +410,7 @@ definitions: items: type: array items: + type: object $ref: '#/definitions/v1Account' next_page_params: $ref: '#/definitions/v1Pagination' @@ -418,6 +420,7 @@ definitions: items: type: array items: + type: object $ref: '#/definitions/v1Bundler' next_page_params: $ref: '#/definitions/v1Pagination' @@ -427,6 +430,7 @@ definitions: items: type: array items: + type: object $ref: '#/definitions/v1Bundle' next_page_params: $ref: '#/definitions/v1Pagination' @@ -436,6 +440,7 @@ definitions: items: type: array items: + type: object $ref: '#/definitions/v1Factory' next_page_params: $ref: '#/definitions/v1Pagination' @@ -445,6 +450,7 @@ definitions: items: type: array items: + type: object $ref: '#/definitions/v1Paymaster' next_page_params: $ref: '#/definitions/v1Pagination' @@ -476,6 +482,7 @@ definitions: items: type: array items: + type: object $ref: '#/definitions/v1ListUserOp' next_page_params: $ref: '#/definitions/v1Pagination' diff --git a/user-ops-indexer/user-ops-indexer-server/Cargo.toml b/user-ops-indexer/user-ops-indexer-server/Cargo.toml index 9d7404975..343d776e3 100644 --- a/user-ops-indexer/user-ops-indexer-server/Cargo.toml +++ b/user-ops-indexer/user-ops-indexer-server/Cargo.toml @@ -11,31 +11,15 @@ user-ops-indexer-migration = { path = "../user-ops-indexer-migration" } user-ops-indexer-proto = { path = "../user-ops-indexer-proto" } actix-web = "4.2" -amplify = { version = "3.13.0", features = ["derive"] } anyhow = "1.0" async-trait = "0.1" -blockscout-display-bytes = "1.0" blockscout-service-launcher = { workspace = true, features = ["database-0_12"] } -config = "0.13" -ethers = "2.0.0" sea-orm = "0.12.2" serde = "1.0" -serde_json = "1.0.96" -serde_with = "2.1" -sourcify = { git = "https://github.com/blockscout/blockscout-rs", rev = "34827ae" } tokio = { version = "1.23", features = ["rt-multi-thread", "macros"] } tonic = "0.8" tracing = "0.1" -uuid = { version = "1.6.1", features = ["v4"] } +alloy = { version = "0.8.2", features = ["full", "provider-debug-api", "provider-trace-api"] } [dev-dependencies] -bytes = "1.5.0" -hex = "0.4.3" -mockall = "0.11" -keccak-hash = "0.10.0" -pretty_assertions = "1.3" -reqwest = { version = "0.11", features = ["json"] } -rand = "0.8" -rstest = "0.18.2" sea-orm = { version = "*", features = ["sqlx-sqlite"] } -tokio-stream = { version = "0.1", features = ["net"] } diff --git a/user-ops-indexer/user-ops-indexer-server/src/indexer.rs b/user-ops-indexer/user-ops-indexer-server/src/indexer.rs index d25519dff..52eb06dad 100644 --- a/user-ops-indexer/user-ops-indexer-server/src/indexer.rs +++ b/user-ops-indexer/user-ops-indexer-server/src/indexer.rs @@ -1,11 +1,12 @@ use crate::settings::Settings; -use ethers::{prelude::Provider, utils::to_checksum}; +use alloy::{ + providers::{ProviderBuilder, RootProvider, WsConnect}, + transports::{BoxTransport, TransportError, TransportErrorKind}, +}; use sea_orm::DatabaseConnection; use std::sync::Arc; use tokio::time::sleep; -use user_ops_indexer_logic::indexer::{ - common_transport::CommonTransport, settings::IndexerSettings, v06, v07, Indexer, IndexerLogic, -}; +use user_ops_indexer_logic::indexer::{settings::IndexerSettings, v06, v07, Indexer, IndexerLogic}; pub async fn run( settings: Settings, @@ -49,16 +50,14 @@ async fn start_indexer_with_retries anyhow::Result<()> { tracing::info!( version = L::version(), - entry_point = to_checksum(&logic.entry_point(), None), + entry_point = logic.entry_point().to_string(), "connecting to rpc" ); // If the first connect fails, the function will return an error immediately. // All subsequent reconnects are done inside tokio task and will not propagate to above. - let transport = CommonTransport::new(settings.rpc_url.clone()).await?; - let client = Provider::new(transport); let mut indexer = Indexer::new( - client, + connect(settings.rpc_url.clone()).await?, db_connection.clone(), settings.clone(), logic.clone(), @@ -98,8 +97,8 @@ async fn start_indexer_with_retries transport, + let provider = match connect(settings.rpc_url.clone()).await { + Ok(provider) => provider, Err(err) => { tracing::error!( error = ?err, @@ -110,9 +109,8 @@ async fn start_indexer_with_retries Result, TransportError> { + if rpc_url.starts_with("ws") { + let ws = WsConnect::new(rpc_url); + Ok(ProviderBuilder::new().on_ws(ws).await?.boxed()) + } else { + let http = rpc_url + .parse() + .map_err(|_| TransportErrorKind::custom_str("invalid http url"))?; + Ok(ProviderBuilder::new().on_http(http).boxed()) + } +} diff --git a/user-ops-indexer/user-ops-indexer-server/src/services/user_ops.rs b/user-ops-indexer/user-ops-indexer-server/src/services/user_ops.rs index f21e38bb0..05629fd28 100644 --- a/user-ops-indexer/user-ops-indexer-server/src/services/user_ops.rs +++ b/user-ops-indexer/user-ops-indexer-server/src/services/user_ops.rs @@ -1,9 +1,5 @@ use crate::{proto::user_ops_service_server::UserOpsService as UserOps, settings::ApiSettings}; -use ethers::{ - abi::{AbiEncode, Address}, - prelude::H256, - utils::to_checksum, -}; +use alloy::primitives::{Address, B256}; use sea_orm::DatabaseConnection; use std::str::FromStr; use tonic::{Request, Response, Status}; @@ -157,7 +153,7 @@ impl UserOps for UserOpsService { let res = ListAccountsResponse { items: accounts.into_iter().map(|acc| acc.into()).collect(), next_page_params: next_page_token.map(|a| Pagination { - page_token: to_checksum(&a, None), + page_token: a.to_string(), page_size, }), }; @@ -174,7 +170,7 @@ impl UserOps for UserOpsService { let bundler_filter = inner.bundler.map(parse_filter).transpose()?; let entry_point_filter = inner.entry_point.map(parse_filter).transpose()?; - let page_token: Option<(u64, H256, u32)> = + let page_token: Option<(u64, B256, u32)> = inner.page_token.map(parse_filter_3).transpose()?; let page_size = self.normalize_page_size(inner.page_size); @@ -194,7 +190,7 @@ impl UserOps for UserOpsService { let res = ListBundlesResponse { items: bundles.into_iter().map(|b| b.into()).collect(), next_page_params: next_page_token.map(|(b, t, i)| Pagination { - page_token: format!("{},{},{}", b, t.encode_hex(), i), + page_token: format!("{},{},{}", b, t, i), page_size, }), }; @@ -217,7 +213,7 @@ impl UserOps for UserOpsService { let bundle_index_filter = inner.bundle_index; let block_number_filter = inner.block_number; - let page_token: Option<(u64, H256)> = inner.page_token.map(parse_filter_2).transpose()?; + let page_token: Option<(u64, B256)> = inner.page_token.map(parse_filter_2).transpose()?; let page_size = self.normalize_page_size(inner.page_size); let (ops, next_page_token) = repository::user_op::list_user_ops( @@ -242,7 +238,7 @@ impl UserOps for UserOpsService { let res = ListUserOpsResponse { items: ops.into_iter().map(|acc| acc.into()).collect(), next_page_params: next_page_token.map(|(b, o)| Pagination { - page_token: format!("{},{}", b, o.encode_hex()), + page_token: format!("{},{}", b, o), page_size, }), }; @@ -271,7 +267,7 @@ impl UserOps for UserOpsService { let res = ListBundlersResponse { items: bundlers.into_iter().map(|b| b.into()).collect(), next_page_params: next_page_token.map(|(t, f)| Pagination { - page_token: format!("{},{}", t, to_checksum(&f, None)), + page_token: format!("{},{}", t, f), page_size, }), }; @@ -300,7 +296,7 @@ impl UserOps for UserOpsService { let res = ListPaymastersResponse { items: paymasters.into_iter().map(|b| b.into()).collect(), next_page_params: next_page_token.map(|(t, f)| Pagination { - page_token: format!("{},{}", t, to_checksum(&f, None)), + page_token: format!("{},{}", t, f), page_size, }), }; @@ -329,7 +325,7 @@ impl UserOps for UserOpsService { let res = ListFactoriesResponse { items: factories.into_iter().map(|b| b.into()).collect(), next_page_params: next_page_token.map(|(t, f)| Pagination { - page_token: format!("{},{}", t, to_checksum(&f, None)), + page_token: format!("{},{}", t, f), page_size, }), }; From 11ca4e51ec005721d23b1ca6c53f3eed0bcb4051 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 25 Dec 2024 18:02:23 +0700 Subject: [PATCH 2/6] chore: more refactor --- .../src/indexer/base_indexer.rs | 66 +++++++++++-------- .../src/indexer/common.rs | 4 +- .../src/indexer/rpc_utils.rs | 6 +- .../src/indexer/v06/mod.rs | 16 ++--- .../src/indexer/v07/mod.rs | 16 ++--- .../src/types/user_op.rs | 5 +- .../user-ops-indexer-proto/src/lib.rs | 6 +- .../user-ops-indexer-server/src/indexer.rs | 58 ++++++---------- 8 files changed, 81 insertions(+), 96 deletions(-) diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs index f37406ce1..e58d00009 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs @@ -11,7 +11,9 @@ use alloy::{ primitives::{Address, BlockHash, Bytes, TxHash, B256}, providers::Provider, rpc::types::{Filter, Log, TransactionReceipt}, + sol_types, sol_types::SolEvent, + transports::{TransportError, TransportErrorKind}, }; use anyhow::{anyhow, bail}; use futures::{ @@ -60,12 +62,13 @@ impl TryFrom for Job { } pub trait IndexerLogic { - fn entry_point(&self) -> Address; - fn version() -> &'static str; + const VERSION: &'static str; + + const USER_OPERATION_EVENT_SIGNATURE: B256; - fn user_operation_event_signature() -> B256; + const BEFORE_EXECUTION_SIGNATURE: B256; - fn before_execution_signature() -> B256; + fn entry_point(&self) -> Address; fn matches_handler_calldata(calldata: &Bytes) -> bool; @@ -78,15 +81,15 @@ pub trait IndexerLogic { ) -> anyhow::Result>; fn user_operation_event_matcher(&self, log: &Log) -> bool { log.address() == self.entry_point() - && log.topics().first() == Some(&Self::user_operation_event_signature()) + && log.topic0() == Some(&Self::USER_OPERATION_EVENT_SIGNATURE) } fn before_execution_matcher(&self, log: &Log) -> bool { log.address() == self.entry_point() - && log.topics().first() == Some(&Self::before_execution_signature()) + && log.topic0() == Some(&Self::BEFORE_EXECUTION_SIGNATURE) } - fn match_and_parse(&self, log: &Log) -> Option> { + fn match_and_parse(&self, log: &Log) -> Option> { if log.address() == self.entry_point() && log.topic0() == Some(&T::SIGNATURE_HASH) { Some(T::decode_log(&log.inner, true).map(|l| l.data)) } else { @@ -96,7 +99,7 @@ pub trait IndexerLogic { fn base_tx_logs_filter(&self) -> Filter { Filter::new() .address(self.entry_point()) - .event_signature(Self::before_execution_signature()) + .event_signature(Self::BEFORE_EXECUTION_SIGNATURE) } } @@ -125,7 +128,7 @@ impl Indexer { } } - #[instrument(name = "indexer", skip_all, level = "info", fields(version = L::version()))] + #[instrument(name = "indexer", skip_all, level = "info", fields(version = L::VERSION))] pub async fn start(&self) -> anyhow::Result<()> { let trace_client = match self.settings.trace_client { Some(client) => client, @@ -153,9 +156,8 @@ impl Indexer { // That's the only infinite stream in the SelectAll set. If the ws connection // unexpectedly disconnects, this stream will terminate, // so will the whole SelectAll set with for_each_concurrent on it. - // ethers-rs does not handle ws reconnects well, neither it can guarantee that no - // events would be lost even if reconnect is successful, so it's better to restart - // the whole indexer at once instead of trying to reconnect. + // alloy-rs will try to reconnect once, and if failed, + // the indexer will be restarted with a new rpc provider. stream_jobs.push(Box::pin(realtime_stream_jobs)); } else { tracing::info!("starting polling of past BeforeExecution logs from rpc"); @@ -176,18 +178,17 @@ impl Indexer { past_db_logs_start_block as u64 } else { rpc_refetch_block_number.saturating_add_signed(past_db_logs_start_block as i64) - as u64 }; let to_block = if past_db_logs_end_block > 0 { past_db_logs_end_block as u64 } else { - rpc_refetch_block_number.saturating_add_signed(past_db_logs_end_block as i64) as u64 + rpc_refetch_block_number.saturating_add_signed(past_db_logs_end_block as i64) }; tracing::info!(from_block, to_block, "fetching missed tx hashes in db"); let missed_txs = repository::user_op::stream_unprocessed_logs_tx_hashes( &self.db, self.logic.entry_point(), - L::user_operation_event_signature(), + L::BEFORE_EXECUTION_SIGNATURE, from_block, to_block, ) @@ -228,6 +229,12 @@ impl Indexer { .try_for_each_concurrent(Some(self.settings.concurrency as usize), |tx| async move { let mut backoff = vec![5, 20, 120].into_iter().map(Duration::from_secs); while let Err(err) = self.handle_tx(tx, trace_client).await { + // terminate stream if WS connection is closed, indexer will be restarted + if let Some(TransportError::Transport(TransportErrorKind::BackendGone)) = err.downcast_ref::() { + tracing::error!(error = ?err, tx_hash = ?tx, "tx handler failed, ws connection closed, exiting"); + return Err(err); + } + match backoff.next() { None => { tracing::error!(error = ?err, tx_hash = ?tx, "tx handler failed, skipping"); @@ -248,7 +255,7 @@ impl Indexer { &self, from_block: u64, to_block: u64, - ) -> Result, alloy::transports::TransportError> { + ) -> Result, TransportError> { let filter = self .logic .base_tx_logs_filter() @@ -285,7 +292,7 @@ impl Indexer { .fetch_jobs_for_block_range(from_block, block_number) .await?; - Ok::, alloy::transports::TransportError>(jobs) + Ok::, TransportError>(jobs) }) .filter_map(|fut| async { fut.await @@ -398,20 +405,29 @@ mod tests { indexer::{settings::EntrypointsSettings, v06, v07}, repository::tests::get_shared_db, }; - use alloy::{primitives::U256, providers::ProviderBuilder}; + use alloy::{ + primitives::U256, + providers::{ProviderBuilder, RootProvider}, + transports::BoxTransport, + }; use entity::sea_orm_active_enums::{EntryPointVersion, SponsorType}; use sea_orm::EntityTrait; use std::str::FromStr; const ETH_RPC_URL: &str = "https://eth.drpc.org"; + async fn connect_rpc() -> RootProvider { + ProviderBuilder::new() + .on_builtin(ETH_RPC_URL) + .await + .expect("can't connect") + } + #[tokio::test] async fn handle_tx_v06_ok() { let db = get_shared_db().await; // TODO: use mocked connection, alloy::transports::ipc::MockIpcServer from alloy seems broken at v0.8.3 - let client = ProviderBuilder::new() - .on_http(ETH_RPC_URL.parse().unwrap()) - .boxed(); + let client = connect_rpc().await; // just some random tx from mainnet let tx_hash = @@ -479,9 +495,7 @@ mod tests { async fn handle_tx_v06_with_tracing_ok() { let db = get_shared_db().await; // TODO: use mocked connection, alloy::transports::ipc::MockIpcServer from alloy seems broken at v0.8.3 - let client = ProviderBuilder::new() - .on_http(ETH_RPC_URL.parse().unwrap()) - .boxed(); + let client = connect_rpc().await; // just some random tx from mainnet let tx_hash = @@ -554,9 +568,7 @@ mod tests { async fn handle_tx_v07_ok() { let db = get_shared_db().await; // TODO: use mocked connection, alloy::transports::ipc::MockIpcServer from alloy seems broken at v0.8.3 - let client = ProviderBuilder::new() - .on_http(ETH_RPC_URL.parse().unwrap()) - .boxed(); + let client = connect_rpc().await; // just some random tx from mainnet let tx_hash = diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs index 1e0796543..e729f7321 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs @@ -115,7 +115,7 @@ pub fn decode_execute_call_data(call_data: &Bytes) -> (Option
, Option Result, RpcError>; + ) -> TransportResult>; } #[async_trait] @@ -70,7 +70,7 @@ impl CallTracer for T { &self, tx_hash: TxHash, client: TraceClient, - ) -> Result, RpcError> { + ) -> TransportResult> { if client == TraceClient::Geth { let geth_trace = self .debug_trace_transaction( diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs index 7815b5bef..5186f31a4 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs @@ -33,20 +33,14 @@ struct ExtendedUserOperation { } impl IndexerLogic for IndexerV06 { - fn entry_point(&self) -> Address { - self.entry_point - } + const VERSION: &'static str = "v0.6"; - fn version() -> &'static str { - "v0.6" - } + const USER_OPERATION_EVENT_SIGNATURE: B256 = IEntrypointV06::UserOperationEvent::SIGNATURE_HASH; - fn user_operation_event_signature() -> B256 { - IEntrypointV06::UserOperationEvent::SIGNATURE_HASH - } + const BEFORE_EXECUTION_SIGNATURE: B256 = IEntrypointV06::BeforeExecution::SIGNATURE_HASH; - fn before_execution_signature() -> B256 { - IEntrypointV06::BeforeExecution::SIGNATURE_HASH + fn entry_point(&self) -> Address { + self.entry_point } fn matches_handler_calldata(calldata: &Bytes) -> bool { diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs index 5bf452680..73bbc24c5 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs @@ -34,20 +34,14 @@ struct ExtendedUserOperation { } impl IndexerLogic for IndexerV07 { - fn entry_point(&self) -> Address { - self.entry_point - } + const VERSION: &'static str = "v0.7"; - fn version() -> &'static str { - "v0.7" - } + const USER_OPERATION_EVENT_SIGNATURE: B256 = IEntrypointV07::UserOperationEvent::SIGNATURE_HASH; - fn user_operation_event_signature() -> B256 { - IEntrypointV07::UserOperationEvent::SIGNATURE_HASH - } + const BEFORE_EXECUTION_SIGNATURE: B256 = IEntrypointV07::BeforeExecution::SIGNATURE_HASH; - fn before_execution_signature() -> B256 { - IEntrypointV07::BeforeExecution::SIGNATURE_HASH + fn entry_point(&self) -> Address { + self.entry_point } fn matches_handler_calldata(calldata: &Bytes) -> bool { diff --git a/user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs b/user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs index 411670f97..12212cfef 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs @@ -2,8 +2,9 @@ use crate::{ indexer::common::decode_execute_call_data, repository::user_op::ListUserOpDB, types::common::u256_to_decimal, }; -use alloy::primitives::ruint::UintTryTo; -use alloy::primitives::{Address, BlockHash, BlockNumber, Bytes, TxHash, B128, B256, U128, U256}; +use alloy::primitives::{ + ruint::UintTryTo, Address, BlockHash, BlockNumber, Bytes, TxHash, B128, B256, U128, U256, +}; pub use entity::sea_orm_active_enums::{EntryPointVersion, SponsorType}; use entity::user_operations::Model; use num_traits::cast::ToPrimitive; diff --git a/user-ops-indexer/user-ops-indexer-proto/src/lib.rs b/user-ops-indexer/user-ops-indexer-proto/src/lib.rs index e5bf65b84..0c9c83c7a 100644 --- a/user-ops-indexer/user-ops-indexer-proto/src/lib.rs +++ b/user-ops-indexer/user-ops-indexer-proto/src/lib.rs @@ -1,4 +1,8 @@ -#![allow(clippy::derive_partial_eq_without_eq, unused_imports, unreachable_patterns)] +#![allow( + clippy::derive_partial_eq_without_eq, + unused_imports, + unreachable_patterns +)] pub mod blockscout { pub mod user_ops_indexer { diff --git a/user-ops-indexer/user-ops-indexer-server/src/indexer.rs b/user-ops-indexer/user-ops-indexer-server/src/indexer.rs index 52eb06dad..78d21d205 100644 --- a/user-ops-indexer/user-ops-indexer-server/src/indexer.rs +++ b/user-ops-indexer/user-ops-indexer-server/src/indexer.rs @@ -1,8 +1,5 @@ use crate::settings::Settings; -use alloy::{ - providers::{ProviderBuilder, RootProvider, WsConnect}, - transports::{BoxTransport, TransportError, TransportErrorKind}, -}; +use alloy::providers::ProviderBuilder; use sea_orm::DatabaseConnection; use std::sync::Arc; use tokio::time::sleep; @@ -49,29 +46,30 @@ async fn start_indexer_with_retries anyhow::Result<()> { tracing::info!( - version = L::version(), + version = L::VERSION, entry_point = logic.entry_point().to_string(), "connecting to rpc" ); - // If the first connect fails, the function will return an error immediately. // All subsequent reconnects are done inside tokio task and will not propagate to above. - let mut indexer = Indexer::new( - connect(settings.rpc_url.clone()).await?, - db_connection.clone(), - settings.clone(), - logic.clone(), - ); - - let delay = settings.restart_delay; + let mut client = ProviderBuilder::new().on_builtin(&settings.rpc_url).await?; tokio::spawn(async move { + let delay = settings.restart_delay; + loop { + let indexer = Indexer::new( + client.clone(), + db_connection.clone(), + settings.clone(), + logic.clone(), + ); + match indexer.start().await { Err(err) => { tracing::error!( error = ?err, - version = L::version(), + version = L::VERSION, ?delay, "indexer stream ended with error, retrying" ); @@ -79,13 +77,13 @@ async fn start_indexer_with_retries { if !settings.realtime.enabled { tracing::info!( - version = L::version(), + version = L::VERSION, "indexer stream ended without error, exiting" ); return; } tracing::error!( - version = L::version(), + version = L::VERSION, ?delay, "indexer stream ended unexpectedly, retrying" ); @@ -95,26 +93,20 @@ async fn start_indexer_with_retries provider, + client = match ProviderBuilder::new().on_builtin(&settings.rpc_url).await { + Ok(client) => client, Err(err) => { tracing::error!( error = ?err, - version = L::version(), + version = L::VERSION, ?delay, "failed to reconnect to the rpc, retrying" ); continue; } }; - indexer = Indexer::new( - provider, - db_connection.clone(), - settings.clone(), - logic.clone(), - ); break; } } @@ -122,15 +114,3 @@ async fn start_indexer_with_retries Result, TransportError> { - if rpc_url.starts_with("ws") { - let ws = WsConnect::new(rpc_url); - Ok(ProviderBuilder::new().on_ws(ws).await?.boxed()) - } else { - let http = rpc_url - .parse() - .map_err(|_| TransportErrorKind::custom_str("invalid http url"))?; - Ok(ProviderBuilder::new().on_http(http).boxed()) - } -} From bce5c26bd0bcb863515b229677d711a9f4572547 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Thu, 26 Dec 2024 13:11:42 +0700 Subject: [PATCH 3/6] chore: update feature flags --- user-ops-indexer/Cargo.lock | 92 ------------------- .../user-ops-indexer-logic/Cargo.toml | 2 +- .../user-ops-indexer-server/Cargo.toml | 2 +- 3 files changed, 2 insertions(+), 94 deletions(-) diff --git a/user-ops-indexer/Cargo.lock b/user-ops-indexer/Cargo.lock index 64f95512c..16d310abb 100644 --- a/user-ops-indexer/Cargo.lock +++ b/user-ops-indexer/Cargo.lock @@ -345,11 +345,8 @@ dependencies = [ "alloy-rpc-client", "alloy-rpc-types", "alloy-serde", - "alloy-signer", - "alloy-signer-local", "alloy-transport", "alloy-transport-http", - "alloy-transport-ipc", "alloy-transport-ws", ] @@ -378,7 +375,6 @@ dependencies = [ "auto_impl", "c-kzg", "derive_more 1.0.0", - "k256", "serde", ] @@ -467,7 +463,6 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "derive_more 1.0.0", - "k256", "serde", ] @@ -613,7 +608,6 @@ dependencies = [ "alloy-rpc-types-trace", "alloy-transport", "alloy-transport-http", - "alloy-transport-ipc", "alloy-transport-ws", "async-stream", "async-trait", @@ -687,7 +681,6 @@ dependencies = [ "alloy-pubsub", "alloy-transport", "alloy-transport-http", - "alloy-transport-ipc", "alloy-transport-ws", "futures", "pin-project", @@ -709,7 +702,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" dependencies = [ "alloy-primitives", - "alloy-rpc-types-engine", "alloy-rpc-types-eth", "alloy-rpc-types-trace", "alloy-serde", @@ -737,22 +729,6 @@ dependencies = [ "serde", ] -[[package]] -name = "alloy-rpc-types-engine" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03bd16fa4959255ebf4a7702df08f325e5631df5cdca07c8a8e58bdc10fe02e3" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "derive_more 1.0.0", - "serde", - "strum 0.26.3", -] - [[package]] name = "alloy-rpc-types-eth" version = "0.8.3" @@ -812,22 +788,6 @@ dependencies = [ "thiserror 2.0.9", ] -[[package]] -name = "alloy-signer-local" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256", - "rand", - "thiserror 2.0.9", -] - [[package]] name = "alloy-sol-macro" version = "0.8.15" @@ -936,25 +896,6 @@ dependencies = [ "url", ] -[[package]] -name = "alloy-transport-ipc" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a172a59d24706b26a79a837f86d51745cb26ca6f8524712acd0208a14cff95" -dependencies = [ - "alloy-json-rpc", - "alloy-pubsub", - "alloy-transport", - "bytes", - "futures", - "interprocess", - "pin-project", - "serde_json", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "alloy-transport-ws" version = "0.8.3" @@ -2191,12 +2132,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" -[[package]] -name = "doctest-file" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" - [[package]] name = "dotenvy" version = "0.15.7" @@ -3134,21 +3069,6 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" -[[package]] -name = "interprocess" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "894148491d817cb36b6f778017b8ac46b17408d522dd90f539d677ea938362eb" -dependencies = [ - "doctest-file", - "futures-core", - "libc", - "recvmsg", - "tokio", - "widestring", - "windows-sys 0.52.0", -] - [[package]] name = "ipnet" version = "2.10.1" @@ -4357,12 +4277,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "recvmsg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" - [[package]] name = "redox_syscall" version = "0.5.8" @@ -6535,12 +6449,6 @@ dependencies = [ "wasite", ] -[[package]] -name = "widestring" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" - [[package]] name = "winapi" version = "0.3.9" diff --git a/user-ops-indexer/user-ops-indexer-logic/Cargo.toml b/user-ops-indexer/user-ops-indexer-logic/Cargo.toml index 03a18bd4b..f9ded282b 100644 --- a/user-ops-indexer/user-ops-indexer-logic/Cargo.toml +++ b/user-ops-indexer/user-ops-indexer-logic/Cargo.toml @@ -29,7 +29,7 @@ chrono = "0.4.31" lru = "0.12.2" async-trait = "0.1.77" serde_with = "3.6.1" -alloy = { version = "0.8.2", features = ["full", "provider-debug-api", "provider-trace-api"] } +alloy = { version = "0.8.3", features = ["contract", "pubsub", "provider-debug-api", "provider-trace-api"] } [dev-dependencies] async-trait = "0.1" diff --git a/user-ops-indexer/user-ops-indexer-server/Cargo.toml b/user-ops-indexer/user-ops-indexer-server/Cargo.toml index 343d776e3..1fbc302b4 100644 --- a/user-ops-indexer/user-ops-indexer-server/Cargo.toml +++ b/user-ops-indexer/user-ops-indexer-server/Cargo.toml @@ -19,7 +19,7 @@ serde = "1.0" tokio = { version = "1.23", features = ["rt-multi-thread", "macros"] } tonic = "0.8" tracing = "0.1" -alloy = { version = "0.8.2", features = ["full", "provider-debug-api", "provider-trace-api"] } +alloy = { version = "0.8.3", features = ["provider-ws", "provider-http"] } [dev-dependencies] sea-orm = { version = "*", features = ["sqlx-sqlite"] } From b43ac370280ece199eea2d9726d98169ba1e4c55 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Wed, 1 Jan 2025 23:51:41 +0700 Subject: [PATCH 4/6] chore: bump alloy --- user-ops-indexer/Cargo.lock | 95 ++++++++++--------- .../user-ops-indexer-logic/Cargo.toml | 2 +- .../user-ops-indexer-server/Cargo.toml | 2 +- 3 files changed, 50 insertions(+), 49 deletions(-) diff --git a/user-ops-indexer/Cargo.lock b/user-ops-indexer/Cargo.lock index 16d310abb..dbaa320e8 100644 --- a/user-ops-indexer/Cargo.lock +++ b/user-ops-indexer/Cargo.lock @@ -330,9 +330,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +checksum = "4305e0397a7eb57f4840a048583b7ab904eabd250264568fc65a7e38a76c9e40" dependencies = [ "alloy-consensus", "alloy-contract", @@ -363,9 +363,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +checksum = "d802a6d579d924a2926d181bce43231aaab4699a7c206197e88fbc6b9dda846f" dependencies = [ "alloy-eips", "alloy-primitives", @@ -380,9 +380,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +checksum = "24b1bcb3e4810bff7e2a62ac0d741c70a7b5560e57b76eb0f0d33e1070735c60" dependencies = [ "alloy-consensus", "alloy-eips", @@ -394,9 +394,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" +checksum = "8e56bc4dc06ab205dc4106348c44b92e0d979148f8db751994c11caabf5ebbef" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -456,9 +456,9 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "cabf647eb4650c91a9d38cb6f972bb320009e7e9d61765fb688a86f1563b33e8" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -468,9 +468,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +checksum = "938bc1cf2ec42579e187834efc254e76dd3fa19f526b57872713e6b95f411305" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -486,10 +486,11 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +checksum = "b648eac186485ead3da160985b929e610a45eb39903f750da9b35f58a91eef52" dependencies = [ + "alloy-eips", "alloy-primitives", "alloy-serde", "alloy-trie", @@ -510,9 +511,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +checksum = "a1a38b4b49667a84ecad7cdaf431b8bd3f14ca496e5a021df1c26d5c4595dca6" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -524,9 +525,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +checksum = "4fb5dc326960e88eec6b5e9add221a071f15cb8fa93b9e88ee9c76cd0e4e1009" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -549,9 +550,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +checksum = "1535c89ae0648f2c15c0bf9b8b92670f6b3b8515b645425c8b46462563c0eae4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -590,9 +591,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +checksum = "a9a9d6ef38d75e4b0dce6737463099698f9b839d1c3f7c8883bfdfce8954374b" dependencies = [ "alloy-chains", "alloy-consensus", @@ -631,9 +632,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" +checksum = "1be3b30bab565198a1bda090915dd165ca9211154eb0b37d046a22829418dcc0" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -672,9 +673,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +checksum = "f5ed1e9957edfc8d155e2610e2ff3e10b059b89a6103de9f01579f40d8926d47" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -697,9 +698,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" +checksum = "206749723862bd27d5468270e30fc987c5b4376240aefee728d7e64282c9d146" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -710,9 +711,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +checksum = "5e6ff23d7bde6ddeea4c1ca98e7a5a728326d543bd7133735c04ea83ebde41d0" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -721,9 +722,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-debug" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dec1c1b65614ebd5834a7dfddf525a186962082023718e10f4f64ed2d02514" +checksum = "3d72085173d210806a27892eb72770a663f5b0c17598e37f18c6bb24f7583c3c" dependencies = [ "alloy-primitives", "serde", @@ -731,9 +732,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +checksum = "319a0ca31863bd6fb9aafeaa16425d0a2f1228da44bc24fd2f997ba50afe7e18" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -743,17 +744,17 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "derive_more 1.0.0", "itertools 0.13.0", "serde", "serde_json", + "thiserror 2.0.9", ] [[package]] name = "alloy-rpc-types-trace" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db14a83665cd28ffd01939f04c2adf0e0fd9bb648b73ca651dcaa0869dae027f" +checksum = "af2769894024f65ba252618e06a0ca22fc025377ade6d60d7f47a83ac9559680" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -765,9 +766,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +checksum = "81537867986734e5867a9131145bdc56301f5b37ef9c9fb4654d7f7691a4015d" dependencies = [ "alloy-primitives", "serde", @@ -776,9 +777,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +checksum = "0fdcbfe7079c877b3cb6ec43017e94f66432480f1c1779f736c064e6a8d422cc" dependencies = [ "alloy-primitives", "async-trait", @@ -863,9 +864,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +checksum = "6121c7a8791d7984bd3e1a487aae55c62358b0bd94330126db41d795d942e24e" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -883,9 +884,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +checksum = "15487cd2d7f2bfd8546e851d80db470603c2a1de82f7c39403078356b20d9a21" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -898,9 +899,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.8.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" +checksum = "f812a1f1ae7955964727d3040bf240955ca324d80383b9dd0ab21a6de3007386" dependencies = [ "alloy-pubsub", "alloy-transport", diff --git a/user-ops-indexer/user-ops-indexer-logic/Cargo.toml b/user-ops-indexer/user-ops-indexer-logic/Cargo.toml index f9ded282b..8cdcddc66 100644 --- a/user-ops-indexer/user-ops-indexer-logic/Cargo.toml +++ b/user-ops-indexer/user-ops-indexer-logic/Cargo.toml @@ -29,7 +29,7 @@ chrono = "0.4.31" lru = "0.12.2" async-trait = "0.1.77" serde_with = "3.6.1" -alloy = { version = "0.8.3", features = ["contract", "pubsub", "provider-debug-api", "provider-trace-api"] } +alloy = { version = "0.9.1", features = ["contract", "pubsub", "provider-debug-api", "provider-trace-api"] } [dev-dependencies] async-trait = "0.1" diff --git a/user-ops-indexer/user-ops-indexer-server/Cargo.toml b/user-ops-indexer/user-ops-indexer-server/Cargo.toml index 1fbc302b4..fffc43e21 100644 --- a/user-ops-indexer/user-ops-indexer-server/Cargo.toml +++ b/user-ops-indexer/user-ops-indexer-server/Cargo.toml @@ -19,7 +19,7 @@ serde = "1.0" tokio = { version = "1.23", features = ["rt-multi-thread", "macros"] } tonic = "0.8" tracing = "0.1" -alloy = { version = "0.8.3", features = ["provider-ws", "provider-http"] } +alloy = { version = "0.9.1", features = ["provider-ws", "provider-http"] } [dev-dependencies] sea-orm = { version = "*", features = ["sqlx-sqlite"] } From 132b25953ac2868ed7aabd702e4e0f9cfaf4f8ab Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Thu, 2 Jan 2025 13:48:50 +0700 Subject: [PATCH 5/6] chore: use alloy macroses --- .../src/indexer/base_indexer.rs | 65 ++++++++----------- .../src/indexer/common.rs | 15 ++--- .../src/indexer/rpc_utils.rs | 9 ++- .../src/indexer/settings.rs | 10 +-- .../src/indexer/v06/mod.rs | 2 +- .../src/indexer/v07/mod.rs | 2 +- .../src/repository/account.rs | 12 ++-- .../src/repository/bundle.rs | 8 +-- .../src/repository/bundler.rs | 8 +-- .../src/repository/factory.rs | 6 +- .../src/repository/paymaster.rs | 6 +- .../src/repository/user_op.rs | 20 +++--- 12 files changed, 69 insertions(+), 94 deletions(-) diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs index e58d00009..322dcc847 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs @@ -406,13 +406,12 @@ mod tests { repository::tests::get_shared_db, }; use alloy::{ - primitives::U256, + primitives::{address, b256, bytes, U256}, providers::{ProviderBuilder, RootProvider}, transports::BoxTransport, }; use entity::sea_orm_active_enums::{EntryPointVersion, SponsorType}; use sea_orm::EntityTrait; - use std::str::FromStr; const ETH_RPC_URL: &str = "https://eth.drpc.org"; @@ -430,9 +429,7 @@ mod tests { let client = connect_rpc().await; // just some random tx from mainnet - let tx_hash = - TxHash::from_str("0xf9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e") - .unwrap(); + let tx_hash = b256!("f9f60f6dc99663c6ce4912ef92fe6a122bb90585e47b5f213efca1705be26d6e"); let entry_point = EntrypointsSettings::default().v06_entry_point; let indexer = Indexer::new( @@ -446,34 +443,32 @@ mod tests { .await .unwrap(); - let op_hash = - B256::from_str("0x2d5f7a884e9a99cfe2445db2af140a8851fbd860852b668f2f199190f68adf87") - .unwrap(); + let op_hash = b256!("2d5f7a884e9a99cfe2445db2af140a8851fbd860852b668f2f199190f68adf87"); let user_op = repository::user_op::find_user_op_by_op_hash(&db, op_hash) .await .unwrap() .unwrap(); assert_eq!(user_op, UserOp { hash: op_hash, - sender: Address::from_str("0xeae4d85f7733ad522f601ce7ad4f595704a2d677").unwrap(), + sender: address!("eae4d85f7733ad522f601ce7ad4f595704a2d677"), nonce: B256::ZERO, init_code: None, - call_data: Bytes::from_str("0x70641a22000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001e0049783f008a0085193e00003d00cd54003c71ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000").unwrap(), + call_data: bytes!("70641a22000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001e0049783f008a0085193e00003d00cd54003c71ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000"), call_gas_limit: U256::from(92599), verification_gas_limit: U256::from(87149), pre_verification_gas: U256::from(49900), max_fee_per_gas: U256::from(53825000000u64), max_priority_fee_per_gas: U256::from(500000000u64), paymaster_and_data: None, - signature: Bytes::from_str("0x000000000000000000000000000000000000000000000000000000000065793a092c25c7a7c5e4bc46467324e2845caf1ccae767786e07806ca720f8a6b83356bc7d43a63a96b34507cfe7c424db37f351d71851ae9318e8d5c3d9f17c8bdb744c1c").unwrap(), + signature: bytes!("000000000000000000000000000000000000000000000000000000000065793a092c25c7a7c5e4bc46467324e2845caf1ccae767786e07806ca720f8a6b83356bc7d43a63a96b34507cfe7c424db37f351d71851ae9318e8d5c3d9f17c8bdb744c1c"), aggregator: None, aggregator_signature: None, entry_point, entry_point_version: EntryPointVersion::V06, transaction_hash: tx_hash, block_number: 18774992, - block_hash: BlockHash::from_str("0xe90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4").unwrap(), - bundler: Address::from_str("0x2df993cd76bb8dbda50546eef00eee2e6331a2c8").unwrap(), + block_hash: b256!("e90aa1d6038c87b029a0666148ac2058ab8397f9c53594cc5a38c0113a48eab4"), + bundler: address!("2df993cd76bb8dbda50546eef00eee2e6331a2c8"), bundle_index: 0, index: 0, factory: None, @@ -498,13 +493,9 @@ mod tests { let client = connect_rpc().await; // just some random tx from mainnet - let tx_hash = - TxHash::from_str("0xd69a2233e7ff9034d21f588ffde16ef30dee6ddc4814fa4ecd4a1355630b1730") - .unwrap(); + let tx_hash = b256!("d69a2233e7ff9034d21f588ffde16ef30dee6ddc4814fa4ecd4a1355630b1730"); let entry_point = EntrypointsSettings::default().v06_entry_point; - let op_hash = - B256::from_str("0xe5df829d25b3b0a043a658eb460cf74898eb0ad72a526dba0cd509ed2b83f796") - .unwrap(); + let op_hash = b256!("e5df829d25b3b0a043a658eb460cf74898eb0ad72a526dba0cd509ed2b83f796"); let indexer = Indexer::new( client, @@ -526,25 +517,25 @@ mod tests { .unwrap(); assert_eq!(user_op, UserOp { hash: op_hash, - sender: Address::from_str("0xc09521aa72df1f93e36c776d5464f8bf2ae7b37d").unwrap(), - nonce: B256::from_str("0x0000000000000000000000000000000000000000000021050000000000000002").unwrap(), + sender: address!("c09521aa72df1f93e36c776d5464f8bf2ae7b37d"), + nonce: b256!("0000000000000000000000000000000000000000000021050000000000000002"), init_code: None, - call_data: Bytes::from_str("0x2c2abd1e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000240f0f3f240000000000000000000000005ecd0d3a7f69c73d86f634b52cb9a4c0eb4df7ae00000000000000000000000000000000000000000000000000000000").unwrap(), + call_data: bytes!("2c2abd1e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000240f0f3f240000000000000000000000005ecd0d3a7f69c73d86f634b52cb9a4c0eb4df7ae00000000000000000000000000000000000000000000000000000000"), call_gas_limit: U256::from(89016), verification_gas_limit: U256::from(578897), pre_verification_gas: U256::from(107592), max_fee_per_gas: U256::ZERO, max_priority_fee_per_gas: U256::ZERO, paymaster_and_data: None, - signature: Bytes::from_str("0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000013259e664945ba8945c3198dfbfc83dd1c654a7d284dd48b3f4c80544a281938960d7a8386af33457c88801d6e59aa95f374978f0cf400952eea08a15ad68aa7d0000000000000000000000000000000000000000000000000000000000000025f198086b2db17256731bc456673b96bcef23f51d1fbacdd7c4379ef65465572f1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a224d624230784b7177593773684c3461574c31714f5f315668794c4773433632764354682d544342464c704d222c226f726967696e223a2268747470733a2f2f6b6579732e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000").unwrap(), + signature: bytes!("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000013259e664945ba8945c3198dfbfc83dd1c654a7d284dd48b3f4c80544a281938960d7a8386af33457c88801d6e59aa95f374978f0cf400952eea08a15ad68aa7d0000000000000000000000000000000000000000000000000000000000000025f198086b2db17256731bc456673b96bcef23f51d1fbacdd7c4379ef65465572f1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a224d624230784b7177593773684c3461574c31714f5f315668794c4773433632764354682d544342464c704d222c226f726967696e223a2268747470733a2f2f6b6579732e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000"), aggregator: None, aggregator_signature: None, entry_point, entry_point_version: EntryPointVersion::V06, transaction_hash: tx_hash, block_number: 21478047, - block_hash: BlockHash::from_str("0x2389d13b5294f5c38f5120671adf870468d892e60e637cb65e0eb47c455160f9").unwrap(), - bundler: Address::from_str("0xc09521aa72df1f93e36c776d5464f8bf2ae7b37d").unwrap(), + block_hash: b256!("2389d13b5294f5c38f5120671adf870468d892e60e637cb65e0eb47c455160f9"), + bundler: address!("c09521aa72df1f93e36c776d5464f8bf2ae7b37d"), bundle_index: 0, index: 0, factory: None, @@ -571,9 +562,7 @@ mod tests { let client = connect_rpc().await; // just some random tx from mainnet - let tx_hash = - TxHash::from_str("0x4a6702f8ef5b7754f5b54dfb00ccba181603e3a6fff77c93e7d0d40148f09ad0") - .unwrap(); + let tx_hash = b256!("4a6702f8ef5b7754f5b54dfb00ccba181603e3a6fff77c93e7d0d40148f09ad0"); let entry_point = EntrypointsSettings::default().v07_entry_point; let indexer = Indexer::new( @@ -587,38 +576,36 @@ mod tests { .await .unwrap(); - let op_hash = - B256::from_str("0xbd48a68e7dd39891fe7f139fe11bfb82d934a5deceb98f0c6fc4ebc7eeca58da") - .unwrap(); + let op_hash = b256!("bd48a68e7dd39891fe7f139fe11bfb82d934a5deceb98f0c6fc4ebc7eeca58da"); let user_op = repository::user_op::find_user_op_by_op_hash(&db, op_hash) .await .unwrap() .unwrap(); assert_eq!(user_op, UserOp { hash: op_hash, - sender: Address::from_str("0x4a7EFb490b2D34D1962f365C5647D84FAdD3Bd6A").unwrap(), - nonce: B256::from_str("0x00005c97aa67ba578e3c54ec5942a7563ea9130e4f5f4c300000000000000000").unwrap(), + sender: address!("4a7EFb490b2D34D1962f365C5647D84FAdD3Bd6A"), + nonce: b256!("00005c97aa67ba578e3c54ec5942a7563ea9130e4f5f4c300000000000000000"), init_code: None, - call_data: Bytes::from_str("0xe9ae5c530100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000000000027d9000000000000000000000000000000000000000000000000000000000000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c44666fc80394356b4034c6f447b20899cff26af1d6d4520e9e3d7616ac0408daeb3cba94a00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000003c170744609c21c313473e3811563073c850c9f500000000000000000000000000000000000000000000000000000000009032d20000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000b44656669417070486f6d65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a30783030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000000000000000000000000000000000000000000000000000f2614a233c7c3e7f08b1f887ba133a13f1eb2c55000000000000000000000000f2614a233c7c3e7f08b1f887ba133a13f1eb2c550000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000027d900000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001442646478b0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000000000000000000000000000000000000000027d9000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000009032d20000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000045022260fac5e5542a773aa44fbcfedf7c193bc2c59901ffff00004375dff511095cc5a197a54140a24efef3a416011231deb6f5749ef6ce6943a275a1d3e7486f4eae000bb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000056eb4bf8b7510323b89fde249d1fb660ae30d2ee00000000000000000000000000000000000000000000000000000000000e7e2700000000000000000000000000000000000000000000000000000000").unwrap(), + call_data: bytes!("e9ae5c530100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000000000027d9000000000000000000000000000000000000000000000000000000000000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c44666fc80394356b4034c6f447b20899cff26af1d6d4520e9e3d7616ac0408daeb3cba94a00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000003c170744609c21c313473e3811563073c850c9f500000000000000000000000000000000000000000000000000000000009032d20000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000b44656669417070486f6d65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a30783030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000000000000000000000000000000000000000000000000000f2614a233c7c3e7f08b1f887ba133a13f1eb2c55000000000000000000000000f2614a233c7c3e7f08b1f887ba133a13f1eb2c550000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000027d900000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001442646478b0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000000000000000000000000000000000000000027d9000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000009032d20000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000045022260fac5e5542a773aa44fbcfedf7c193bc2c59901ffff00004375dff511095cc5a197a54140a24efef3a416011231deb6f5749ef6ce6943a275a1d3e7486f4eae000bb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000056eb4bf8b7510323b89fde249d1fb660ae30d2ee00000000000000000000000000000000000000000000000000000000000e7e2700000000000000000000000000000000000000000000000000000000"), call_gas_limit: U256::from(375068), verification_gas_limit: U256::from(166784), pre_verification_gas: U256::from(69185), max_fee_per_gas: U256::from(1000000), max_priority_fee_per_gas: U256::from(5095252459u64), - paymaster_and_data: Some(Bytes::from_str("0x0000000000000039cd5e8ae05257ce51c473ddd10000000000000000000000000001440600000000000000000000000000000001000000676b732f000000000000bc8f0c8fbbdaa38053b974afd0fe66cc7be40c0941f4ac58304ddda97ee5ba6e14c11f01cbd2c7c46401448bb9615bf29449ead5da1c4755989910524828a2461c").unwrap()), - signature: Bytes::from_str("0xf59f5f4d934312578dbd0c7a8a464cd8c73c1cbbb267b1dcae103d0e2d8f3971314b169eac449874652d7f6cb83de63422c762c4dfbca02629f94fc3a478141d1c").unwrap(), + paymaster_and_data: Some(bytes!("0000000000000039cd5e8ae05257ce51c473ddd10000000000000000000000000001440600000000000000000000000000000001000000676b732f000000000000bc8f0c8fbbdaa38053b974afd0fe66cc7be40c0941f4ac58304ddda97ee5ba6e14c11f01cbd2c7c46401448bb9615bf29449ead5da1c4755989910524828a2461c")), + signature: bytes!("f59f5f4d934312578dbd0c7a8a464cd8c73c1cbbb267b1dcae103d0e2d8f3971314b169eac449874652d7f6cb83de63422c762c4dfbca02629f94fc3a478141d1c"), aggregator: None, aggregator_signature: None, entry_point, entry_point_version: EntryPointVersion::V07, transaction_hash: tx_hash, block_number: 21476573, - block_hash: BlockHash::from_str("0x54f26503211219a84c1c25d8f5c61d6e1a2f253b97508fb88a6e2e13bffee0b3").unwrap(), - bundler: Address::from_str("0x4337003fcD2F56DE3977cCb806383E9161628D0E").unwrap(), + block_hash: b256!("54f26503211219a84c1c25d8f5c61d6e1a2f253b97508fb88a6e2e13bffee0b3"), + bundler: address!("4337003fcD2F56DE3977cCb806383E9161628D0E"), bundle_index: 0, index: 0, factory: None, - paymaster: Some(Address::from_str("0x0000000000000039cd5e8aE05257CE51C473ddd1").unwrap()), + paymaster: Some(address!("0000000000000039cd5e8aE05257CE51C473ddd1")), status: true, revert_reason: None, gas: U256::from(693988), diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs index e729f7321..42cf90ae4 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/common.rs @@ -115,16 +115,15 @@ pub fn decode_execute_call_data(call_data: &Bytes) -> (Option
, Option Vec { mod tests { use crate::indexer::rpc_utils::{flatten_geth_trace, TraceType}; use alloy::{ - primitives::{Address, Bytes}, + primitives::{address, bytes}, rpc::types::trace::geth::CallFrame, }; - use std::str::FromStr; #[test] fn test_flatten_geth_trace() { @@ -183,13 +182,13 @@ mod tests { assert_eq!(res[1].typ, TraceType::Call); assert_eq!( res[1].from, - Address::from_str("0xcA11bde05977b3631167028862bE2a173976CA11").unwrap() + address!("cA11bde05977b3631167028862bE2a173976CA11") ); assert_eq!( res[1].to, - Some(Address::from_str("0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789").unwrap()) + Some(address!("5FF137D4b0FDCD49DcA30c7CF57E578a026d2789")) ); - assert_eq!(res[1].input, Bytes::from_str("0x1fad948c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b0000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000").unwrap()); + assert_eq!(res[1].input, bytes!("1fad948c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b0000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000")); assert_eq!( res.iter() diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/settings.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/settings.rs index b9f817635..1fa2f460c 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/settings.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/settings.rs @@ -1,5 +1,5 @@ use crate::indexer::rpc_utils::TraceClient; -use alloy::primitives::Address; +use alloy::primitives::{address, Address}; use serde::Deserialize; use serde_with::serde_as; use std::time; @@ -127,13 +127,9 @@ impl Default for EntrypointsSettings { fn default() -> Self { Self { v06: true, - v06_entry_point: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" - .parse() - .unwrap(), + v06_entry_point: address!("5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"), v07: true, - v07_entry_point: "0x0000000071727De22E5E9d8BAf0edAc6f37da032" - .parse() - .unwrap(), + v07_entry_point: address!("0000000071727De22E5E9d8BAf0edAc6f37da032"), } } } diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs index 5186f31a4..82313b21b 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs @@ -158,7 +158,7 @@ impl IndexerV06 { let (user_logs_start_index, user_logs_count) = extract_user_logs_boundaries(logs, self.entry_point, paymaster); Ok(UserOp { - hash: B256::from(user_op_event.userOpHash), + hash: user_op_event.userOpHash, sender, nonce: B256::from(user_op.user_op.nonce), init_code: none_if_empty(user_op.user_op.initCode), diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs index 73bbc24c5..0fceb6ea3 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs @@ -177,7 +177,7 @@ impl IndexerV07 { let (user_logs_start_index, user_logs_count) = extract_user_logs_boundaries(logs, self.entry_point, paymaster); Ok(UserOp { - hash: B256::from(user_op_event.userOpHash), + hash: user_op_event.userOpHash, sender, nonce: B256::from(user_op.user_op.nonce), init_code: none_if_empty(user_op.user_op.initCode), diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/account.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/account.rs index e6650f629..4986ed0c7 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/account.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/account.rs @@ -100,18 +100,18 @@ FROM accounts_cte mod tests { use super::*; use crate::repository::tests::get_shared_db; - use alloy::primitives::{B256, U160, U256}; + use alloy::primitives::{address, B256, U256}; use pretty_assertions::assert_eq; #[tokio::test] async fn find_account_by_address_ok() { let db = get_shared_db().await; - let addr = Address::from(U160::from(0xffff)); + let addr = address!("000000000000000000000000000000000000ffff"); let item = find_account_by_address(&db, addr).await.unwrap(); assert_eq!(item, None); - let addr = Address::from(U160::from(0x0102)); + let addr = address!("0000000000000000000000000000000000000102"); let item = find_account_by_address(&db, addr).await.unwrap(); assert_eq!( item, @@ -125,13 +125,13 @@ mod tests { }) ); - let addr = Address::from(U160::from(0x3202)); + let addr = address!("0000000000000000000000000000000000003202"); let item = find_account_by_address(&db, addr).await.unwrap(); assert_eq!( item, Some(Account { address: addr, - factory: Some(Address::from(U160::from(0xf1))), + factory: Some(address!("00000000000000000000000000000000000000f1")), creation_transaction_hash: Some(B256::from(U256::from(0x3204))), creation_op_hash: Some(B256::from(U256::from(0x3201))), creation_timestamp: Some("2024-01-01T00:01:00.000000Z".to_string()), @@ -152,7 +152,7 @@ mod tests { assert_eq!(items.len(), 40); assert_eq!(next_page_token, None); - let factory = Some(Address::from(U160::from(0xf1))); + let factory = Some(address!("00000000000000000000000000000000000000f1")); let (items, next_page_token) = list_accounts(&db, factory, None, 60).await.unwrap(); assert_eq!(items.len(), 10); assert_eq!(next_page_token, None); diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/bundle.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/bundle.rs index 4de7d7383..933de83fa 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/bundle.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/bundle.rs @@ -61,9 +61,8 @@ LIMIT $6"#, mod tests { use super::*; use crate::repository::tests::get_shared_db; - use alloy::primitives::U160; + use alloy::primitives::address; use pretty_assertions::assert_eq; - use std::str::FromStr; #[tokio::test] async fn list_bundles_ok() { @@ -73,9 +72,8 @@ mod tests { assert_eq!(items.len(), 100); assert_ne!(next_page_token, None); - let entrypoint = - Some(Address::from_str("0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789").unwrap()); - let bundler = Some(Address::from(U160::from(0x0105))); + let entrypoint = Some(address!("5FF137D4b0FDCD49DcA30c7CF57E578a026d2789")); + let bundler = Some(address!("0000000000000000000000000000000000000105")); let (items, next_page_token) = list_bundles(&db, None, entrypoint, None, 100) .await diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/bundler.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/bundler.rs index 856905dea..7b3cd7aaf 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/bundler.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/bundler.rs @@ -78,18 +78,18 @@ LIMIT $3"#, mod tests { use super::*; use crate::repository::tests::get_shared_db; - use alloy::primitives::U160; + use alloy::primitives::address; use pretty_assertions::assert_eq; #[tokio::test] async fn find_bundler_by_address_ok() { let db = get_shared_db().await; - let addr = Address::from(U160::from(0xffff)); + let addr = address!("000000000000000000000000000000000000ffff"); let item = find_bundler_by_address(&db, addr).await.unwrap(); assert_eq!(item, None); - let addr = Address::from(U160::from(0x0105)); + let addr = address!("0000000000000000000000000000000000000105"); let item = find_bundler_by_address(&db, addr).await.unwrap(); assert_eq!( item, @@ -100,7 +100,7 @@ mod tests { }) ); - let addr = Address::from(U160::from(0x0505)); + let addr = address!("0000000000000000000000000000000000000505"); let item = find_bundler_by_address(&db, addr).await.unwrap(); assert_eq!( item, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/factory.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/factory.rs index 07387637b..230218382 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/factory.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/factory.rs @@ -73,18 +73,18 @@ pub async fn list_factories( mod tests { use super::*; use crate::repository::tests::get_shared_db; - use alloy::primitives::U160; + use alloy::primitives::address; use pretty_assertions::assert_eq; #[tokio::test] async fn find_factory_by_address_ok() { let db = get_shared_db().await; - let addr = Address::from(U160::from(0xf3)); + let addr = address!("00000000000000000000000000000000000000f3"); let item = find_factory_by_address(&db, addr).await.unwrap(); assert_eq!(item, None); - let addr = Address::from(U160::from(0xf1)); + let addr = address!("00000000000000000000000000000000000000f1"); let item = find_factory_by_address(&db, addr).await.unwrap(); assert_eq!( item, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/paymaster.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/paymaster.rs index 312d9202d..938a631e1 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/paymaster.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/paymaster.rs @@ -78,18 +78,18 @@ pub async fn list_paymasters( mod tests { use super::*; use crate::repository::tests::get_shared_db; - use alloy::primitives::U160; + use alloy::primitives::address; use pretty_assertions::assert_eq; #[tokio::test] async fn find_paymaster_by_address_ok() { let db = get_shared_db().await; - let addr = Address::from(U160::from(0xe3)); + let addr = address!("00000000000000000000000000000000000000e3"); let item = find_paymaster_by_address(&db, addr).await.unwrap(); assert_eq!(item, None); - let addr = Address::from(U160::from(0xe1)); + let addr = address!("00000000000000000000000000000000000000e1"); let item = find_paymaster_by_address(&db, addr).await.unwrap(); assert_eq!( item, diff --git a/user-ops-indexer/user-ops-indexer-logic/src/repository/user_op.rs b/user-ops-indexer/user-ops-indexer-logic/src/repository/user_op.rs index a0a9284b1..f331c6924 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/repository/user_op.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/repository/user_op.rs @@ -239,9 +239,8 @@ WHERE logs.address_hash = $1 mod tests { use super::*; use crate::repository::tests::get_shared_db; - use alloy::primitives::{U160, U256}; + use alloy::primitives::{address, b256, U256}; use pretty_assertions::assert_eq; - use std::str::FromStr; #[tokio::test] async fn find_user_op_by_op_hash_ok() { @@ -276,7 +275,6 @@ mod tests { #[tokio::test] async fn list_user_ops_ok() { let db = get_shared_db().await; - let entrypoint = Address::from_str("0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789").unwrap(); let (items, next_page_token) = list_user_ops( &db, None, None, None, None, None, None, None, None, None, 5000, @@ -312,7 +310,7 @@ mod tests { let (items, next_page_token) = list_user_ops( &db, - Some(Address::from(U160::from(0x0502))), + Some(address!("0000000000000000000000000000000000000502")), None, None, None, @@ -331,10 +329,10 @@ mod tests { [ ListUserOp { hash: B256::from(U256::from(0x6901)), - entry_point: entrypoint, + entry_point: address!("5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"), entry_point_version: EntryPointVersion::V06, block_number: 0, - sender: Address::from(U160::from(0x0502)), + sender: address!("0000000000000000000000000000000000000502"), transaction_hash: B256::from(U256::from(0x0504)), timestamp: "2024-01-01T00:00:00.000000Z".to_string(), status: true, @@ -342,10 +340,10 @@ mod tests { }, ListUserOp { hash: B256::from(U256::from(0x0501)), - entry_point: entrypoint, + entry_point: address!("5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"), entry_point_version: EntryPointVersion::V06, block_number: 0, - sender: Address::from(U160::from(0x0502)), + sender: address!("0000000000000000000000000000000000000502"), transaction_hash: B256::from(U256::from(0x0504)), timestamp: "2024-01-01T00:00:00.000000Z".to_string(), status: true, @@ -359,10 +357,8 @@ mod tests { async fn find_unprocessed_logs_tx_hashes_ok() { let db = get_shared_db().await; - let entrypoint = Address::from_str("0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789").unwrap(); - let topic = - B256::from_str("0x49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f") - .unwrap(); + let entrypoint = address!("5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"); + let topic = b256!("49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f"); let items: Vec = stream_unprocessed_logs_tx_hashes(&db, entrypoint, topic, 100, 150) .await .unwrap() From f831fe69c592334fd726846ea11b498f022bf4c7 Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Mon, 6 Jan 2025 15:49:36 +0700 Subject: [PATCH 6/6] chore: node client enum --- user-ops-indexer/Cargo.lock | 4 +- user-ops-indexer/README.md | 2 +- .../user-ops-indexer-logic/Cargo.toml | 2 +- .../src/indexer/base_indexer.rs | 8 +- .../src/indexer/rpc_utils.rs | 75 ++++++++++++++++--- .../user-ops-indexer-server/Cargo.toml | 2 +- 6 files changed, 72 insertions(+), 21 deletions(-) diff --git a/user-ops-indexer/Cargo.lock b/user-ops-indexer/Cargo.lock index dbaa320e8..347528a67 100644 --- a/user-ops-indexer/Cargo.lock +++ b/user-ops-indexer/Cargo.lock @@ -330,9 +330,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4305e0397a7eb57f4840a048583b7ab904eabd250264568fc65a7e38a76c9e40" +checksum = "bbcc41e8a11a4975b18ec6afba2cc48d591fa63336a4c526dacb50479a8d6b35" dependencies = [ "alloy-consensus", "alloy-contract", diff --git a/user-ops-indexer/README.md b/user-ops-indexer/README.md index 6045bcac5..91832372d 100644 --- a/user-ops-indexer/README.md +++ b/user-ops-indexer/README.md @@ -71,7 +71,7 @@ found [here](../docs/common-envs.md). | `USER_OPS_INDEXER__INDEXER__PAST_DB_LOGS_INDEXER__ENABLED` | | Enable one-time reindex of missed user operations from core Blockscout DB. Will query relevant events from `logs` Postgres table | `false` | | `USER_OPS_INDEXER__INDEXER__PAST_DB_LOGS_INDEXER__START_BLOCK` | | Block range start for one-time DB reindex. Use positive number for static block number, or zero/negative number to count backwards from `latest` | `0` | | `USER_OPS_INDEXER__INDEXER__PAST_DB_LOGS_INDEXER__END_BLOCK` | | Block range end for one-time DB reindex. Use positive number for static block number, or zero/negative number to count backwards from `latest` | `0` | -| `USER_OPS_INDEXER__INDEXER__TRACE_CLIENT` | | Node client variant to use for tracing transactions, `Geth` for using `debug_traceTransaction`, `Parity` for using `trace_transaction` | Depends on `web3_clientVersion` | +| `USER_OPS_INDEXER__INDEXER__TRACE_CLIENT` | | RPC tracing namespace to use for tracing transactions, `debug` for using `debug_traceTransaction`, `trace` for using `trace_transaction` | Depends on `web3_clientVersion` | | `USER_OPS_INDEXER__DATABASE__CONNECT__URL` | true | Postgres connect URL to Blockscout DB with read/write access | (empty) | | `USER_OPS_INDEXER__DATABASE__CREATE_DATABASE` | | Create database if doesn't exist | `false` | | `USER_OPS_INDEXER__DATABASE__RUN_MIGRATIONS` | | Run database migrations | `false` | diff --git a/user-ops-indexer/user-ops-indexer-logic/Cargo.toml b/user-ops-indexer/user-ops-indexer-logic/Cargo.toml index 8cdcddc66..26a1b682e 100644 --- a/user-ops-indexer/user-ops-indexer-logic/Cargo.toml +++ b/user-ops-indexer/user-ops-indexer-logic/Cargo.toml @@ -29,7 +29,7 @@ chrono = "0.4.31" lru = "0.12.2" async-trait = "0.1.77" serde_with = "3.6.1" -alloy = { version = "0.9.1", features = ["contract", "pubsub", "provider-debug-api", "provider-trace-api"] } +alloy = { version = "0.9.2", features = ["contract", "pubsub", "provider-debug-api", "provider-trace-api"] } [dev-dependencies] async-trait = "0.1" diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs index 322dcc847..3440b0438 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs @@ -136,7 +136,7 @@ impl Indexer { tracing::debug!("fetching node client"); let client_version = self.client.get_client_version().await?; tracing::info!(client_version, "fetched node client"); - client_version.into() + TraceClient::default_for(client_version.into()) } }; @@ -439,7 +439,7 @@ mod tests { v06::IndexerV06 { entry_point }, ); indexer - .handle_tx(tx_hash, TraceClient::Parity) + .handle_tx(tx_hash, TraceClient::Trace) .await .unwrap(); @@ -503,7 +503,7 @@ mod tests { Default::default(), v06::IndexerV06 { entry_point }, ); - for trace_client in [TraceClient::Geth, TraceClient::Parity] { + for trace_client in [TraceClient::Debug, TraceClient::Trace] { entity::user_operations::Entity::delete_by_id(op_hash.to_vec()) .exec(db.as_ref()) .await @@ -572,7 +572,7 @@ mod tests { v07::IndexerV07 { entry_point }, ); indexer - .handle_tx(tx_hash, TraceClient::Parity) + .handle_tx(tx_hash, TraceClient::Trace) .await .unwrap(); diff --git a/user-ops-indexer/user-ops-indexer-logic/src/indexer/rpc_utils.rs b/user-ops-indexer/user-ops-indexer-logic/src/indexer/rpc_utils.rs index 3ba8f683f..79cc1cf1e 100644 --- a/user-ops-indexer/user-ops-indexer-logic/src/indexer/rpc_utils.rs +++ b/user-ops-indexer/user-ops-indexer-logic/src/indexer/rpc_utils.rs @@ -16,25 +16,55 @@ use alloy::{ use async_trait::async_trait; use serde::Deserialize; +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum NodeClient { + Geth, + Erigon, + OpenEthereum, + Nethermind, + Besu, + Reth, + Unknown, +} + +impl From for NodeClient { + fn from(s: String) -> Self { + match s.split('/').next().unwrap().to_lowercase().as_str() { + "geth" => Self::Geth, + "erigon" => Self::Erigon, + "openethereum" => Self::OpenEthereum, + "nethermind" => Self::Nethermind, + "besu" => Self::Besu, + "reth" => Self::Reth, + _ => Self::Unknown, + } + } +} + #[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "lowercase")] pub enum TraceClient { - Geth, - Parity, + Debug, + Trace, } -impl From for TraceClient { - fn from(value: String) -> Self { - if value.contains("Geth/") { - Self::Geth - } else { - Self::Parity +impl TraceClient { + pub fn default_for(client: NodeClient) -> Self { + match client { + NodeClient::Geth => Self::Debug, + NodeClient::Erigon => Self::Trace, + NodeClient::OpenEthereum => Self::Trace, + NodeClient::Nethermind => Self::Trace, + NodeClient::Besu => Self::Trace, + NodeClient::Reth => Self::Trace, + NodeClient::Unknown => Self::Debug, } } } impl Default for TraceClient { fn default() -> Self { - Self::Parity + Self::Debug } } @@ -71,7 +101,7 @@ impl CallTracer for T { tx_hash: TxHash, client: TraceClient, ) -> TransportResult> { - if client == TraceClient::Geth { + if client == TraceClient::Debug { let geth_trace = self .debug_trace_transaction( tx_hash, @@ -166,16 +196,37 @@ fn flatten_geth_trace(root: CallFrame) -> Vec { #[cfg(test)] mod tests { - use crate::indexer::rpc_utils::{flatten_geth_trace, TraceType}; + use crate::indexer::rpc_utils::{flatten_geth_trace, NodeClient, TraceType}; use alloy::{ primitives::{address, bytes}, rpc::types::trace::geth::CallFrame, }; + #[test] + fn test_node_client() { + assert_eq!( + NodeClient::from("Geth/v1.14.12-stable-293a300d/linux-amd64/go1.23.3".to_string()), + NodeClient::Geth + ); + assert_eq!( + NodeClient::from("erigon/2.60.10/linux-amd64/go1.23.3".to_string()), + NodeClient::Erigon + ); + assert_eq!( + NodeClient::from("reth/v1.1.4-15fac087/x86_64-unknown-linux-gnu".to_string()), + NodeClient::Reth + ); + assert_eq!( + NodeClient::from("other_client/v1.2.3".to_string()), + NodeClient::Unknown + ); + assert_eq!(NodeClient::from("".to_string()), NodeClient::Unknown); + } + #[test] fn test_flatten_geth_trace() { // optimism tx 0x0ea5571bc90fd76fe29e4e844ae74c901dac89032f6a01e2ec4e4fa9c4203824 - let root: CallFrame = serde_json::from_str(r#"{"from":"0x42fdd562221741a1db62a0f69a5a680367f07e33","gas":"0x15f900","gasUsed":"0x387dc","to":"0xca11bde05977b3631167028862be2a173976ca11","input":"0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000007a41fad948c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b0000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","output":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000","calls":[{"from":"0xca11bde05977b3631167028862be2a173976ca11","gas":"0x150974","gasUsed":"0x2f5c7","to":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","input":"0x1fad948c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b0000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000","calls":[{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x7a120","gasUsed":"0x6c9c","to":"0x8b9658b654efdfd69be5208e53342f5283f6486e","input":"0x3a871cdd0000000000000000000000000000000000000000000000000000000000000060dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2ffffffffffff0000000000000000000000000000000000000000","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x76fa0","gasUsed":"0x5932","to":"0x20029869dbea98c62c4eb85d85400ae833c0394b","input":"0x3a871cdd0000000000000000000000000000000000000000000000000000000000000060dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2ffffffffffff0000000000000000000000000000000000000000","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x72ba5","gasUsed":"0x3041","to":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","input":"0x3a871cdd0000000000000000000000000000000000000000000000000000000000000060dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea76260000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b00000000000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2000065f7ea520000000000000000000000000000000000000000","calls":[{"from":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","gas":"0x70b5c","gasUsed":"0xbb8","to":"0x0000000000000000000000000000000000000001","input":"0xdedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d000000000000000000000000000000000000000000000000000000000000001bc06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d","output":"0x000000000000000000000000a7b494e320acc72de6122e8e3783338741497e9e","type":"STATICCALL"},{"from":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","gas":"0x6f439","gasUsed":"0xbb8","to":"0x0000000000000000000000000000000000000001","input":"0xbdc87cf20f24dbbb071f403150d9f118f102ddd52a804dd7db98681515d8bd7e000000000000000000000000000000000000000000000000000000000000001bc06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d","output":"0x0000000000000000000000001b243979dd49d4f329b6298445efb77e86eb4d83","type":"STATICCALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x72126","gasUsed":"0x4d7","to":"0x00d5bda3b690c569c1c78a387ed6cf1a88ea7626","input":"0xf465c77e0000000000000000000000000000000000000000000000000000000000000060dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d000000000000000000000000000000000000000000000000000a3eda744555000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b000000000000000000000000000000000000000000000000000000","output":"0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x7a120","gasUsed":"0x41a4","to":"0x8b9658b654efdfd69be5208e53342f5283f6486e","input":"0x3a871cdd000000000000000000000000000000000000000000000000000000000000006055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff100000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2ffffffffffff0000000000000000000000000000000000000000","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x780ee","gasUsed":"0x3fce","to":"0x20029869dbea98c62c4eb85d85400ae833c0394b","input":"0x3a871cdd000000000000000000000000000000000000000000000000000000000000006055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff100000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2ffffffffffff0000000000000000000000000000000000000000","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x74dfc","gasUsed":"0x2871","to":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","input":"0x3a871cdd000000000000000000000000000000000000000000000000000000000000006055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff100000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea76260000000000000000000000000000000000000000000000000000000000000000000000000000000000000041910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c00000000000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2000065f7ea520000000000000000000000000000000000000000","calls":[{"from":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","gas":"0x72d29","gasUsed":"0xbb8","to":"0x0000000000000000000000000000000000000001","input":"0x55031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff1000000000000000000000000000000000000000000000000000000000000001c910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c","output":"0x000000000000000000000000a496a2426fb717409a471f0fcef6d20dc069fc2c","type":"STATICCALL"},{"from":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","gas":"0x71606","gasUsed":"0xbb8","to":"0x0000000000000000000000000000000000000001","input":"0xe12c7cc1f1266db450bb061a37e16f9eb41e67cc034dbf09b24824bb9fda449b000000000000000000000000000000000000000000000000000000000000001c910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c","output":"0x0000000000000000000000001b243979dd49d4f329b6298445efb77e86eb4d83","type":"STATICCALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x755f6","gasUsed":"0x4d7","to":"0x00d5bda3b690c569c1c78a387ed6cf1a88ea7626","input":"0xf465c77e000000000000000000000000000000000000000000000000000000000000006055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff1000000000000000000000000000000000000000000000000000a3eda744555000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000","output":"0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x1359ab","gasUsed":"0xc66d","to":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","input":"0x1d73275600000000000000000000000000000000000000000000000000000000000001c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f00dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d000000000000000000000000000000000000000000000000000a3eda744555000000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000002541a00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","output":"0x00000000000000000000000000000000000000000000000000010f5cf6029997","calls":[{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x493e0","gasUsed":"0xadc9","to":"0x8b9658b654efdfd69be5208e53342f5283f6486e","input":"0x519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be00000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x4806d","gasUsed":"0xac7f","to":"0x20029869dbea98c62c4eb85d85400ae833c0394b","input":"0x519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be00000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x460b8","gasUsed":"0x9e73","to":"0x0b2c639c533813f4aa9d7837caf62653d097ff85","input":"0xa9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x0b2c639c533813f4aa9d7837caf62653d097ff85","gas":"0x433ae","gasUsed":"0x8253","to":"0xded3b9a8dbedc2f9cb725b55d0e686a81e6d06dc","input":"0xa9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be","output":"0x0000000000000000000000000000000000000000000000000000000000000001","value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x129046","gasUsed":"0x88b5","to":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","input":"0x1d73275600000000000000000000000000000000000000000000000000000000000001c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff1000000000000000000000000000000000000000000000000000a3eda7445550000000000000000000000000000000000000000000000000000000000000009c0000000000000000000000000000000000000000000000000000000000001efd800000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000d675dce98765","calls":[{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x493e0","gasUsed":"0x7011","to":"0x8b9658b654efdfd69be5208e53342f5283f6486e","input":"0x519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x4806d","gasUsed":"0x6ec7","to":"0x20029869dbea98c62c4eb85d85400ae833c0394b","input":"0x519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x46a55","gasUsed":"0x6a7f","to":"0x0b2c639c533813f4aa9d7837caf62653d097ff85","input":"0xa9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x0b2c639c533813f4aa9d7837caf62653d097ff85","gas":"0x45623","gasUsed":"0x67c3","to":"0xded3b9a8dbedc2f9cb725b55d0e686a81e6d06dc","input":"0xa9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002","output":"0x0000000000000000000000000000000000000000000000000000000000000001","value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x11e498","gasUsed":"0x18b9","to":"0x04471500ac7147c158224fee67ac64227d3049de","input":"0x","calls":[{"from":"0x04471500ac7147c158224fee67ac64227d3049de","gas":"0x118aa2","gasUsed":"0x5e0","to":"0xfb1bffc9d739b8d520daf37df666da4c687191ea","input":"0x","value":"0x1e5d2d2ec20fc","type":"DELEGATECALL"}],"value":"0x1e5d2d2ec20fc","type":"CALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"}"#, ).unwrap(); + let root: CallFrame = serde_json::from_str(r#"{"from":"0x42fdd562221741a1db62a0f69a5a680367f07e33","gas":"0x15f900","gasUsed":"0x387dc","to":"0xca11bde05977b3631167028862be2a173976ca11","input":"0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000007a41fad948c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b0000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","output":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000","calls":[{"from":"0xca11bde05977b3631167028862be2a173976ca11","gas":"0x150974","gasUsed":"0x2f5c7","to":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","input":"0x1fad948c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b0000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000","calls":[{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x7a120","gasUsed":"0x6c9c","to":"0x8b9658b654efdfd69be5208e53342f5283f6486e","input":"0x3a871cdd0000000000000000000000000000000000000000000000000000000000000060dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2ffffffffffff0000000000000000000000000000000000000000","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x76fa0","gasUsed":"0x5932","to":"0x20029869dbea98c62c4eb85d85400ae833c0394b","input":"0x3a871cdd0000000000000000000000000000000000000000000000000000000000000060dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2ffffffffffff0000000000000000000000000000000000000000","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x72ba5","gasUsed":"0x3041","to":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","input":"0x3a871cdd0000000000000000000000000000000000000000000000000000000000000060dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea76260000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b00000000000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2000065f7ea520000000000000000000000000000000000000000","calls":[{"from":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","gas":"0x70b5c","gasUsed":"0xbb8","to":"0x0000000000000000000000000000000000000001","input":"0xdedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d000000000000000000000000000000000000000000000000000000000000001bc06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d","output":"0x000000000000000000000000a7b494e320acc72de6122e8e3783338741497e9e","type":"STATICCALL"},{"from":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","gas":"0x6f439","gasUsed":"0xbb8","to":"0x0000000000000000000000000000000000000001","input":"0xbdc87cf20f24dbbb071f403150d9f118f102ddd52a804dd7db98681515d8bd7e000000000000000000000000000000000000000000000000000000000000001bc06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d","output":"0x0000000000000000000000001b243979dd49d4f329b6298445efb77e86eb4d83","type":"STATICCALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x72126","gasUsed":"0x4d7","to":"0x00d5bda3b690c569c1c78a387ed6cf1a88ea7626","input":"0xf465c77e0000000000000000000000000000000000000000000000000000000000000060dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d000000000000000000000000000000000000000000000000000a3eda744555000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000c06e5c395501f2069dcbc9b05e75f9fd632765a99ebe8d2680862b95a3cfee5b581cfbbecc01c954b729c74b6b337e61fff043e1746f753d5a95913d8f13691d1b000000000000000000000000000000000000000000000000000000","output":"0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x7a120","gasUsed":"0x41a4","to":"0x8b9658b654efdfd69be5208e53342f5283f6486e","input":"0x3a871cdd000000000000000000000000000000000000000000000000000000000000006055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff100000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2ffffffffffff0000000000000000000000000000000000000000","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x780ee","gasUsed":"0x3fce","to":"0x20029869dbea98c62c4eb85d85400ae833c0394b","input":"0x3a871cdd000000000000000000000000000000000000000000000000000000000000006055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff100000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2ffffffffffff0000000000000000000000000000000000000000","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x74dfc","gasUsed":"0x2871","to":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","input":"0x3a871cdd000000000000000000000000000000000000000000000000000000000000006055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff100000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea76260000000000000000000000000000000000000000000000000000000000000000000000000000000000000041910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c00000000000000000000000000000000000000000000000000000000000000","output":"0x000065f698d2000065f7ea520000000000000000000000000000000000000000","calls":[{"from":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","gas":"0x72d29","gasUsed":"0xbb8","to":"0x0000000000000000000000000000000000000001","input":"0x55031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff1000000000000000000000000000000000000000000000000000000000000001c910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c","output":"0x000000000000000000000000a496a2426fb717409a471f0fcef6d20dc069fc2c","type":"STATICCALL"},{"from":"0x7a5862415a6e55d71c21e78dd87a4a057073f411","gas":"0x71606","gasUsed":"0xbb8","to":"0x0000000000000000000000000000000000000001","input":"0xe12c7cc1f1266db450bb061a37e16f9eb41e67cc034dbf09b24824bb9fda449b000000000000000000000000000000000000000000000000000000000000001c910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c","output":"0x0000000000000000000000001b243979dd49d4f329b6298445efb77e86eb4d83","type":"STATICCALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x755f6","gasUsed":"0x4d7","to":"0x00d5bda3b690c569c1c78a387ed6cf1a88ea7626","input":"0xf465c77e000000000000000000000000000000000000000000000000000000000000006055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff1000000000000000000000000000000000000000000000000000a3eda744555000000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000000000000000000000000000000000004500000000910c0077d5fba1f751d0ad9ae50d4595d9437fcbc8b7df19b3bdc97c59166df021a9bf7f913df6132acfa223bb9e4b26446461cfb99e837b86e5d070171a763c1c000000000000000000000000000000000000000000000000000000","output":"0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x1359ab","gasUsed":"0xc66d","to":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","input":"0x1d73275600000000000000000000000000000000000000000000000000000000000001c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f00dedc2b3442f65958bfdcd84c8f9efee89faeb15591a6a8e3a57cd81c560d384d000000000000000000000000000000000000000000000000000a3eda744555000000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000002541a00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","output":"0x00000000000000000000000000000000000000000000000000010f5cf6029997","calls":[{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x493e0","gasUsed":"0xadc9","to":"0x8b9658b654efdfd69be5208e53342f5283f6486e","input":"0x519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be00000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x4806d","gasUsed":"0xac7f","to":"0x20029869dbea98c62c4eb85d85400ae833c0394b","input":"0x519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be00000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x460b8","gasUsed":"0x9e73","to":"0x0b2c639c533813f4aa9d7837caf62653d097ff85","input":"0xa9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x0b2c639c533813f4aa9d7837caf62653d097ff85","gas":"0x433ae","gasUsed":"0x8253","to":"0xded3b9a8dbedc2f9cb725b55d0e686a81e6d06dc","input":"0xa9059cbb0000000000000000000000000b21f56063860b6aa1b86191a9dec568bebfdec50000000000000000000000000000000000000000000000000000000000e4e1be","output":"0x0000000000000000000000000000000000000000000000000000000000000001","value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x129046","gasUsed":"0x88b5","to":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","input":"0x1d73275600000000000000000000000000000000000000000000000000000000000001c00000000000000000000000008b9658b654efdfd69be5208e53342f5283f6486e000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000d5bda3b690c569c1c78a387ed6cf1a88ea7626000000000000000000000000000000000000000000000000000000005a7817d80000000000000000000000000000000000000000000000000000000059682f0055031538b4ed6c73cde960fb2eee5c06a5282b0d49e6578a22dad2fb8f2abff1000000000000000000000000000000000000000000000000000a3eda7445550000000000000000000000000000000000000000000000000000000000000009c0000000000000000000000000000000000000000000000000000000000001efd800000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000104519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000d675dce98765","calls":[{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x493e0","gasUsed":"0x7011","to":"0x8b9658b654efdfd69be5208e53342f5283f6486e","input":"0x519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x4806d","gasUsed":"0x6ec7","to":"0x20029869dbea98c62c4eb85d85400ae833c0394b","input":"0x519454470000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x8b9658b654efdfd69be5208e53342f5283f6486e","gas":"0x46a55","gasUsed":"0x6a7f","to":"0x0b2c639c533813f4aa9d7837caf62653d097ff85","input":"0xa9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002","output":"0x0000000000000000000000000000000000000000000000000000000000000001","calls":[{"from":"0x0b2c639c533813f4aa9d7837caf62653d097ff85","gas":"0x45623","gasUsed":"0x67c3","to":"0xded3b9a8dbedc2f9cb725b55d0e686a81e6d06dc","input":"0xa9059cbb00000000000000000000000004471500ac7147c158224fee67ac64227d3049de0000000000000000000000000000000000000000000000000000000000000002","output":"0x0000000000000000000000000000000000000000000000000000000000000001","value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"DELEGATECALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"},{"from":"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789","gas":"0x11e498","gasUsed":"0x18b9","to":"0x04471500ac7147c158224fee67ac64227d3049de","input":"0x","calls":[{"from":"0x04471500ac7147c158224fee67ac64227d3049de","gas":"0x118aa2","gasUsed":"0x5e0","to":"0xfb1bffc9d739b8d520daf37df666da4c687191ea","input":"0x","value":"0x1e5d2d2ec20fc","type":"DELEGATECALL"}],"value":"0x1e5d2d2ec20fc","type":"CALL"}],"value":"0x0","type":"CALL"}],"value":"0x0","type":"CALL"}"#).unwrap(); let res = flatten_geth_trace(root); assert_eq!(res.len(), 26); diff --git a/user-ops-indexer/user-ops-indexer-server/Cargo.toml b/user-ops-indexer/user-ops-indexer-server/Cargo.toml index fffc43e21..8758be7aa 100644 --- a/user-ops-indexer/user-ops-indexer-server/Cargo.toml +++ b/user-ops-indexer/user-ops-indexer-server/Cargo.toml @@ -19,7 +19,7 @@ serde = "1.0" tokio = { version = "1.23", features = ["rt-multi-thread", "macros"] } tonic = "0.8" tracing = "0.1" -alloy = { version = "0.9.1", features = ["provider-ws", "provider-http"] } +alloy = { version = "0.9.2", features = ["provider-ws", "provider-http"] } [dev-dependencies] sea-orm = { version = "*", features = ["sqlx-sqlite"] }