From 1e933b9642d3c11cd0934fa92de0da3304e8cbf1 Mon Sep 17 00:00:00 2001 From: Lozano Date: Wed, 9 Oct 2024 11:23:09 +0200 Subject: [PATCH 01/62] feat: reusable offchain workers --- Cargo.lock | 2322 ++++++++++++++++++--- Cargo.toml | 1 + workers/Cargo.lock | 3581 +++++++++++++++++++++++++++++++++ workers/Cargo.toml | 24 + workers/README.md | 12 + workers/abi/L0V2Endpoint.json | 1 + workers/abi/SendLibrary.json | 1 + workers/src/abi.rs | 20 + workers/src/bin/dvn.rs | 78 + workers/src/config.rs | 94 + workers/src/lib.rs | 5 + workers/src/utils.rs | 235 +++ 12 files changed, 6051 insertions(+), 323 deletions(-) create mode 100644 workers/Cargo.lock create mode 100644 workers/Cargo.toml create mode 100644 workers/README.md create mode 100644 workers/abi/L0V2Endpoint.json create mode 100644 workers/abi/SendLibrary.json create mode 100644 workers/src/abi.rs create mode 100644 workers/src/bin/dvn.rs create mode 100644 workers/src/config.rs create mode 100644 workers/src/lib.rs create mode 100644 workers/src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index d0b4d718..1fd6901b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,7 +52,7 @@ checksum = "0346d8c1f762b41b458ed3145eea914966bb9ad20b9be0d6d463b20d45586370" dependencies = [ "actix-utils", "actix-web", - "derive_more", + "derive_more 0.99.18", "futures-util", "log", "once_cell", @@ -75,7 +75,7 @@ dependencies = [ "brotli", "bytes", "bytestring", - "derive_more", + "derive_more 0.99.18", "encoding_rs", "flate2", "futures-core", @@ -105,7 +105,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -213,7 +213,7 @@ dependencies = [ "bytestring", "cfg-if 1.0.0", "cookie", - "derive_more", + "derive_more 0.99.18", "encoding_rs", "futures-core", "futures-util", @@ -244,7 +244,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -255,7 +255,7 @@ checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -269,11 +269,11 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli 0.31.0", + "gimli 0.31.1", ] [[package]] @@ -347,11 +347,588 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "alloy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" +dependencies = [ + "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 = "alloy-chains" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4932d790c723181807738cf1ac68198ab581cd699545b155601332541ee47bd" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum 0.26.3", +] + +[[package]] +name = "alloy-consensus" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "c-kzg", + "derive_more 1.0.0", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917f7d12cf3971dc8c11c9972f732b35ccb9aaaf5f28f2f87e9e6523bee3a8ad" +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", +] + +[[package]] +name = "alloy-core" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cce174ca699ddee3bfb2ec1fbd99ad7efd05eca20c5c888d8320db41f7e8f04" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5647fce5a168f9630f935bf7821c4207b1755184edaeba783cb4e11d35058484" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "k256", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 1.0.0", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b5671117c38b1c2306891f97ad3828d85487087f54ebe2c7591a055ea5bcea7" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "thiserror", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71738eb20c42c5fb149571e76536a0f309d142f3957c28791662b96baf77a3d" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if 1.0.0", + "const-hex", + "derive_more 1.0.0", + "foldhash", + "hashbrown 0.15.0", + "hex-literal", + "indexmap 2.6.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand", + "ruint", + "rustc-hash 2.0.0", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" +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-eth", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru 0.12.5", + "pin-project", + "reqwest 0.12.8", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "alloy-pubsub" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f32cef487122ae75c91eb50154c70801d71fabdb976fec6c49e0af5e6486ab15" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.1", + "tracing", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +dependencies = [ + "alloy-rlp-derive", + "arrayvec 0.7.6", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "reqwest 0.12.8", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.1", + "tracing", + "url", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0285c4c09f838ab830048b780d7f4a4f460f309aa1194bb049843309524c64c" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "derive_more 1.0.0", + "strum 0.26.3", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" +dependencies = [ + "alloy-consensus", + "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 = "alloy-serde" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror", +] + +[[package]] +name = "alloy-signer-local" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494e0a256f3e99f2426f994bcd1be312c02cb8f88260088dacb33a8b8936475f" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand", + "thiserror", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0900b83f4ee1f45c640ceee596afbc118051921b9438fdb5a3175c1a7e05f8b" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.82", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41b1e78dde06b5e12e6702fa8c1d30621bf07728ba75b801fb801c9c6a0ba10" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.6.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.82", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91dc311a561a306664393407b88d3e53ae58581624128afd8a15faa5de3627dc" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck 0.5.0", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.82", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d1fbee9e698f3ba176b6e7a145f4aefe6d2b746b611e8bb246fe11a0e9f6c4" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "086f41bc6ebcd8cb15f38ba20e47be38dd03692149681ce8061c35d960dbf850" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower 0.5.1", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-http" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest 0.12.8", + "serde_json", + "tower 0.5.1", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90cf9cde7f2fce617da52768ee28f522264b282d148384a4ca0ea85af04fa3a" +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.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7153b88690de6a50bba81c11e1d706bc41dbb90126d607404d60b763f6a3947f" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http 1.1.0", + "rustls", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + [[package]] name = "amq-protocol" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0234884b3641db74d22ccc20fc2594db5f23d7d41ade5c93d7ee33d200960c" +checksum = "e3a41c091e49edfcc098b4f90d4d7706a8cf9158034e84ebfee7ff346092f67c" dependencies = [ "amq-protocol-tcp", "amq-protocol-types", @@ -363,9 +940,9 @@ dependencies = [ [[package]] name = "amq-protocol-tcp" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265dca43d9dbb3d5bbb0b3ef1b0cd9044ce3aa5d697d5b66cde974d1f6063f09" +checksum = "3ed7a4a662472f88823ed2fc81babb0b00562f2c54284e3e7bffc02b6df649bf" dependencies = [ "amq-protocol-uri", "tcp-stream", @@ -374,9 +951,9 @@ dependencies = [ [[package]] name = "amq-protocol-types" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7412353b58923fa012feb9a64ccc0c811747babee2e5a2fd63eb102dc8054c3" +checksum = "bd6484fdc918c1b6e2ae8eda2914d19a5873e1975f93ad8d33d6a24d1d98df05" dependencies = [ "cookie-factory", "nom", @@ -386,9 +963,9 @@ dependencies = [ [[package]] name = "amq-protocol-uri" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be91352c805d5704784e079117d5291fd5bf2569add53c914ebce6d1a795d33" +checksum = "7f7f2da69e0e1182765bf33407cd8a843f20791b5af2b57a2645818c4776c56c" dependencies = [ "amq-protocol-types", "percent-encoding", @@ -461,9 +1038,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" [[package]] name = "arbitrary" @@ -480,6 +1057,130 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[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 0.4.6", + "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 0.4.6", + "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 0.4.6", + "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 0.4.6", + "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 0.4.6", +] + +[[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 = "arrayref" version = "0.3.9" @@ -492,6 +1193,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "asn1-rs" version = "0.6.2" @@ -516,7 +1223,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", "synstructure", ] @@ -528,7 +1235,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -579,9 +1286,9 @@ dependencies = [ [[package]] name = "async-global-executor-trait" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33dd14c5a15affd2abcff50d84efd4009ada28a860f01c14f9d654f3e81b3f75" +checksum = "80f19936c1a84fb48ceb8899b642d2a72572587d1021cc561bfb24de9f33ee89" dependencies = [ "async-global-executor", "async-trait", @@ -661,9 +1368,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -672,13 +1379,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -689,13 +1396,24 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", ] [[package]] @@ -720,11 +1438,22 @@ dependencies = [ "wildmatch", ] +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", +] + [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "awc" @@ -742,7 +1471,7 @@ dependencies = [ "bytes", "cfg-if 1.0.0", "cookie", - "derive_more", + "derive_more 0.99.18", "futures-core", "futures-util", "h2", @@ -797,8 +1526,8 @@ dependencies = [ "bytes", "futures-util", "http 0.2.12", - "http-body", - "hyper", + "http-body 0.4.6", + "hyper 0.14.31", "itoa", "matchit", "memchr", @@ -807,8 +1536,8 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper", - "tower", + "sync_wrapper 0.1.2", + "tower 0.4.13", "tower-layer", "tower-service", ] @@ -823,7 +1552,7 @@ dependencies = [ "bytes", "futures-util", "http 0.2.12", - "http-body", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", @@ -836,15 +1565,21 @@ version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ - "addr2line 0.24.1", + "addr2line 0.24.2", "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.36.4", + "object 0.36.5", "rustc-demangle", "windows-targets 0.52.6", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.12.3" @@ -875,6 +1610,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + [[package]] name = "bincode" version = "1.3.3" @@ -900,11 +1641,26 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", - "syn 2.0.77", + "syn 2.0.82", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", ] +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -954,7 +1710,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.5.2", "cc", "cfg-if 0.1.10", "constant_time_eq", @@ -1069,7 +1825,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", "syn_derive", ] @@ -1128,6 +1884,12 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + [[package]] name = "bytecheck" version = "0.6.12" @@ -1158,9 +1920,12 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +dependencies = [ + "serde", +] [[package]] name = "bytesize" @@ -1191,6 +1956,21 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + [[package]] name = "cbc" version = "0.1.2" @@ -1202,9 +1982,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.19" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d74707dde2ba56f86ae90effb3b43ddd369504387e718014de010cec7959800" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -1276,9 +2056,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.17" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -1286,9 +2066,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -1298,14 +2078,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -1331,7 +2111,7 @@ dependencies = [ "lazy_static", "openssl", "percent-encoding", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "tokio", @@ -1386,6 +2166,19 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "const-hex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "hex", + "proptest", + "serde", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -1650,6 +2443,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array 0.14.7", + "rand_core", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -1694,7 +2499,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -1718,7 +2523,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -1729,7 +2534,21 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.82", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api 0.4.12", + "once_cell", + "parking_lot_core 0.9.10", ] [[package]] @@ -1814,7 +2633,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -1827,6 +2646,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive-where" version = "1.2.7" @@ -1835,7 +2665,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -1846,7 +2676,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -1859,7 +2689,28 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.77", + "syn 2.0.82", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", + "unicode-xid", ] [[package]] @@ -1896,6 +2747,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -1928,7 +2780,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -1949,12 +2801,24 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + [[package]] name = "dotenv" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dynasm" version = "1.2.3" @@ -2014,6 +2878,20 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53aff6fdc1b181225acdcb5b14c47106726fd8e486707315b1b138baed68ee31" +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "ed25519" version = "2.2.3" @@ -2042,6 +2920,25 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array 0.14.7", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "encode_unicode" version = "0.3.6" @@ -2074,7 +2971,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -2095,7 +2992,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -2164,13 +3061,23 @@ dependencies = [ [[package]] name = "executor-trait" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a1052dd43212a7777ec6a69b117da52f5e52f07aec47d00c1a2b33b85d06b08" +checksum = "13c39dff9342e4e0e16ce96be751eb21a94e94a87bb2f6e63ad1961c2ce109bf" dependencies = [ "async-trait", ] +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -2192,6 +3099,27 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec 0.7.6", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" @@ -2223,6 +3151,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + [[package]] name = "flagset" version = "0.4.6" @@ -2231,9 +3171,9 @@ checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -2241,9 +3181,9 @@ dependencies = [ [[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", @@ -2256,6 +3196,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2288,9 +3234,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2303,9 +3249,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2313,15 +3259,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2330,9 +3276,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -2364,32 +3310,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2403,6 +3349,12 @@ dependencies = [ "slab", ] +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + [[package]] name = "fxhash" version = "0.2.1" @@ -2442,6 +3394,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -2462,15 +3415,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" dependencies = [ "fallible-iterator", - "indexmap 2.5.0", + "indexmap 2.6.0", "stable_deref_trait", ] [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2478,6 +3431,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + [[package]] name = "h2" version = "0.3.26" @@ -2490,7 +3454,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -2531,7 +3495,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ "allocator-api2", + "equivalent", + "foldhash", + "serde", ] [[package]] @@ -2567,6 +3542,12 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + [[package]] name = "hmac" version = "0.12.1" @@ -2618,11 +3599,34 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "pin-project-lite", +] + [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2632,9 +3636,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -2642,7 +3646,7 @@ dependencies = [ "futures-util", "h2", "http 0.2.12", - "http-body", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -2654,29 +3658,83 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-timeout" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.31", "pin-project-lite", "tokio", - "tokio-io-timeout", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.31", + "native-tls", + "tokio", + "tokio-native-tls", ] [[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.0", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.5.0", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower-service", + "tracing", ] [[package]] @@ -2732,11 +3790,37 @@ dependencies = [ "version_check", ] +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "impl-more" -version = "0.1.6" +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.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexer" @@ -2781,12 +3865,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", "serde", ] @@ -2822,6 +3906,21 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "interprocess" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f4e4a06d42fab3e85ab1b419ad32b09eab58b901d40c57935ff92db3287a13" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + [[package]] name = "io-lifetimes" version = "1.0.11" @@ -2835,9 +3934,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is_terminal_polyfill" @@ -2863,6 +3962,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -2880,9 +3988,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -2907,6 +4015,19 @@ dependencies = [ "simple_asn1", ] +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + [[package]] name = "keccak" version = "0.1.5" @@ -2916,6 +4037,16 @@ 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 = "language-tags" version = "0.3.2" @@ -2967,9 +4098,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" @@ -3090,18 +4221,18 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] name = "lz4-sys" -version = "1.11.0" +version = "1.11.1+lz4-1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb44a01837a858d47e5a630d2ccf304c8efcc4b83b8f9f75b7a9ee4fcc6e57d" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" dependencies = [ "cc", "libc", @@ -3159,7 +4290,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -3331,7 +4462,7 @@ version = "2.2.1-rc.1" source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c8ac1afb2058#b3d767e7664d8e123a35313ccc66c8ac1afb2058" dependencies = [ "actix", - "derive_more", + "derive_more 0.99.18", "futures", "near-async-derive", "near-o11y", @@ -3352,7 +4483,7 @@ source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -3360,7 +4491,7 @@ name = "near-cache" version = "2.2.1-rc.1" source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c8ac1afb2058#b3d767e7664d8e123a35313ccc66c8ac1afb2058" dependencies = [ - "lru 0.12.4", + "lru 0.12.5", ] [[package]] @@ -3378,7 +4509,7 @@ dependencies = [ "enum-map", "itertools 0.10.5", "itoa", - "lru 0.12.4", + "lru 0.12.5", "near-async", "near-cache", "near-chain-configs", @@ -3402,7 +4533,7 @@ dependencies = [ "rand", "rand_chacha", "rayon", - "strum", + "strum 0.24.1", "tempfile", "thiserror", "time", @@ -3418,7 +4549,7 @@ dependencies = [ "anyhow", "bytesize", "chrono", - "derive_more", + "derive_more 0.99.18", "near-config-utils", "near-crypto", "near-o11y", @@ -3456,10 +4587,10 @@ dependencies = [ "actix", "borsh 1.5.1", "chrono", - "derive_more", + "derive_more 0.99.18", "futures", "itertools 0.10.5", - "lru 0.12.4", + "lru 0.12.5", "near-async", "near-chain", "near-chain-configs", @@ -3476,7 +4607,7 @@ dependencies = [ "once_cell", "rand", "reed-solomon-erasure", - "strum", + "strum 0.24.1", "time", "tracing", ] @@ -3503,10 +4634,10 @@ dependencies = [ "bytesize", "chrono", "cloud-storage", - "derive_more", + "derive_more 0.99.18", "futures", "itertools 0.10.5", - "lru 0.12.4", + "lru 0.12.5", "near-async", "near-cache", "near-chain", @@ -3534,11 +4665,11 @@ dependencies = [ "rayon", "reed-solomon-erasure", "regex", - "reqwest", + "reqwest 0.11.27", "rust-s3", "serde", "serde_json", - "strum", + "strum 0.24.1", "sysinfo", "tempfile", "thiserror", @@ -3563,7 +4694,7 @@ dependencies = [ "near-time", "serde", "serde_json", - "strum", + "strum 0.24.1", "thiserror", "time", "tracing", @@ -3590,14 +4721,14 @@ dependencies = [ "borsh 1.5.1", "bs58", "curve25519-dalek", - "derive_more", + "derive_more 0.99.18", "ed25519-dalek", "hex", "near-account-id", "near-config-utils", "near-stdx", "once_cell", - "primitive-types", + "primitive-types 0.10.1", "rand", "secp256k1", "serde", @@ -3642,7 +4773,7 @@ dependencies = [ "near-store", "num-rational", "once_cell", - "primitive-types", + "primitive-types 0.10.1", "rand", "rand_hc", "serde_json", @@ -3705,7 +4836,7 @@ dependencies = [ "actix-cors", "actix-web", "bs58", - "derive_more", + "derive_more 0.99.18", "easy-ext", "futures", "hex", @@ -3784,13 +4915,13 @@ dependencies = [ "bytesize", "chrono", "crossbeam-channel", - "derive_more", + "derive_more 0.99.18", "enum-map", "futures", "futures-util", "im", "itertools 0.10.5", - "lru 0.12.4", + "lru 0.12.5", "near-async", "near-chain-configs", "near-crypto", @@ -3804,7 +4935,7 @@ dependencies = [ "opentelemetry", "parking_lot 0.12.3", "pin-project", - "protobuf 3.5.1", + "protobuf 3.7.1", "protobuf-codegen", "rand", "rayon", @@ -3812,7 +4943,7 @@ dependencies = [ "serde", "sha2", "smart-default", - "strum", + "strum 0.24.1", "stun", "thiserror", "time", @@ -3861,7 +4992,7 @@ dependencies = [ "serde", "serde_repr", "serde_yaml", - "strum", + "strum 0.24.1", "thiserror", ] @@ -3887,7 +5018,7 @@ version = "2.2.1-rc.1" source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c8ac1afb2058#b3d767e7664d8e123a35313ccc66c8ac1afb2058" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -3915,7 +5046,7 @@ dependencies = [ "bytesize", "cfg-if 1.0.0", "chrono", - "derive_more", + "derive_more 0.99.18", "easy-ext", "enum-map", "hex", @@ -3931,7 +5062,7 @@ dependencies = [ "num-rational", "once_cell", "ordered-float", - "primitive-types", + "primitive-types 0.10.1", "rand", "rand_chacha", "reed-solomon-erasure", @@ -3940,7 +5071,7 @@ dependencies = [ "serde_with", "sha3", "smart-default", - "strum", + "strum 0.24.1", "thiserror", "tracing", "zstd", @@ -3955,7 +5086,7 @@ dependencies = [ "base64 0.21.7", "borsh 1.5.1", "bs58", - "derive_more", + "derive_more 0.99.18", "enum-map", "near-account-id", "near-structs-checker-lib", @@ -3976,7 +5107,7 @@ dependencies = [ "actix-http", "actix-web", "awc", - "derive_more", + "derive_more 0.99.18", "futures", "hex", "near-account-id", @@ -3992,7 +5123,7 @@ dependencies = [ "paperclip", "serde", "serde_json", - "strum", + "strum 0.24.1", "thiserror", "tokio", ] @@ -4004,7 +5135,7 @@ source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c dependencies = [ "quote", "serde", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -4014,7 +5145,7 @@ source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c dependencies = [ "near-rpc-error-core", "serde", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -4034,12 +5165,12 @@ dependencies = [ "bytesize", "crossbeam", "derive-where", - "derive_more", + "derive_more 0.99.18", "enum-map", "hex", "itertools 0.10.5", "itoa", - "lru 0.12.4", + "lru 0.12.5", "near-chain-configs", "near-crypto", "near-fmt", @@ -4059,7 +5190,7 @@ dependencies = [ "serde", "serde_json", "smallvec", - "strum", + "strum 0.24.1", "tempfile", "thiserror", "tokio", @@ -4149,7 +5280,7 @@ dependencies = [ "near-vm-vm", "rayon", "smallvec", - "strum", + "strum 0.24.1", "tracing", ] @@ -4188,7 +5319,7 @@ dependencies = [ "ed25519-dalek", "enum-map", "finite-wasm", - "lru 0.12.4", + "lru 0.12.5", "memoffset 0.8.0", "near-crypto", "near-o11y", @@ -4213,7 +5344,7 @@ dependencies = [ "serde_repr", "sha2", "sha3", - "strum", + "strum 0.24.1", "tempfile", "thiserror", "tracing", @@ -4292,8 +5423,8 @@ dependencies = [ "easy-ext", "futures", "hex", - "hyper", - "hyper-tls", + "hyper 0.14.31", + "hyper-tls 0.5.0", "indicatif", "near-async", "near-chain", @@ -4324,14 +5455,14 @@ dependencies = [ "rand", "rayon", "regex", - "reqwest", + "reqwest 0.11.27", "rlimit", "rust-s3", "serde", "serde_ignored", "serde_json", "smart-default", - "strum", + "strum 0.24.1", "tempfile", "thiserror", "tokio", @@ -4485,6 +5616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -4497,6 +5629,26 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.82", +] + [[package]] name = "number_prefix" version = "0.3.0" @@ -4511,15 +5663,15 @@ checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "crc32fast", "hashbrown 0.14.5", - "indexmap 2.5.0", + "indexmap 2.6.0", "memchr", ] [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] @@ -4535,15 +5687,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if 1.0.0", @@ -4562,7 +5714,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -4582,9 +5734,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -4669,9 +5821,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "4.2.2" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a91171844676f8c7990ce64959210cd2eaef32c2612c50f9fae9f8aaa6065a6" +checksum = "83e7ccb95e240b7c9506a3d544f10d935e142cc90b0a1d56954fb44d89ad6b97" dependencies = [ "borsh 1.5.1", "num-traits", @@ -4784,9 +5936,9 @@ dependencies = [ [[package]] name = "paperclip-macros" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0385be5ae9c886c46688290534363a229f2531aa2c5c2bfc3b3ddafed5143aaa" +checksum = "ce6e25ce2c5362c8d48dc89e0f9ca076d507f7c1eabd04f0d593cdf5addff90c" dependencies = [ "heck 0.4.1", "http 0.2.12", @@ -4795,8 +5947,34 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", + "syn 1.0.109", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec 0.7.6", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -4885,7 +6063,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.5.4", + "redox_syscall 0.5.7", "smallvec", "windows-targets 0.52.6", ] @@ -4938,24 +6116,45 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -5023,11 +6222,21 @@ dependencies = [ "spki", ] +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polling" @@ -5083,12 +6292,12 @@ checksum = "aa06bd51638b6e76ac9ba9b6afb4164fa647bd2916d722f2623fbb6d1ed8bdba" [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "910d41a655dac3b764f1ade94821093d3610248694320cd072303a8eedcf221d" dependencies = [ "proc-macro2", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -5097,7 +6306,18 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" dependencies = [ - "fixed-hash", + "fixed-hash 0.7.0", + "uint", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash 0.8.0", + "impl-codec", "uint", ] @@ -5143,11 +6363,33 @@ 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.82", +] + [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] @@ -5167,6 +6409,26 @@ dependencies = [ "thiserror", ] +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.6.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.12.6" @@ -5187,7 +6449,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -5198,9 +6460,9 @@ checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] name = "protobuf" -version = "3.5.1" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bcc343da15609eaecd65f8aa76df8dc4209d325131d8219358c0aaaebab0bf6" +checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" dependencies = [ "once_cell", "protobuf-support", @@ -5209,13 +6471,13 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.5.1" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d0cde5642ea4df842b13eb9f59ea6fafa26dcb43e3e1ee49120e9757556189" +checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144" dependencies = [ "anyhow", "once_cell", - "protobuf 3.5.1", + "protobuf 3.7.1", "protobuf-parse", "regex", "tempfile", @@ -5224,14 +6486,14 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.5.1" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b0e9b447d099ae2c4993c0cbb03c7a9d6c937b17f2d56cfc0b1550e6fcfdb76" +checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" dependencies = [ "anyhow", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", - "protobuf 3.5.1", + "protobuf 3.7.1", "protobuf-support", "tempfile", "thiserror", @@ -5240,9 +6502,9 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.5.1" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0766e3675a627c327e4b3964582594b0e8741305d628a98a5de75a1d15f99b9" +checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" dependencies = [ "thiserror", ] @@ -5287,6 +6549,12 @@ dependencies = [ "parity-wasm 0.41.0", ] +[[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.37" @@ -5343,6 +6611,15 @@ dependencies = [ "rand_core", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + [[package]] name = "rand_xoshiro" version = "0.6.0" @@ -5392,6 +6669,12 @@ dependencies = [ "futures-io", ] +[[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.1.57" @@ -5409,9 +6692,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -5448,21 +6731,21 @@ checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" dependencies = [ "hashbrown 0.13.2", "log", - "rustc-hash", + "rustc-hash 1.1.0", "slice-group-by", "smallvec", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -5476,13 +6759,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -5499,9 +6782,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "region" @@ -5537,9 +6820,9 @@ dependencies = [ "futures-util", "h2", "http 0.2.12", - "http-body", - "hyper", - "hyper-tls", + "http-body 0.4.6", + "hyper 0.14.31", + "hyper-tls 0.5.0", "ipnet", "js-sys", "log", @@ -5552,7 +6835,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", @@ -5566,6 +6849,55 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.0", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.2.0", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.16.20" @@ -5643,6 +6975,16 @@ dependencies = [ "libc", ] +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + [[package]] name = "rocksdb" version = "0.21.0" @@ -5653,6 +6995,36 @@ dependencies = [ "librocksdb-sys", ] +[[package]] +name = "ruint" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint 0.4.6", + "num-traits", + "parity-scale-codec", + "primitive-types 0.12.2", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + [[package]] name = "rust-ini" version = "0.18.0" @@ -5683,7 +7055,7 @@ dependencies = [ "md5", "minidom", "percent-encoding", - "reqwest", + "reqwest 0.11.27", "serde", "serde-xml-rs", "serde_derive", @@ -5707,6 +7079,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -5722,6 +7100,15 @@ dependencies = [ "semver 0.9.0", ] +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustc_version" version = "0.4.1" @@ -5769,9 +7156,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ "once_cell", "ring 0.17.8", @@ -5801,7 +7188,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.3", + "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -5818,19 +7205,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -5845,9 +7231,21 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + +[[package]] +name = "rusty-fork" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] [[package]] name = "rxml" @@ -5883,9 +7281,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -5913,6 +7311,20 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.7", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "secp256k1" version = "0.27.0" @@ -5947,9 +7359,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -5961,7 +7373,16 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser", + "semver-parser 0.7.0", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser 0.10.2", ] [[package]] @@ -5976,11 +7397,26 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + [[package]] name = "serde" -version = "1.0.210" +version = "1.0.211" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "1ac55e59090389fb9f0dd9e0f3c09615afed1d19094284d0b200441f13550793" dependencies = [ "serde_derive", ] @@ -6018,13 +7454,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.211" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "54be4f245ce16bc58d57ef2716271d0d4519e0f6defa147f6e081005bcb278ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -6038,9 +7474,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -6056,7 +7492,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -6073,15 +7509,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -6091,14 +7527,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -6107,7 +7543,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -6146,6 +7582,16 @@ dependencies = [ "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 1.0.0", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -6175,12 +7621,16 @@ name = "signature" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core", +] [[package]] name = "simdutf8" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple_asn1" @@ -6321,7 +7771,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", ] [[package]] @@ -6337,6 +7796,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.82", +] + [[package]] name = "stun" version = "0.4.4" @@ -6375,15 +7847,27 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5e0c2ea8db64b2898b62ea2fbd60204ca95e0b2c6bdf53ff768bbe916fbe4d" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.82", +] + [[package]] name = "syn_derive" version = "0.1.8" @@ -6393,7 +7877,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -6402,6 +7886,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.13.1" @@ -6410,7 +7903,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -6476,14 +7969,14 @@ dependencies = [ "cfg-if 1.0.0", "p12-keystore", "rustls-connector", - "rustls-pemfile 2.1.3", + "rustls-pemfile 2.2.0", ] [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if 1.0.0", "fastrand 2.1.1", @@ -6494,22 +7987,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -6572,6 +8065,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -6589,9 +8091,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -6607,9 +8109,9 @@ dependencies = [ [[package]] name = "tokio-executor-trait" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "802ccf58e108fe16561f35348fabe15ff38218968f033d587e399a84937533cc" +checksum = "96a1593beae7759f592e1100c5997fe9e9ebf4b5968062f1fbcd807989cd1b79" dependencies = [ "async-trait", "executor-trait", @@ -6634,7 +8136,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -6672,6 +8174,17 @@ dependencies = [ "tokio-stream", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.16" @@ -6681,6 +8194,23 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", ] [[package]] @@ -6713,11 +8243,11 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "toml_datetime", "winnow", ] @@ -6735,15 +8265,15 @@ dependencies = [ "bytes", "h2", "http 0.2.12", - "http-body", - "hyper", + "http-body 0.4.6", + "hyper 0.14.31", "hyper-timeout", "percent-encoding", "pin-project", "prost", "tokio", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -6769,6 +8299,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -6813,7 +8357,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -6879,12 +8423,38 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.1.0", + "httparse", + "log", + "rand", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror", + "utf-8", +] + [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uint" version = "0.9.5" @@ -6897,20 +8467,23 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" @@ -6920,18 +8493,24 @@ checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsafe-libyaml" @@ -6968,6 +8547,12 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8parse" version = "0.2.2" @@ -6976,9 +8561,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" [[package]] name = "valuable" @@ -7004,6 +8589,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "waker-fn" version = "1.2.0" @@ -7027,9 +8621,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -7038,24 +8632,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -7065,9 +8659,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7075,22 +8669,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-encoder" @@ -7112,9 +8706,9 @@ dependencies = [ [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" dependencies = [ "futures-util", "js-sys", @@ -7329,7 +8923,7 @@ version = "0.115.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "semver 1.0.23", ] @@ -7354,7 +8948,7 @@ dependencies = [ "bumpalo", "cfg-if 1.0.0", "fxprof-processed-profile", - "indexmap 2.5.0", + "indexmap 2.6.0", "libc", "log", "object 0.32.2", @@ -7433,7 +9027,7 @@ dependencies = [ "anyhow", "cranelift-entity", "gimli 0.28.1", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "object 0.32.2", "serde", @@ -7499,7 +9093,7 @@ dependencies = [ "anyhow", "cc", "cfg-if 1.0.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "libc", "log", "mach", @@ -7539,7 +9133,7 @@ checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -7550,9 +9144,9 @@ checksum = "9dafab2db172a53e23940e0fa3078c202f567ee5f13f4b42f66b694fab43c658" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -7568,6 +9162,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webrtc-util" version = "0.7.0" @@ -7601,11 +9204,17 @@ dependencies = [ "rustix 0.38.37", ] +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + [[package]] name = "wildmatch" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3928939971918220fed093266b809d1ee4ec6c1a2d72692ff6876898f3b16c19" +checksum = "68ce1ab1f8c62655ebe1350f589c61e505cf94d385bc6a12899442d9081e71fd" [[package]] name = "winapi" @@ -7638,6 +9247,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "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]] name = "windows-sys" version = "0.48.0" @@ -7788,9 +9427,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -7805,6 +9444,43 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "workers" +version = "0.1.0" +dependencies = [ + "alloy", + "alloy-json-abi", + "dotenv", + "eyre", + "futures", + "hex", + "serde", + "serde_json", + "sha3", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wyz" version = "0.5.1" @@ -7881,7 +9557,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] @@ -7901,7 +9577,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.82", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 388cb0ea..3fa805b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ resolver = "2" members = [ "indexer", "contracts/evm/test/ffi/bls-utils", + "workers", ] [workspace.package] diff --git a/workers/Cargo.lock b/workers/Cargo.lock new file mode 100644 index 00000000..9b3ecd35 --- /dev/null +++ b/workers/Cargo.lock @@ -0,0 +1,3581 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "alloy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" +dependencies = [ + "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 = "alloy-chains" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94c225801d42099570d0674701dddd4142f0ef715282aeb5985042e2ec962df7" +dependencies = [ + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "c-kzg", + "derive_more", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917f7d12cf3971dc8c11c9972f732b35ccb9aaaf5f28f2f87e9e6523bee3a8ad" +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", +] + +[[package]] +name = "alloy-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "k256", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" +dependencies = [ + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cc0e59c803dd44d14fc0cfa9fea1f74cfa8fd9fb60ca303ced390c58c28d4e" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "thiserror", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a289ffd7448036f2f436b377f981c79ce0b2090877bad938d43387dc09931877" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "foldhash", + "hashbrown 0.15.0", + "hex-literal", + "indexmap", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" +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-eth", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "alloy-pubsub" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f32cef487122ae75c91eb50154c70801d71fabdb976fec6c49e0af5e6486ab15" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" +dependencies = [ + "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", + "tracing", + "url", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0285c4c09f838ab830048b780d7f4a4f460f309aa1194bb049843309524c64c" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "derive_more", + "strum", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "derive_more", + "itertools 0.13.0", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-serde" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror", +] + +[[package]] +name = "alloy-signer-local" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494e0a256f3e99f2426f994bcd1be312c02cb8f88260088dacb33a8b8936475f" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand", + "thiserror", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.79", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.79", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" +dependencies = [ + "alloy-json-rpc", + "base64", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-http" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90cf9cde7f2fce617da52768ee28f522264b282d148384a4ca0ea85af04fa3a" +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.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7153b88690de6a50bba81c11e1d706bc41dbb90126d607404d60b763f6a3947f" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http", + "rustls", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + +[[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" + +[[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.79", +] + +[[package]] +name = "async-trait" +version = "0.1.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +dependencies = [ + "serde", +] + +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "cc" +version = "1.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-hex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "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", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "foldhash", + "serde", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", + "serde", +] + +[[package]] +name = "interprocess" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f4e4a06d42fab3e85ab1b419ad32b09eab58b901d40c57935ff92db3287a13" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +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 = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "lru" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[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.79", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[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.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "serde", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "ruint" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.23", +] + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "schannel" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "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.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.79", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[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", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +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 = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "workers" +version = "0.1.0" +dependencies = [ + "alloy", + "alloy-json-abi", + "dotenv", + "eyre", + "futures", + "hex", + "serde", + "serde_json", + "sha3", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] diff --git a/workers/Cargo.toml b/workers/Cargo.toml new file mode 100644 index 00000000..913060ad --- /dev/null +++ b/workers/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "workers" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "dvn" +path = "src/bin/dvn.rs" + +[dependencies] +alloy = { version = "0.4.2", features = ["full"] } +alloy-json-abi = "0.8.6" +dotenv = "0.15.0" +eyre = "0.6.12" +futures = "0.3.31" +serde = { version = "1.0.210", features = ["derive"] } +serde_json = "1.0.128" +sha3 = "0.10.8" +tokio = { version = "1.40.0", features = ["full"] } +tracing = "0.1.40" +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } + +[dev-dependencies] +hex = "0.4.3" diff --git a/workers/README.md b/workers/README.md new file mode 100644 index 00000000..d9694042 --- /dev/null +++ b/workers/README.md @@ -0,0 +1,12 @@ +# Workers for offchain workflows + +## DVN + +Nuff's DVN for LayerZero integration lives under `bin/dvn.rs`. + +To run it, do `$ RUST_LOG=debug cargo run --bin dvn` to see everything, or `$ RUST_LOG=info cargo run --bin dvn` for something less. + +## Configuration + +To run different binaries, some configuration is needed. It usually loads some environment variables from an `.env` file. + diff --git a/workers/abi/L0V2Endpoint.json b/workers/abi/L0V2Endpoint.json new file mode 100644 index 00000000..33f4ede9 --- /dev/null +++ b/workers/abi/L0V2Endpoint.json @@ -0,0 +1 @@ +{"abi":[{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LZ_AlreadyRegistered","type":"error"},{"inputs":[],"name":"LZ_ComposeExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"name":"LZ_ComposeNotFound","type":"error"},{"inputs":[],"name":"LZ_DefaultReceiveLibUnavailable","type":"error"},{"inputs":[],"name":"LZ_DefaultSendLibUnavailable","type":"error"},{"inputs":[{"internalType":"uint256","name":"requiredNative","type":"uint256"},{"internalType":"uint256","name":"suppliedNative","type":"uint256"},{"internalType":"uint256","name":"requiredLzToken","type":"uint256"},{"internalType":"uint256","name":"suppliedLzToken","type":"uint256"}],"name":"LZ_InsufficientFee","type":"error"},{"inputs":[],"name":"LZ_InvalidExpiry","type":"error"},{"inputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"LZ_InvalidNonce","type":"error"},{"inputs":[],"name":"LZ_InvalidPayloadHash","type":"error"},{"inputs":[],"name":"LZ_InvalidReceiveLibrary","type":"error"},{"inputs":[],"name":"LZ_LzTokenUnavailable","type":"error"},{"inputs":[],"name":"LZ_OnlyNonDefaultLib","type":"error"},{"inputs":[],"name":"LZ_OnlyReceiveLib","type":"error"},{"inputs":[],"name":"LZ_OnlyRegisteredLib","type":"error"},{"inputs":[],"name":"LZ_OnlyRegisteredOrDefaultLib","type":"error"},{"inputs":[],"name":"LZ_OnlySendLib","type":"error"},{"inputs":[],"name":"LZ_PathNotInitializable","type":"error"},{"inputs":[],"name":"LZ_PathNotVerifiable","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"name":"LZ_PayloadHashNotFound","type":"error"},{"inputs":[],"name":"LZ_SameValue","type":"error"},{"inputs":[],"name":"LZ_SendReentrancy","type":"error"},{"inputs":[],"name":"LZ_Unauthorized","type":"error"},{"inputs":[],"name":"LZ_UnsupportedEid","type":"error"},{"inputs":[],"name":"LZ_UnsupportedInterface","type":"error"},{"inputs":[],"name":"LZ_ZeroLzTokenFee","type":"error"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer_NativeFailed","type":"error"},{"inputs":[],"name":"Transfer_ToAddressIsZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"}],"name":"ComposeDelivered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"ComposeSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"DefaultReceiveLibrarySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"oldLib","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"DefaultReceiveLibraryTimeoutSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"DefaultSendLibrarySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"}],"name":"DelegateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"sender","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"InboundNonceSkipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"LibraryRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"LzComposeAlert","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"indexed":false,"internalType":"struct Origin","name":"origin","type":"tuple"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"LzReceiveAlert","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"LzTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"sender","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"PacketBurnt","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"indexed":false,"internalType":"struct Origin","name":"origin","type":"tuple"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"PacketDelivered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"sender","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"PacketNilified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"encodedPayload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"options","type":"bytes"},{"indexed":false,"internalType":"address","name":"sendLibrary","type":"address"}],"name":"PacketSent","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"indexed":false,"internalType":"struct Origin","name":"origin","type":"tuple"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"PacketVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"ReceiveLibrarySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"oldLib","type":"address"},{"indexed":false,"internalType":"uint256","name":"timeout","type":"uint256"}],"name":"ReceiveLibraryTimeoutSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"SendLibrarySet","type":"event"},{"inputs":[],"name":"EMPTY_PAYLOAD_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NIL_PAYLOAD_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockedLibrary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"bytes32","name":"_sender","type":"bytes32"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"clear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"composeQueue","outputs":[{"internalType":"bytes32","name":"messageHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"srcEid","type":"uint32"}],"name":"defaultReceiveLibrary","outputs":[{"internalType":"address","name":"lib","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"srcEid","type":"uint32"}],"name":"defaultReceiveLibraryTimeout","outputs":[{"internalType":"address","name":"lib","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"dstEid","type":"uint32"}],"name":"defaultSendLibrary","outputs":[{"internalType":"address","name":"lib","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oapp","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"delegate","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eid","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"address","name":"_lib","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"uint32","name":"_configType","type":"uint32"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"config","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"}],"name":"getReceiveLibrary","outputs":[{"internalType":"address","name":"lib","type":"address"},{"internalType":"bool","name":"isDefault","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegisteredLibraries","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSendContext","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"}],"name":"getSendLibrary","outputs":[{"internalType":"address","name":"lib","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"bytes32","name":"_sender","type":"bytes32"}],"name":"inboundNonce","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"inboundNonce","type":"uint64"}],"name":"inboundPayloadHash","outputs":[{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"initializable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"}],"name":"isDefaultSendLibrary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lib","type":"address"}],"name":"isRegisteredLibrary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSendingMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"isSupportedEid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"address","name":"_actualReceiveLib","type":"address"}],"name":"isValidReceiveLibrary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"lazyInboundNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint16","name":"_index","type":"uint16"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzCompose","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint16","name":"_index","type":"uint16"},{"internalType":"uint256","name":"_gas","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_extraData","type":"bytes"},{"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"lzComposeAlert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint256","name":"_gas","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_extraData","type":"bytes"},{"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"lzReceiveAlert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lzToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"bytes32","name":"_receiver","type":"bytes32"}],"name":"nextGuid","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"bytes32","name":"_sender","type":"bytes32"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"nilify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"}],"name":"outboundNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"options","type":"bytes"},{"internalType":"bool","name":"payInLzToken","type":"bool"}],"internalType":"struct MessagingParams","name":"_params","type":"tuple"},{"internalType":"address","name":"_sender","type":"address"}],"name":"quote","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint32","name":"srcEid","type":"uint32"}],"name":"receiveLibraryTimeout","outputs":[{"internalType":"address","name":"lib","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lib","type":"address"}],"name":"registerLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"options","type":"bytes"},{"internalType":"bool","name":"payInLzToken","type":"bool"}],"internalType":"struct MessagingParams","name":"_params","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint16","name":"_index","type":"uint16"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendCompose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"address","name":"_lib","type":"address"},{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint32","name":"configType","type":"uint32"},{"internalType":"bytes","name":"config","type":"bytes"}],"internalType":"struct SetConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_newLib","type":"address"},{"internalType":"uint256","name":"_gracePeriod","type":"uint256"}],"name":"setDefaultReceiveLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_lib","type":"address"},{"internalType":"uint256","name":"_expiry","type":"uint256"}],"name":"setDefaultReceiveLibraryTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_newLib","type":"address"}],"name":"setDefaultSendLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lzToken","type":"address"}],"name":"setLzToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_newLib","type":"address"},{"internalType":"uint256","name":"_gracePeriod","type":"uint256"}],"name":"setReceiveLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_lib","type":"address"},{"internalType":"uint256","name":"_expiry","type":"uint256"}],"name":"setReceiveLibraryTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_newLib","type":"address"}],"name":"setSendLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"bytes32","name":"_sender","type":"bytes32"},{"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"skip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"verifiable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"verify","outputs":[],"stateMutability":"nonpayable","type":"function"}]} diff --git a/workers/abi/SendLibrary.json b/workers/abi/SendLibrary.json new file mode 100644 index 00000000..ed8a8f21 --- /dev/null +++ b/workers/abi/SendLibrary.json @@ -0,0 +1 @@ +{"abi":[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"uint256","name":"_treasuryGasLimit","type":"uint256"},{"internalType":"uint256","name":"_treasuryGasForFeeCap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DVN_InvalidDVNIdx","type":"error"},{"inputs":[{"internalType":"uint256","name":"cursor","type":"uint256"}],"name":"DVN_InvalidDVNOptions","type":"error"},{"inputs":[],"name":"LZ_MessageLib_CannotWithdrawAltToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"LZ_MessageLib_InvalidAmount","type":"error"},{"inputs":[],"name":"LZ_MessageLib_InvalidExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"LZ_MessageLib_InvalidMessageSize","type":"error"},{"inputs":[],"name":"LZ_MessageLib_NotTreasury","type":"error"},{"inputs":[],"name":"LZ_MessageLib_OnlyEndpoint","type":"error"},{"inputs":[],"name":"LZ_MessageLib_TransferFailed","type":"error"},{"inputs":[],"name":"LZ_MessageLib_ZeroMessageSize","type":"error"},{"inputs":[],"name":"LZ_ULN_AtLeastOneDVN","type":"error"},{"inputs":[{"internalType":"uint32","name":"configType","type":"uint32"}],"name":"LZ_ULN_InvalidConfigType","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidConfirmations","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidLegacyType1Option","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidLegacyType2Option","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNCount","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNThreshold","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidRequiredDVNCount","type":"error"},{"inputs":[{"internalType":"uint8","name":"workerId","type":"uint8"}],"name":"LZ_ULN_InvalidWorkerId","type":"error"},{"inputs":[{"internalType":"uint256","name":"cursor","type":"uint256"}],"name":"LZ_ULN_InvalidWorkerOptions","type":"error"},{"inputs":[],"name":"LZ_ULN_Unsorted","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"LZ_ULN_UnsupportedEid","type":"error"},{"inputs":[{"internalType":"uint16","name":"optionType","type":"uint16"}],"name":"LZ_ULN_UnsupportedOptionType","type":"error"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer_NativeFailed","type":"error"},{"inputs":[],"name":"Transfer_ToAddressIsZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"optionalDVNs","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"fees","type":"uint256[]"}],"name":"DVNFeePaid","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"indexed":false,"internalType":"struct SetDefaultExecutorConfigParam[]","name":"params","type":"tuple[]"}],"name":"DefaultExecutorConfigsSet","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"indexed":false,"internalType":"struct SetDefaultUlnConfigParam[]","name":"params","type":"tuple[]"}],"name":"DefaultUlnConfigsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oapp","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"indexed":false,"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"name":"ExecutorConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ExecutorFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lzToken","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LzTokenFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"worker","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTreasuryNativeFeeCap","type":"uint256"}],"name":"TreasuryNativeFeeCapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasurySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oapp","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"indexed":false,"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"name":"UlnConfigSet","type":"event"},{"inputs":[{"internalType":"address","name":"oapp","type":"address"},{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"executorConfigs","outputs":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"worker","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getAppUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_configType","type":"uint32"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getExecutorConfig","outputs":[{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"rtnConfig","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"rtnConfig","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"isSupportedEid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageLibType","outputs":[{"internalType":"enum MessageLibType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Packet","name":"_packet","type":"tuple"},{"internalType":"bytes","name":"_options","type":"bytes"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quote","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Packet","name":"_packet","type":"tuple"},{"internalType":"bytes","name":"_options","type":"bytes"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"send","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint32","name":"configType","type":"uint32"},{"internalType":"bytes","name":"config","type":"bytes"}],"internalType":"struct SetConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"internalType":"struct SetDefaultExecutorConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setDefaultExecutorConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"internalType":"struct SetDefaultUlnConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setDefaultUlnConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTreasuryNativeFeeCap","type":"uint256"}],"name":"setTreasuryNativeFeeCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint64","name":"major","type":"uint64"},{"internalType":"uint8","name":"minor","type":"uint8"},{"internalType":"uint8","name":"endpointVersion","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lzToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLzTokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]} diff --git a/workers/src/abi.rs b/workers/src/abi.rs new file mode 100644 index 00000000..bed75af1 --- /dev/null +++ b/workers/src/abi.rs @@ -0,0 +1,20 @@ +//! Types create from the JSON ABI files. For example, to be able to decode the logs' data, or call contracts' methods. + +use alloy::sol; +use serde::{Deserialize, Serialize}; + +sol!( + #[allow(missing_docs)] + #[sol(rpc)] + #[derive(Debug, Serialize, Deserialize)] + SendLibraryAbi, + "abi/SendLibrary.json" +); + +sol!( + #[allow(missing_docs)] + #[sol(rpc)] + #[derive(Debug, Serialize, Deserialize)] + L0V2EndpointAbi, + "abi/L0V2Endpoint.json" +); diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs new file mode 100644 index 00000000..27b07931 --- /dev/null +++ b/workers/src/bin/dvn.rs @@ -0,0 +1,78 @@ +//! Main workflow for subscribing and listening for specific contract events using a `WebSocket` subscription. + +use eyre::Result; +use futures::stream::StreamExt; +use tracing::{debug, error, info}; +use tracing_subscriber::EnvFilter; +use workers::{ + abi::{L0V2EndpointAbi, SendLibraryAbi}, + config, utils, +}; + +#[tokio::main] +async fn main() -> Result<()> { + // Initialize tracing + tracing_subscriber::fmt() + .with_target(false) + .with_env_filter(EnvFilter::from_default_env()) + .init(); + + // Load the DVN workflow configuration. + let config = config::DVNConfig::load_from_env()?; + + // Create the WS subscriptions for listening to the events. + let (_provider, mut endpoint_stream, mut sendlib_stream) = utils::build_subscriptions(&config).await?; + + // Create an HTTP provider to call the contract. + let http_provider = utils::get_http_provider(&config)?; + + // Get the relevant contract ABI. + let sendlib_abi = utils::get_sendlib_abi()?; + + // Create a contract instance. + let sendlib_contract = utils::create_contract_instance(&config, http_provider, sendlib_abi)?; + + info!("Listening to chain events..."); + + loop { + tokio::select! { + Some(log) = endpoint_stream.next() => { + match log.log_decode::() { + Ok(_inner_log) => { + info!("PacketSent event found and decoded."); + }, + Err(e) => { + error!("Failed to decode PacketSent event: {:?}", e); + } + } + } + Some(log) = sendlib_stream.next() => { + match log.log_decode::() { + Ok(inner_log) => { + info!("DVNFeePaid event found and decoded."); + let required_dvns = inner_log.inner.requiredDVNs.clone(); + + if required_dvns.contains(&config.dvn_addr()?) { + debug!("Matched DVN found in required DVNs. Performing idempotency check..."); + + let required_confirmations = utils::get_confirmations(&config, &sendlib_contract).await?; + + //let already_verified = utils::get_verified(&config, &sendlib_contract, required_confirmations).await?; + // + //if already_verified { + // debug!("Packet has been verified. Listening for more packets..."); + //} else { + // debug!("Packet has not been verified. Calling verification."); + //} + // TODO: idempotency check again + + } + }, + Err(e) => { + error!("Failed to decode DVNFeePaid event: {:?}", e); + } + } + }, + } + } +} diff --git a/workers/src/config.rs b/workers/src/config.rs new file mode 100644 index 00000000..40ecdc90 --- /dev/null +++ b/workers/src/config.rs @@ -0,0 +1,94 @@ +//! Configuration for the DVN offchain workflow. + +use alloy::{ + primitives::{Address, U256}, + transports::http::reqwest::Url, +}; +use eyre::Result; + +#[derive(Default)] +pub struct DVNConfig { + /// The Websocket RPC URL to connect to the Ethereum network. + ws_rpc_url: String, + /// The HTTP RPC URL to connect to the Ethereum network. + http_rpc_url: String, + /// The LayerZero endpoint address. + l0_endpoint_addr: String, + /// The SendLib Ultra Light Node 302 address. + sendlib_uln302_addr: String, + /// The SendLib Ultra Light Node 301 address. + sendlib_uln301_addr: String, + /// The Ethereum network ID. + network_id: u64, + /// Own DVN address. Used to check when the DVN is assigned to a task. + dvn_addr: String, +} + +impl DVNConfig { + /// Get the chain's RPC URL. + pub fn ws_rpc(&self) -> &str { + &self.ws_rpc_url + } + + /// Get the chain's RPC URL. + pub fn http_rpc(&self) -> Result { + Ok(self.http_rpc_url.parse::()?) + } + + /// Get the LayerZero endpoint address. + pub fn l0_addr(&self) -> Result
{ + Ok(self.l0_endpoint_addr.parse::
()?) + } + + /// Get the SendLib ULN302 address. + pub fn sendlib_uln302_addr(&self) -> Result
{ + Ok(self.sendlib_uln302_addr.parse::
()?) + } + + /// Get the SendLib ULN301 address. + pub fn sendlib_uln301_addr(&self) -> Result
{ + Ok(self.sendlib_uln301_addr.parse::
()?) + } + + /// Get the EID as U256. + pub fn eid(&self) -> U256 { + U256::from(self.network_id) + } + + /// Get the DVN address. + pub fn dvn_addr(&self) -> Result
{ + Ok(self.dvn_addr.parse::
()?) + } + + /// Load environment variables. + pub fn load_from_env() -> Result { + dotenv::dotenv()?; + + Ok(Self { + ws_rpc_url: std::env::var("WS_RPC_URL").unwrap_or_else(|_| Default::default()), + http_rpc_url: std::env::var("HTTP_RPC_URL").unwrap_or_else(|_| Default::default()), + l0_endpoint_addr: std::env::var("L0_ENDPOINT_ADDR").unwrap_or_else(|_| Default::default()), + sendlib_uln302_addr: std::env::var("SENDLIB_ULN302_ADDR").unwrap_or_else(|_| Default::default()), + sendlib_uln301_addr: std::env::var("SENDLIB_ULN301_ADDR").unwrap_or_else(|_| Default::default()), + network_id: std::env::var("NETWORK_EID") + .unwrap_or_else(|_| "0".to_string()) + .parse::()?, + dvn_addr: std::env::var("DVN_ADDR").unwrap_or_else(|_| Default::default()), + }) + } +} + +/// Useful events for the DVN workflow. +pub enum DVNEvent { + PacketSent, + FeePaid, +} + +impl AsRef for DVNEvent { + fn as_ref(&self) -> &str { + match self { + DVNEvent::PacketSent => "PacketSent(bytes,bytes,address)", + DVNEvent::FeePaid => "DVNFeePaid(address[],address[],uint256[])", + } + } +} diff --git a/workers/src/lib.rs b/workers/src/lib.rs new file mode 100644 index 00000000..6805bab0 --- /dev/null +++ b/workers/src/lib.rs @@ -0,0 +1,5 @@ +//! Tools to build offchain workers for the LayerZero protocol. + +pub mod abi; +pub mod config; +pub mod utils; diff --git a/workers/src/utils.rs b/workers/src/utils.rs new file mode 100644 index 00000000..b6dfcae0 --- /dev/null +++ b/workers/src/utils.rs @@ -0,0 +1,235 @@ +//! Utilities for interacting with the DVN. + +use crate::config::{DVNConfig, DVNEvent}; +use alloy::{ + contract::{ContractInstance, Interface}, + dyn_abi::DynSolValue, + eips::BlockNumberOrTag, + network::Ethereum, + primitives::U256, + providers::{Provider, ProviderBuilder, RootProvider, WsConnect}, + pubsub::{PubSubFrontend, SubscriptionStream}, + rpc::types::{Filter, Log}, + transports::http::{Client, Http}, +}; +use alloy_json_abi::JsonAbi; +use eyre::Result; +use sha3::{Digest, Keccak256}; +use tracing::debug; + +pub type ContractInst = ContractInstance, RootProvider>, Ethereum>; +pub type HttpProvider = RootProvider>; + +/// Create the subscriptions for the DVN workflow. +pub async fn build_subscriptions( + config: &DVNConfig, +) -> Result<( + RootProvider, + SubscriptionStream, + SubscriptionStream, +)> { + // Create the provider + let rpc_url = config.ws_rpc(); + let ws = WsConnect::new(rpc_url); + let provider = ProviderBuilder::new().on_ws(ws).await?; + + // layerzero endpoint filter + let packet_filter = Filter::new() + .address(config.l0_addr()?) + .event(DVNEvent::PacketSent.as_ref()) + .from_block(BlockNumberOrTag::Latest); + + // messagelib endpoint filter + let fee_paid_filter = Filter::new() + .address(config.sendlib_uln302_addr()?) + .event(DVNEvent::FeePaid.as_ref()) + .from_block(BlockNumberOrTag::Latest); + + // Subscribe to logs + let endpoint_sub = provider.subscribe_logs(&packet_filter).await?; + let sendlib_sub = provider.subscribe_logs(&fee_paid_filter).await?; + + // Create some streams from the subscriptions + let endpoint_stream = endpoint_sub.into_stream(); + let sendlib_stream = sendlib_sub.into_stream(); + + Ok((provider, endpoint_stream, sendlib_stream)) +} + +/// Load the MessageLib ABI. +pub fn get_sendlib_abi() -> Result { + // Get the SendLib ABI + let artifact = std::fs::read("./abi/SendLibrary.json")?; + let json: serde_json::Value = serde_json::from_slice(&artifact)?; + // SAFETY: Assume `unwrap` is safe since the key is always present + let abi_value = json.get("abi").unwrap(); + let abi = serde_json::from_str(&abi_value.to_string())?; + Ok(abi) +} + +/// Construct an HTTP provider given the config. +pub fn get_http_provider(config: &DVNConfig) -> Result { + let http_provider = ProviderBuilder::new().on_http(config.http_rpc()?); + Ok(http_provider) +} + +/// Create a contract instance from the ABI to interact with on-chain instance. +pub fn create_contract_instance(config: &DVNConfig, http_provider: HttpProvider, abi: JsonAbi) -> Result { + let contract: ContractInstance, _, Ethereum> = ContractInstance::new( + config.sendlib_uln302_addr()?, + http_provider.clone(), + Interface::new(abi), + ); + Ok(contract) +} + +/// Get the number of required confirmations by the ULN. +pub async fn get_confirmations(config: &DVNConfig, contract: &ContractInst) -> Result { + // FIXME: there an error returned by the server: + // Error: server returned an error response: error code 3: execution reverted, data: "0xce2c3751" + // which decodes (https://www.4byte.directory/signatures/?bytes4_signature=0xce2c3751) to: + // LZ_ULN_AtLeastOneDVN() + + debug!("Getting confirmations required by the ULN."); + debug!("Contract address: {:?}", config.sendlib_uln302_addr()?); + debug!("Contract address: {:?}", config.eid()); + + // Call the `getUlnConfig` function on the contract + let uln_config = contract + .function( + "getUlnConfig", + &[ + DynSolValue::Address(config.sendlib_uln302_addr()?), + DynSolValue::Uint(config.eid(), 32), + ], + )? + .call() + .await?; + + let num_confirmations = if let DynSolValue::Tuple(tupled_uint) = uln_config[0].clone() { + if let Some(value) = tupled_uint[0].as_uint() { + value.0 + } else { + U256::from(0) + } + } else { + U256::from(0) + }; + + debug!( + "{:?} confirmations required by MessageLib at: {:?}", + num_confirmations, + contract.address() + ); + + Ok(num_confirmations) +} + +/// Idempotent check to see if there's work to do for the DVN. +pub async fn get_verified(config: &DVNConfig, contract: &ContractInst, required_confirmations: U256) -> Result { + // Call the `verified` function on the contract + let uln302 = contract + .function( + "_verified", + &[ + DynSolValue::Address(config.sendlib_uln301_addr()?), + // HeaderHash + // PayloadHash + DynSolValue::Uint(required_confirmations, 32), + ], + )? + .call() + .await?; + + let uln302_state = if uln302[0].as_bool().unwrap() { + debug!("Packet already verified, DVN workflow can stop."); + true + } else { + debug!("Packet hasn't been verified. Call `verify`."); + false + }; + + // Call the `_verified` function on the contract + let uln301 = contract + .function( + "_verified", + &[ + DynSolValue::Address(config.sendlib_uln301_addr()?), + // HeaderHash + // PayloadHash + DynSolValue::Uint(required_confirmations, 32), + ], + )? + .call() + .await?; + + let uln301_state = if uln301[0].as_bool().unwrap() { + debug!("Packet already verified, DVN workflow can stop."); + true + } else { + debug!("Packet hasn't been verified. Call `verify`."); + false + }; + + Ok(uln302_state && uln301_state) +} + +pub async fn verify( + config: &DVNConfig, + contract: &ContractInst, + packet_header: &[u8], + payload: &[u8], + confirmations: U256, +) -> Result { + // Create the hash of the payload + let payload_hash = keccak256(payload); + + // Call the `verified` function on the contract + let _ = contract + .function( + "verify", + &[ + // PacketHeader + //packet_header, + // PayloadHash + //payload_hash, + // Confirmations + //DynSolValue::Uint(confirmations, 32), + ], + )? + .call() + .await?; + + Ok(false) +} + +/// Helper for hashing some data with `keccak256`. +fn keccak256(data: &[u8]) -> [u8; 32] { + let mut hasher = Keccak256::default(); + hasher.update(data); + let result = hasher.finalize(); + result.into() +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::config; + + #[tokio::test] + async fn test_get_confirmations() -> Result<()> { + // Set up + let config = config::DVNConfig::load_from_env()?; + let http_provider = get_http_provider(&config)?; + let sendlib_abi = get_sendlib_abi()?; + let sendlib_contract = create_contract_instance(&config, http_provider, sendlib_abi)?; + + // Query contract value + let required_confirmations = get_confirmations(&config, &sendlib_contract).await?; + + // Check the value is what we expect + assert_eq!(required_confirmations, U256::from(20)); + + Ok(()) + } +} From 9fc8be8b9a846b80fb9d29c352ad7e41f73ba244 Mon Sep 17 00:00:00 2001 From: Lozano Date: Wed, 9 Oct 2024 16:18:40 +0200 Subject: [PATCH 02/62] chore: add receive lib abi --- ...ndpoint.json => ArbitrumL0V2Endpoint.json} | 0 workers/abi/ArbitrumReceiveLibUln302.json | 1 + ...ibrary.json => ArbitrumSendLibUln302.json} | 0 workers/src/abi.rs | 12 ++++- workers/src/bin/dvn.rs | 26 ++++++---- workers/src/config.rs | 16 ++++++ workers/src/utils.rs | 50 +++++++++++-------- 7 files changed, 73 insertions(+), 32 deletions(-) rename workers/abi/{L0V2Endpoint.json => ArbitrumL0V2Endpoint.json} (100%) create mode 100644 workers/abi/ArbitrumReceiveLibUln302.json rename workers/abi/{SendLibrary.json => ArbitrumSendLibUln302.json} (100%) diff --git a/workers/abi/L0V2Endpoint.json b/workers/abi/ArbitrumL0V2Endpoint.json similarity index 100% rename from workers/abi/L0V2Endpoint.json rename to workers/abi/ArbitrumL0V2Endpoint.json diff --git a/workers/abi/ArbitrumReceiveLibUln302.json b/workers/abi/ArbitrumReceiveLibUln302.json new file mode 100644 index 00000000..9b9ad405 --- /dev/null +++ b/workers/abi/ArbitrumReceiveLibUln302.json @@ -0,0 +1 @@ +{"abi":[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LZ_MessageLib_OnlyEndpoint","type":"error"},{"inputs":[],"name":"LZ_ULN_AtLeastOneDVN","type":"error"},{"inputs":[{"internalType":"uint32","name":"configType","type":"uint32"}],"name":"LZ_ULN_InvalidConfigType","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidConfirmations","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidEid","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNCount","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNThreshold","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidPacketHeader","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidPacketVersion","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidRequiredDVNCount","type":"error"},{"inputs":[],"name":"LZ_ULN_Unsorted","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"LZ_ULN_UnsupportedEid","type":"error"},{"inputs":[],"name":"LZ_ULN_Verifying","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"indexed":false,"internalType":"struct SetDefaultUlnConfigParam[]","name":"params","type":"tuple[]"}],"name":"DefaultUlnConfigsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dvn","type":"address"},{"indexed":false,"internalType":"bytes","name":"header","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"confirmations","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"proofHash","type":"bytes32"}],"name":"PayloadVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oapp","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"indexed":false,"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"name":"UlnConfigSet","type":"event"},{"inputs":[{"internalType":"bytes","name":"_packetHeader","type":"bytes"},{"internalType":"uint32","name":"_localEid","type":"uint32"}],"name":"assertHeader","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_packetHeader","type":"bytes"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"commitVerification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getAppUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_configType","type":"uint32"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"rtnConfig","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"headerHash","type":"bytes32"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"internalType":"address","name":"dvn","type":"address"}],"name":"hashLookup","outputs":[{"internalType":"bool","name":"submitted","type":"bool"},{"internalType":"uint64","name":"confirmations","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"isSupportedEid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageLibType","outputs":[{"internalType":"enum MessageLibType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint32","name":"configType","type":"uint32"},{"internalType":"bytes","name":"config","type":"bytes"}],"internalType":"struct SetConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"internalType":"struct SetDefaultUlnConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setDefaultUlnConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"_config","type":"tuple"},{"internalType":"bytes32","name":"_headerHash","type":"bytes32"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"verifiable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_packetHeader","type":"bytes"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"},{"internalType":"uint64","name":"_confirmations","type":"uint64"}],"name":"verify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint64","name":"major","type":"uint64"},{"internalType":"uint8","name":"minor","type":"uint8"},{"internalType":"uint8","name":"endpointVersion","type":"uint8"}],"stateMutability":"pure","type":"function"}]} diff --git a/workers/abi/SendLibrary.json b/workers/abi/ArbitrumSendLibUln302.json similarity index 100% rename from workers/abi/SendLibrary.json rename to workers/abi/ArbitrumSendLibUln302.json diff --git a/workers/src/abi.rs b/workers/src/abi.rs index bed75af1..96ca4b75 100644 --- a/workers/src/abi.rs +++ b/workers/src/abi.rs @@ -8,7 +8,15 @@ sol!( #[sol(rpc)] #[derive(Debug, Serialize, Deserialize)] SendLibraryAbi, - "abi/SendLibrary.json" + "abi/ArbitrumSendLibUln302.json" +); + +sol!( + #[allow(missing_docs)] + #[sol(rpc)] + #[derive(Debug, Serialize, Deserialize)] + ReceiveLibraryAbi, + "abi/ArbitrumReceiveLibUln302.json" ); sol!( @@ -16,5 +24,5 @@ sol!( #[sol(rpc)] #[derive(Debug, Serialize, Deserialize)] L0V2EndpointAbi, - "abi/L0V2Endpoint.json" + "abi/ArbitrumL0V2Endpoint.json" ); diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 27b07931..1de716bf 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -27,10 +27,12 @@ async fn main() -> Result<()> { let http_provider = utils::get_http_provider(&config)?; // Get the relevant contract ABI. - let sendlib_abi = utils::get_sendlib_abi()?; + let sendlib_abi = utils::get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; + let receivelib_abi = utils::get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; // Create a contract instance. - let sendlib_contract = utils::create_contract_instance(&config, http_provider, sendlib_abi)?; + let sendlib_contract = utils::create_contract_instance(&config, http_provider.clone(), sendlib_abi)?; + let receivelib_contract = utils::create_contract_instance(&config, http_provider, receivelib_abi)?; info!("Listening to chain events..."); @@ -57,15 +59,19 @@ async fn main() -> Result<()> { let required_confirmations = utils::get_confirmations(&config, &sendlib_contract).await?; - //let already_verified = utils::get_verified(&config, &sendlib_contract, required_confirmations).await?; - // - //if already_verified { - // debug!("Packet has been verified. Listening for more packets..."); - //} else { - // debug!("Packet has not been verified. Calling verification."); - //} - // TODO: idempotency check again + let already_verified = utils::get_verified(&config, &receivelib_contract, required_confirmations).await?; + loop { + if already_verified { + debug!("Packet has been verified. Listening for more packets..."); + + } else { + debug!("Packet has not been verified. Calling verification."); + //utils::verify(); + // TODO: idempotency check again + let already_verified = utils::get_verified(&config, &receivelib_contract, required_confirmations).await?; + } + } } }, Err(e) => { diff --git a/workers/src/config.rs b/workers/src/config.rs index 40ecdc90..8737e37a 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -16,8 +16,12 @@ pub struct DVNConfig { l0_endpoint_addr: String, /// The SendLib Ultra Light Node 302 address. sendlib_uln302_addr: String, + /// The ReceiveLib Ultra Light Node 302 address. + receivelib_uln302_addr: String, /// The SendLib Ultra Light Node 301 address. sendlib_uln301_addr: String, + /// The ReceiveLib Ultra Light Node 301 address. + receivelib_uln301_addr: String, /// The Ethereum network ID. network_id: u64, /// Own DVN address. Used to check when the DVN is assigned to a task. @@ -45,11 +49,21 @@ impl DVNConfig { Ok(self.sendlib_uln302_addr.parse::
()?) } + /// Get the ReceiveLib ULN302 address. + pub fn receivelib_uln302_addr(&self) -> Result
{ + Ok(self.receivelib_uln302_addr.parse::
()?) + } + /// Get the SendLib ULN301 address. pub fn sendlib_uln301_addr(&self) -> Result
{ Ok(self.sendlib_uln301_addr.parse::
()?) } + /// Get the ReceiveLib ULN301 address. + pub fn receivelib_uln301_addr(&self) -> Result
{ + Ok(self.receivelib_uln301_addr.parse::
()?) + } + /// Get the EID as U256. pub fn eid(&self) -> U256 { U256::from(self.network_id) @@ -69,7 +83,9 @@ impl DVNConfig { http_rpc_url: std::env::var("HTTP_RPC_URL").unwrap_or_else(|_| Default::default()), l0_endpoint_addr: std::env::var("L0_ENDPOINT_ADDR").unwrap_or_else(|_| Default::default()), sendlib_uln302_addr: std::env::var("SENDLIB_ULN302_ADDR").unwrap_or_else(|_| Default::default()), + receivelib_uln302_addr: std::env::var("RECEIVELIB_ULN302_ADDR").unwrap_or_else(|_| Default::default()), sendlib_uln301_addr: std::env::var("SENDLIB_ULN301_ADDR").unwrap_or_else(|_| Default::default()), + receivelib_uln301_addr: std::env::var("RECEIVELIB_ULN301_ADDR").unwrap_or_else(|_| Default::default()), network_id: std::env::var("NETWORK_EID") .unwrap_or_else(|_| "0".to_string()) .parse::()?, diff --git a/workers/src/utils.rs b/workers/src/utils.rs index b6dfcae0..a92ece7c 100644 --- a/workers/src/utils.rs +++ b/workers/src/utils.rs @@ -17,7 +17,9 @@ use eyre::Result; use sha3::{Digest, Keccak256}; use tracing::debug; +/// Alias for a contract instance in the Ethereum network. pub type ContractInst = ContractInstance, RootProvider>, Ethereum>; +/// Alias for an HTTP provider. pub type HttpProvider = RootProvider>; /// Create the subscriptions for the DVN workflow. @@ -57,9 +59,9 @@ pub async fn build_subscriptions( } /// Load the MessageLib ABI. -pub fn get_sendlib_abi() -> Result { +pub fn get_abi_from_path(path: &str) -> Result { // Get the SendLib ABI - let artifact = std::fs::read("./abi/SendLibrary.json")?; + let artifact = std::fs::read(path)?; let json: serde_json::Value = serde_json::from_slice(&artifact)?; // SAFETY: Assume `unwrap` is safe since the key is always present let abi_value = json.get("abi").unwrap(); @@ -85,15 +87,6 @@ pub fn create_contract_instance(config: &DVNConfig, http_provider: HttpProvider, /// Get the number of required confirmations by the ULN. pub async fn get_confirmations(config: &DVNConfig, contract: &ContractInst) -> Result { - // FIXME: there an error returned by the server: - // Error: server returned an error response: error code 3: execution reverted, data: "0xce2c3751" - // which decodes (https://www.4byte.directory/signatures/?bytes4_signature=0xce2c3751) to: - // LZ_ULN_AtLeastOneDVN() - - debug!("Getting confirmations required by the ULN."); - debug!("Contract address: {:?}", config.sendlib_uln302_addr()?); - debug!("Contract address: {:?}", config.eid()); - // Call the `getUlnConfig` function on the contract let uln_config = contract .function( @@ -127,12 +120,12 @@ pub async fn get_confirmations(config: &DVNConfig, contract: &ContractInst) -> R /// Idempotent check to see if there's work to do for the DVN. pub async fn get_verified(config: &DVNConfig, contract: &ContractInst, required_confirmations: U256) -> Result { - // Call the `verified` function on the contract - let uln302 = contract + // Call the `_verified` function on the 302 contract + let receive_uln302 = contract .function( "_verified", &[ - DynSolValue::Address(config.sendlib_uln301_addr()?), + DynSolValue::Address(config.receivelib_uln302_addr()?), // HeaderHash // PayloadHash DynSolValue::Uint(required_confirmations, 32), @@ -141,20 +134,20 @@ pub async fn get_verified(config: &DVNConfig, contract: &ContractInst, required_ .call() .await?; - let uln302_state = if uln302[0].as_bool().unwrap() { - debug!("Packet already verified, DVN workflow can stop."); + let uln302_state = if receive_uln302[0].as_bool().unwrap() { + debug!("Packet already verified (by Uln302), DVN workflow can stop."); true } else { debug!("Packet hasn't been verified. Call `verify`."); false }; - // Call the `_verified` function on the contract + // Call the `_verified` function on the 301 contract let uln301 = contract .function( "_verified", &[ - DynSolValue::Address(config.sendlib_uln301_addr()?), + DynSolValue::Address(config.receivelib_uln301_addr()?), // HeaderHash // PayloadHash DynSolValue::Uint(required_confirmations, 32), @@ -164,7 +157,7 @@ pub async fn get_verified(config: &DVNConfig, contract: &ContractInst, required_ .await?; let uln301_state = if uln301[0].as_bool().unwrap() { - debug!("Packet already verified, DVN workflow can stop."); + debug!("Packet already verified (by Uln301), DVN workflow can stop."); true } else { debug!("Packet hasn't been verified. Call `verify`."); @@ -221,7 +214,7 @@ mod tests { // Set up let config = config::DVNConfig::load_from_env()?; let http_provider = get_http_provider(&config)?; - let sendlib_abi = get_sendlib_abi()?; + let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; let sendlib_contract = create_contract_instance(&config, http_provider, sendlib_abi)?; // Query contract value @@ -232,4 +225,21 @@ mod tests { Ok(()) } + + #[tokio::test] + async fn test_get_verified() -> Result<()> { + // Set up + let config = config::DVNConfig::load_from_env()?; + let http_provider = get_http_provider(&config)?; + let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLib302.json")?; + let receivelib_contract = create_contract_instance(&config, http_provider, receivelib_abi)?; + + // Query contract value + let is_verified = get_verified(&config, &receivelib_contract, U256::from(20)).await?; + + // Check the value is what we expect + assert!(is_verified); + + Ok(()) + } } From 9d720c57b67d1ceae805964cffc04485edd09eef Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 10 Oct 2024 12:38:24 +0200 Subject: [PATCH 03/62] chore: fix overall flow --- workers/Cargo.toml | 4 +- workers/src/abi.rs | 4 +- workers/src/bin/dvn.rs | 83 +++++++---- workers/src/chain/connections.rs | 67 +++++++++ workers/src/chain/contracts.rs | 180 +++++++++++++++++++++++ workers/src/chain/mod.rs | 16 ++ workers/src/data.rs | 62 ++++++++ workers/src/lib.rs | 3 +- workers/src/utils.rs | 245 ------------------------------- 9 files changed, 387 insertions(+), 277 deletions(-) create mode 100644 workers/src/chain/connections.rs create mode 100644 workers/src/chain/contracts.rs create mode 100644 workers/src/chain/mod.rs create mode 100644 workers/src/data.rs delete mode 100644 workers/src/utils.rs diff --git a/workers/Cargo.toml b/workers/Cargo.toml index 913060ad..b4d62b18 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -13,12 +13,10 @@ alloy-json-abi = "0.8.6" dotenv = "0.15.0" eyre = "0.6.12" futures = "0.3.31" +hex = "0.4.3" serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" sha3 = "0.10.8" tokio = { version = "1.40.0", features = ["full"] } tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } - -[dev-dependencies] -hex = "0.4.3" diff --git a/workers/src/abi.rs b/workers/src/abi.rs index 96ca4b75..d352fe8f 100644 --- a/workers/src/abi.rs +++ b/workers/src/abi.rs @@ -1,4 +1,6 @@ -//! Types create from the JSON ABI files. For example, to be able to decode the logs' data, or call contracts' methods. +//! Types create from the JSON ABI files. +//! +//! For example, to be able to decode the logs' data, or call contracts' methods. use alloy::sol; use serde::{Deserialize, Serialize}; diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 1de716bf..73b60103 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -1,12 +1,19 @@ -//! Main workflow for subscribing and listening for specific contract events using a `WebSocket` subscription. +//! Main offchain workflow for Nuff DVN. use eyre::Result; use futures::stream::StreamExt; use tracing::{debug, error, info}; use tracing_subscriber::EnvFilter; use workers::{ - abi::{L0V2EndpointAbi, SendLibraryAbi}, - config, utils, + abi::{ + L0V2EndpointAbi::{self}, + SendLibraryAbi, + }, + chain::{ + connections::{build_subscriptions, get_abi_from_path, get_http_provider}, + contracts::{create_contract_instance, query_confirmations, verify}, + }, + data::Dvn, }; #[tokio::main] @@ -17,31 +24,35 @@ async fn main() -> Result<()> { .with_env_filter(EnvFilter::from_default_env()) .init(); - // Load the DVN workflow configuration. - let config = config::DVNConfig::load_from_env()?; + let mut dvn_worker = Dvn::new_from_env()?; // Create the WS subscriptions for listening to the events. - let (_provider, mut endpoint_stream, mut sendlib_stream) = utils::build_subscriptions(&config).await?; + let (_provider, mut endpoint_stream, mut sendlib_stream) = build_subscriptions(dvn_worker.config()).await?; - // Create an HTTP provider to call the contract. - let http_provider = utils::get_http_provider(&config)?; + // Create an HTTP provider to call contract functions. + let http_provider = get_http_provider(dvn_worker.config())?; // Get the relevant contract ABI. - let sendlib_abi = utils::get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; - let receivelib_abi = utils::get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; + //let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; + let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; // Create a contract instance. - let sendlib_contract = utils::create_contract_instance(&config, http_provider.clone(), sendlib_abi)?; - let receivelib_contract = utils::create_contract_instance(&config, http_provider, receivelib_abi)?; + //let sendlib_contract = create_contract_instance(&config, http_provider.clone(), sendlib_abi)?; + let receivelib_contract = create_contract_instance(dvn_worker.config(), http_provider, receivelib_abi)?; info!("Listening to chain events..."); loop { tokio::select! { Some(log) = endpoint_stream.next() => { + //println!("->> PacketSent log: {:?}", log); match log.log_decode::() { - Ok(_inner_log) => { - info!("PacketSent event found and decoded."); + Ok(inner_log) => { + debug!("PacketSent event found and decoded."); + dvn_worker.packet_received(inner_log.data().clone()); + debug!("PacketSent data stored."); + + println!("->> PacketSent data stored: {:?}", dvn_worker.packet()); }, Err(e) => { error!("Failed to decode PacketSent event: {:?}", e); @@ -49,28 +60,46 @@ async fn main() -> Result<()> { } } Some(log) = sendlib_stream.next() => { + //println!("->> DVNFeePaid log: {:?}", log); match log.log_decode::() { Ok(inner_log) => { info!("DVNFeePaid event found and decoded."); let required_dvns = inner_log.inner.requiredDVNs.clone(); - if required_dvns.contains(&config.dvn_addr()?) { - debug!("Matched DVN found in required DVNs. Performing idempotency check..."); + if required_dvns.contains(&dvn_worker.config().dvn_addr()?) { + debug!("Matched DVN found in required DVNs."); - let required_confirmations = utils::get_confirmations(&config, &sendlib_contract).await?; + // NOTE: the docs' workflow require now to query L0's endpoint to + // get the address of the MessageLib, but we have already created + // the contract above to query it directly. - let already_verified = utils::get_verified(&config, &receivelib_contract, required_confirmations).await?; + let required_confirmations = query_confirmations(&receivelib_contract, dvn_worker.config().eid()).await?; - loop { - if already_verified { - debug!("Packet has been verified. Listening for more packets..."); + // NOTE: the method `_verified` doesn't seem to exist in the contract, + // so cannot perform the idempotency check. + // + //let already_verified = query_already_verified(&receivelib_contract, dvn_worker.config().dvn_addr()?, &[1,2,3], &[1,2,3], required_confirmations).await?; + // + //if already_verified { + // debug!("Packet already verified."); + //} else { + // debug!("Packet NOT verified. Calling verification."); + // let _ = utils::verify(); + // + // // Idempotency check again + // if get_verified(&receivelib_contract, required_confirmations).await? { + // debug!("Packet successfully verified. Listening for more packets..."); + // } else { + // debug!("Packet verification failed!"); + // } + //} - } else { - debug!("Packet has not been verified. Calling verification."); - //utils::verify(); - // TODO: idempotency check again - let already_verified = utils::get_verified(&config, &receivelib_contract, required_confirmations).await?; - } + if let Some(packet) = dvn_worker.packet() { + debug!("Packet data found. Calling verification."); + // FIXME: incorrect data + verify(&receivelib_contract, &packet.options, &packet.encodedPayload, required_confirmations).await?; + } else { + debug!("No packet data found. Skipping verification."); } } }, diff --git a/workers/src/chain/connections.rs b/workers/src/chain/connections.rs new file mode 100644 index 00000000..01669a2c --- /dev/null +++ b/workers/src/chain/connections.rs @@ -0,0 +1,67 @@ +//! Utilities related to connection with a blockchain. + +use crate::{ + chain::HttpProvider, + config::{DVNConfig, DVNEvent}, +}; +use alloy::{ + eips::BlockNumberOrTag, + providers::{Provider, ProviderBuilder, RootProvider, WsConnect}, + pubsub::{PubSubFrontend, SubscriptionStream}, + rpc::types::{Filter, Log}, +}; +use alloy_json_abi::JsonAbi; +use eyre::Result; + +/// Create the subscriptions for the DVN workflow. +pub async fn build_subscriptions( + config: &DVNConfig, +) -> Result<( + RootProvider, + SubscriptionStream, + SubscriptionStream, +)> { + // Create the provider + let rpc_url = config.ws_rpc(); + let ws = WsConnect::new(rpc_url); + let provider = ProviderBuilder::new().on_ws(ws).await?; + + // layerzero endpoint filter + let packet_filter = Filter::new() + .address(config.l0_addr()?) + .event(DVNEvent::PacketSent.as_ref()) + .from_block(BlockNumberOrTag::Latest); + + // messagelib endpoint filter + let fee_paid_filter = Filter::new() + .address(config.sendlib_uln302_addr()?) + .event(DVNEvent::FeePaid.as_ref()) + .from_block(BlockNumberOrTag::Latest); + + // Subscribe to logs + let endpoint_sub = provider.subscribe_logs(&packet_filter).await?; + let sendlib_sub = provider.subscribe_logs(&fee_paid_filter).await?; + + // Create some streams from the subscriptions + let endpoint_stream = endpoint_sub.into_stream(); + let sendlib_stream = sendlib_sub.into_stream(); + + Ok((provider, endpoint_stream, sendlib_stream)) +} + +/// Load the MessageLib ABI. +pub fn get_abi_from_path(path: &str) -> Result { + // Get the SendLib ABI + let artifact = std::fs::read(path)?; + let json: serde_json::Value = serde_json::from_slice(&artifact)?; + // SAFETY: Assume `unwrap` is safe since the key has been harcoded + let abi_value = json.get("abi").unwrap(); + let abi = serde_json::from_str(&abi_value.to_string())?; + Ok(abi) +} + +/// Construct an HTTP provider given the config. +pub fn get_http_provider(config: &DVNConfig) -> Result { + let http_provider = ProviderBuilder::new().on_http(config.http_rpc()?); + Ok(http_provider) +} diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs new file mode 100644 index 00000000..d5271289 --- /dev/null +++ b/workers/src/chain/contracts.rs @@ -0,0 +1,180 @@ +//! Utilities for interacting with onchain contracts. + +use crate::{ + chain::{ContractInst, HttpProvider}, + config::DVNConfig, +}; +use alloy::{ + contract::{ContractInstance, Interface}, + dyn_abi::DynSolValue, + network::Ethereum, + primitives::{Address, Bytes, FixedBytes, U256}, + transports::http::{Client, Http}, +}; +use alloy_json_abi::JsonAbi; +use eyre::{eyre, OptionExt, Result}; +use sha3::{Digest, Keccak256}; + +/// Create a contract instance from the ABI to interact with on-chain instance. +pub fn create_contract_instance(config: &DVNConfig, http_provider: HttpProvider, abi: JsonAbi) -> Result { + let contract: ContractInstance, _, Ethereum> = ContractInstance::new( + config.sendlib_uln302_addr()?, + http_provider.clone(), + Interface::new(abi), + ); + Ok(contract) +} + +/// Get the address of the MessageLib on the destination chain +pub async fn get_messagelib_addr(contract: &ContractInst, eid: U256) -> Result
{ + // Call the `getUlnConfig` function on the contract + let receive_library = contract + .function( + "getReceiveLibrary", + &[DynSolValue::Address(*contract.address()), DynSolValue::Uint(eid, 32)], + )? + .call() + .await?; + + match receive_library[0] { + DynSolValue::Address(address) => Ok(address), + _ => Err(eyre!("Failed to get address")), + } +} + +/// Get the number of required confirmations by the ULN. +pub async fn query_confirmations(contract: &ContractInst, eid: U256) -> Result { + // Call the `getUlnConfig` function on the contract + let uln_config = contract + .function( + "getUlnConfig", + &[DynSolValue::Address(*contract.address()), DynSolValue::Uint(eid, 32)], + )? + .call() + .await?; + + match &uln_config[0] { + DynSolValue::Tuple(tupled_int) => { + let value = tupled_int[0] + .as_uint() + .ok_or_eyre("Cannot parse response from MessageLib")?; + Ok(value.0) + } + _ => Err(eyre::eyre!("Failed to get confirmations")), + } +} + +/// Idempotent check to see if there's work to do for the DVN. +pub async fn query_already_verified( + contract: &ContractInst, + dvn_address: Address, + header_hash: &[u8], + payload_hash: &[u8], + required_confirmations: U256, +) -> Result { + // Call the `_verified` function on the 302 contract, to check if the DVN has already verified + // the packet. + let receive_uln302 = contract + .function( + "_verified", + &[ + DynSolValue::Address(dvn_address), // DVN address + DynSolValue::Bytes(header_hash.to_vec()), // HeaderHash + DynSolValue::Bytes(payload_hash.to_vec()), // PayloadHash + DynSolValue::Uint(required_confirmations, 32), // confirmations + ], + )? + .call() + .await?; + + let uln302_state = match receive_uln302[0] { + DynSolValue::Bool(b) => Ok(b), + _ => Err(eyre!("Failed to parse response from ULN302 for `_verified`")), + }?; + + Ok(uln302_state) +} + +pub async fn verify( + contract: &ContractInst, + packet_header: &Bytes, + payload: &Bytes, + confirmations: U256, +) -> Result { + //// Create the hash of the payload + let payload_hash = keccak256(payload); + // + // Call the `verified` function on the contract + let _ = contract + .function( + "verify", + &[ + DynSolValue::Bytes(packet_header.to_vec()), // PacketHeader + DynSolValue::FixedBytes(FixedBytes(payload_hash), 32), // PayloadHash + DynSolValue::Uint(confirmations, 64), // Confirmations + ], + )? + .call() + .await?; + + Ok(false) +} + +/// Hash some data with `keccak256`. +fn keccak256(data: &[u8]) -> [u8; 32] { + let mut hasher = Keccak256::default(); + hasher.update(data); + let result = hasher.finalize(); + result.into() +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + chain::connections::{get_abi_from_path, get_http_provider}, + config, + }; + + #[tokio::test] + async fn test_get_confirmations() -> Result<()> { + // Set up + let config = config::DVNConfig::load_from_env()?; + let http_provider = get_http_provider(&config)?; + let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; + let sendlib_contract = create_contract_instance(&config, http_provider, sendlib_abi)?; + + // Query contract value + let required_confirmations = query_confirmations(&sendlib_contract, U256::from(30110)).await?; + + // Check the value is what we expect + assert_eq!(required_confirmations, U256::from(20)); + + Ok(()) + } + + //#[tokio::test] + async fn test_get_verified() -> Result<()> { + // NOTE: this method doesn't seem to exist in the contract + // Set up + let config = config::DVNConfig::load_from_env()?; + let http_provider = get_http_provider(&config)?; + let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; + let receivelib_contract = create_contract_instance(&config, http_provider, receivelib_abi)?; + + // Query contract value + let uln302 = query_already_verified( + &receivelib_contract, + "0x7B9E184e07a6EE1aC23eAe0fe8D6Be2f663f05e6".parse::
()?, + &[1, 2, 3], + &[1, 2, 3], + U256::from(20), + ) + .await?; + + // Check the value is what we expect + assert!(uln302); + + Ok(()) + } +} diff --git a/workers/src/chain/mod.rs b/workers/src/chain/mod.rs new file mode 100644 index 00000000..b6f18ad3 --- /dev/null +++ b/workers/src/chain/mod.rs @@ -0,0 +1,16 @@ +//! Utilities for interacting with the blockchain. + +use alloy::{ + contract::ContractInstance, + network::Ethereum, + providers::RootProvider, + transports::http::{Client, Http}, +}; + +pub mod connections; +pub mod contracts; + +/// Alias for a contract instance in the Ethereum network. +pub type ContractInst = ContractInstance, RootProvider>, Ethereum>; +/// Alias for an HTTP provider. +pub type HttpProvider = RootProvider>; diff --git a/workers/src/data.rs b/workers/src/data.rs new file mode 100644 index 00000000..2ac99327 --- /dev/null +++ b/workers/src/data.rs @@ -0,0 +1,62 @@ +use crate::abi::L0V2EndpointAbi::PacketSent; +use crate::config; +use crate::config::DVNConfig; +use eyre::Result; +//use alloy::primitives::{Address, U256}; + +pub struct Dvn { + config: DVNConfig, + status: DvnStatus, + packet: Option, + //receivelib_address: Option
, + //num_confirmations: Option, +} + +pub enum DvnStatus { + Stopped, + Listening, + PacketReceived, + Verifying, +} + +impl Dvn { + pub fn new(config: DVNConfig) -> Self { + Self { + config, + status: DvnStatus::Stopped, + packet: None, + //receivelib_address: None, + //num_confirmations: None, + } + } + + pub fn new_from_env() -> Result { + Ok(Dvn::new(config::DVNConfig::load_from_env()?)) + } + + pub fn packet(&self) -> Option<&PacketSent> { + self.packet.as_ref() + } + + pub fn config(&self) -> &DVNConfig { + &self.config + } + + pub fn listen(&mut self) { + self.status = DvnStatus::Listening; + } + + pub fn stop(&mut self) { + self.status = DvnStatus::Stopped; + } + + pub fn packet_received(&mut self, packet_log: PacketSent) { + self.packet = Some(packet_log); + self.status = DvnStatus::PacketReceived; + } + + pub fn verify(&mut self) { + self.status = DvnStatus::Verifying; + } +} + diff --git a/workers/src/lib.rs b/workers/src/lib.rs index 6805bab0..5bfaf915 100644 --- a/workers/src/lib.rs +++ b/workers/src/lib.rs @@ -1,5 +1,6 @@ //! Tools to build offchain workers for the LayerZero protocol. pub mod abi; +pub mod chain; pub mod config; -pub mod utils; +pub mod data; diff --git a/workers/src/utils.rs b/workers/src/utils.rs deleted file mode 100644 index a92ece7c..00000000 --- a/workers/src/utils.rs +++ /dev/null @@ -1,245 +0,0 @@ -//! Utilities for interacting with the DVN. - -use crate::config::{DVNConfig, DVNEvent}; -use alloy::{ - contract::{ContractInstance, Interface}, - dyn_abi::DynSolValue, - eips::BlockNumberOrTag, - network::Ethereum, - primitives::U256, - providers::{Provider, ProviderBuilder, RootProvider, WsConnect}, - pubsub::{PubSubFrontend, SubscriptionStream}, - rpc::types::{Filter, Log}, - transports::http::{Client, Http}, -}; -use alloy_json_abi::JsonAbi; -use eyre::Result; -use sha3::{Digest, Keccak256}; -use tracing::debug; - -/// Alias for a contract instance in the Ethereum network. -pub type ContractInst = ContractInstance, RootProvider>, Ethereum>; -/// Alias for an HTTP provider. -pub type HttpProvider = RootProvider>; - -/// Create the subscriptions for the DVN workflow. -pub async fn build_subscriptions( - config: &DVNConfig, -) -> Result<( - RootProvider, - SubscriptionStream, - SubscriptionStream, -)> { - // Create the provider - let rpc_url = config.ws_rpc(); - let ws = WsConnect::new(rpc_url); - let provider = ProviderBuilder::new().on_ws(ws).await?; - - // layerzero endpoint filter - let packet_filter = Filter::new() - .address(config.l0_addr()?) - .event(DVNEvent::PacketSent.as_ref()) - .from_block(BlockNumberOrTag::Latest); - - // messagelib endpoint filter - let fee_paid_filter = Filter::new() - .address(config.sendlib_uln302_addr()?) - .event(DVNEvent::FeePaid.as_ref()) - .from_block(BlockNumberOrTag::Latest); - - // Subscribe to logs - let endpoint_sub = provider.subscribe_logs(&packet_filter).await?; - let sendlib_sub = provider.subscribe_logs(&fee_paid_filter).await?; - - // Create some streams from the subscriptions - let endpoint_stream = endpoint_sub.into_stream(); - let sendlib_stream = sendlib_sub.into_stream(); - - Ok((provider, endpoint_stream, sendlib_stream)) -} - -/// Load the MessageLib ABI. -pub fn get_abi_from_path(path: &str) -> Result { - // Get the SendLib ABI - let artifact = std::fs::read(path)?; - let json: serde_json::Value = serde_json::from_slice(&artifact)?; - // SAFETY: Assume `unwrap` is safe since the key is always present - let abi_value = json.get("abi").unwrap(); - let abi = serde_json::from_str(&abi_value.to_string())?; - Ok(abi) -} - -/// Construct an HTTP provider given the config. -pub fn get_http_provider(config: &DVNConfig) -> Result { - let http_provider = ProviderBuilder::new().on_http(config.http_rpc()?); - Ok(http_provider) -} - -/// Create a contract instance from the ABI to interact with on-chain instance. -pub fn create_contract_instance(config: &DVNConfig, http_provider: HttpProvider, abi: JsonAbi) -> Result { - let contract: ContractInstance, _, Ethereum> = ContractInstance::new( - config.sendlib_uln302_addr()?, - http_provider.clone(), - Interface::new(abi), - ); - Ok(contract) -} - -/// Get the number of required confirmations by the ULN. -pub async fn get_confirmations(config: &DVNConfig, contract: &ContractInst) -> Result { - // Call the `getUlnConfig` function on the contract - let uln_config = contract - .function( - "getUlnConfig", - &[ - DynSolValue::Address(config.sendlib_uln302_addr()?), - DynSolValue::Uint(config.eid(), 32), - ], - )? - .call() - .await?; - - let num_confirmations = if let DynSolValue::Tuple(tupled_uint) = uln_config[0].clone() { - if let Some(value) = tupled_uint[0].as_uint() { - value.0 - } else { - U256::from(0) - } - } else { - U256::from(0) - }; - - debug!( - "{:?} confirmations required by MessageLib at: {:?}", - num_confirmations, - contract.address() - ); - - Ok(num_confirmations) -} - -/// Idempotent check to see if there's work to do for the DVN. -pub async fn get_verified(config: &DVNConfig, contract: &ContractInst, required_confirmations: U256) -> Result { - // Call the `_verified` function on the 302 contract - let receive_uln302 = contract - .function( - "_verified", - &[ - DynSolValue::Address(config.receivelib_uln302_addr()?), - // HeaderHash - // PayloadHash - DynSolValue::Uint(required_confirmations, 32), - ], - )? - .call() - .await?; - - let uln302_state = if receive_uln302[0].as_bool().unwrap() { - debug!("Packet already verified (by Uln302), DVN workflow can stop."); - true - } else { - debug!("Packet hasn't been verified. Call `verify`."); - false - }; - - // Call the `_verified` function on the 301 contract - let uln301 = contract - .function( - "_verified", - &[ - DynSolValue::Address(config.receivelib_uln301_addr()?), - // HeaderHash - // PayloadHash - DynSolValue::Uint(required_confirmations, 32), - ], - )? - .call() - .await?; - - let uln301_state = if uln301[0].as_bool().unwrap() { - debug!("Packet already verified (by Uln301), DVN workflow can stop."); - true - } else { - debug!("Packet hasn't been verified. Call `verify`."); - false - }; - - Ok(uln302_state && uln301_state) -} - -pub async fn verify( - config: &DVNConfig, - contract: &ContractInst, - packet_header: &[u8], - payload: &[u8], - confirmations: U256, -) -> Result { - // Create the hash of the payload - let payload_hash = keccak256(payload); - - // Call the `verified` function on the contract - let _ = contract - .function( - "verify", - &[ - // PacketHeader - //packet_header, - // PayloadHash - //payload_hash, - // Confirmations - //DynSolValue::Uint(confirmations, 32), - ], - )? - .call() - .await?; - - Ok(false) -} - -/// Helper for hashing some data with `keccak256`. -fn keccak256(data: &[u8]) -> [u8; 32] { - let mut hasher = Keccak256::default(); - hasher.update(data); - let result = hasher.finalize(); - result.into() -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::config; - - #[tokio::test] - async fn test_get_confirmations() -> Result<()> { - // Set up - let config = config::DVNConfig::load_from_env()?; - let http_provider = get_http_provider(&config)?; - let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; - let sendlib_contract = create_contract_instance(&config, http_provider, sendlib_abi)?; - - // Query contract value - let required_confirmations = get_confirmations(&config, &sendlib_contract).await?; - - // Check the value is what we expect - assert_eq!(required_confirmations, U256::from(20)); - - Ok(()) - } - - #[tokio::test] - async fn test_get_verified() -> Result<()> { - // Set up - let config = config::DVNConfig::load_from_env()?; - let http_provider = get_http_provider(&config)?; - let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLib302.json")?; - let receivelib_contract = create_contract_instance(&config, http_provider, receivelib_abi)?; - - // Query contract value - let is_verified = get_verified(&config, &receivelib_contract, U256::from(20)).await?; - - // Check the value is what we expect - assert!(is_verified); - - Ok(()) - } -} From 9e1c1eeaf6a2933b89fed633d990f6f3a82b2df9 Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 10 Oct 2024 15:21:00 +0200 Subject: [PATCH 04/62] chore: preparing for deployment, lacking correct header --- workers/src/bin/dvn.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 73b60103..a4ed7726 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -55,7 +55,7 @@ async fn main() -> Result<()> { println!("->> PacketSent data stored: {:?}", dvn_worker.packet()); }, Err(e) => { - error!("Failed to decode PacketSent event: {:?}", e); + error!("Failed to decode `PacketSent` event: {:?}", e); } } } @@ -75,7 +75,7 @@ async fn main() -> Result<()> { let required_confirmations = query_confirmations(&receivelib_contract, dvn_worker.config().eid()).await?; - // NOTE: the method `_verified` doesn't seem to exist in the contract, + // NOTE: the method `_verified` doesn't seem to exist in the contracts, // so cannot perform the idempotency check. // //let already_verified = query_already_verified(&receivelib_contract, dvn_worker.config().dvn_addr()?, &[1,2,3], &[1,2,3], required_confirmations).await?; @@ -94,8 +94,9 @@ async fn main() -> Result<()> { // } //} + // If the packet was stored when emited in the PacketSent event. if let Some(packet) = dvn_worker.packet() { - debug!("Packet data found. Calling verification."); + debug!("Calling verification."); // FIXME: incorrect data verify(&receivelib_contract, &packet.options, &packet.encodedPayload, required_confirmations).await?; } else { @@ -104,7 +105,7 @@ async fn main() -> Result<()> { } }, Err(e) => { - error!("Failed to decode DVNFeePaid event: {:?}", e); + error!("Failed to decode `DVNFeePaid` event: {:?}", e); } } }, From 1b02a1ef4f872fa671aabdbbe2f00364a414d7cc Mon Sep 17 00:00:00 2001 From: Lozano Date: Fri, 11 Oct 2024 17:28:48 +0200 Subject: [PATCH 05/62] chore: ordering --- workers/src/bin/dvn.rs | 71 ++++++++++++++++------------------ workers/src/chain/contracts.rs | 24 +++++++++--- workers/src/data.rs | 14 ++++--- 3 files changed, 61 insertions(+), 48 deletions(-) diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index a4ed7726..0b3913f9 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -11,7 +11,7 @@ use workers::{ }, chain::{ connections::{build_subscriptions, get_abi_from_path, get_http_provider}, - contracts::{create_contract_instance, query_confirmations, verify}, + contracts::{create_contract_instance, query_already_verified, query_confirmations, verify}, }, data::Dvn, }; @@ -32,27 +32,22 @@ async fn main() -> Result<()> { // Create an HTTP provider to call contract functions. let http_provider = get_http_provider(dvn_worker.config())?; - // Get the relevant contract ABI. + // Get the relevant contract ABI, and create contract. //let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; - let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; - - // Create a contract instance. //let sendlib_contract = create_contract_instance(&config, http_provider.clone(), sendlib_abi)?; + let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; let receivelib_contract = create_contract_instance(dvn_worker.config(), http_provider, receivelib_abi)?; info!("Listening to chain events..."); loop { + dvn_worker.listening(); tokio::select! { Some(log) = endpoint_stream.next() => { - //println!("->> PacketSent log: {:?}", log); match log.log_decode::() { Ok(inner_log) => { debug!("PacketSent event found and decoded."); dvn_worker.packet_received(inner_log.data().clone()); - debug!("PacketSent data stored."); - - println!("->> PacketSent data stored: {:?}", dvn_worker.packet()); }, Err(e) => { error!("Failed to decode `PacketSent` event: {:?}", e); @@ -60,55 +55,57 @@ async fn main() -> Result<()> { } } Some(log) = sendlib_stream.next() => { - //println!("->> DVNFeePaid log: {:?}", log); match log.log_decode::() { Ok(inner_log) => { info!("DVNFeePaid event found and decoded."); let required_dvns = inner_log.inner.requiredDVNs.clone(); if required_dvns.contains(&dvn_worker.config().dvn_addr()?) { - debug!("Matched DVN found in required DVNs."); + info!("Found DVN in required DVNs."); // NOTE: the docs' workflow require now to query L0's endpoint to // get the address of the MessageLib, but we have already created // the contract above to query it directly. - let required_confirmations = query_confirmations(&receivelib_contract, dvn_worker.config().eid()).await?; + let required_confirmations = + query_confirmations(&receivelib_contract, dvn_worker.config().eid()).await?; - // NOTE: the method `_verified` doesn't seem to exist in the contracts, - // so cannot perform the idempotency check. - // - //let already_verified = query_already_verified(&receivelib_contract, dvn_worker.config().dvn_addr()?, &[1,2,3], &[1,2,3], required_confirmations).await?; - // - //if already_verified { - // debug!("Packet already verified."); - //} else { - // debug!("Packet NOT verified. Calling verification."); - // let _ = utils::verify(); - // - // // Idempotency check again - // if get_verified(&receivelib_contract, required_confirmations).await? { - // debug!("Packet successfully verified. Listening for more packets..."); - // } else { - // debug!("Packet verification failed!"); - // } - //} + let already_verified = query_already_verified( + &receivelib_contract, + dvn_worker.config().dvn_addr()?, + &[1, 2, 3], + &[1, 2, 3], + required_confirmations, + ) + .await?; - // If the packet was stored when emited in the PacketSent event. - if let Some(packet) = dvn_worker.packet() { - debug!("Calling verification."); - // FIXME: incorrect data - verify(&receivelib_contract, &packet.options, &packet.encodedPayload, required_confirmations).await?; + if already_verified { + debug!("Packet already verified."); } else { - debug!("No packet data found. Skipping verification."); + // If the packet was stored when emited in the PacketSent event. + if let Some(packet) = dvn_worker.packet() { + dvn_worker.verifying(); + debug!("Packet NOT verified. Calling verification."); + // FIXME: incorrect data + verify( + &receivelib_contract, + &packet.options, + &packet.encodedPayload, + required_confirmations, + ) + .await?; + } else { + debug!("No packet data found. Skipping verification."); + } } } - }, + } Err(e) => { error!("Failed to decode `DVNFeePaid` event: {:?}", e); } } }, } + dvn_worker.reset_packet(); } } diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index d5271289..979c7973 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -14,6 +14,7 @@ use alloy::{ use alloy_json_abi::JsonAbi; use eyre::{eyre, OptionExt, Result}; use sha3::{Digest, Keccak256}; +use tracing::{debug, error}; /// Create a contract instance from the ABI to interact with on-chain instance. pub fn create_contract_instance(config: &DVNConfig, http_provider: HttpProvider, abi: JsonAbi) -> Result { @@ -38,7 +39,10 @@ pub async fn get_messagelib_addr(contract: &ContractInst, eid: U256) -> Result Ok(address), - _ => Err(eyre!("Failed to get address")), + _ => { + error!("Failed to get address"); + Err(eyre!("Failed to get address")) + } } } @@ -60,7 +64,10 @@ pub async fn query_confirmations(contract: &ContractInst, eid: U256) -> Result Err(eyre::eyre!("Failed to get confirmations")), + _ => { + error!("Failed to get confirmations"); + Err(eyre!("Failed to get confirmations")) + } } } @@ -74,7 +81,9 @@ pub async fn query_already_verified( ) -> Result { // Call the `_verified` function on the 302 contract, to check if the DVN has already verified // the packet. - let receive_uln302 = contract + debug!("Calling _verified on contract's ReceiveLib"); + + let contract_state = contract .function( "_verified", &[ @@ -87,12 +96,15 @@ pub async fn query_already_verified( .call() .await?; - let uln302_state = match receive_uln302[0] { + let packet_state = match contract_state[0] { DynSolValue::Bool(b) => Ok(b), - _ => Err(eyre!("Failed to parse response from ULN302 for `_verified`")), + _ => { + error!("Failed to parse response from ReceiveLib for `_verified`"); + Err(eyre!("Failed to parse response from ReceiveLib for `_verified`")) + } }?; - Ok(uln302_state) + Ok(packet_state) } pub async fn verify( diff --git a/workers/src/data.rs b/workers/src/data.rs index 2ac99327..a53a0c6c 100644 --- a/workers/src/data.rs +++ b/workers/src/data.rs @@ -34,15 +34,15 @@ impl Dvn { Ok(Dvn::new(config::DVNConfig::load_from_env()?)) } - pub fn packet(&self) -> Option<&PacketSent> { - self.packet.as_ref() + pub fn packet(&self) -> Option { + self.packet.clone() } pub fn config(&self) -> &DVNConfig { &self.config } - pub fn listen(&mut self) { + pub fn listening(&mut self) { self.status = DvnStatus::Listening; } @@ -55,8 +55,12 @@ impl Dvn { self.status = DvnStatus::PacketReceived; } - pub fn verify(&mut self) { + pub fn reset_packet(&mut self) { + self.packet = None; + self.status = DvnStatus::Stopped; + } + + pub fn verifying(&mut self) { self.status = DvnStatus::Verifying; } } - From d4b3c538b038ca3f0ec32b727d459506b11a60b0 Mon Sep 17 00:00:00 2001 From: Lozano Date: Tue, 15 Oct 2024 12:55:55 +0200 Subject: [PATCH 06/62] refactor: more modular for later executor --- workers/src/chain/contracts.rs | 27 +-------------------------- workers/src/{data.rs => data/dvn.rs} | 0 workers/src/data/mod.rs | 2 ++ 3 files changed, 3 insertions(+), 26 deletions(-) rename workers/src/{data.rs => data/dvn.rs} (100%) create mode 100644 workers/src/data/mod.rs diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index 979c7973..ce4a89d4 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -8,7 +8,7 @@ use alloy::{ contract::{ContractInstance, Interface}, dyn_abi::DynSolValue, network::Ethereum, - primitives::{Address, Bytes, FixedBytes, U256}, + primitives::{Address, FixedBytes, U256}, transports::http::{Client, Http}, }; use alloy_json_abi::JsonAbi; @@ -164,29 +164,4 @@ mod tests { Ok(()) } - - //#[tokio::test] - async fn test_get_verified() -> Result<()> { - // NOTE: this method doesn't seem to exist in the contract - // Set up - let config = config::DVNConfig::load_from_env()?; - let http_provider = get_http_provider(&config)?; - let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; - let receivelib_contract = create_contract_instance(&config, http_provider, receivelib_abi)?; - - // Query contract value - let uln302 = query_already_verified( - &receivelib_contract, - "0x7B9E184e07a6EE1aC23eAe0fe8D6Be2f663f05e6".parse::
()?, - &[1, 2, 3], - &[1, 2, 3], - U256::from(20), - ) - .await?; - - // Check the value is what we expect - assert!(uln302); - - Ok(()) - } } diff --git a/workers/src/data.rs b/workers/src/data/dvn.rs similarity index 100% rename from workers/src/data.rs rename to workers/src/data/dvn.rs diff --git a/workers/src/data/mod.rs b/workers/src/data/mod.rs new file mode 100644 index 00000000..4cec19d2 --- /dev/null +++ b/workers/src/data/mod.rs @@ -0,0 +1,2 @@ +pub mod dvn; + From a9508f87ae9037cd736906fe4cba74bb41921c67 Mon Sep 17 00:00:00 2001 From: Lozano Date: Tue, 15 Oct 2024 13:57:42 +0200 Subject: [PATCH 07/62] chore: clean up --- Cargo.lock | 1 - contracts/evm/src/dvn/NuffDVN.sol | 338 ++++++++++++++++++++++++++++++ workers/Cargo.toml | 1 - workers/src/chain/contracts.rs | 17 +- 4 files changed, 342 insertions(+), 15 deletions(-) create mode 100644 contracts/evm/src/dvn/NuffDVN.sol diff --git a/Cargo.lock b/Cargo.lock index 1fd6901b..8b12968a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9456,7 +9456,6 @@ dependencies = [ "hex", "serde", "serde_json", - "sha3", "tokio", "tracing", "tracing-subscriber", diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol new file mode 100644 index 00000000..9a2eb907 --- /dev/null +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -0,0 +1,338 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; + +import { ILayerZeroEndpointV2 } from "./interfaces/ILayerZeroEndpointV2.sol"; +import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; +import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol"; +import { IReceiveUlnE2, Verification, UlnConfig } from "./interfaces/IReceiveUlnE2.sol"; +import { ISendLib } from "./interfaces/ISendLib.sol"; +import { IDVNFeeLib } from "./interfaces/IDVNFeeLib.sol"; +import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; +import { IDVN } from "./interfaces/IDVN.sol"; +import "./interfaces/INuffClient.sol"; +import "./utils/PacketV1Codec.sol"; + +contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { + using PacketV1Codec for bytes; + using ECDSA for bytes32; + using MessageHashUtils for bytes32; + + struct Job { + address origin; + uint32 srcEid; + uint32 dstEid; + bytes packetHeader; + bytes32 payloadHash; + uint64 confirmations; + address sender; + address receiver; + bytes options; + } + + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + bytes32 public constant MESSAGE_LIB_ROLE = keccak256("MESSAGE_LIB_ROLE"); + + ILayerZeroEndpointV2 public layerZeroEndpointV2; + ILayerZeroEndpoint public layerZeroEndpointV1; + uint32 public immutable localEid; + + uint256 public lastJobId; + + uint256 public nuffAppId; + INuffClient.PublicKey public nuffPublicKey; + INuffClient public nuff; + INuffDVNConfig public dvnConfig; + + uint16 public defaultMultiplierBps; + uint64 public quorum; + address public priceFeed; + address public feeLib; + + mapping(uint256 => Job) public jobs; + + // eid => bool + mapping(uint32 => bool) public supportedDstChain; + mapping(uint32 dstEid => DstConfig) public dstConfig; + // srcEid => ( jobId => isVerified ) + mapping(uint32 => mapping(uint256 => bool)) public verifiedJobs; + + event JobAssigned(uint256 jobId); + event Verified(uint32 srcEid, uint256 jobId); + + constructor( + uint256 _nuffAppId, + INuffClient.PublicKey memory _nuffPublicKey, + address _nuff, + address _layerZeroEndpointV2, + address _layerZeroEndpointV1, + address _dvnConfig, + uint16 _defaultMultiplierBps, + uint64 _quorum, + address _priceFeed, + address _feeLib + ) { + nuffAppId = _nuffAppId; + nuffPublicKey = _nuffPublicKey; + nuff = INuffClient(_nuff); + layerZeroEndpointV2 = ILayerZeroEndpointV2(_layerZeroEndpointV2); + layerZeroEndpointV1 = ILayerZeroEndpoint(_layerZeroEndpointV1); + dvnConfig = INuffDVNConfig(_dvnConfig); + localEid = layerZeroEndpointV2.eid(); + defaultMultiplierBps = _defaultMultiplierBps; + quorum = _quorum; + priceFeed = _priceFeed; + feeLib = _feeLib; + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(ADMIN_ROLE, msg.sender); + } + + function assignJob( + AssignJobParam calldata _param, + bytes calldata _options + ) + external + payable + override + onlyRole(MESSAGE_LIB_ROLE) + returns (uint256 fee) + { + require(supportedDstChain[_param.dstEid], "Unsupported chain"); + + uint256 jobId = ++lastJobId; + Job storage newJob = jobs[jobId]; + + newJob.origin = msg.sender; + newJob.srcEid = localEid; + newJob.dstEid = _param.dstEid; + newJob.packetHeader = _param.packetHeader; + newJob.payloadHash = _param.payloadHash; + newJob.confirmations = _param.confirmations; + newJob.sender = _param.sender; + newJob.receiver = address( + uint160(uint256(_param.packetHeader.receiver())) + ); + newJob.options = _options; + + IDVNFeeLib.FeeParams memory feeParams = IDVNFeeLib.FeeParams( + priceFeed, + _param.dstEid, + _param.confirmations, + _param.sender, + quorum, + defaultMultiplierBps + ); + + fee = IDVNFeeLib(feeLib).getFeeOnSend( + feeParams, + dstConfig[_param.dstEid], + _options + ); + + emit JobAssigned(jobId); + } + + function verify( + uint32 _srcEid, + uint32 _dstEid, + uint256 _jobId, + bytes memory _packetHeader, + bytes32 _payloadHash, + uint64 _confirmations, + address _receiver, + bytes calldata _reqId, + INuffClient.SchnorrSign calldata _signature, + bytes calldata gatewaySignature + ) external { + require(_isLocal(_dstEid), "Invalid dstEid"); + require( + !verifiedJobs[_srcEid][_jobId], + "src jobId is already verified" + ); + + verifiedJobs[_srcEid][_jobId] = true; + + bytes32 hash = keccak256( + abi.encodePacked( + nuffAppId, + _reqId, + _srcEid, + _dstEid, + _jobId, + _packetHeader, + _payloadHash, + _confirmations, + _receiver + ) + ); + + _verifyNuffSig( + _reqId, + hash, + _signature, + dvnConfig.shieldNodes(_receiver), + gatewaySignature + ); + + _lzVerify( + _srcEid, + _packetHeader, + _payloadHash, + _confirmations, + _receiver + ); + + emit Verified(_srcEid, _jobId); + } + + function setNuffAppId(uint256 _nuffAppId) external onlyRole(ADMIN_ROLE) { + nuffAppId = _nuffAppId; + } + + function setNuffContract(address addr) external onlyRole(ADMIN_ROLE) { + nuff = INuffClient(addr); + } + + function setNuffPubKey( + INuffClient.PublicKey memory _nuffPublicKey + ) external onlyRole(ADMIN_ROLE) { + nuffPublicKey = _nuffPublicKey; + } + + function setLzEndpointV2( + address _layerZeroEndpointV2 + ) external onlyRole(ADMIN_ROLE) { + layerZeroEndpointV2 = ILayerZeroEndpointV2(_layerZeroEndpointV2); + } + + function updateSupportedDstChain( + uint32 eid, + bool status + ) external onlyRole(ADMIN_ROLE) { + supportedDstChain[eid] = status; + } + + function setPriceFeed(address _priceFeed) external onlyRole(ADMIN_ROLE) { + priceFeed = _priceFeed; + } + + function setDefaultMultiplierBps( + uint16 _multiplierBps + ) external onlyRole(ADMIN_ROLE) { + defaultMultiplierBps = _multiplierBps; + } + + function setDstConfig( + DstConfigParam[] calldata _params + ) external onlyRole(ADMIN_ROLE) { + for (uint256 i = 0; i < _params.length; ++i) { + DstConfigParam calldata param = _params[i]; + dstConfig[param.dstEid] = DstConfig( + param.gas, + param.multiplierBps, + param.floorMarginUSD + ); + } + emit SetDstConfig(_params); + } + + function setFeeLib(address _feeLib) external onlyRole(ADMIN_ROLE) { + feeLib = _feeLib; + } + + function withdrawFee( + address _lib, + address _to, + uint256 _amount + ) external onlyRole(ADMIN_ROLE) { + require(hasRole(MESSAGE_LIB_ROLE, _lib), "Invalid lib"); + ISendLib(_lib).withdrawFee(_to, _amount); + emit Withdraw(_lib, _to, _amount); + } + + function getFee( + uint32 _dstEid, + uint64 _confirmations, + address _sender, + bytes calldata _options + ) external view override returns (uint256 _fee) { + IDVNFeeLib.FeeParams memory params = IDVNFeeLib.FeeParams( + priceFeed, + _dstEid, + _confirmations, + _sender, + quorum, + defaultMultiplierBps + ); + return IDVNFeeLib(feeLib).getFee(params, dstConfig[_dstEid], _options); + } + + function _verifyNuffSig( + bytes calldata reqId, + bytes32 hash, + INuffClient.SchnorrSign calldata sign, + address nuffValidGateway, + bytes calldata gatewaySignature + ) internal { + bool verified = nuff.nuffVerify( + reqId, + uint256(hash), + sign, + nuffPublicKey + ); + require(verified, "Invalid signature!"); + + if (nuffValidGateway != address(0)) { + hash = hash.toEthSignedMessageHash(); + address gatewaySignatureSigner = hash.recover(gatewaySignature); + + require( + gatewaySignatureSigner == nuffValidGateway, + "Gateway is not valid" + ); + } + } + + function _lzVerify( + uint32 _srcEid, + bytes memory _packetHeader, + bytes32 _payloadHash, + uint64 _confirmations, + address _receiver + ) internal { + address receiverLib; + if (_isV2(_srcEid)) { + (receiverLib, ) = layerZeroEndpointV2.getReceiveLibrary( + _receiver, + _srcEid + ); + } else { + receiverLib = layerZeroEndpointV1.getReceiveLibraryAddress( + _receiver + ); + } + + IReceiveUlnE2(receiverLib).verify( + _packetHeader, + _payloadHash, + _confirmations + ); + } + + function _isLocal(uint32 _dstEid) internal view returns (bool) { + if (localEid == _dstEid || localEid == _dstEid + 30000) { + return true; + } + return false; + } + + function _isV2(uint32 _eid) internal pure returns (bool) { + if (_eid > 30000) { + return true; + } + return false; + } +} diff --git a/workers/Cargo.toml b/workers/Cargo.toml index b4d62b18..711c2d12 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -16,7 +16,6 @@ futures = "0.3.31" hex = "0.4.3" serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" -sha3 = "0.10.8" tokio = { version = "1.40.0", features = ["full"] } tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index ce4a89d4..2878fdb5 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -8,12 +8,11 @@ use alloy::{ contract::{ContractInstance, Interface}, dyn_abi::DynSolValue, network::Ethereum, - primitives::{Address, FixedBytes, U256}, + primitives::{keccak256, Address, U256}, transports::http::{Client, Http}, }; use alloy_json_abi::JsonAbi; use eyre::{eyre, OptionExt, Result}; -use sha3::{Digest, Keccak256}; use tracing::{debug, error}; /// Create a contract instance from the ABI to interact with on-chain instance. @@ -121,9 +120,9 @@ pub async fn verify( .function( "verify", &[ - DynSolValue::Bytes(packet_header.to_vec()), // PacketHeader - DynSolValue::FixedBytes(FixedBytes(payload_hash), 32), // PayloadHash - DynSolValue::Uint(confirmations, 64), // Confirmations + DynSolValue::Bytes(packet_header.to_vec()), // PacketHeader + DynSolValue::FixedBytes(payload_hash, 32), // PayloadHash + DynSolValue::Uint(confirmations, 64), // Confirmations ], )? .call() @@ -132,14 +131,6 @@ pub async fn verify( Ok(false) } -/// Hash some data with `keccak256`. -fn keccak256(data: &[u8]) -> [u8; 32] { - let mut hasher = Keccak256::default(); - hasher.update(data); - let result = hasher.finalize(); - result.into() -} - #[cfg(test)] mod tests { use super::*; From af548f84b2c423fd61ed4591f6b8a5c87784b321 Mon Sep 17 00:00:00 2001 From: Lozano Date: Tue, 15 Oct 2024 16:48:13 +0200 Subject: [PATCH 08/62] refactor: dotenv -> dotenvy --- Cargo.lock | 164 +++++++++++++++++++++++++++++++++++++++++- workers/Cargo.toml | 3 +- workers/src/config.rs | 2 +- 3 files changed, 164 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b12968a..d2bb5800 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1770,11 +1770,38 @@ dependencies = [ "zeropool-bn", ] +[[package]] +name = "blsful" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a676ce0f93ae20ca6defc223b5ac459a6f071bd88c03100a14cb93604a5e994c" +dependencies = [ + "anyhow", + "arrayref", + "blstrs_plus", + "hex", + "hkdf", + "merlin", + "pairing", + "rand", + "rand_chacha", + "rand_core", + "serde", + "serde_bare", + "sha2", + "sha3", + "subtle", + "thiserror", + "uint-zigzag", + "vsss-rs", + "zeroize", +] + [[package]] name = "blst" -version = "0.3.13" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" dependencies = [ "cc", "glob", @@ -1782,6 +1809,24 @@ dependencies = [ "zeroize", ] +[[package]] +name = "blstrs_plus" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a16dd4b0d6b4538e1fa0388843acb186363082713a8fc8416d802a04d013818" +dependencies = [ + "arrayref", + "blst", + "elliptic-curve", + "ff", + "group", + "pairing", + "rand_core", + "serde", + "subtle", + "zeroize", +] + [[package]] name = "borsh" version = "0.9.3" @@ -2230,6 +2275,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpp_demangle" version = "0.3.5" @@ -2813,6 +2867,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dunce" version = "1.0.5" @@ -2932,6 +2992,7 @@ dependencies = [ "ff", "generic-array 0.14.7", "group", + "hkdf", "pkcs8", "rand_core", "sec1", @@ -3116,6 +3177,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -3397,6 +3459,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "generic-array" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" +dependencies = [ + "typenum", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -3438,7 +3509,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", + "rand", "rand_core", + "rand_xorshift", "subtle", ] @@ -3548,6 +3621,15 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + [[package]] name = "hmac" version = "0.12.1" @@ -4370,6 +4452,18 @@ dependencies = [ "autocfg", ] +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core", + "zeroize", +] + [[package]] name = "mime" version = "0.3.17" @@ -5879,6 +5973,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + [[package]] name = "paperclip" version = "0.8.2" @@ -7443,6 +7546,15 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "serde_bare" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51c55386eed0f1ae957b091dc2ca8122f287b60c79c774cbe3d5f2b69fded660" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.15" @@ -8005,6 +8117,26 @@ dependencies = [ "syn 2.0.82", ] +[[package]] +name = "thiserror-impl-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" +dependencies = [ + "thiserror-impl-no-std", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -8467,6 +8599,15 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "uint-zigzag" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abbf77aed65cb885a8ba07138c365879be3d9a93dce82bf6cc50feca9138ec15" +dependencies = [ + "core2", +] + [[package]] name = "unarray" version = "0.1.4" @@ -8589,6 +8730,22 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "vsss-rs" +version = "4.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fabeca519a296f0b39428cfe496b600c0179c9498687986449d61fa40e60806" +dependencies = [ + "crypto-bigint", + "elliptic-curve", + "generic-array 1.1.0", + "rand_core", + "serde", + "sha3", + "subtle", + "thiserror-no-std", +] + [[package]] name = "wait-timeout" version = "0.2.0" @@ -9450,7 +9607,8 @@ version = "0.1.0" dependencies = [ "alloy", "alloy-json-abi", - "dotenv", + "blsful", + "dotenvy", "eyre", "futures", "hex", diff --git a/workers/Cargo.toml b/workers/Cargo.toml index 711c2d12..d0531a37 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -10,7 +10,8 @@ path = "src/bin/dvn.rs" [dependencies] alloy = { version = "0.4.2", features = ["full"] } alloy-json-abi = "0.8.6" -dotenv = "0.15.0" +blsful = "2.5.7" +dotenvy = "0.15.7" eyre = "0.6.12" futures = "0.3.31" hex = "0.4.3" diff --git a/workers/src/config.rs b/workers/src/config.rs index 8737e37a..a73b6f37 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -76,7 +76,7 @@ impl DVNConfig { /// Load environment variables. pub fn load_from_env() -> Result { - dotenv::dotenv()?; + dotenvy::dotenv()?; Ok(Self { ws_rpc_url: std::env::var("WS_RPC_URL").unwrap_or_else(|_| Default::default()), From f8250368febf7756f805ec92113cde4488ba176b Mon Sep 17 00:00:00 2001 From: Lozano Date: Tue, 15 Oct 2024 16:50:25 +0200 Subject: [PATCH 09/62] chore: remove Cargo.lock --- workers/Cargo.lock | 3581 -------------------------------------------- 1 file changed, 3581 deletions(-) delete mode 100644 workers/Cargo.lock diff --git a/workers/Cargo.lock b/workers/Cargo.lock deleted file mode 100644 index 9b3ecd35..00000000 --- a/workers/Cargo.lock +++ /dev/null @@ -1,3581 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "alloy" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056f2c01b2aed86e15b43c47d109bfc8b82553dc34e66452875e51247ec31ab2" -dependencies = [ - "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 = "alloy-chains" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94c225801d42099570d0674701dddd4142f0ef715282aeb5985042e2ec962df7" -dependencies = [ - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705687d5bfd019fee57cf9e206b27b30a9a9617535d5590a02b171e813208f8e" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "auto_impl", - "c-kzg", - "derive_more", - "serde", -] - -[[package]] -name = "alloy-contract" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917f7d12cf3971dc8c11c9972f732b35ccb9aaaf5f28f2f87e9e6523bee3a8ad" -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", -] - -[[package]] -name = "alloy-core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" -dependencies = [ - "alloy-dyn-abi", - "alloy-json-abi", - "alloy-primitives", - "alloy-rlp", - "alloy-sol-types", -] - -[[package]] -name = "alloy-dyn-abi" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-type-parser", - "alloy-sol-types", - "const-hex", - "itoa", - "serde", - "serde_json", - "winnow", -] - -[[package]] -name = "alloy-eip2930" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "k256", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffb906284a1e1f63c4607da2068c8197458a352d0b3e9796e67353d72a9be85" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "c-kzg", - "derive_more", - "once_cell", - "serde", - "sha2", -] - -[[package]] -name = "alloy-genesis" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8429cf4554eed9b40feec7f4451113e76596086447550275e3def933faf47ce3" -dependencies = [ - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-json-abi" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cc0e59c803dd44d14fc0cfa9fea1f74cfa8fd9fb60ca303ced390c58c28d4e" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-json-rpc" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" -dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "alloy-network" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fa23a6a9d612b52e402c995f2d582c25165ec03ac6edf64c861a76bc5b87cd" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "futures-utils-wasm", - "thiserror", -] - -[[package]] -name = "alloy-network-primitives" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801492711d4392b2ccf5fc0bc69e299fa1aab15167d74dcaa9aab96a54f684bd" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-primitives" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a289ffd7448036f2f436b377f981c79ce0b2090877bad938d43387dc09931877" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "foldhash", - "hashbrown 0.15.0", - "hex-literal", - "indexmap", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand", - "ruint", - "rustc-hash", - "serde", - "sha3", - "tiny-keccak", -] - -[[package]] -name = "alloy-provider" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcfaa4ffec0af04e3555686b8aacbcdf7d13638133a0672749209069750f78a6" -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-eth", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "alloy-transport-ws", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "futures", - "futures-utils-wasm", - "lru", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "alloy-pubsub" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32cef487122ae75c91eb50154c70801d71fabdb976fec6c49e0af5e6486ab15" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "bimap", - "futures", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "alloy-rpc-client" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" -dependencies = [ - "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", - "tracing", - "url", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ffc534b7919e18f35e3aa1f507b6f3d9d92ec298463a9f6beaac112809d8d06" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-serde", - "serde", -] - -[[package]] -name = "alloy-rpc-types-engine" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0285c4c09f838ab830048b780d7f4a4f460f309aa1194bb049843309524c64c" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "derive_more", - "strum", -] - -[[package]] -name = "alloy-rpc-types-eth" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413f4aa3ccf2c3e4234a047c5fa4727916d7daf25a89f9b765df0ba09784fd87" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "derive_more", - "itertools 0.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-serde" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dff0ab1cdd43ca001e324dc27ee0e8606bd2161d6623c63e0e0b8c4dfc13600" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-signer" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd4e0ad79c81a27ca659be5d176ca12399141659fef2bcbfdc848da478f4504" -dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "elliptic-curve", - "k256", - "thiserror", -] - -[[package]] -name = "alloy-signer-local" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494e0a256f3e99f2426f994bcd1be312c02cb8f88260088dacb33a8b8936475f" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256", - "rand", - "thiserror", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" -dependencies = [ - "alloy-json-abi", - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.79", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" -dependencies = [ - "alloy-json-abi", - "const-hex", - "dunce", - "heck", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.79", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-type-parser" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd3548d5262867c2c4be6223fe4f2583e21ade0ca1c307fd23bc7f28fca479e" -dependencies = [ - "serde", - "winnow", -] - -[[package]] -name = "alloy-sol-types" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" -dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-transport" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" -dependencies = [ - "alloy-json-rpc", - "base64", - "futures-util", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror", - "tokio", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-http" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "reqwest", - "serde_json", - "tower", - "tracing", - "url", -] - -[[package]] -name = "alloy-transport-ipc" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90cf9cde7f2fce617da52768ee28f522264b282d148384a4ca0ea85af04fa3a" -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.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7153b88690de6a50bba81c11e1d706bc41dbb90126d607404d60b763f6a3947f" -dependencies = [ - "alloy-pubsub", - "alloy-transport", - "futures", - "http", - "rustls", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "ws_stream_wasm", -] - -[[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" - -[[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.79", -] - -[[package]] -name = "async-trait" -version = "0.1.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.1", -] - -[[package]] -name = "auto_impl" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "cc" -version = "1.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "const-hex" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "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", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "doctest-file" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" - -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core", - "subtle", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" -dependencies = [ - "foldhash", - "serde", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" -dependencies = [ - "equivalent", - "hashbrown 0.15.0", - "serde", -] - -[[package]] -name = "interprocess" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f4e4a06d42fab3e85ab1b419ad32b09eab58b901d40c57935ff92db3287a13" -dependencies = [ - "doctest-file", - "futures-core", - "libc", - "recvmsg", - "tokio", - "widestring", - "windows-sys 0.52.0", -] - -[[package]] -name = "ipnet" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -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 = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.159" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "lru" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi", - "libc", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "object" -version = "0.36.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "openssl" -version = "0.10.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parity-scale-codec" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.1", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" -dependencies = [ - "toml_edit", -] - -[[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.79", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax 0.8.5", - "rusty-fork", - "tempfile", - "unarray", -] - -[[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.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", - "serde", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "recvmsg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" - -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "reqwest" -version = "0.12.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - -[[package]] -name = "ruint" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.23", -] - -[[package]] -name = "rustix" -version = "0.38.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.23.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "schannel" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "serde_json" -version = "1.0.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "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.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.79", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -dependencies = [ - "futures-core", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots", -] - -[[package]] -name = "tokio-util" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper 0.1.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.79", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" - -[[package]] -name = "web-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" -dependencies = [ - "rustls-pki-types", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets", -] - -[[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", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -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 = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] - -[[package]] -name = "workers" -version = "0.1.0" -dependencies = [ - "alloy", - "alloy-json-abi", - "dotenv", - "eyre", - "futures", - "hex", - "serde", - "serde_json", - "sha3", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version 0.4.1", - "send_wrapper", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] From 131c35172233a63b38edd551bdfcf09a6ab0c4dd Mon Sep 17 00:00:00 2001 From: Lozano Date: Tue, 15 Oct 2024 18:14:06 +0200 Subject: [PATCH 10/62] refactor: move config to `config-rs` crate --- .gitignore | 3 + Cargo.lock | 202 ++++++++++++++++++++++++++++++- workers/Cargo.toml | 3 +- workers/src/bin/dvn.rs | 49 +++++--- workers/src/chain/connections.rs | 9 +- workers/src/chain/contracts.rs | 59 +++++---- workers/src/config.rs | 100 ++++----------- 7 files changed, 290 insertions(+), 135 deletions(-) diff --git a/.gitignore b/.gitignore index d367a739..fbd735af 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,6 @@ setup/plugin/config/keys/ecdsa.json # Near DA RPC libs libnear_da_rpc_sys.* +# Ignore configuration for DVN or Executor +**/config_dvn.toml +**/config_executor.toml diff --git a/Cargo.lock b/Cargo.lock index d2bb5800..01afbbc4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1497,7 +1497,7 @@ checksum = "5aeeee1a5defa63cba39097a510dfe63ef53658fc8995202a610f6a8a4d03639" dependencies = [ "attohttpc", "dirs", - "rust-ini", + "rust-ini 0.18.0", "serde", "serde-xml-rs", "thiserror", @@ -1672,6 +1672,9 @@ name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "bitmaps" @@ -2198,6 +2201,26 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "config" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" +dependencies = [ + "async-trait", + "convert_case 0.6.0", + "json5", + "lazy_static", + "nom", + "pathdiff", + "ron", + "rust-ini 0.19.0", + "serde", + "serde_json", + "toml 0.8.19", + "yaml-rust", +] + [[package]] name = "console" version = "0.15.8" @@ -2230,6 +2253,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -2242,6 +2285,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.16.2" @@ -2739,7 +2791,7 @@ version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ - "convert_case", + "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version 0.4.1", @@ -2849,6 +2901,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -4077,6 +4138,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "json_comments" version = "0.2.2" @@ -4238,6 +4310,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -5931,10 +6009,20 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" dependencies = [ - "dlv-list", + "dlv-list 0.3.0", "hashbrown 0.12.3", ] +[[package]] +name = "ordered-multimap" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ed8acf08e98e744e5384c8bc63ceb0364e68a6854187221c18df61c4797690e" +dependencies = [ + "dlv-list 0.5.2", + "hashbrown 0.13.2", +] + [[package]] name = "overload" version = "0.1.1" @@ -6177,6 +6265,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pathdiff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" + [[package]] name = "pbkdf2" version = "0.12.2" @@ -6230,6 +6324,40 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "pest_derive" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.82", +] + +[[package]] +name = "pest_meta" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "pharos" version = "0.5.3" @@ -6430,7 +6558,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -7098,6 +7226,18 @@ dependencies = [ "librocksdb-sys", ] +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64 0.21.7", + "bitflags 2.6.0", + "serde", + "serde_derive", +] + [[package]] name = "ruint" version = "1.12.3" @@ -7135,7 +7275,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" dependencies = [ "cfg-if 1.0.0", - "ordered-multimap", + "ordered-multimap 0.4.3", +] + +[[package]] +name = "rust-ini" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e2a3bcec1f113553ef1c88aae6c020a369d03d55b58de9869a0908930385091" +dependencies = [ + "cfg-if 1.0.0", + "ordered-multimap 0.6.0", ] [[package]] @@ -7607,6 +7757,15 @@ dependencies = [ "syn 2.0.82", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -8367,11 +8526,26 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -8380,6 +8554,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap 2.6.0", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -8641,6 +8817,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.1.14" @@ -9608,6 +9790,7 @@ dependencies = [ "alloy", "alloy-json-abi", "blsful", + "config", "dotenvy", "eyre", "futures", @@ -9690,6 +9873,15 @@ dependencies = [ "lzma-sys", ] +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "yansi" version = "0.5.1" diff --git a/workers/Cargo.toml b/workers/Cargo.toml index d0531a37..4b2b3c3d 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -9,8 +9,9 @@ path = "src/bin/dvn.rs" [dependencies] alloy = { version = "0.4.2", features = ["full"] } -alloy-json-abi = "0.8.6" +alloy-json-abi = "0.8.8" blsful = "2.5.7" +config = { version = "0.14.0", features = ["toml"] } dotenvy = "0.15.7" eyre = "0.6.12" futures = "0.3.31" diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 0b3913f9..60d9a5ea 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -1,5 +1,6 @@ //! Main offchain workflow for Nuff DVN. +use alloy::primitives::{Address, U256}; use eyre::Result; use futures::stream::StreamExt; use tracing::{debug, error, info}; @@ -36,7 +37,8 @@ async fn main() -> Result<()> { //let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; //let sendlib_contract = create_contract_instance(&config, http_provider.clone(), sendlib_abi)?; let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; - let receivelib_contract = create_contract_instance(dvn_worker.config(), http_provider, receivelib_abi)?; + let contract_address = dvn_data.config().receivelib_uln302_addr.parse::
()?; + let receivelib_contract = create_contract_instance(contract_address, http_provider, receivelib_abi)?; info!("Listening to chain events..."); @@ -60,31 +62,38 @@ async fn main() -> Result<()> { info!("DVNFeePaid event found and decoded."); let required_dvns = inner_log.inner.requiredDVNs.clone(); - if required_dvns.contains(&dvn_worker.config().dvn_addr()?) { - info!("Found DVN in required DVNs."); + info!("DVNFeePaid event found and decoded."); + let required_dvns = inner_log.inner.requiredDVNs.clone(); + let own_dvn_addr = dvn_data.config().dvn_addr.parse::
()?; - // NOTE: the docs' workflow require now to query L0's endpoint to - // get the address of the MessageLib, but we have already created - // the contract above to query it directly. + if required_dvns.contains(&own_dvn_addr) { + debug!("Found DVN in required DVNs."); let required_confirmations = query_confirmations(&receivelib_contract, dvn_worker.config().eid()).await?; - let already_verified = query_already_verified( - &receivelib_contract, - dvn_worker.config().dvn_addr()?, - &[1, 2, 3], - &[1, 2, 3], - required_confirmations, - ) - .await?; + let eid = U256::from(dvn_data.config().network_id); + let required_confirmations = query_confirmations(&receivelib_contract, eid).await?; - if already_verified { - debug!("Packet already verified."); - } else { - // If the packet was stored when emited in the PacketSent event. - if let Some(packet) = dvn_worker.packet() { - dvn_worker.verifying(); + // Prepare the header + let header = packet_v1_codec::header(packet.encodedPayload.as_ref()).to_vec(); + // Prepate the payload. + let payload = packet_v1_codec::payload(packet.encodedPayload.as_ref()).to_vec(); + + // Check + let already_verified = query_already_verified( + &receivelib_contract, + own_dvn_addr, + &header, + &payload, + required_confirmations, + ) + .await?; + + if already_verified { + debug!("Packet already verified."); + } else { + dvn_data.verifying(); debug!("Packet NOT verified. Calling verification."); // FIXME: incorrect data verify( diff --git a/workers/src/chain/connections.rs b/workers/src/chain/connections.rs index 01669a2c..3688c70c 100644 --- a/workers/src/chain/connections.rs +++ b/workers/src/chain/connections.rs @@ -6,6 +6,7 @@ use crate::{ }; use alloy::{ eips::BlockNumberOrTag, + primitives::Address, providers::{Provider, ProviderBuilder, RootProvider, WsConnect}, pubsub::{PubSubFrontend, SubscriptionStream}, rpc::types::{Filter, Log}, @@ -22,19 +23,19 @@ pub async fn build_subscriptions( SubscriptionStream, )> { // Create the provider - let rpc_url = config.ws_rpc(); + let rpc_url = config.ws_rpc_url.clone(); let ws = WsConnect::new(rpc_url); let provider = ProviderBuilder::new().on_ws(ws).await?; // layerzero endpoint filter let packet_filter = Filter::new() - .address(config.l0_addr()?) + .address(config.l0_endpoint_addr.parse::
()?) .event(DVNEvent::PacketSent.as_ref()) .from_block(BlockNumberOrTag::Latest); // messagelib endpoint filter let fee_paid_filter = Filter::new() - .address(config.sendlib_uln302_addr()?) + .address(config.sendlib_uln302_addr.parse::
()?) .event(DVNEvent::FeePaid.as_ref()) .from_block(BlockNumberOrTag::Latest); @@ -62,6 +63,6 @@ pub fn get_abi_from_path(path: &str) -> Result { /// Construct an HTTP provider given the config. pub fn get_http_provider(config: &DVNConfig) -> Result { - let http_provider = ProviderBuilder::new().on_http(config.http_rpc()?); + let http_provider = ProviderBuilder::new().on_http(config.http_rpc_url.parse()?); Ok(http_provider) } diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index 2878fdb5..04c37c40 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -16,12 +16,9 @@ use eyre::{eyre, OptionExt, Result}; use tracing::{debug, error}; /// Create a contract instance from the ABI to interact with on-chain instance. -pub fn create_contract_instance(config: &DVNConfig, http_provider: HttpProvider, abi: JsonAbi) -> Result { - let contract: ContractInstance, _, Ethereum> = ContractInstance::new( - config.sendlib_uln302_addr()?, - http_provider.clone(), - Interface::new(abi), - ); +pub fn create_contract_instance(addr: Address, http_provider: HttpProvider, abi: JsonAbi) -> Result { + let contract: ContractInstance, _, Ethereum> = + ContractInstance::new(addr, http_provider.clone(), Interface::new(abi)); Ok(contract) } @@ -131,28 +128,28 @@ pub async fn verify( Ok(false) } -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - chain::connections::{get_abi_from_path, get_http_provider}, - config, - }; - - #[tokio::test] - async fn test_get_confirmations() -> Result<()> { - // Set up - let config = config::DVNConfig::load_from_env()?; - let http_provider = get_http_provider(&config)?; - let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; - let sendlib_contract = create_contract_instance(&config, http_provider, sendlib_abi)?; - - // Query contract value - let required_confirmations = query_confirmations(&sendlib_contract, U256::from(30110)).await?; - - // Check the value is what we expect - assert_eq!(required_confirmations, U256::from(20)); - - Ok(()) - } -} +//#[cfg(test)] +//mod tests { +// use super::*; +// use crate::{ +// chain::connections::{get_abi_from_path, get_http_provider}, +// config, +// }; +// +// #[tokio::test] +// async fn test_get_confirmations() -> Result<()> { +// // Set up +// let config = config::DVNConfig::load_from_env()?; +// let http_provider = get_http_provider(&config)?; +// let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; +// let sendlib_contract = create_contract_instance(&config, http_provider, sendlib_abi)?; +// +// // Query contract value +// let required_confirmations = query_confirmations(&sendlib_contract, U256::from(30110)).await?; +// +// // Check the value is what we expect +// assert_eq!(required_confirmations, U256::from(20)); +// +// Ok(()) +// } +//} diff --git a/workers/src/config.rs b/workers/src/config.rs index a73b6f37..9f1d4ff2 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -1,96 +1,38 @@ //! Configuration for the DVN offchain workflow. -use alloy::{ - primitives::{Address, U256}, - transports::http::reqwest::Url, -}; +use config::Config; use eyre::Result; +use serde::Deserialize; -#[derive(Default)] +#[derive(Default, Deserialize)] pub struct DVNConfig { /// The Websocket RPC URL to connect to the Ethereum network. - ws_rpc_url: String, + pub ws_rpc_url: String, /// The HTTP RPC URL to connect to the Ethereum network. - http_rpc_url: String, + pub http_rpc_url: String, /// The LayerZero endpoint address. - l0_endpoint_addr: String, + pub l0_endpoint_addr: String, /// The SendLib Ultra Light Node 302 address. - sendlib_uln302_addr: String, + pub sendlib_uln302_addr: String, /// The ReceiveLib Ultra Light Node 302 address. - receivelib_uln302_addr: String, + pub receivelib_uln302_addr: String, /// The SendLib Ultra Light Node 301 address. - sendlib_uln301_addr: String, + pub sendlib_uln301_addr: String, /// The ReceiveLib Ultra Light Node 301 address. - receivelib_uln301_addr: String, + pub receivelib_uln301_addr: String, /// The Ethereum network ID. - network_id: u64, + pub network_id: u64, /// Own DVN address. Used to check when the DVN is assigned to a task. - dvn_addr: String, + pub dvn_addr: String, } impl DVNConfig { - /// Get the chain's RPC URL. - pub fn ws_rpc(&self) -> &str { - &self.ws_rpc_url - } - - /// Get the chain's RPC URL. - pub fn http_rpc(&self) -> Result { - Ok(self.http_rpc_url.parse::()?) - } - - /// Get the LayerZero endpoint address. - pub fn l0_addr(&self) -> Result
{ - Ok(self.l0_endpoint_addr.parse::
()?) - } - - /// Get the SendLib ULN302 address. - pub fn sendlib_uln302_addr(&self) -> Result
{ - Ok(self.sendlib_uln302_addr.parse::
()?) - } - - /// Get the ReceiveLib ULN302 address. - pub fn receivelib_uln302_addr(&self) -> Result
{ - Ok(self.receivelib_uln302_addr.parse::
()?) - } - - /// Get the SendLib ULN301 address. - pub fn sendlib_uln301_addr(&self) -> Result
{ - Ok(self.sendlib_uln301_addr.parse::
()?) - } - - /// Get the ReceiveLib ULN301 address. - pub fn receivelib_uln301_addr(&self) -> Result
{ - Ok(self.receivelib_uln301_addr.parse::
()?) - } - - /// Get the EID as U256. - pub fn eid(&self) -> U256 { - U256::from(self.network_id) - } - - /// Get the DVN address. - pub fn dvn_addr(&self) -> Result
{ - Ok(self.dvn_addr.parse::
()?) - } - /// Load environment variables. pub fn load_from_env() -> Result { - dotenvy::dotenv()?; - - Ok(Self { - ws_rpc_url: std::env::var("WS_RPC_URL").unwrap_or_else(|_| Default::default()), - http_rpc_url: std::env::var("HTTP_RPC_URL").unwrap_or_else(|_| Default::default()), - l0_endpoint_addr: std::env::var("L0_ENDPOINT_ADDR").unwrap_or_else(|_| Default::default()), - sendlib_uln302_addr: std::env::var("SENDLIB_ULN302_ADDR").unwrap_or_else(|_| Default::default()), - receivelib_uln302_addr: std::env::var("RECEIVELIB_ULN302_ADDR").unwrap_or_else(|_| Default::default()), - sendlib_uln301_addr: std::env::var("SENDLIB_ULN301_ADDR").unwrap_or_else(|_| Default::default()), - receivelib_uln301_addr: std::env::var("RECEIVELIB_ULN301_ADDR").unwrap_or_else(|_| Default::default()), - network_id: std::env::var("NETWORK_EID") - .unwrap_or_else(|_| "0".to_string()) - .parse::()?, - dvn_addr: std::env::var("DVN_ADDR").unwrap_or_else(|_| Default::default()), - }) + let settings = Config::builder() + .add_source(config::File::with_name("workers/config_dvn")) + .build()?; + Ok(settings.try_deserialize::()?) } } @@ -108,3 +50,13 @@ impl AsRef for DVNEvent { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn load_config_from_env() { + let conf = DVNConfig::load_from_env().unwrap(); + } +} From 4a5cc5ce5e5683987bb8f6de951c77d9509ec694 Mon Sep 17 00:00:00 2001 From: Lozano Date: Wed, 16 Oct 2024 17:42:05 +0200 Subject: [PATCH 11/62] refactor: move to manual decoding --- Cargo.lock | 1 + workers/Cargo.toml | 2 + workers/src/abi.rs | 6 +- workers/src/bin/dvn.rs | 17 +++-- workers/src/chain/contracts.rs | 31 +------- workers/src/codec/mod.rs | 2 + workers/src/codec/packet_v1_codec.rs | 85 +++++++++++++++++++++ workers/src/config.rs | 4 +- workers/src/data/dvn.rs | 108 ++++++++++++++++++++++++--- 9 files changed, 201 insertions(+), 55 deletions(-) create mode 100644 workers/src/codec/mod.rs create mode 100644 workers/src/codec/packet_v1_codec.rs diff --git a/Cargo.lock b/Cargo.lock index 01afbbc4..578957ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9790,6 +9790,7 @@ dependencies = [ "alloy", "alloy-json-abi", "blsful", + "bytes", "config", "dotenvy", "eyre", diff --git a/workers/Cargo.toml b/workers/Cargo.toml index 4b2b3c3d..e4414a77 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -10,7 +10,9 @@ path = "src/bin/dvn.rs" [dependencies] alloy = { version = "0.4.2", features = ["full"] } alloy-json-abi = "0.8.8" +#alloy-rlp = "0.3.8" blsful = "2.5.7" +bytes = "1.7.2" config = { version = "0.14.0", features = ["toml"] } dotenvy = "0.15.7" eyre = "0.6.12" diff --git a/workers/src/abi.rs b/workers/src/abi.rs index d352fe8f..75555bcb 100644 --- a/workers/src/abi.rs +++ b/workers/src/abi.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; sol!( #[allow(missing_docs)] - #[sol(rpc)] + #[sol(abi, rpc)] #[derive(Debug, Serialize, Deserialize)] SendLibraryAbi, "abi/ArbitrumSendLibUln302.json" @@ -15,7 +15,7 @@ sol!( sol!( #[allow(missing_docs)] - #[sol(rpc)] + #[sol(abi, rpc)] #[derive(Debug, Serialize, Deserialize)] ReceiveLibraryAbi, "abi/ArbitrumReceiveLibUln302.json" @@ -23,7 +23,7 @@ sol!( sol!( #[allow(missing_docs)] - #[sol(rpc)] + #[sol(abi, rpc)] #[derive(Debug, Serialize, Deserialize)] L0V2EndpointAbi, "abi/ArbitrumL0V2Endpoint.json" diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 60d9a5ea..e2fbe66c 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -75,10 +75,10 @@ async fn main() -> Result<()> { let eid = U256::from(dvn_data.config().network_id); let required_confirmations = query_confirmations(&receivelib_contract, eid).await?; - // Prepare the header - let header = packet_v1_codec::header(packet.encodedPayload.as_ref()).to_vec(); - // Prepate the payload. - let payload = packet_v1_codec::payload(packet.encodedPayload.as_ref()).to_vec(); + // Prepare the header hash. + let header_hash = dvn_data.get_header_hash(); + // Prepate the payload hash. + let message_hash = dvn_data.get_message_hash(); // Check let already_verified = query_already_verified( @@ -98,14 +98,15 @@ async fn main() -> Result<()> { // FIXME: incorrect data verify( &receivelib_contract, - &packet.options, - &packet.encodedPayload, + own_dvn_addr, + header.as_ref(), + payload.as_ref(), required_confirmations, ) .await?; - } else { - debug!("No packet data found. Skipping verification."); } + } else { + dvn_data.reset_packet(); } } } diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index 04c37c40..88620a9f 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -1,9 +1,6 @@ //! Utilities for interacting with onchain contracts. -use crate::{ - chain::{ContractInst, HttpProvider}, - config::DVNConfig, -}; +use crate::chain::{ContractInst, HttpProvider}; use alloy::{ contract::{ContractInstance, Interface}, dyn_abi::DynSolValue, @@ -127,29 +124,3 @@ pub async fn verify( Ok(false) } - -//#[cfg(test)] -//mod tests { -// use super::*; -// use crate::{ -// chain::connections::{get_abi_from_path, get_http_provider}, -// config, -// }; -// -// #[tokio::test] -// async fn test_get_confirmations() -> Result<()> { -// // Set up -// let config = config::DVNConfig::load_from_env()?; -// let http_provider = get_http_provider(&config)?; -// let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; -// let sendlib_contract = create_contract_instance(&config, http_provider, sendlib_abi)?; -// -// // Query contract value -// let required_confirmations = query_confirmations(&sendlib_contract, U256::from(30110)).await?; -// -// // Check the value is what we expect -// assert_eq!(required_confirmations, U256::from(20)); -// -// Ok(()) -// } -//} diff --git a/workers/src/codec/mod.rs b/workers/src/codec/mod.rs new file mode 100644 index 00000000..ac6329b0 --- /dev/null +++ b/workers/src/codec/mod.rs @@ -0,0 +1,2 @@ +//pub mod bytes_utils; +//pub mod packet_v1_codec; diff --git a/workers/src/codec/packet_v1_codec.rs b/workers/src/codec/packet_v1_codec.rs new file mode 100644 index 00000000..7031caf6 --- /dev/null +++ b/workers/src/codec/packet_v1_codec.rs @@ -0,0 +1,85 @@ +use crate::abi::PacketStruct; +use crate::codec::bytes_utils::BytesUtils; + +pub const PACKET_VERSION: u8 = 1; +pub const PACKET_HEADER_SIZE: usize = 81; + +// header (version + nonce + path) +// version +const PACKET_VERSION_OFFSET: usize = 0; +// nonce +const NONCE_OFFSET: usize = 1; +// path +const SRC_EID_OFFSET: usize = 9; +const SENDER_OFFSET: usize = 13; +const DST_EID_OFFSET: usize = 45; +const RECEIVER_OFFSET: usize = 49; +// payload (guid + message) +const GUID_OFFSET: usize = 81; +const MESSAGE_OFFSET: usize = 113; + +pub fn encode(packet: &PacketStruct) -> Vec { + [ + &PACKET_VERSION.to_be_bytes()[..], + &packet.nonce.to_be_bytes()[..], + &packet.srcEid.to_be_bytes()[..], + &packet.sender.to_vec()[..], + &packet.dstEid.to_be_bytes()[..], + &packet.receiver[..], + &packet.guid[..], + &packet.message, + ] + .concat() +} + +pub fn encode_packet_header(packet: &PacketStruct) -> Vec { + [ + &PACKET_VERSION.to_be_bytes()[..], + &packet.nonce.to_be_bytes()[..], + &packet.srcEid.to_be_bytes()[..], + &packet.sender.to_vec()[..], + &packet.dstEid.to_be_bytes()[..], + &packet.receiver[..], + ] + .concat() +} + +pub fn header(packet: &[u8]) -> &[u8] { + &packet[0..GUID_OFFSET] +} + +pub fn version(packet: &[u8]) -> u8 { + packet.to_u8(PACKET_VERSION_OFFSET) +} + +pub fn nonce(packet: &[u8]) -> u64 { + packet.to_u64(NONCE_OFFSET) +} + +pub fn src_eid(packet: &[u8]) -> u32 { + packet.to_u32(SRC_EID_OFFSET) +} + +pub fn sender(packet: &[u8]) -> [u8; 32] { + packet.to_byte_array(SENDER_OFFSET) +} + +pub fn dst_eid(packet: &[u8]) -> u32 { + packet.to_u32(DST_EID_OFFSET) +} + +pub fn receiver(packet: &[u8]) -> [u8; 32] { + packet.to_byte_array(RECEIVER_OFFSET) +} + +pub fn guid(packet: &[u8]) -> [u8; 32] { + packet.to_byte_array(GUID_OFFSET) +} + +pub fn message(packet: &[u8]) -> &[u8] { + &packet[MESSAGE_OFFSET..] +} + +pub fn payload(packet: &[u8]) -> &[u8] { + &packet[GUID_OFFSET..] +} diff --git a/workers/src/config.rs b/workers/src/config.rs index 9f1d4ff2..a981249e 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -21,7 +21,7 @@ pub struct DVNConfig { /// The ReceiveLib Ultra Light Node 301 address. pub receivelib_uln301_addr: String, /// The Ethereum network ID. - pub network_id: u64, + pub network_eid: u64, /// Own DVN address. Used to check when the DVN is assigned to a task. pub dvn_addr: String, } @@ -30,7 +30,7 @@ impl DVNConfig { /// Load environment variables. pub fn load_from_env() -> Result { let settings = Config::builder() - .add_source(config::File::with_name("workers/config_dvn")) + .add_source(config::File::with_name("./config_dvn")) .build()?; Ok(settings.try_deserialize::()?) } diff --git a/workers/src/data/dvn.rs b/workers/src/data/dvn.rs index a53a0c6c..515a772a 100644 --- a/workers/src/data/dvn.rs +++ b/workers/src/data/dvn.rs @@ -1,15 +1,15 @@ use crate::abi::L0V2EndpointAbi::PacketSent; use crate::config; use crate::config::DVNConfig; +use alloy::primitives::{keccak256, FixedBytes, B256}; +use bytes::{Buf, BufMut, BytesMut}; use eyre::Result; -//use alloy::primitives::{Address, U256}; +use tracing::debug; pub struct Dvn { config: DVNConfig, status: DvnStatus, packet: Option, - //receivelib_address: Option
, - //num_confirmations: Option, } pub enum DvnStatus { @@ -25,8 +25,6 @@ impl Dvn { config, status: DvnStatus::Stopped, packet: None, - //receivelib_address: None, - //num_confirmations: None, } } @@ -46,21 +44,107 @@ impl Dvn { self.status = DvnStatus::Listening; } - pub fn stop(&mut self) { - self.status = DvnStatus::Stopped; - } - - pub fn packet_received(&mut self, packet_log: PacketSent) { - self.packet = Some(packet_log); + pub fn packet_received(&mut self, packet: PacketSent) { + self.packet = Some(packet); self.status = DvnStatus::PacketReceived; } pub fn reset_packet(&mut self) { self.packet = None; - self.status = DvnStatus::Stopped; + self.status = DvnStatus::Listening; + debug!("DVN not required, stored packet dropped") } pub fn verifying(&mut self) { self.status = DvnStatus::Verifying; } + + pub fn get_header(&self) -> Option
{ + if let Some(packet) = self.packet.as_ref() { + extract_header(packet.encodedPayload.as_ref()) + } else { + None + } + } + + pub fn get_header_hash(&self) -> Option { + if let Some(packet) = self.packet.as_ref() { + extract_header(packet.encodedPayload.as_ref()).map(|header| keccak256(header.to_slice())) + } else { + None + } + } + + pub fn get_message_hash(&self) -> Option { + if let Some(packet) = self.packet.as_ref() { + extract_message(packet.encodedPayload.as_ref()).map(|message| keccak256(message.as_slice())) + } else { + None + } + } +} + +/// Minimum length of a packet. +const MINIMUM_PACKET_LENGTH: usize = 93; // 1 + 8 + 4 + 32 + 4 + 32 + 32 + +/// The whole header from the message. +pub struct Header { + version: u8, + nonce: u64, + src_eid: u32, + sender_addr: u32, + dst_eid: u32, + rcv_addr: FixedBytes<32>, + guid: FixedBytes<32>, +} + +impl Header { + pub fn to_slice(&self) -> Vec { + let mut header = BytesMut::new(); + header.put_u8(self.version); + header.put_u64(self.nonce); + header.put_u32(self.src_eid); + header.put_u32(self.sender_addr); + header.put_u32(self.dst_eid); + header.put_slice(self.rcv_addr.as_ref()); + header.put_slice(self.guid.as_ref()); + header.to_vec() + } +} + +/// When feeded a packet, return the whole header, which is everything but the message. +pub fn extract_header(raw_packet: &[u8]) -> Option
{ + if raw_packet.len() < MINIMUM_PACKET_LENGTH { + return None; + } + let mut buffered_packet = BytesMut::from(raw_packet); + let version = buffered_packet.get_u8(); // version + let nonce = buffered_packet.get_u64(); // nonce + let src_eid = buffered_packet.get_u32(); // src_eid + let sender_addr = buffered_packet.get_u32(); // sender address + let dst_eid = buffered_packet.get_u32(); // dst_eid + let rcv_addr: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).as_ref()); + let guid: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).freeze().iter().as_slice()); + + Some(Header { + version, + nonce, + src_eid, + sender_addr, + dst_eid, + rcv_addr, + guid, + }) +} + +/// When feeded a packet, return the whole message, which is everything but the header. +pub fn extract_message(raw_packet: &[u8]) -> Option> { + if raw_packet.len() < MINIMUM_PACKET_LENGTH { + return None; + } + let mut buffered_packet = BytesMut::from(raw_packet); + buffered_packet.advance(81); // version + let message = buffered_packet.freeze().to_vec(); + + Some(message) } From 4894f4ad65ef623fd9be030358310570923310fc Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 10:07:59 +0200 Subject: [PATCH 12/62] chore: modularize --- .gitignore | 1 + workers/src/codec/mod.rs | 2 - workers/src/codec/packet_v1_codec.rs | 85 ---------------------------- workers/src/data/dvn.rs | 76 ++----------------------- workers/src/data/extractors.rs | 67 ++++++++++++++++++++++ workers/src/data/mod.rs | 2 +- 6 files changed, 75 insertions(+), 158 deletions(-) delete mode 100644 workers/src/codec/mod.rs delete mode 100644 workers/src/codec/packet_v1_codec.rs create mode 100644 workers/src/data/extractors.rs diff --git a/.gitignore b/.gitignore index fbd735af..fbf66b4b 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ libnear_da_rpc_sys.* # Ignore configuration for DVN or Executor **/config_dvn.toml **/config_executor.toml +**/abi/ diff --git a/workers/src/codec/mod.rs b/workers/src/codec/mod.rs deleted file mode 100644 index ac6329b0..00000000 --- a/workers/src/codec/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -//pub mod bytes_utils; -//pub mod packet_v1_codec; diff --git a/workers/src/codec/packet_v1_codec.rs b/workers/src/codec/packet_v1_codec.rs deleted file mode 100644 index 7031caf6..00000000 --- a/workers/src/codec/packet_v1_codec.rs +++ /dev/null @@ -1,85 +0,0 @@ -use crate::abi::PacketStruct; -use crate::codec::bytes_utils::BytesUtils; - -pub const PACKET_VERSION: u8 = 1; -pub const PACKET_HEADER_SIZE: usize = 81; - -// header (version + nonce + path) -// version -const PACKET_VERSION_OFFSET: usize = 0; -// nonce -const NONCE_OFFSET: usize = 1; -// path -const SRC_EID_OFFSET: usize = 9; -const SENDER_OFFSET: usize = 13; -const DST_EID_OFFSET: usize = 45; -const RECEIVER_OFFSET: usize = 49; -// payload (guid + message) -const GUID_OFFSET: usize = 81; -const MESSAGE_OFFSET: usize = 113; - -pub fn encode(packet: &PacketStruct) -> Vec { - [ - &PACKET_VERSION.to_be_bytes()[..], - &packet.nonce.to_be_bytes()[..], - &packet.srcEid.to_be_bytes()[..], - &packet.sender.to_vec()[..], - &packet.dstEid.to_be_bytes()[..], - &packet.receiver[..], - &packet.guid[..], - &packet.message, - ] - .concat() -} - -pub fn encode_packet_header(packet: &PacketStruct) -> Vec { - [ - &PACKET_VERSION.to_be_bytes()[..], - &packet.nonce.to_be_bytes()[..], - &packet.srcEid.to_be_bytes()[..], - &packet.sender.to_vec()[..], - &packet.dstEid.to_be_bytes()[..], - &packet.receiver[..], - ] - .concat() -} - -pub fn header(packet: &[u8]) -> &[u8] { - &packet[0..GUID_OFFSET] -} - -pub fn version(packet: &[u8]) -> u8 { - packet.to_u8(PACKET_VERSION_OFFSET) -} - -pub fn nonce(packet: &[u8]) -> u64 { - packet.to_u64(NONCE_OFFSET) -} - -pub fn src_eid(packet: &[u8]) -> u32 { - packet.to_u32(SRC_EID_OFFSET) -} - -pub fn sender(packet: &[u8]) -> [u8; 32] { - packet.to_byte_array(SENDER_OFFSET) -} - -pub fn dst_eid(packet: &[u8]) -> u32 { - packet.to_u32(DST_EID_OFFSET) -} - -pub fn receiver(packet: &[u8]) -> [u8; 32] { - packet.to_byte_array(RECEIVER_OFFSET) -} - -pub fn guid(packet: &[u8]) -> [u8; 32] { - packet.to_byte_array(GUID_OFFSET) -} - -pub fn message(packet: &[u8]) -> &[u8] { - &packet[MESSAGE_OFFSET..] -} - -pub fn payload(packet: &[u8]) -> &[u8] { - &packet[GUID_OFFSET..] -} diff --git a/workers/src/data/dvn.rs b/workers/src/data/dvn.rs index 515a772a..887120e4 100644 --- a/workers/src/data/dvn.rs +++ b/workers/src/data/dvn.rs @@ -1,8 +1,9 @@ -use crate::abi::L0V2EndpointAbi::PacketSent; -use crate::config; -use crate::config::DVNConfig; -use alloy::primitives::{keccak256, FixedBytes, B256}; -use bytes::{Buf, BufMut, BytesMut}; +use crate::{ + abi::L0V2EndpointAbi::PacketSent, + config::{self, DVNConfig}, + data::extractors::{extract_header, extract_message, Header}, +}; +use alloy::primitives::{keccak256, B256}; use eyre::Result; use tracing::debug; @@ -83,68 +84,3 @@ impl Dvn { } } } - -/// Minimum length of a packet. -const MINIMUM_PACKET_LENGTH: usize = 93; // 1 + 8 + 4 + 32 + 4 + 32 + 32 - -/// The whole header from the message. -pub struct Header { - version: u8, - nonce: u64, - src_eid: u32, - sender_addr: u32, - dst_eid: u32, - rcv_addr: FixedBytes<32>, - guid: FixedBytes<32>, -} - -impl Header { - pub fn to_slice(&self) -> Vec { - let mut header = BytesMut::new(); - header.put_u8(self.version); - header.put_u64(self.nonce); - header.put_u32(self.src_eid); - header.put_u32(self.sender_addr); - header.put_u32(self.dst_eid); - header.put_slice(self.rcv_addr.as_ref()); - header.put_slice(self.guid.as_ref()); - header.to_vec() - } -} - -/// When feeded a packet, return the whole header, which is everything but the message. -pub fn extract_header(raw_packet: &[u8]) -> Option
{ - if raw_packet.len() < MINIMUM_PACKET_LENGTH { - return None; - } - let mut buffered_packet = BytesMut::from(raw_packet); - let version = buffered_packet.get_u8(); // version - let nonce = buffered_packet.get_u64(); // nonce - let src_eid = buffered_packet.get_u32(); // src_eid - let sender_addr = buffered_packet.get_u32(); // sender address - let dst_eid = buffered_packet.get_u32(); // dst_eid - let rcv_addr: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).as_ref()); - let guid: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).freeze().iter().as_slice()); - - Some(Header { - version, - nonce, - src_eid, - sender_addr, - dst_eid, - rcv_addr, - guid, - }) -} - -/// When feeded a packet, return the whole message, which is everything but the header. -pub fn extract_message(raw_packet: &[u8]) -> Option> { - if raw_packet.len() < MINIMUM_PACKET_LENGTH { - return None; - } - let mut buffered_packet = BytesMut::from(raw_packet); - buffered_packet.advance(81); // version - let message = buffered_packet.freeze().to_vec(); - - Some(message) -} diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs new file mode 100644 index 00000000..4b454b10 --- /dev/null +++ b/workers/src/data/extractors.rs @@ -0,0 +1,67 @@ +use alloy::primitives::FixedBytes; +use bytes::{Buf, BufMut, BytesMut}; + +/// Minimum length of a packet. +const MINIMUM_PACKET_LENGTH: usize = 93; // 1 + 8 + 4 + 32 + 4 + 32 + 32 + +/// The whole header from the message. +pub struct Header { + version: u8, + nonce: u64, + src_eid: u32, + sender_addr: u32, + dst_eid: u32, + rcv_addr: FixedBytes<32>, + guid: FixedBytes<32>, +} + +impl Header { + pub fn to_slice(&self) -> Vec { + let mut header = BytesMut::new(); + header.put_u8(self.version); + header.put_u64(self.nonce); + header.put_u32(self.src_eid); + header.put_u32(self.sender_addr); + header.put_u32(self.dst_eid); + header.put_slice(self.rcv_addr.as_ref()); + header.put_slice(self.guid.as_ref()); + header.to_vec() + } +} + +/// When feeded a packet, return the whole header, which is everything but the message. +pub fn extract_header(raw_packet: &[u8]) -> Option
{ + if raw_packet.len() < MINIMUM_PACKET_LENGTH { + return None; + } + let mut buffered_packet = BytesMut::from(raw_packet); + let version = buffered_packet.get_u8(); // version + let nonce = buffered_packet.get_u64(); // nonce + let src_eid = buffered_packet.get_u32(); // src_eid + let sender_addr = buffered_packet.get_u32(); // sender address + let dst_eid = buffered_packet.get_u32(); // dst_eid + let rcv_addr: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).as_ref()); + let guid: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).freeze().iter().as_slice()); + + Some(Header { + version, + nonce, + src_eid, + sender_addr, + dst_eid, + rcv_addr, + guid, + }) +} + +/// When feeded a packet, return the whole message, which is everything but the header. +pub fn extract_message(raw_packet: &[u8]) -> Option> { + if raw_packet.len() < MINIMUM_PACKET_LENGTH { + return None; + } + let mut buffered_packet = BytesMut::from(raw_packet); + buffered_packet.advance(81); // version + let message = buffered_packet.freeze().to_vec(); + + Some(message) +} diff --git a/workers/src/data/mod.rs b/workers/src/data/mod.rs index 4cec19d2..037da295 100644 --- a/workers/src/data/mod.rs +++ b/workers/src/data/mod.rs @@ -1,2 +1,2 @@ pub mod dvn; - +pub mod extractors; From 290bb852b59707b0292ab012e231c36479a4de3e Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 10:30:36 +0200 Subject: [PATCH 13/62] chore: address pr comments on the worker --- workers/src/bin/dvn.rs | 19 ++++++++----------- workers/src/chain/contracts.rs | 7 +++++-- workers/src/config.rs | 2 +- workers/src/data/dvn.rs | 14 +++----------- workers/src/data/extractors.rs | 6 ++++++ 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index e2fbe66c..5f41ce6a 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -25,19 +25,19 @@ async fn main() -> Result<()> { .with_env_filter(EnvFilter::from_default_env()) .init(); - let mut dvn_worker = Dvn::new_from_env()?; + let mut dvn_data = Dvn::new_from_env()?; // Create the WS subscriptions for listening to the events. - let (_provider, mut endpoint_stream, mut sendlib_stream) = build_subscriptions(dvn_worker.config()).await?; + let (_provider, mut endpoint_stream, mut sendlib_stream) = build_subscriptions(&dvn_data.config).await?; // Create an HTTP provider to call contract functions. - let http_provider = get_http_provider(dvn_worker.config())?; + let http_provider = get_http_provider(&dvn_data.config)?; // Get the relevant contract ABI, and create contract. //let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; //let sendlib_contract = create_contract_instance(&config, http_provider.clone(), sendlib_abi)?; let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; - let contract_address = dvn_data.config().receivelib_uln302_addr.parse::
()?; + let contract_address = dvn_data.config.receivelib_uln302_addr.parse::
()?; let receivelib_contract = create_contract_instance(contract_address, http_provider, receivelib_abi)?; info!("Listening to chain events..."); @@ -59,20 +59,17 @@ async fn main() -> Result<()> { Some(log) = sendlib_stream.next() => { match log.log_decode::() { Ok(inner_log) => { - info!("DVNFeePaid event found and decoded."); - let required_dvns = inner_log.inner.requiredDVNs.clone(); + if dvn_data.packet.is_some() { info!("DVNFeePaid event found and decoded."); let required_dvns = inner_log.inner.requiredDVNs.clone(); - let own_dvn_addr = dvn_data.config().dvn_addr.parse::
()?; + let own_dvn_addr = dvn_data.config.dvn_addr.parse::
()?; if required_dvns.contains(&own_dvn_addr) { debug!("Found DVN in required DVNs."); - let required_confirmations = - query_confirmations(&receivelib_contract, dvn_worker.config().eid()).await?; - - let eid = U256::from(dvn_data.config().network_id); + // Query how many confirmations are required. + let eid = U256::from(dvn_data.config.network_eid); let required_confirmations = query_confirmations(&receivelib_contract, eid).await?; // Prepare the header hash. diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index 88620a9f..513b6051 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -89,7 +89,10 @@ pub async fn query_already_verified( .call() .await?; - let packet_state = match contract_state[0] { + let packet_state = match contract_state + .first() + .ok_or(eyre!("Empty response when querying `_verified`"))? + { DynSolValue::Bool(b) => Ok(b), _ => { error!("Failed to parse response from ReceiveLib for `_verified`"); @@ -97,7 +100,7 @@ pub async fn query_already_verified( } }?; - Ok(packet_state) + Ok(*packet_state) } pub async fn verify( diff --git a/workers/src/config.rs b/workers/src/config.rs index a981249e..22e49351 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -57,6 +57,6 @@ mod tests { #[test] fn load_config_from_env() { - let conf = DVNConfig::load_from_env().unwrap(); + let _conf = DVNConfig::load_from_env().unwrap(); } } diff --git a/workers/src/data/dvn.rs b/workers/src/data/dvn.rs index 887120e4..35b41ae0 100644 --- a/workers/src/data/dvn.rs +++ b/workers/src/data/dvn.rs @@ -8,9 +8,9 @@ use eyre::Result; use tracing::debug; pub struct Dvn { - config: DVNConfig, - status: DvnStatus, - packet: Option, + pub config: DVNConfig, + pub status: DvnStatus, + pub packet: Option, } pub enum DvnStatus { @@ -33,14 +33,6 @@ impl Dvn { Ok(Dvn::new(config::DVNConfig::load_from_env()?)) } - pub fn packet(&self) -> Option { - self.packet.clone() - } - - pub fn config(&self) -> &DVNConfig { - &self.config - } - pub fn listening(&mut self) { self.status = DvnStatus::Listening; } diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index 4b454b10..d47fa87a 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -1,3 +1,9 @@ +//! Extract data from encoded payloads. +//! +//! FIXME: couldn't make it work with `alloy`+ABI, so +//! using manual extracting for now. +//! Re-check if it can work that way. + use alloy::primitives::FixedBytes; use bytes::{Buf, BufMut, BytesMut}; From 263cb0e5cb01d39b898a4eaa23644bd973e9103a Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 12:28:41 +0200 Subject: [PATCH 14/62] chore: move some files to lib imports --- contracts/evm/src/dvn/NuffDVN.sol | 17 ++++---- .../evm/src/dvn/interfaces/INuffClient.sol | 27 ++++++++++++ .../evm/src/dvn/interfaces/IReceiveUlnE2.sol | 43 +++++++++++++++++++ contracts/evm/test/dvn/IMBToken.sol | 11 +++++ contracts/evm/test/dvn/IMRC20.sol | 12 ++++++ 5 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 contracts/evm/src/dvn/interfaces/INuffClient.sol create mode 100644 contracts/evm/src/dvn/interfaces/IReceiveUlnE2.sol create mode 100644 contracts/evm/test/dvn/IMBToken.sol create mode 100644 contracts/evm/test/dvn/IMRC20.sol diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol index 9a2eb907..b4dff1b2 100644 --- a/contracts/evm/src/dvn/NuffDVN.sol +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -5,16 +5,15 @@ import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; -import { ILayerZeroEndpointV2 } from "./interfaces/ILayerZeroEndpointV2.sol"; +import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol"; -import { IReceiveUlnE2, Verification, UlnConfig } from "./interfaces/IReceiveUlnE2.sol"; -import { ISendLib } from "./interfaces/ISendLib.sol"; -import { IDVNFeeLib } from "./interfaces/IDVNFeeLib.sol"; -import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; -import { IDVN } from "./interfaces/IDVN.sol"; +import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { IReceiveUlnE2, Verification, UlnConfig} from "./interfaces/IReceiveUlnE2.sol"; + import "./interfaces/INuffClient.sol"; -import "./utils/PacketV1Codec.sol"; +import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; +import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { using PacketV1Codec for bytes; @@ -144,7 +143,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { uint64 _confirmations, address _receiver, bytes calldata _reqId, - INuffClient.SchnorrSign calldata _signature, + INuffClient.BSLSign calldata _signature, bytes calldata gatewaySignature ) external { require(_isLocal(_dstEid), "Invalid dstEid"); @@ -273,7 +272,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { function _verifyNuffSig( bytes calldata reqId, bytes32 hash, - INuffClient.SchnorrSign calldata sign, + INuffClient.BLSSign calldata sign, address nuffValidGateway, bytes calldata gatewaySignature ) internal { diff --git a/contracts/evm/src/dvn/interfaces/INuffClient.sol b/contracts/evm/src/dvn/interfaces/INuffClient.sol new file mode 100644 index 00000000..a7fd02fc --- /dev/null +++ b/contracts/evm/src/dvn/interfaces/INuffClient.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface INuffClient { + struct BLSSign { + Signature signature; + address owner; + address nonce; + } + + struct Signature { + uint[2] X; + uint[2] Y; + } + + struct PublicKey { + uint x; + uint y; + } + + function nuffVerify( + bytes calldata reqId, + uint256 hash, + BLSSign memory signature, + PublicKey memory pubKey + ) external returns (bool); +} diff --git a/contracts/evm/src/dvn/interfaces/IReceiveUlnE2.sol b/contracts/evm/src/dvn/interfaces/IReceiveUlnE2.sol new file mode 100644 index 00000000..ba666a3c --- /dev/null +++ b/contracts/evm/src/dvn/interfaces/IReceiveUlnE2.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0; + +struct Verification { + bool submitted; + uint64 confirmations; +} + +struct UlnConfig { + uint64 confirmations; + uint8 requiredDVNCount; + uint8 optionalDVNCount; + uint8 optionalDVNThreshold; + address[] requiredDVNs; + address[] optionalDVNs; +} + +/// @dev should be implemented by the ReceiveUln302 contract and future ReceiveUln contracts on EndpointV2 +interface IReceiveUlnE2 { + /// @notice for each dvn to verify the payload + function verify( + bytes calldata _packetHeader, + bytes32 _payloadHash, + uint64 _confirmations + ) external; + + /// @notice verify the payload at endpoint, will check if all DVNs verified + function commitVerification( + bytes calldata _packetHeader, + bytes32 _payloadHash + ) external; + + function hashLookup( + bytes32 _headerHash, + bytes32 _payloadHash, + address _dnv + ) external view returns (Verification memory); + + function getUlnConfig( + address _oapp, + uint32 _remoteEid + ) external view returns (UlnConfig memory rtnConfig); +} diff --git a/contracts/evm/test/dvn/IMBToken.sol b/contracts/evm/test/dvn/IMBToken.sol new file mode 100644 index 00000000..6d412b0b --- /dev/null +++ b/contracts/evm/test/dvn/IMBToken.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppCore.sol"; +import {MessagingFee, SendParam, IOFT} from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; + +interface IMBToken is IOFT { + function mint(address to, uint256 amount) external; + + function burnFrom(address from, uint256 amount) external; +} diff --git a/contracts/evm/test/dvn/IMRC20.sol b/contracts/evm/test/dvn/IMRC20.sol new file mode 100644 index 00000000..a3f03f7b --- /dev/null +++ b/contracts/evm/test/dvn/IMRC20.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +interface IMRC20 is IERC20 { + function mint(address reveiver, uint256 amount) external; + + function burn(uint256 amount) external; + + function burnFrom(address account, uint256 amount) external; +} From b9b81fbac63a61c2d4159b4a19d9cb00a69d773c Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 12:35:30 +0200 Subject: [PATCH 15/62] chore: remove unused tests for now --- contracts/evm/test/dvn/IMBToken.sol | 11 ----------- contracts/evm/test/dvn/IMRC20.sol | 12 ------------ 2 files changed, 23 deletions(-) delete mode 100644 contracts/evm/test/dvn/IMBToken.sol delete mode 100644 contracts/evm/test/dvn/IMRC20.sol diff --git a/contracts/evm/test/dvn/IMBToken.sol b/contracts/evm/test/dvn/IMBToken.sol deleted file mode 100644 index 6d412b0b..00000000 --- a/contracts/evm/test/dvn/IMBToken.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppCore.sol"; -import {MessagingFee, SendParam, IOFT} from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; - -interface IMBToken is IOFT { - function mint(address to, uint256 amount) external; - - function burnFrom(address from, uint256 amount) external; -} diff --git a/contracts/evm/test/dvn/IMRC20.sol b/contracts/evm/test/dvn/IMRC20.sol deleted file mode 100644 index a3f03f7b..00000000 --- a/contracts/evm/test/dvn/IMRC20.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -interface IMRC20 is IERC20 { - function mint(address reveiver, uint256 amount) external; - - function burn(uint256 amount) external; - - function burnFrom(address account, uint256 amount) external; -} From 62994a81dba8ef29777e82e7f08f4dd29e567783 Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 12:38:34 +0200 Subject: [PATCH 16/62] chore: reorder imports --- contracts/evm/src/dvn/NuffDVN.sol | 6 +- contracts/evm/src/dvn/NuffDVNv2.sol | 337 ++++++++++++++++++++++++++++ 2 files changed, 340 insertions(+), 3 deletions(-) create mode 100644 contracts/evm/src/dvn/NuffDVNv2.sol diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol index b4dff1b2..48081373 100644 --- a/contracts/evm/src/dvn/NuffDVN.sol +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -6,13 +6,13 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; +import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; + import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol"; -import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; import { IReceiveUlnE2, Verification, UlnConfig} from "./interfaces/IReceiveUlnE2.sol"; - import "./interfaces/INuffClient.sol"; -import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { diff --git a/contracts/evm/src/dvn/NuffDVNv2.sol b/contracts/evm/src/dvn/NuffDVNv2.sol new file mode 100644 index 00000000..035f1a57 --- /dev/null +++ b/contracts/evm/src/dvn/NuffDVNv2.sol @@ -0,0 +1,337 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; + +import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; +import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; + +import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; +import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol"; +import { IReceiveUlnE2, Verification, UlnConfig} from "./interfaces/IReceiveUlnE2.sol"; +import "./interfaces/INuffClient.sol"; +import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; + +contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { + using PacketV1Codec for bytes; + using ECDSA for bytes32; + using MessageHashUtils for bytes32; + + struct Job { + address origin; + uint32 srcEid; + uint32 dstEid; + bytes packetHeader; + bytes32 payloadHash; + uint64 confirmations; + address sender; + address receiver; + bytes options; + } + + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + bytes32 public constant MESSAGE_LIB_ROLE = keccak256("MESSAGE_LIB_ROLE"); + + ILayerZeroEndpointV2 public layerZeroEndpointV2; + ILayerZeroEndpoint public layerZeroEndpointV1; + uint32 public immutable localEid; + + uint256 public lastJobId; + + uint256 public nuffAppId; + INuffClient.PublicKey public nuffPublicKey; + INuffClient public nuff; + INuffDVNConfig public dvnConfig; + + uint16 public defaultMultiplierBps; + uint64 public quorum; + address public priceFeed; + address public feeLib; + + mapping(uint256 => Job) public jobs; + + // eid => bool + mapping(uint32 => bool) public supportedDstChain; + mapping(uint32 dstEid => DstConfig) public dstConfig; + // srcEid => ( jobId => isVerified ) + mapping(uint32 => mapping(uint256 => bool)) public verifiedJobs; + + event JobAssigned(uint256 jobId); + event Verified(uint32 srcEid, uint256 jobId); + + constructor( + uint256 _nuffAppId, + INuffClient.PublicKey memory _nuffPublicKey, + address _nuff, + address _layerZeroEndpointV2, + address _layerZeroEndpointV1, + address _dvnConfig, + uint16 _defaultMultiplierBps, + uint64 _quorum, + address _priceFeed, + address _feeLib + ) { + nuffAppId = _nuffAppId; + nuffPublicKey = _nuffPublicKey; + nuff = INuffClient(_nuff); + layerZeroEndpointV2 = ILayerZeroEndpointV2(_layerZeroEndpointV2); + layerZeroEndpointV1 = ILayerZeroEndpoint(_layerZeroEndpointV1); + dvnConfig = INuffDVNConfig(_dvnConfig); + localEid = layerZeroEndpointV2.eid(); + defaultMultiplierBps = _defaultMultiplierBps; + quorum = _quorum; + priceFeed = _priceFeed; + feeLib = _feeLib; + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + _grantRole(ADMIN_ROLE, msg.sender); + } + + function assignJob( + AssignJobParam calldata _param, + bytes calldata _options + ) + external + payable + override + onlyRole(MESSAGE_LIB_ROLE) + returns (uint256 fee) + { + require(supportedDstChain[_param.dstEid], "Unsupported chain"); + + uint256 jobId = ++lastJobId; + Job storage newJob = jobs[jobId]; + + newJob.origin = msg.sender; + newJob.srcEid = localEid; + newJob.dstEid = _param.dstEid; + newJob.packetHeader = _param.packetHeader; + newJob.payloadHash = _param.payloadHash; + newJob.confirmations = _param.confirmations; + newJob.sender = _param.sender; + newJob.receiver = address( + uint160(uint256(_param.packetHeader.receiver())) + ); + newJob.options = _options; + + IDVNFeeLib.FeeParams memory feeParams = IDVNFeeLib.FeeParams( + priceFeed, + _param.dstEid, + _param.confirmations, + _param.sender, + quorum, + defaultMultiplierBps + ); + + fee = IDVNFeeLib(feeLib).getFeeOnSend( + feeParams, + dstConfig[_param.dstEid], + _options + ); + + emit JobAssigned(jobId); + } + + function verify( + uint32 _srcEid, + uint32 _dstEid, + uint256 _jobId, + bytes memory _packetHeader, + bytes32 _payloadHash, + uint64 _confirmations, + address _receiver, + bytes calldata _reqId, + INuffClient.SchnorrSign calldata _signature, + bytes calldata gatewaySignature + ) external { + require(_isLocal(_dstEid), "Invalid dstEid"); + require( + !verifiedJobs[_srcEid][_jobId], + "src jobId is already verified" + ); + + verifiedJobs[_srcEid][_jobId] = true; + + bytes32 hash = keccak256( + abi.encodePacked( + nuffAppId, + _reqId, + _srcEid, + _dstEid, + _jobId, + _packetHeader, + _payloadHash, + _confirmations, + _receiver + ) + ); + + _verifyNuffSig( + _reqId, + hash, + _signature, + dvnConfig.shieldNodes(_receiver), + gatewaySignature + ); + + _lzVerify( + _srcEid, + _packetHeader, + _payloadHash, + _confirmations, + _receiver + ); + + emit Verified(_srcEid, _jobId); + } + + function setNuffAppId(uint256 _nuffAppId) external onlyRole(ADMIN_ROLE) { + nuffAppId = _nuffAppId; + } + + function setNuffContract(address addr) external onlyRole(ADMIN_ROLE) { + nuff = INuffClient(addr); + } + + function setNuffPubKey( + INuffClient.PublicKey memory _nuffPublicKey + ) external onlyRole(ADMIN_ROLE) { + nuffPublicKey = _nuffPublicKey; + } + + function setLzEndpointV2( + address _layerZeroEndpointV2 + ) external onlyRole(ADMIN_ROLE) { + layerZeroEndpointV2 = ILayerZeroEndpointV2(_layerZeroEndpointV2); + } + + function updateSupportedDstChain( + uint32 eid, + bool status + ) external onlyRole(ADMIN_ROLE) { + supportedDstChain[eid] = status; + } + + function setPriceFeed(address _priceFeed) external onlyRole(ADMIN_ROLE) { + priceFeed = _priceFeed; + } + + function setDefaultMultiplierBps( + uint16 _multiplierBps + ) external onlyRole(ADMIN_ROLE) { + defaultMultiplierBps = _multiplierBps; + } + + function setDstConfig( + DstConfigParam[] calldata _params + ) external onlyRole(ADMIN_ROLE) { + for (uint256 i = 0; i < _params.length; ++i) { + DstConfigParam calldata param = _params[i]; + dstConfig[param.dstEid] = DstConfig( + param.gas, + param.multiplierBps, + param.floorMarginUSD + ); + } + emit SetDstConfig(_params); + } + + function setFeeLib(address _feeLib) external onlyRole(ADMIN_ROLE) { + feeLib = _feeLib; + } + + function withdrawFee( + address _lib, + address _to, + uint256 _amount + ) external onlyRole(ADMIN_ROLE) { + require(hasRole(MESSAGE_LIB_ROLE, _lib), "Invalid lib"); + ISendLib(_lib).withdrawFee(_to, _amount); + emit Withdraw(_lib, _to, _amount); + } + + function getFee( + uint32 _dstEid, + uint64 _confirmations, + address _sender, + bytes calldata _options + ) external view override returns (uint256 _fee) { + IDVNFeeLib.FeeParams memory params = IDVNFeeLib.FeeParams( + priceFeed, + _dstEid, + _confirmations, + _sender, + quorum, + defaultMultiplierBps + ); + return IDVNFeeLib(feeLib).getFee(params, dstConfig[_dstEid], _options); + } + + function _verifyNuffSig( + bytes calldata reqId, + bytes32 hash, + INuffClient.SchnorrSign calldata sign, + address nuffValidGateway, + bytes calldata gatewaySignature + ) internal { + bool verified = nuff.nuffVerify( + reqId, + uint256(hash), + sign, + nuffPublicKey + ); + require(verified, "Invalid signature!"); + + if (nuffValidGateway != address(0)) { + hash = hash.toEthSignedMessageHash(); + address gatewaySignatureSigner = hash.recover(gatewaySignature); + + require( + gatewaySignatureSigner == nuffValidGateway, + "Gateway is not valid" + ); + } + } + + function _lzVerify( + uint32 _srcEid, + bytes memory _packetHeader, + bytes32 _payloadHash, + uint64 _confirmations, + address _receiver + ) internal { + address receiverLib; + if (_isV2(_srcEid)) { + (receiverLib, ) = layerZeroEndpointV2.getReceiveLibrary( + _receiver, + _srcEid + ); + } else { + receiverLib = layerZeroEndpointV1.getReceiveLibraryAddress( + _receiver + ); + } + + IReceiveUlnE2(receiverLib).verify( + _packetHeader, + _payloadHash, + _confirmations + ); + } + + function _isLocal(uint32 _dstEid) internal view returns (bool) { + if (localEid == _dstEid || localEid == _dstEid + 30000) { + return true; + } + return false; + } + + function _isV2(uint32 _eid) internal pure returns (bool) { + if (_eid > 30000) { + return true; + } + return false; + } +} From 5da950a92430fa4c62f94cb73440255545207901 Mon Sep 17 00:00:00 2001 From: Firat Sertgoz Date: Wed, 16 Oct 2024 09:40:24 +0200 Subject: [PATCH 17/62] wip: fix dockerfile so it doesn't break current indexer --- indexer/FastIndexer.dockerfile | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 indexer/FastIndexer.dockerfile diff --git a/indexer/FastIndexer.dockerfile b/indexer/FastIndexer.dockerfile new file mode 100644 index 00000000..5e898fec --- /dev/null +++ b/indexer/FastIndexer.dockerfile @@ -0,0 +1,47 @@ +FROM rust:1.79 AS builder +WORKDIR /tmp/indexer + +# Copy from nearcore: +# https://github.com/near/nearcore/blob/master/Dockerfile +RUN apt-get update -qq && \ + apt-get install -y \ + git \ + cmake \ + g++ \ + pkg-config \ + libssl-dev \ + curl \ + llvm \ + clang + +COPY ./Cargo.toml . +RUN mkdir ./src && echo "fn main() {}" > ./src/main.rs +RUN cargo build --release -p indexer --features use_fastnear + +COPY . . +RUN touch ./src/main.rs + +RUN cargo build --release -p indexer --features use_fastnear + +FROM debian:bookworm-slim as runtime +WORKDIR /indexer-app + +RUN apt update && apt install -yy openssl ca-certificates jq curl + +COPY --from=builder /tmp/indexer/target/release/indexer . +COPY entrypoint.sh ./entrypoint.sh +RUN chmod +x ./entrypoint.sh + +EXPOSE 3030 + +HEALTHCHECK --interval=20s --timeout=30s --retries=10000 \ + CMD (curl -f -s -X POST -H "Content-Type: application/json" \ + -d '{"jsonrpc":"2.0","method":"block","params":{"finality":"optimistic"},"id":"dontcare"}' \ + http://localhost:3030 | \ + jq -es 'if . == [] then null else .[] | (now - (.result.header.timestamp / 1000000000)) < 10 end') && \ + (curl -f -s -X POST -H "Content-Type: application/json" \ + -d '{"jsonrpc":"2.0","method":"status","params":[],"id":"dontcare"}' \ + http://localhost:3030 | \ + jq -es 'if . == [] then null else .[] | .result.sync_info.syncing == false end') + +ENTRYPOINT [ "./entrypoint.sh" ] From 58d24542e9267359e292e24296edfd4cafaa6ed6 Mon Sep 17 00:00:00 2001 From: Firat Sertgoz Date: Wed, 16 Oct 2024 09:43:02 +0200 Subject: [PATCH 18/62] wip: fix docker compose for setups --- setup/fastnear-indexer/docker-compose.yml | 60 ++++++++ setup/i-r-a/docker-compose.yml | 138 ++++++++++++++++++ .../docker-compose.yml | 94 ++++++++++++ 3 files changed, 292 insertions(+) create mode 100644 setup/fastnear-indexer/docker-compose.yml create mode 100644 setup/i-r-a/docker-compose.yml create mode 100644 setup/indexer-relayer-testnet/docker-compose.yml diff --git a/setup/fastnear-indexer/docker-compose.yml b/setup/fastnear-indexer/docker-compose.yml new file mode 100644 index 00000000..0285e111 --- /dev/null +++ b/setup/fastnear-indexer/docker-compose.yml @@ -0,0 +1,60 @@ +networks: + fastnear: + name: fastnear + driver: bridge + +services: + rmq: + image: rabbitmq:3-management-alpine + container_name: rmq + user: rabbitmq + ports: + - "127.0.0.1:5672:5672" + - "127.0.0.1:15672:15672" + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + healthcheck: + test: rabbitmq-diagnostics check_port_connectivity + interval: 1s + timeout: 3s + retries: 30 + networks: + - fastnear + + fastnear-indexer: + profiles: [indexer] + build: + context: ../../indexer + dockerfile: FastIndexer.dockerfile + container_name: fastnear-indexer + depends_on: + rmq: + condition: service_healthy + ports: + - "127.0.0.1:3030:3030" + - "127.0.0.1:9092:9092" + environment: + - CHAIN_ID=${NEAR_CHAIN_ID:-testnet} + volumes: + - ./:/fastnear-indexer/ + - ${NEAR_HOME_DIR:-~/.near}:/root/.near + - ${NEAR_KEYS_DIR:-~/.near-credentials}:/root/.near-credentials + command: + - run + - --da-contract-ids + - da.testnet + - --rollup-ids + - "2" + - --rmq-address + - "amqp://rmq:5672" + entrypoint: ["/indexer-app/indexer"] + restart: unless-stopped + networks: + - fastnear + logging: + driver: "json-file" + options: + max-size: "1g" + max-file: "10" + compress: "true" \ No newline at end of file diff --git a/setup/i-r-a/docker-compose.yml b/setup/i-r-a/docker-compose.yml new file mode 100644 index 00000000..d526529f --- /dev/null +++ b/setup/i-r-a/docker-compose.yml @@ -0,0 +1,138 @@ +version: "3" + +networks: + fastnear: + name: fastnear + driver: bridge + near-sffl-relayer-rs: + driver: bridge + +services: + rmq: + image: rabbitmq:3-management-alpine + container_name: rmq + user: rabbitmq + ports: + - "127.0.0.1:5672:5672" + - "127.0.0.1:15672:15672" + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + healthcheck: + test: rabbitmq-diagnostics check_port_connectivity + interval: 1s + timeout: 3s + retries: 30 + networks: + - fastnear + + fastnear-indexer: + build: + context: ../../indexer + dockerfile: FastIndexer.dockerfile + container_name: fastnear-indexer + depends_on: + rmq: + condition: service_healthy + ports: + - "127.0.0.1:3030:3030" + - "127.0.0.1:9092:9092" + environment: + - CHAIN_ID=${NEAR_CHAIN_ID:-testnet} + volumes: + - ./:/fastnear-indexer/ + - ${NEAR_HOME_DIR:-~/.near}:/root/.near + - ${NEAR_KEYS_DIR:-~/.near-credentials}:/root/.near-credentials + command: + - run + - --da-contract-ids + - sfrelayer21155420-2.testnet + - --rollup-ids + - "2" + - --rmq-address + - "amqp://rmq:5672" + entrypoint: ["/indexer-app/indexer"] + restart: unless-stopped + networks: + - fastnear + logging: + driver: "json-file" + options: + max-size: "1g" + max-file: "10" + compress: "true" + + relayer_11155420_rs: + build: + context: ../../relayer-rs + dockerfile: Dockerfile + container_name: near-sffl-relayer-rs-21155420 + volumes: + - ${NEAR_KEYS_DIR}:/root/.near-credentials + networks: + - near-sffl-relayer-rs + expose: + - 9094 + command: + - run-args + - --rpc-url + - wss://optimism-sepolia-rpc.publicnode.com + - --da-account-id + - sfrelayer21155420-2.testnet + - --key-path + - /root/.near-credentials/${NEAR_CHAIN_ID}/sfrelayer21155420-2.testnet.json + - --network + - ${NEAR_RPC_URL} + - --metrics-ip-port-address + - near-sffl-relayer-rs-21155420:9094 + restart: unless-stopped + logging: + driver: "json-file" + options: + max-size: "1g" + max-file: "20" + compress: "true" + + operator-rs: + build: + context: ../.. # Set this to the parent directory of both operator-rs and core-rs + dockerfile: operator-rs/Dockerfile + container_name: near-sffl-operator-rs + volumes: + - ./config:/near-sffl/config + - ${NEAR_KEYS_DIR:-~/.near-credentials}:/root/.near-credentials + - ../../tests/keys/bls:/near-sffl/bls_keys + networks: + - fastnear + - near-sffl-relayer-rs + expose: + - ${OPERATOR_METRICS_PORT:-9095} + environment: + - PRODUCTION=${PRODUCTION:-false} + - ETH_RPC_URL=${ETH_RPC_URL:-https://optimism-sepolia-rpc.publicnode.com} + - ETH_WS_URL=${ETH_WS_URL:-wss://optimism-sepolia-rpc.publicnode.com} + - OPERATOR_ADDRESS=${OPERATOR_ADDRESS} + - BLS_KEY_PATH=/near-sffl/bls_keys/1/key.json + - BLS_KEY_PASSWORD_PATH=/near-sffl/bls_keys/1/password.txt + - ECDSA_KEY_PATH=${ECDSA_KEY_PATH:-/root/.near-credentials/ecdsa_key.json} + - AVS_REGISTRY_COORDINATOR_ADDRESS=${AVS_REGISTRY_COORDINATOR_ADDRESS} + - OPERATOR_STATE_RETRIEVER_ADDRESS=${OPERATOR_STATE_RETRIEVER_ADDRESS} + - AGGREGATOR_SERVER_IP_PORT=${AGGREGATOR_SERVER_IP_PORT} + - ENABLE_METRICS=${ENABLE_METRICS:-true} + - EIGEN_METRICS_IP_PORT=${EIGEN_METRICS_IP_PORT:-0.0.0.0:9095} + - NEAR_DA_INDEXER_RMQ_ADDRESS=${NEAR_DA_INDEXER_RMQ_ADDRESS:-amqp://rmq:5672} + - NEAR_DA_INDEXER_ROLLUP_IDS=${NEAR_DA_INDEXER_ROLLUP_IDS:-2} + - ROLLUP_IDS_TO_RPC_URLS=${ROLLUP_IDS_TO_RPC_URLS:-2:https://optimism-sepolia-rpc.publicnode.com} + - TASK_RESPONSE_WAIT_MS=${TASK_RESPONSE_WAIT_MS:-60000} + - TOKEN_STRATEGY_ADDR=${TOKEN_STRATEGY_ADDR:-0x0000000000000000000000000000000000000000} + command: + - run-config + - --path + - /near-sffl/config/operator.yaml + restart: unless-stopped + logging: + driver: "json-file" + options: + max-size: "1g" + max-file: "20" + compress: "true" diff --git a/setup/indexer-relayer-testnet/docker-compose.yml b/setup/indexer-relayer-testnet/docker-compose.yml new file mode 100644 index 00000000..6962b6c8 --- /dev/null +++ b/setup/indexer-relayer-testnet/docker-compose.yml @@ -0,0 +1,94 @@ +version: "3" + +networks: + fastnear: + name: fastnear + driver: bridge + near-sffl-relayer-rs: + driver: bridge + +services: + rmq: + image: rabbitmq:3-management-alpine + container_name: rmq + user: rabbitmq + ports: + - "127.0.0.1:5672:5672" + - "127.0.0.1:15672:15672" + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + healthcheck: + test: rabbitmq-diagnostics check_port_connectivity + interval: 1s + timeout: 3s + retries: 30 + networks: + - fastnear + + fastnear-indexer: + build: + context: ../../indexer + dockerfile: FastIndexer.dockerfile + container_name: fastnear-indexer + depends_on: + rmq: + condition: service_healthy + ports: + - "127.0.0.1:3030:3030" + - "127.0.0.1:9092:9092" + environment: + - CHAIN_ID=${NEAR_CHAIN_ID:-testnet} + volumes: + - ./:/fastnear-indexer/ + - ${NEAR_HOME_DIR:-~/.near}:/root/.near + - ${NEAR_KEYS_DIR:-~/.near-credentials}:/root/.near-credentials + command: + - run + - --da-contract-ids + - sfrelayer21155420-2.testnet + - --rollup-ids + - "2" + - --rmq-address + - "amqp://rmq:5672" + entrypoint: ["/indexer-app/indexer"] + restart: unless-stopped + networks: + - fastnear + logging: + driver: "json-file" + options: + max-size: "1g" + max-file: "10" + compress: "true" + + relayer_11155420_rs: + build: + context: ../../relayer-rs + dockerfile: Dockerfile + container_name: near-sffl-relayer-rs-21155420 + volumes: + - ${NEAR_KEYS_DIR}:/root/.near-credentials + networks: + - near-sffl-relayer-rs + expose: + - 9094 + command: + - run-args + - --rpc-url + - wss://optimism-sepolia-rpc.publicnode.com + - --da-account-id + - sfrelayer21155420-2.testnet + - --key-path + - /root/.near-credentials/${NEAR_CHAIN_ID}/sfrelayer21155420-2.testnet.json + - --network + - ${NEAR_RPC_URL} + - --metrics-ip-port-address + - near-sffl-relayer-rs-21155420:9094 + restart: unless-stopped + logging: + driver: "json-file" + options: + max-size: "1g" + max-file: "20" + compress: "true" \ No newline at end of file From c5359dc8155ccb447e6bab82335a4376be9731c4 Mon Sep 17 00:00:00 2001 From: firatsertgoz Date: Wed, 16 Oct 2024 10:20:01 +0200 Subject: [PATCH 19/62] wip: big cargo clean up --- Cargo.toml | 24 ++++++++++++++++++++++++ core-rs/Cargo.toml | 23 +++++++++++++++++++++++ indexer/Cargo.toml | 16 ++++++++-------- operator-rs/Cargo.toml | 36 ++++++++++++++++++++++++++++++++++++ relayer-rs/Cargo.toml | 28 ++++++++++++++++++++++++++++ 5 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 core-rs/Cargo.toml create mode 100644 operator-rs/Cargo.toml create mode 100644 relayer-rs/Cargo.toml diff --git a/Cargo.toml b/Cargo.toml index 3fa805b7..9ebdd5ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,5 +13,29 @@ version = "0.0.1" edition = "2021" repository = "https://github.com/NethermindEth/near-sffl" +[workspace.dependencies] +alloy = { version = "0.4.2", features = ["full", "node-bindings", "rpc-types-debug", "rpc-types-trace", "json-rpc", "rpc-client", "serde"] } +alloy-primitives = "0.8.3" +alloy-rpc-client = "0.4.2" +alloy-rpc-types = "0.4.2" +alloy-transport-ws = "0.4.2" +alloy-rlp = "0.3.8" +tokio = { version = "1.0", features = ["full"] } +prometheus = "0.13" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +anyhow = "1.0" +tracing = "0.1" +tracing-subscriber = "0.3" +futures-util = "0.3.30" +eyre = "0.6" +bincode = "1.3" +serde_yaml = "0.9" +clap = "4.5.18" +tempfile = "3.10.0" +async-trait = "0.1" +log = "0.4" +core-rs = { path = "core-rs" } + [patch.crates-io] parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } diff --git a/core-rs/Cargo.toml b/core-rs/Cargo.toml new file mode 100644 index 00000000..590b9bda --- /dev/null +++ b/core-rs/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "core-rs" +version = "0.1.0" +edition = "2021" + +[dependencies] +tokio = { workspace = true } +async-trait = { workspace = true } +thiserror = "1.0" +anyhow = { workspace = true } + +alloy = { workspace = true } +mockall = "0.13.0" + +serde = { workspace = true } +serde_json = { workspace = true } +sha2 = "0.10.6" + +log = { workspace = true } +futures-util = { workspace = true } + +[dev-dependencies] +tokio-test = "0.4" diff --git a/indexer/Cargo.toml b/indexer/Cargo.toml index 5591fee0..8d91e8a9 100644 --- a/indexer/Cargo.toml +++ b/indexer/Cargo.toml @@ -9,29 +9,29 @@ edition = "2021" actix = "0.13.1" actix-web = "4.5.1" futures = "0.3.5" -tokio = { version = "1.28.2", features = ["sync", "time"] } +tokio = { workspace = true } deadpool = "0.10.0" lapin = "2.3.1" deadpool-lapin = "0.11.0" tokio-executor-trait = "2.1.0" tokio-reactor-trait = "1.1.0" -prometheus = "0.13.3" +prometheus = { workspace = true } -clap = { version = "4.4.11", features = ["color", "derive", "env"] } +clap = { workspace = true } openssl-probe = "0.1.4" -serde = { version = "1", features = ["derive"] } -serde_json = "1.0.68" +serde = { workspace = true } +serde_json = { workspace = true } -tracing = { version = "0.1.36", features = ["std"] } +tracing = { workspace = true } thiserror = "1.0.56" -anyhow = "1.0.79" +anyhow = { workspace = true } near-indexer = { git = "https://github.com/near/nearcore", rev = "b3d767e7664d8e123a35313ccc66c8ac1afb2058" } near-client = { git = "https://github.com/near/nearcore", rev = "b3d767e7664d8e123a35313ccc66c8ac1afb2058" } near-o11y = { git = "https://github.com/near/nearcore", rev = "b3d767e7664d8e123a35313ccc66c8ac1afb2058" } near-client-primitives = { git = "https://github.com/near/nearcore", rev = "b3d767e7664d8e123a35313ccc66c8ac1afb2058" } borsh = { version = "1.0.0", features = ["derive", "rc"] } -serde_yaml = "0.9.34" +serde_yaml = { workspace = true } [dev-dependencies] near-crypto = { git = "https://github.com/near/nearcore", rev = "b3d767e7664d8e123a35313ccc66c8ac1afb2058" } diff --git a/operator-rs/Cargo.toml b/operator-rs/Cargo.toml new file mode 100644 index 00000000..3b65eeab --- /dev/null +++ b/operator-rs/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "operator-rs" +version = "0.1.0" +edition = "2021" + +[dependencies] +alloy = { workspace = true } +alloy-primitives = { workspace = true } +alloy-rpc-client = { workspace = true } +alloy-rpc-types = { workspace = true } +alloy-transport-ws = { workspace = true } +alloy-rlp = { workspace = true } +tokio = { workspace = true } +prometheus = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +anyhow = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +futures-util = { workspace = true } +eyre = { workspace = true } +bincode = { workspace = true } +serde_yaml = { workspace = true } +clap = { workspace = true } +tempfile = { workspace = true } +core-rs = { workspace = true } + +# Dependencies specific to operator-rs +near-da-rpc = { git = "https://github.com/Nuffle-Labs/data-availability", branch = "main" } +near-da-primitives = { git = "https://github.com/Nuffle-Labs/data-availability", branch = "main" } +warp = "0.3" +hex = "0.4" +rand = "0.8" +eigensdk = { version = "0.1.0", features = ["full", "types", "crypto-bls", "utils"] } +borsh = "1.5.1" +lapin = "2.3.1" diff --git a/relayer-rs/Cargo.toml b/relayer-rs/Cargo.toml new file mode 100644 index 00000000..0fe2c99b --- /dev/null +++ b/relayer-rs/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "relayer-rs" +version = "0.1.0" +edition = "2021" + +[dependencies] +alloy = { workspace = true } +alloy-primitives = { workspace = true } +alloy-rpc-client = { workspace = true } +alloy-rpc-types = { workspace = true } +alloy-transport-ws = { workspace = true } +alloy-rlp = { workspace = true } +near-da-rpc = { git = "https://github.com/Nuffle-Labs/data-availability", branch = "main" } +near-da-primitives = { git = "https://github.com/Nuffle-Labs/data-availability", branch = "main" } +tokio = { workspace = true } +prometheus = { workspace = true } +warp = "0.3" +serde = { workspace = true } +serde_json = { workspace = true } +anyhow = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +futures-util = { workspace = true } +eyre = { workspace = true } +bincode = { workspace = true } +serde_yaml = { workspace = true } +clap = { workspace = true } +tempfile = { workspace = true } From f1624fded84db8fe2adad3c17a9855298a222de6 Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 13:27:18 +0200 Subject: [PATCH 20/62] chore: remove unused --- contracts/evm/src/dvn/NuffDVN.sol | 2 +- contracts/evm/src/dvn/interfaces/IDVN.sol | 27 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 contracts/evm/src/dvn/interfaces/IDVN.sol diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol index 48081373..0830a13e 100644 --- a/contracts/evm/src/dvn/NuffDVN.sol +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -11,7 +11,7 @@ import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol"; -import { IReceiveUlnE2, Verification, UlnConfig} from "./interfaces/IReceiveUlnE2.sol"; +import { IReceiveUlnE2 } from "./interfaces/IReceiveUlnE2.sol"; import "./interfaces/INuffClient.sol"; import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; diff --git a/contracts/evm/src/dvn/interfaces/IDVN.sol b/contracts/evm/src/dvn/interfaces/IDVN.sol new file mode 100644 index 00000000..d78f35a8 --- /dev/null +++ b/contracts/evm/src/dvn/interfaces/IDVN.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.8.0; + +import { IWorker } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/interfaces/IWorker.sol"; +import {ILayerZeroDVN} from "./ILayerZeroDVN.sol"; + +interface IDVN is IWorker, ILayerZeroDVN { + struct DstConfigParam { + uint32 dstEid; + uint64 gas; + uint16 multiplierBps; + uint128 floorMarginUSD; + } + + struct DstConfig { + uint64 gas; + uint16 multiplierBps; + uint128 floorMarginUSD; // uses priceFeed PRICE_RATIO_DENOMINATOR + } + + event SetDstConfig(DstConfigParam[] params); + + function dstConfig( + uint32 _dstEid + ) external view returns (uint64, uint16, uint128); +} From 5bf79ef5fcacfd37e65d6e8fe95c5fbab1d38729 Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 16:37:59 +0200 Subject: [PATCH 21/62] chore: add tests to manual decoding --- workers/src/chain/contracts.rs | 2 +- workers/src/data/extractors.rs | 140 +++++++++++++++++++++++++++++++-- 2 files changed, 134 insertions(+), 8 deletions(-) diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index 513b6051..d340fc2c 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -111,7 +111,7 @@ pub async fn verify( ) -> Result { //// Create the hash of the payload let payload_hash = keccak256(payload); - // + // Call the `verified` function on the contract let _ = contract .function( diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index d47fa87a..405dc494 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -1,7 +1,7 @@ //! Extract data from encoded payloads. //! //! FIXME: couldn't make it work with `alloy`+ABI, so -//! using manual extracting for now. +//! using manual extracting for now. Added tests. //! Re-check if it can work that way. use alloy::primitives::FixedBytes; @@ -11,13 +11,14 @@ use bytes::{Buf, BufMut, BytesMut}; const MINIMUM_PACKET_LENGTH: usize = 93; // 1 + 8 + 4 + 32 + 4 + 32 + 32 /// The whole header from the message. +#[derive(Debug)] pub struct Header { version: u8, nonce: u64, src_eid: u32, - sender_addr: u32, + sender_addr: FixedBytes<20>, dst_eid: u32, - rcv_addr: FixedBytes<32>, + rcv_addr: FixedBytes<20>, guid: FixedBytes<32>, } @@ -27,7 +28,7 @@ impl Header { header.put_u8(self.version); header.put_u64(self.nonce); header.put_u32(self.src_eid); - header.put_u32(self.sender_addr); + header.put_slice(self.sender_addr.as_ref()); header.put_u32(self.dst_eid); header.put_slice(self.rcv_addr.as_ref()); header.put_slice(self.guid.as_ref()); @@ -44,9 +45,11 @@ pub fn extract_header(raw_packet: &[u8]) -> Option
{ let version = buffered_packet.get_u8(); // version let nonce = buffered_packet.get_u64(); // nonce let src_eid = buffered_packet.get_u32(); // src_eid - let sender_addr = buffered_packet.get_u32(); // sender address + buffered_packet.advance(12); // skip padding + let sender_addr: FixedBytes<20> = FixedBytes::from_slice(buffered_packet.split_to(20).as_ref()); let dst_eid = buffered_packet.get_u32(); // dst_eid - let rcv_addr: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).as_ref()); + buffered_packet.advance(12); // skip padding + let rcv_addr: FixedBytes<20> = FixedBytes::from_slice(buffered_packet.split_to(20).as_ref()); let guid: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).freeze().iter().as_slice()); Some(Header { @@ -66,8 +69,131 @@ pub fn extract_message(raw_packet: &[u8]) -> Option> { return None; } let mut buffered_packet = BytesMut::from(raw_packet); - buffered_packet.advance(81); // version + buffered_packet.advance(113); let message = buffered_packet.freeze().to_vec(); Some(message) } + +#[cfg(test)] +mod tests { + use super::*; + use alloy::hex; + + //0x010000000000001CE00000759E00000000000000000000000026DA582889F59EAAE9DA1F063BE0140CD93E6A4F0000759600000000000000000000000026DA582889F59EAAE9DA1F063BE0140CD93E6A4F58565502B0810F2B41F18679D3BFB5B703296753807465C02C37E23364EAE7D8 + + /// Test the extraction of the message from a packet. + /// + /// An encodedPayload from a transaction is used as mockup data, + /// and to test that it correctly decodes it, a LayerZero's library + /// in typescript has been used to check it: + /// + /// ```typescript + /// import { PacketSerializer } from "@layerzerolabs/lz-v2-utilities"; + /// + /// const des = PacketSerializer.deserialize("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"); + /// + /// console.log(des); + /// ``` + /// + /// And its output is: + /// ``` + /// { + /// version: 1, + /// nonce: '76929', + /// srcEid: 30110, + /// sender: '0x00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd', + /// dstEid: 30184, + /// receiver: '0x0000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e47', + /// guid: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b', + /// message: '0x0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00', + /// payload: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00' + /// } + /// ``` + /// + /// The payload is the concatenation of the guid and the message. + #[test] + fn extract_msg() { + // GIVEN: a known encodedPayload + let hex_payload = "0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"; + + // WHEN: the values are extracted from it. + let payload: Vec = hex::decode(hex_payload).unwrap(); + let message = extract_message(&payload).unwrap(); + + // THEN: the message is correctly extracted. + // Check the extracted value isn't altered. + assert!(hex_payload.contains(&hex::encode(&message))); + // Check the obtained value is the same as the expected one (see above to know + // where this comes from). + let expected_message = hex::decode("0x0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00").unwrap(); + assert_eq!(message, expected_message); + } + + /// Test the extraction of the message from a packet. + /// + /// An encodedPayload from a transaction is used as mockup data, + /// and to test that it correctly decodes it, a LayerZero's library + /// in typescript has been used to check it: + /// + /// ```typescript + /// import { PacketSerializer } from "@layerzerolabs/lz-v2-utilities"; + /// + /// const des = PacketSerializer.deserialize("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"); + /// + /// console.log(des); + /// ``` + /// + /// And its output is: + /// ``` + /// { + /// version: 1, + /// nonce: '76929', + /// srcEid: 30110, + /// sender: '0x00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd', + /// dstEid: 30184, + /// receiver: '0x0000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e47', + /// guid: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b', + /// message: '0x0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00', + /// payload: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00' + /// } + /// ``` + #[test] + fn extract_hdr() { + // GIVEN: a known encodedPayload + let payload: Vec = hex::decode("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00").unwrap(); + + // WHEN: the header is extracted from it. + let header = extract_header(&payload).unwrap(); + + // THEN: the header values are correctly extracted. + assert_eq!(header.version, 1); + assert_eq!(header.nonce, 76929); + assert_eq!(header.src_eid, 30110); + assert_eq!( + header.sender_addr, + FixedBytes::<20>::from_slice( + hex::decode("19cfce47ed54a88614648dc3f19a5980097007dd") + .unwrap() + .as_ref() + ) + ); + assert_eq!(header.dst_eid, 30184); + assert_eq!( + header.rcv_addr, + FixedBytes::<20>::from_slice( + hex::decode("5634c4a5fed09819e3c46d86a965dd9447d86e47") + .unwrap() + .as_ref() + ) + ); + assert_eq!( + header.guid, + FixedBytes::<32>::from_slice( + hex::decode("9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b") + .unwrap() + .as_ref() + ) + ); + } +} From 90c0e70023b6b4190bcbfab9179486f8e07c1aee Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 16:41:02 +0200 Subject: [PATCH 22/62] chore: use const instead of magic number --- workers/src/data/extractors.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index 405dc494..6c96a5e3 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -8,7 +8,7 @@ use alloy::primitives::FixedBytes; use bytes::{Buf, BufMut, BytesMut}; /// Minimum length of a packet. -const MINIMUM_PACKET_LENGTH: usize = 93; // 1 + 8 + 4 + 32 + 4 + 32 + 32 +const MINIMUM_PACKET_LENGTH: usize = 113; // 1 + 8 + 4 + 32 + 4 + 32 + 32 /// The whole header from the message. #[derive(Debug)] @@ -69,7 +69,7 @@ pub fn extract_message(raw_packet: &[u8]) -> Option> { return None; } let mut buffered_packet = BytesMut::from(raw_packet); - buffered_packet.advance(113); + buffered_packet.advance(MINIMUM_PACKET_LENGTH); let message = buffered_packet.freeze().to_vec(); Some(message) From 1433aac4c0b494de28f62e32b4b55c17a82f09ec Mon Sep 17 00:00:00 2001 From: Lozano Date: Thu, 17 Oct 2024 16:47:38 +0200 Subject: [PATCH 23/62] chore: comments --- workers/src/data/extractors.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index 6c96a5e3..6a9320e5 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -65,10 +65,12 @@ pub fn extract_header(raw_packet: &[u8]) -> Option
{ /// When feeded a packet, return the whole message, which is everything but the header. pub fn extract_message(raw_packet: &[u8]) -> Option> { + // If there's no message to be loaded, return `None`. if raw_packet.len() < MINIMUM_PACKET_LENGTH { return None; } let mut buffered_packet = BytesMut::from(raw_packet); + // Skip the header. buffered_packet.advance(MINIMUM_PACKET_LENGTH); let message = buffered_packet.freeze().to_vec(); From 9293854c6e55ace92be967e6338a23dfcad684f0 Mon Sep 17 00:00:00 2001 From: Lozano Date: Fri, 18 Oct 2024 01:35:05 +0200 Subject: [PATCH 24/62] chore: address pr comments --- Cargo.lock | 57 ++++++++++-- contracts/evm/src/dvn/NuffDVN.sol | 27 ++---- contracts/evm/src/dvn/NuffDVNv2.sol | 24 ++--- contracts/evm/src/dvn/interfaces/IDVN.sol | 27 ------ .../evm/src/dvn/interfaces/INuffClient.sol | 2 +- .../evm/src/dvn/interfaces/IReceiveUlnE2.sol | 43 --------- workers/Cargo.toml | 17 ++-- workers/src/bin/dvn.rs | 5 +- workers/src/data/extractors.rs | 91 ++++++------------- 9 files changed, 107 insertions(+), 186 deletions(-) delete mode 100644 contracts/evm/src/dvn/interfaces/IDVN.sol delete mode 100644 contracts/evm/src/dvn/interfaces/IReceiveUlnE2.sol diff --git a/Cargo.lock b/Cargo.lock index 578957ea..02c46931 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -358,7 +358,9 @@ dependencies = [ "alloy-core", "alloy-eips", "alloy-genesis", + "alloy-json-rpc", "alloy-network", + "alloy-node-bindings", "alloy-provider", "alloy-pubsub", "alloy-rpc-client", @@ -562,6 +564,23 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-node-bindings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f1334a738aa1710cb8227441b3fcc319202ce78e967ef37406940242df4a454" +dependencies = [ + "alloy-genesis", + "alloy-primitives", + "k256", + "rand", + "serde_json", + "tempfile", + "thiserror", + "tracing", + "url", +] + [[package]] name = "alloy-primitives" version = "0.8.9" @@ -602,10 +621,14 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", + "alloy-node-bindings", "alloy-primitives", "alloy-pubsub", "alloy-rpc-client", + "alloy-rpc-types-anvil", "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-signer-local", "alloy-transport", "alloy-transport-http", "alloy-transport-ipc", @@ -702,6 +725,18 @@ dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-anvil" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d780adaa5d95b07ad92006b2feb68ecfa7e2015f7d5976ceaac4c906c73ebd07" +dependencies = [ + "alloy-primitives", "alloy-serde", "serde", ] @@ -739,6 +774,20 @@ dependencies = [ "serde_json", ] +[[package]] +name = "alloy-rpc-types-trace" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "017cad3e5793c5613588c1f9732bcbad77e820ba7d0feaba3527749f856fdbc5" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "alloy-serde" version = "0.4.2" @@ -2928,12 +2977,6 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - [[package]] name = "dunce" version = "1.0.5" @@ -9792,10 +9835,8 @@ dependencies = [ "blsful", "bytes", "config", - "dotenvy", "eyre", "futures", - "hex", "serde", "serde_json", "tokio", diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol index 0830a13e..51fc176c 100644 --- a/contracts/evm/src/dvn/NuffDVN.sol +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -1,21 +1,21 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import { ILayerZeroEndpoint } from "@layerzerolabs/lz-evm-v1-0.7/contracts/interfaces/ILayerZeroEndpoint.sol"; import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; -import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; -import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol"; -import { IReceiveUlnE2 } from "./interfaces/IReceiveUlnE2.sol"; -import "./interfaces/INuffClient.sol"; +import { INuffClient } from "./interfaces/INuffClient.sol"; import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; -contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { +import { ReentrancyGuard } from "@solady/src/utils/ReentrancyGuard.sol"; + +contract NuffDVN is ILayerZeroDVN, AccessControl, IDVN { using PacketV1Codec for bytes; using ECDSA for bytes32; using MessageHashUtils for bytes32; @@ -104,6 +104,8 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { uint256 jobId = ++lastJobId; Job storage newJob = jobs[jobId]; + require(_param.sender != address(0), "Invalid sender address"); + newJob.origin = msg.sender; newJob.srcEid = localEid; newJob.dstEid = _param.dstEid; @@ -145,7 +147,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { bytes calldata _reqId, INuffClient.BSLSign calldata _signature, bytes calldata gatewaySignature - ) external { + ) external ReentrancyGuard.nonReentrant { require(_isLocal(_dstEid), "Invalid dstEid"); require( !verifiedJobs[_srcEid][_jobId], @@ -273,7 +275,6 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { bytes calldata reqId, bytes32 hash, INuffClient.BLSSign calldata sign, - address nuffValidGateway, bytes calldata gatewaySignature ) internal { bool verified = nuff.nuffVerify( @@ -283,16 +284,6 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { nuffPublicKey ); require(verified, "Invalid signature!"); - - if (nuffValidGateway != address(0)) { - hash = hash.toEthSignedMessageHash(); - address gatewaySignatureSigner = hash.recover(gatewaySignature); - - require( - gatewaySignatureSigner == nuffValidGateway, - "Gateway is not valid" - ); - } } function _lzVerify( diff --git a/contracts/evm/src/dvn/NuffDVNv2.sol b/contracts/evm/src/dvn/NuffDVNv2.sol index 035f1a57..634e3c7c 100644 --- a/contracts/evm/src/dvn/NuffDVNv2.sol +++ b/contracts/evm/src/dvn/NuffDVNv2.sol @@ -1,18 +1,19 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; -import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { IDVN } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IDVN.sol"; +import { ILayerZeroDVN } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/interfaces/ILayerZeroDVN.sol"; +import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; +import { IReceiveUlnE2 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IReceiveUlnE2.sol"; +import { IDVNFeeLib } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IDVNFeeLib.sol"; -import { ILayerZeroEndpoint } from "./interfaces/ILayerZeroEndpoint.sol"; -import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol"; -import { IReceiveUlnE2, Verification, UlnConfig} from "./interfaces/IReceiveUlnE2.sol"; -import "./interfaces/INuffClient.sol"; +import { INuffClient } from "./interfaces/INuffClient.sol"; import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { @@ -273,7 +274,6 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { bytes calldata reqId, bytes32 hash, INuffClient.SchnorrSign calldata sign, - address nuffValidGateway, bytes calldata gatewaySignature ) internal { bool verified = nuff.nuffVerify( @@ -283,16 +283,6 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { nuffPublicKey ); require(verified, "Invalid signature!"); - - if (nuffValidGateway != address(0)) { - hash = hash.toEthSignedMessageHash(); - address gatewaySignatureSigner = hash.recover(gatewaySignature); - - require( - gatewaySignatureSigner == nuffValidGateway, - "Gateway is not valid" - ); - } } function _lzVerify( diff --git a/contracts/evm/src/dvn/interfaces/IDVN.sol b/contracts/evm/src/dvn/interfaces/IDVN.sol deleted file mode 100644 index d78f35a8..00000000 --- a/contracts/evm/src/dvn/interfaces/IDVN.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity >=0.8.0; - -import { IWorker } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/interfaces/IWorker.sol"; -import {ILayerZeroDVN} from "./ILayerZeroDVN.sol"; - -interface IDVN is IWorker, ILayerZeroDVN { - struct DstConfigParam { - uint32 dstEid; - uint64 gas; - uint16 multiplierBps; - uint128 floorMarginUSD; - } - - struct DstConfig { - uint64 gas; - uint16 multiplierBps; - uint128 floorMarginUSD; // uses priceFeed PRICE_RATIO_DENOMINATOR - } - - event SetDstConfig(DstConfigParam[] params); - - function dstConfig( - uint32 _dstEid - ) external view returns (uint64, uint16, uint128); -} diff --git a/contracts/evm/src/dvn/interfaces/INuffClient.sol b/contracts/evm/src/dvn/interfaces/INuffClient.sol index a7fd02fc..0b2ce1d7 100644 --- a/contracts/evm/src/dvn/interfaces/INuffClient.sol +++ b/contracts/evm/src/dvn/interfaces/INuffClient.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity ^0.8.20; interface INuffClient { struct BLSSign { diff --git a/contracts/evm/src/dvn/interfaces/IReceiveUlnE2.sol b/contracts/evm/src/dvn/interfaces/IReceiveUlnE2.sol deleted file mode 100644 index ba666a3c..00000000 --- a/contracts/evm/src/dvn/interfaces/IReceiveUlnE2.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0; - -struct Verification { - bool submitted; - uint64 confirmations; -} - -struct UlnConfig { - uint64 confirmations; - uint8 requiredDVNCount; - uint8 optionalDVNCount; - uint8 optionalDVNThreshold; - address[] requiredDVNs; - address[] optionalDVNs; -} - -/// @dev should be implemented by the ReceiveUln302 contract and future ReceiveUln contracts on EndpointV2 -interface IReceiveUlnE2 { - /// @notice for each dvn to verify the payload - function verify( - bytes calldata _packetHeader, - bytes32 _payloadHash, - uint64 _confirmations - ) external; - - /// @notice verify the payload at endpoint, will check if all DVNs verified - function commitVerification( - bytes calldata _packetHeader, - bytes32 _payloadHash - ) external; - - function hashLookup( - bytes32 _headerHash, - bytes32 _payloadHash, - address _dnv - ) external view returns (Verification memory); - - function getUlnConfig( - address _oapp, - uint32 _remoteEid - ) external view returns (UlnConfig memory rtnConfig); -} diff --git a/workers/Cargo.toml b/workers/Cargo.toml index e4414a77..714536d9 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -8,18 +8,15 @@ name = "dvn" path = "src/bin/dvn.rs" [dependencies] -alloy = { version = "0.4.2", features = ["full"] } +alloy.workspace = true alloy-json-abi = "0.8.8" -#alloy-rlp = "0.3.8" blsful = "2.5.7" bytes = "1.7.2" config = { version = "0.14.0", features = ["toml"] } -dotenvy = "0.15.7" -eyre = "0.6.12" +eyre.workspace = true futures = "0.3.31" -hex = "0.4.3" -serde = { version = "1.0.210", features = ["derive"] } -serde_json = "1.0.128" -tokio = { version = "1.40.0", features = ["full"] } -tracing = "0.1.40" -tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +serde.workspace = true +serde_json.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-subscriber = {workspace = true, features = ["env-filter"] } diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 5f41ce6a..f6752025 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -46,7 +46,10 @@ async fn main() -> Result<()> { dvn_worker.listening(); tokio::select! { Some(log) = endpoint_stream.next() => { - match log.log_decode::() { + match log.log_decode::() { + Err(e) => { + error!("Received a `PacketSent` event but failed to decode it: {:?}", e); + } Ok(inner_log) => { debug!("PacketSent event found and decoded."); dvn_worker.packet_received(inner_log.data().clone()); diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index 6a9320e5..f154e0a2 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -10,7 +10,7 @@ use bytes::{Buf, BufMut, BytesMut}; /// Minimum length of a packet. const MINIMUM_PACKET_LENGTH: usize = 113; // 1 + 8 + 4 + 32 + 4 + 32 + 32 -/// The whole header from the message. +/// The whole header from the `Packet`. #[derive(Debug)] pub struct Header { version: u8, @@ -77,43 +77,40 @@ pub fn extract_message(raw_packet: &[u8]) -> Option> { Some(message) } +/// Test the extraction of the header and the message from a packet. +/// +/// An encodedPayload from a transaction is used as mockup data, +/// and to test that it correctly decodes it, a LayerZero's library +/// in typescript has been used to check it: +/// +/// ```typescript +/// import { PacketSerializer } from "@layerzerolabs/lz-v2-utilities"; +/// +/// const des = PacketSerializer.deserialize("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"); +/// +/// console.log(des); +/// ``` +/// +/// And its output is: +/// ``` +/// { +/// version: 1, +/// nonce: '76929', +/// srcEid: 30110, +/// sender: '0x00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd', +/// dstEid: 30184, +/// receiver: '0x0000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e47', +/// guid: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b', +/// message: '0x0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00', +/// payload: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00' +/// } +/// ``` +/// Note: The payload is the concatenation of the guid and the message. #[cfg(test)] mod tests { use super::*; use alloy::hex; - //0x010000000000001CE00000759E00000000000000000000000026DA582889F59EAAE9DA1F063BE0140CD93E6A4F0000759600000000000000000000000026DA582889F59EAAE9DA1F063BE0140CD93E6A4F58565502B0810F2B41F18679D3BFB5B703296753807465C02C37E23364EAE7D8 - - /// Test the extraction of the message from a packet. - /// - /// An encodedPayload from a transaction is used as mockup data, - /// and to test that it correctly decodes it, a LayerZero's library - /// in typescript has been used to check it: - /// - /// ```typescript - /// import { PacketSerializer } from "@layerzerolabs/lz-v2-utilities"; - /// - /// const des = PacketSerializer.deserialize("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"); - /// - /// console.log(des); - /// ``` - /// - /// And its output is: - /// ``` - /// { - /// version: 1, - /// nonce: '76929', - /// srcEid: 30110, - /// sender: '0x00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd', - /// dstEid: 30184, - /// receiver: '0x0000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e47', - /// guid: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b', - /// message: '0x0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00', - /// payload: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00' - /// } - /// ``` - /// - /// The payload is the concatenation of the guid and the message. #[test] fn extract_msg() { // GIVEN: a known encodedPayload @@ -132,34 +129,6 @@ mod tests { assert_eq!(message, expected_message); } - /// Test the extraction of the message from a packet. - /// - /// An encodedPayload from a transaction is used as mockup data, - /// and to test that it correctly decodes it, a LayerZero's library - /// in typescript has been used to check it: - /// - /// ```typescript - /// import { PacketSerializer } from "@layerzerolabs/lz-v2-utilities"; - /// - /// const des = PacketSerializer.deserialize("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"); - /// - /// console.log(des); - /// ``` - /// - /// And its output is: - /// ``` - /// { - /// version: 1, - /// nonce: '76929', - /// srcEid: 30110, - /// sender: '0x00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd', - /// dstEid: 30184, - /// receiver: '0x0000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e47', - /// guid: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b', - /// message: '0x0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00', - /// payload: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00' - /// } - /// ``` #[test] fn extract_hdr() { // GIVEN: a known encodedPayload From ce2d6e6bfb0d465f13cd403766fcefc043fafe10 Mon Sep 17 00:00:00 2001 From: Lozano Date: Fri, 18 Oct 2024 17:45:02 +0200 Subject: [PATCH 25/62] chore: address pr comments --- contracts/evm/src/dvn/NuffDVN.sol | 8 +- contracts/evm/src/dvn/NuffDVNv2.sol | 26 +++-- .../evm/src/dvn/interfaces/INuffDVNConfig.sol | 9 ++ workers/abi/ArbitrumL0V2Endpoint.json | 1 - workers/abi/ArbitrumReceiveLibUln302.json | 1 - workers/abi/ArbitrumSendLibUln302.json | 1 - workers/src/abi.rs | 6 +- workers/src/bin/dvn.rs | 104 ++++++++++-------- workers/src/chain/connections.rs | 4 +- workers/src/chain/contracts.rs | 13 ++- workers/src/data/extractors.rs | 52 ++++++++- 11 files changed, 151 insertions(+), 74 deletions(-) create mode 100644 contracts/evm/src/dvn/interfaces/INuffDVNConfig.sol delete mode 100644 workers/abi/ArbitrumL0V2Endpoint.json delete mode 100644 workers/abi/ArbitrumReceiveLibUln302.json delete mode 100644 workers/abi/ArbitrumSendLibUln302.json diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol index 51fc176c..197af729 100644 --- a/contracts/evm/src/dvn/NuffDVN.sol +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -15,7 +15,7 @@ import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; import { ReentrancyGuard } from "@solady/src/utils/ReentrancyGuard.sol"; -contract NuffDVN is ILayerZeroDVN, AccessControl, IDVN { +contract NuffDVN is ILayerZeroDVN, AccessControl, ReentrancyGuard { using PacketV1Codec for bytes; using ECDSA for bytes32; using MessageHashUtils for bytes32; @@ -51,6 +51,7 @@ contract NuffDVN is ILayerZeroDVN, AccessControl, IDVN { address public priceFeed; address public feeLib; + // FIXME: everything is getting stored in cold storage; use a buffer instead mapping(uint256 => Job) public jobs; // eid => bool @@ -94,6 +95,7 @@ contract NuffDVN is ILayerZeroDVN, AccessControl, IDVN { bytes calldata _options ) external + nonReentrant payable override onlyRole(MESSAGE_LIB_ROLE) @@ -147,7 +149,7 @@ contract NuffDVN is ILayerZeroDVN, AccessControl, IDVN { bytes calldata _reqId, INuffClient.BSLSign calldata _signature, bytes calldata gatewaySignature - ) external ReentrancyGuard.nonReentrant { + ) external nonReentrant { require(_isLocal(_dstEid), "Invalid dstEid"); require( !verifiedJobs[_srcEid][_jobId], @@ -259,7 +261,7 @@ contract NuffDVN is ILayerZeroDVN, AccessControl, IDVN { uint64 _confirmations, address _sender, bytes calldata _options - ) external view override returns (uint256 _fee) { + ) external nonReentrant view override returns (uint256 _fee) { IDVNFeeLib.FeeParams memory params = IDVNFeeLib.FeeParams( priceFeed, _dstEid, diff --git a/contracts/evm/src/dvn/NuffDVNv2.sol b/contracts/evm/src/dvn/NuffDVNv2.sol index 634e3c7c..de254684 100644 --- a/contracts/evm/src/dvn/NuffDVNv2.sol +++ b/contracts/evm/src/dvn/NuffDVNv2.sol @@ -16,7 +16,9 @@ import { IDVNFeeLib } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/in import { INuffClient } from "./interfaces/INuffClient.sol"; import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; -contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { +import { ReentrancyGuard } from "@solady/src/utils/ReentrancyGuard.sol"; + +contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN, ReentrancyGuard { using PacketV1Codec for bytes; using ECDSA for bytes32; using MessageHashUtils for bytes32; @@ -52,16 +54,15 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { address public priceFeed; address public feeLib; - mapping(uint256 => Job) public jobs; - - // eid => bool - mapping(uint32 => bool) public supportedDstChain; - mapping(uint32 dstEid => DstConfig) public dstConfig; - // srcEid => ( jobId => isVerified ) - mapping(uint32 => mapping(uint256 => bool)) public verifiedJobs; + // FIXME: everything is getting stored in cold storage; use a buffer instead + mapping(uint256 jobId => Job job) public jobs; + mapping(uint32 eid => bool isSupported) public supportedDstChain; + mapping(uint32 dstEid => DstConfig config) public dstConfig; + mapping(uint32 srcEid => mapping(uint256 jobId => bool isVerified)) public verifiedJobs; event JobAssigned(uint256 jobId); event Verified(uint32 srcEid, uint256 jobId); + event Withdraw(address lib, address to, uint256 amount); constructor( uint256 _nuffAppId, @@ -95,6 +96,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { bytes calldata _options ) external + nonReentrant payable override onlyRole(MESSAGE_LIB_ROLE) @@ -105,6 +107,8 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { uint256 jobId = ++lastJobId; Job storage newJob = jobs[jobId]; + require(_param.sender != address(0), "Invalid sender address"); + newJob.origin = msg.sender; newJob.srcEid = localEid; newJob.dstEid = _param.dstEid; @@ -146,7 +150,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { bytes calldata _reqId, INuffClient.SchnorrSign calldata _signature, bytes calldata gatewaySignature - ) external { + ) external nonReentrant { require(_isLocal(_dstEid), "Invalid dstEid"); require( !verifiedJobs[_srcEid][_jobId], @@ -258,7 +262,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { uint64 _confirmations, address _sender, bytes calldata _options - ) external view override returns (uint256 _fee) { + ) external nonReentrant view override returns (uint256 _fee) { IDVNFeeLib.FeeParams memory params = IDVNFeeLib.FeeParams( priceFeed, _dstEid, @@ -273,7 +277,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN { function _verifyNuffSig( bytes calldata reqId, bytes32 hash, - INuffClient.SchnorrSign calldata sign, + INuffClient.BLSSign calldata sign, bytes calldata gatewaySignature ) internal { bool verified = nuff.nuffVerify( diff --git a/contracts/evm/src/dvn/interfaces/INuffDVNConfig.sol b/contracts/evm/src/dvn/interfaces/INuffDVNConfig.sol new file mode 100644 index 00000000..9249853a --- /dev/null +++ b/contracts/evm/src/dvn/interfaces/INuffDVNConfig.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +interface INuffDVNConfig { + function getInfo( + address oapp, + string[] memory _configKeys + ) external view returns (string[] memory); +} diff --git a/workers/abi/ArbitrumL0V2Endpoint.json b/workers/abi/ArbitrumL0V2Endpoint.json deleted file mode 100644 index 33f4ede9..00000000 --- a/workers/abi/ArbitrumL0V2Endpoint.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LZ_AlreadyRegistered","type":"error"},{"inputs":[],"name":"LZ_ComposeExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"name":"LZ_ComposeNotFound","type":"error"},{"inputs":[],"name":"LZ_DefaultReceiveLibUnavailable","type":"error"},{"inputs":[],"name":"LZ_DefaultSendLibUnavailable","type":"error"},{"inputs":[{"internalType":"uint256","name":"requiredNative","type":"uint256"},{"internalType":"uint256","name":"suppliedNative","type":"uint256"},{"internalType":"uint256","name":"requiredLzToken","type":"uint256"},{"internalType":"uint256","name":"suppliedLzToken","type":"uint256"}],"name":"LZ_InsufficientFee","type":"error"},{"inputs":[],"name":"LZ_InvalidExpiry","type":"error"},{"inputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"LZ_InvalidNonce","type":"error"},{"inputs":[],"name":"LZ_InvalidPayloadHash","type":"error"},{"inputs":[],"name":"LZ_InvalidReceiveLibrary","type":"error"},{"inputs":[],"name":"LZ_LzTokenUnavailable","type":"error"},{"inputs":[],"name":"LZ_OnlyNonDefaultLib","type":"error"},{"inputs":[],"name":"LZ_OnlyReceiveLib","type":"error"},{"inputs":[],"name":"LZ_OnlyRegisteredLib","type":"error"},{"inputs":[],"name":"LZ_OnlyRegisteredOrDefaultLib","type":"error"},{"inputs":[],"name":"LZ_OnlySendLib","type":"error"},{"inputs":[],"name":"LZ_PathNotInitializable","type":"error"},{"inputs":[],"name":"LZ_PathNotVerifiable","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"name":"LZ_PayloadHashNotFound","type":"error"},{"inputs":[],"name":"LZ_SameValue","type":"error"},{"inputs":[],"name":"LZ_SendReentrancy","type":"error"},{"inputs":[],"name":"LZ_Unauthorized","type":"error"},{"inputs":[],"name":"LZ_UnsupportedEid","type":"error"},{"inputs":[],"name":"LZ_UnsupportedInterface","type":"error"},{"inputs":[],"name":"LZ_ZeroLzTokenFee","type":"error"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer_NativeFailed","type":"error"},{"inputs":[],"name":"Transfer_ToAddressIsZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"}],"name":"ComposeDelivered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"ComposeSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"DefaultReceiveLibrarySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"oldLib","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"DefaultReceiveLibraryTimeoutSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"DefaultSendLibrarySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"}],"name":"DelegateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"sender","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"InboundNonceSkipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"LibraryRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"LzComposeAlert","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"indexed":false,"internalType":"struct Origin","name":"origin","type":"tuple"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"LzReceiveAlert","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"LzTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"sender","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"PacketBurnt","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"indexed":false,"internalType":"struct Origin","name":"origin","type":"tuple"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"PacketDelivered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"sender","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"PacketNilified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"encodedPayload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"options","type":"bytes"},{"indexed":false,"internalType":"address","name":"sendLibrary","type":"address"}],"name":"PacketSent","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"indexed":false,"internalType":"struct Origin","name":"origin","type":"tuple"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"PacketVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"ReceiveLibrarySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"oldLib","type":"address"},{"indexed":false,"internalType":"uint256","name":"timeout","type":"uint256"}],"name":"ReceiveLibraryTimeoutSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"newLib","type":"address"}],"name":"SendLibrarySet","type":"event"},{"inputs":[],"name":"EMPTY_PAYLOAD_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NIL_PAYLOAD_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockedLibrary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"bytes32","name":"_sender","type":"bytes32"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"clear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"composeQueue","outputs":[{"internalType":"bytes32","name":"messageHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"srcEid","type":"uint32"}],"name":"defaultReceiveLibrary","outputs":[{"internalType":"address","name":"lib","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"srcEid","type":"uint32"}],"name":"defaultReceiveLibraryTimeout","outputs":[{"internalType":"address","name":"lib","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"dstEid","type":"uint32"}],"name":"defaultSendLibrary","outputs":[{"internalType":"address","name":"lib","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oapp","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"delegate","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eid","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"address","name":"_lib","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"uint32","name":"_configType","type":"uint32"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"config","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"}],"name":"getReceiveLibrary","outputs":[{"internalType":"address","name":"lib","type":"address"},{"internalType":"bool","name":"isDefault","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegisteredLibraries","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSendContext","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"}],"name":"getSendLibrary","outputs":[{"internalType":"address","name":"lib","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"bytes32","name":"_sender","type":"bytes32"}],"name":"inboundNonce","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"inboundNonce","type":"uint64"}],"name":"inboundPayloadHash","outputs":[{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"initializable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"}],"name":"isDefaultSendLibrary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lib","type":"address"}],"name":"isRegisteredLibrary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSendingMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"isSupportedEid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"address","name":"_actualReceiveLib","type":"address"}],"name":"isValidReceiveLibrary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"lazyInboundNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint16","name":"_index","type":"uint16"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzCompose","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint16","name":"_index","type":"uint16"},{"internalType":"uint256","name":"_gas","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_extraData","type":"bytes"},{"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"lzComposeAlert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint256","name":"_gas","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_extraData","type":"bytes"},{"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"lzReceiveAlert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lzToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"bytes32","name":"_receiver","type":"bytes32"}],"name":"nextGuid","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"bytes32","name":"_sender","type":"bytes32"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"nilify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"}],"name":"outboundNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"options","type":"bytes"},{"internalType":"bool","name":"payInLzToken","type":"bool"}],"internalType":"struct MessagingParams","name":"_params","type":"tuple"},{"internalType":"address","name":"_sender","type":"address"}],"name":"quote","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint32","name":"srcEid","type":"uint32"}],"name":"receiveLibraryTimeout","outputs":[{"internalType":"address","name":"lib","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lib","type":"address"}],"name":"registerLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"options","type":"bytes"},{"internalType":"bool","name":"payInLzToken","type":"bool"}],"internalType":"struct MessagingParams","name":"_params","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint16","name":"_index","type":"uint16"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendCompose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"address","name":"_lib","type":"address"},{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint32","name":"configType","type":"uint32"},{"internalType":"bytes","name":"config","type":"bytes"}],"internalType":"struct SetConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_newLib","type":"address"},{"internalType":"uint256","name":"_gracePeriod","type":"uint256"}],"name":"setDefaultReceiveLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_lib","type":"address"},{"internalType":"uint256","name":"_expiry","type":"uint256"}],"name":"setDefaultReceiveLibraryTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_newLib","type":"address"}],"name":"setDefaultSendLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lzToken","type":"address"}],"name":"setLzToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_newLib","type":"address"},{"internalType":"uint256","name":"_gracePeriod","type":"uint256"}],"name":"setReceiveLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_lib","type":"address"},{"internalType":"uint256","name":"_expiry","type":"uint256"}],"name":"setReceiveLibraryTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_newLib","type":"address"}],"name":"setSendLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"bytes32","name":"_sender","type":"bytes32"},{"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"skip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"verifiable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"verify","outputs":[],"stateMutability":"nonpayable","type":"function"}]} diff --git a/workers/abi/ArbitrumReceiveLibUln302.json b/workers/abi/ArbitrumReceiveLibUln302.json deleted file mode 100644 index 9b9ad405..00000000 --- a/workers/abi/ArbitrumReceiveLibUln302.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LZ_MessageLib_OnlyEndpoint","type":"error"},{"inputs":[],"name":"LZ_ULN_AtLeastOneDVN","type":"error"},{"inputs":[{"internalType":"uint32","name":"configType","type":"uint32"}],"name":"LZ_ULN_InvalidConfigType","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidConfirmations","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidEid","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNCount","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNThreshold","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidPacketHeader","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidPacketVersion","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidRequiredDVNCount","type":"error"},{"inputs":[],"name":"LZ_ULN_Unsorted","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"LZ_ULN_UnsupportedEid","type":"error"},{"inputs":[],"name":"LZ_ULN_Verifying","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"indexed":false,"internalType":"struct SetDefaultUlnConfigParam[]","name":"params","type":"tuple[]"}],"name":"DefaultUlnConfigsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dvn","type":"address"},{"indexed":false,"internalType":"bytes","name":"header","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"confirmations","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"proofHash","type":"bytes32"}],"name":"PayloadVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oapp","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"indexed":false,"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"name":"UlnConfigSet","type":"event"},{"inputs":[{"internalType":"bytes","name":"_packetHeader","type":"bytes"},{"internalType":"uint32","name":"_localEid","type":"uint32"}],"name":"assertHeader","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_packetHeader","type":"bytes"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"commitVerification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getAppUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_configType","type":"uint32"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"rtnConfig","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"headerHash","type":"bytes32"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"internalType":"address","name":"dvn","type":"address"}],"name":"hashLookup","outputs":[{"internalType":"bool","name":"submitted","type":"bool"},{"internalType":"uint64","name":"confirmations","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"isSupportedEid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageLibType","outputs":[{"internalType":"enum MessageLibType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint32","name":"configType","type":"uint32"},{"internalType":"bytes","name":"config","type":"bytes"}],"internalType":"struct SetConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"internalType":"struct SetDefaultUlnConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setDefaultUlnConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"_config","type":"tuple"},{"internalType":"bytes32","name":"_headerHash","type":"bytes32"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"verifiable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_packetHeader","type":"bytes"},{"internalType":"bytes32","name":"_payloadHash","type":"bytes32"},{"internalType":"uint64","name":"_confirmations","type":"uint64"}],"name":"verify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint64","name":"major","type":"uint64"},{"internalType":"uint8","name":"minor","type":"uint8"},{"internalType":"uint8","name":"endpointVersion","type":"uint8"}],"stateMutability":"pure","type":"function"}]} diff --git a/workers/abi/ArbitrumSendLibUln302.json b/workers/abi/ArbitrumSendLibUln302.json deleted file mode 100644 index ed8a8f21..00000000 --- a/workers/abi/ArbitrumSendLibUln302.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"uint256","name":"_treasuryGasLimit","type":"uint256"},{"internalType":"uint256","name":"_treasuryGasForFeeCap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DVN_InvalidDVNIdx","type":"error"},{"inputs":[{"internalType":"uint256","name":"cursor","type":"uint256"}],"name":"DVN_InvalidDVNOptions","type":"error"},{"inputs":[],"name":"LZ_MessageLib_CannotWithdrawAltToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"LZ_MessageLib_InvalidAmount","type":"error"},{"inputs":[],"name":"LZ_MessageLib_InvalidExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"LZ_MessageLib_InvalidMessageSize","type":"error"},{"inputs":[],"name":"LZ_MessageLib_NotTreasury","type":"error"},{"inputs":[],"name":"LZ_MessageLib_OnlyEndpoint","type":"error"},{"inputs":[],"name":"LZ_MessageLib_TransferFailed","type":"error"},{"inputs":[],"name":"LZ_MessageLib_ZeroMessageSize","type":"error"},{"inputs":[],"name":"LZ_ULN_AtLeastOneDVN","type":"error"},{"inputs":[{"internalType":"uint32","name":"configType","type":"uint32"}],"name":"LZ_ULN_InvalidConfigType","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidConfirmations","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidLegacyType1Option","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidLegacyType2Option","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNCount","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidOptionalDVNThreshold","type":"error"},{"inputs":[],"name":"LZ_ULN_InvalidRequiredDVNCount","type":"error"},{"inputs":[{"internalType":"uint8","name":"workerId","type":"uint8"}],"name":"LZ_ULN_InvalidWorkerId","type":"error"},{"inputs":[{"internalType":"uint256","name":"cursor","type":"uint256"}],"name":"LZ_ULN_InvalidWorkerOptions","type":"error"},{"inputs":[],"name":"LZ_ULN_Unsorted","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"LZ_ULN_UnsupportedEid","type":"error"},{"inputs":[{"internalType":"uint16","name":"optionType","type":"uint16"}],"name":"LZ_ULN_UnsupportedOptionType","type":"error"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer_NativeFailed","type":"error"},{"inputs":[],"name":"Transfer_ToAddressIsZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"optionalDVNs","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"fees","type":"uint256[]"}],"name":"DVNFeePaid","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"indexed":false,"internalType":"struct SetDefaultExecutorConfigParam[]","name":"params","type":"tuple[]"}],"name":"DefaultExecutorConfigsSet","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"indexed":false,"internalType":"struct SetDefaultUlnConfigParam[]","name":"params","type":"tuple[]"}],"name":"DefaultUlnConfigsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oapp","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"indexed":false,"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"name":"ExecutorConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ExecutorFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lzToken","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LzTokenFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"worker","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTreasuryNativeFeeCap","type":"uint256"}],"name":"TreasuryNativeFeeCapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasurySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oapp","type":"address"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"indexed":false,"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"name":"UlnConfigSet","type":"event"},{"inputs":[{"internalType":"address","name":"oapp","type":"address"},{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"executorConfigs","outputs":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"worker","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getAppUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_configType","type":"uint32"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getExecutorConfig","outputs":[{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"rtnConfig","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint32","name":"_remoteEid","type":"uint32"}],"name":"getUlnConfig","outputs":[{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"rtnConfig","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"isSupportedEid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageLibType","outputs":[{"internalType":"enum MessageLibType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Packet","name":"_packet","type":"tuple"},{"internalType":"bytes","name":"_options","type":"bytes"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quote","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"receiver","type":"bytes32"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Packet","name":"_packet","type":"tuple"},{"internalType":"bytes","name":"_options","type":"bytes"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"send","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint32","name":"configType","type":"uint32"},{"internalType":"bytes","name":"config","type":"bytes"}],"internalType":"struct SetConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint32","name":"maxMessageSize","type":"uint32"},{"internalType":"address","name":"executor","type":"address"}],"internalType":"struct ExecutorConfig","name":"config","type":"tuple"}],"internalType":"struct SetDefaultExecutorConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setDefaultExecutorConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"components":[{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"uint8","name":"requiredDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNCount","type":"uint8"},{"internalType":"uint8","name":"optionalDVNThreshold","type":"uint8"},{"internalType":"address[]","name":"requiredDVNs","type":"address[]"},{"internalType":"address[]","name":"optionalDVNs","type":"address[]"}],"internalType":"struct UlnConfig","name":"config","type":"tuple"}],"internalType":"struct SetDefaultUlnConfigParam[]","name":"_params","type":"tuple[]"}],"name":"setDefaultUlnConfigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTreasuryNativeFeeCap","type":"uint256"}],"name":"setTreasuryNativeFeeCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint64","name":"major","type":"uint64"},{"internalType":"uint8","name":"minor","type":"uint8"},{"internalType":"uint8","name":"endpointVersion","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lzToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLzTokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]} diff --git a/workers/src/abi.rs b/workers/src/abi.rs index 75555bcb..3c8f6377 100644 --- a/workers/src/abi.rs +++ b/workers/src/abi.rs @@ -10,7 +10,7 @@ sol!( #[sol(abi, rpc)] #[derive(Debug, Serialize, Deserialize)] SendLibraryAbi, - "abi/ArbitrumSendLibUln302.json" + "abi/SendLibUln302.json" ); sol!( @@ -18,7 +18,7 @@ sol!( #[sol(abi, rpc)] #[derive(Debug, Serialize, Deserialize)] ReceiveLibraryAbi, - "abi/ArbitrumReceiveLibUln302.json" + "abi/ReceiveLibUln302.json" ); sol!( @@ -26,5 +26,5 @@ sol!( #[sol(abi, rpc)] #[derive(Debug, Serialize, Deserialize)] L0V2EndpointAbi, - "abi/ArbitrumL0V2Endpoint.json" + "abi/L0V2Endpoint.json" ); diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index f6752025..03e1ed53 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -1,9 +1,9 @@ //! Main offchain workflow for Nuff DVN. use alloy::primitives::{Address, U256}; -use eyre::Result; +use eyre::{OptionExt, Result}; use futures::stream::StreamExt; -use tracing::{debug, error, info}; +use tracing::{debug, error, info, warn}; use tracing_subscriber::EnvFilter; use workers::{ abi::{ @@ -34,9 +34,7 @@ async fn main() -> Result<()> { let http_provider = get_http_provider(&dvn_data.config)?; // Get the relevant contract ABI, and create contract. - //let sendlib_abi = get_abi_from_path("./abi/ArbitrumSendLibUln302.json")?; - //let sendlib_contract = create_contract_instance(&config, http_provider.clone(), sendlib_abi)?; - let receivelib_abi = get_abi_from_path("./abi/ArbitrumReceiveLibUln302.json")?; + let receivelib_abi = get_abi_from_path("./abi/ReceiveLibUln302.json")?; let contract_address = dvn_data.config.receivelib_uln302_addr.parse::
()?; let receivelib_contract = create_contract_instance(contract_address, http_provider, receivelib_abi)?; @@ -60,55 +58,69 @@ async fn main() -> Result<()> { } } Some(log) = sendlib_stream.next() => { - match log.log_decode::() { - Ok(inner_log) => { - if dvn_data.packet.is_some() { - - info!("DVNFeePaid event found and decoded."); - let required_dvns = inner_log.inner.requiredDVNs.clone(); - let own_dvn_addr = dvn_data.config.dvn_addr.parse::
()?; - - if required_dvns.contains(&own_dvn_addr) { - debug!("Found DVN in required DVNs."); - - // Query how many confirmations are required. - let eid = U256::from(dvn_data.config.network_eid); - let required_confirmations = query_confirmations(&receivelib_contract, eid).await?; - - // Prepare the header hash. - let header_hash = dvn_data.get_header_hash(); - // Prepate the payload hash. - let message_hash = dvn_data.get_message_hash(); - - // Check - let already_verified = query_already_verified( - &receivelib_contract, - own_dvn_addr, - &header, - &payload, - required_confirmations, - ) - .await?; - - if already_verified { - debug!("Packet already verified."); - } else { - dvn_data.verifying(); - debug!("Packet NOT verified. Calling verification."); - // FIXME: incorrect data - verify( + match log.log_decode::() { + Err(e) => { + error!("Received a `DVNFeePaid` event but failed to decode it: {:?}", e); + } + Ok(inner_log) if dvn_data.packet.is_some() => { + info!("DVNFeePaid event found and decoded."); + let required_dvns = &inner_log.inner.requiredDVNs; + let own_dvn_addr = dvn_data.config.dvn_addr.parse::
()?; + + if required_dvns.contains(&own_dvn_addr) { + debug!("Found DVN in required DVNs."); + + // Query how many confirmations are required. + let eid = U256::from(dvn_data.config.network_eid); + let required_confirmations = query_confirmations(&receivelib_contract, eid).await?; + + // Prepare the header hash. + let header_hash = dvn_data.get_header_hash(); + // Prepate the payload hash. + let message_hash = dvn_data.get_message_hash(); + + // Check if the info from the payload could have been extracted. + match (header_hash, message_hash) { + (Some(header_hash), Some(message_hash)) => { + let already_verified = query_already_verified( &receivelib_contract, own_dvn_addr, - header.as_ref(), - payload.as_ref(), + header_hash.as_ref(), + message_hash.as_ref(), required_confirmations, ) .await?; + + if already_verified { + debug!("Packet already verified."); + } else { + dvn_data.verifying(); + debug!("Packet NOT verified. Calling verification."); + + // FIXME: logic for NFFL verification + + verify( + &receivelib_contract, + &dvn_data.get_header().ok_or_eyre("Cannot extract header from payload")?.to_slice(), + message_hash.as_ref(), + required_confirmations, + ).await?; + } + } + (_, None) => { + error!("Cannot payload hash"); + } + (None, _) => { + error!("Cannot message hash"); } - } else { - dvn_data.reset_packet(); } + } else { + dvn_data.reset_packet(); } + + } + Ok(_)=> { + warn!("Received a `DVNFeePaid` event but don't have information about the `Packet` to be verified"); } Err(e) => { error!("Failed to decode `DVNFeePaid` event: {:?}", e); diff --git a/workers/src/chain/connections.rs b/workers/src/chain/connections.rs index 3688c70c..fcef831f 100644 --- a/workers/src/chain/connections.rs +++ b/workers/src/chain/connections.rs @@ -12,7 +12,7 @@ use alloy::{ rpc::types::{Filter, Log}, }; use alloy_json_abi::JsonAbi; -use eyre::Result; +use eyre::{OptionExt, Result}; /// Create the subscriptions for the DVN workflow. pub async fn build_subscriptions( @@ -56,7 +56,7 @@ pub fn get_abi_from_path(path: &str) -> Result { let artifact = std::fs::read(path)?; let json: serde_json::Value = serde_json::from_slice(&artifact)?; // SAFETY: Assume `unwrap` is safe since the key has been harcoded - let abi_value = json.get("abi").unwrap(); + let abi_value = json.get("abi").ok_or_eyre("ABI not found in artifact")?; let abi = serde_json::from_str(&abi_value.to_string())?; Ok(abi) } diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index d340fc2c..b75dcf9d 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -30,11 +30,14 @@ pub async fn get_messagelib_addr(contract: &ContractInst, eid: U256) -> Result Ok(address), + match receive_library + .first() + .ok_or_eyre("ReceiveLibrary not found in contract")? + { + DynSolValue::Address(address) if address.len() == 20 => Ok(*address), _ => { - error!("Failed to get address"); - Err(eyre!("Failed to get address")) + error!("Failed to get a valid address"); + Err(eyre!("Failed to get a valid address")) } } } @@ -50,7 +53,7 @@ pub async fn query_confirmations(contract: &ContractInst, eid: U256) -> Result { let value = tupled_int[0] .as_uint() diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index f154e0a2..24c979a2 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -23,6 +23,7 @@ pub struct Header { } impl Header { + /// Return the header as a collection of bytes. pub fn to_slice(&self) -> Vec { let mut header = BytesMut::new(); header.put_u8(self.version); @@ -34,6 +35,21 @@ impl Header { header.put_slice(self.guid.as_ref()); header.to_vec() } + + /// Return the header as a collection of bytes but padding the addresses to 32 bytes. + pub fn to_slice_padded(&self) -> Vec { + let mut header = BytesMut::new(); + header.put_u8(self.version); + header.put_u64(self.nonce); + header.put_u32(self.src_eid); + header.put_slice(&[0; 12]); + header.put_slice(self.sender_addr.as_ref()); + header.put_u32(self.dst_eid); + header.put_slice(&[0; 12]); + header.put_slice(self.rcv_addr.as_ref()); + header.put_slice(self.guid.as_ref()); + header.to_vec() + } } /// When feeded a packet, return the whole header, which is everything but the message. @@ -50,7 +66,7 @@ pub fn extract_header(raw_packet: &[u8]) -> Option
{ let dst_eid = buffered_packet.get_u32(); // dst_eid buffered_packet.advance(12); // skip padding let rcv_addr: FixedBytes<20> = FixedBytes::from_slice(buffered_packet.split_to(20).as_ref()); - let guid: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).freeze().iter().as_slice()); + let guid: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).freeze()[..]); Some(Header { version, @@ -167,4 +183,38 @@ mod tests { ) ); } + + #[test] + fn slice_header() { + let hdr = Header { + version: 1, + nonce: 1, + src_eid: 111, + sender_addr: FixedBytes::<20>::from_slice(&[1; 20]), + dst_eid: 222, + rcv_addr: FixedBytes::<20>::from_slice(&[2; 20]), + guid: FixedBytes::<32>::from_slice(&[3; 32]), + }; + let expected_hdr = vec![ + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 111, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 222, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + ]; + let expected_padded_hdr = vec![ + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, + ]; + + // WHEN: getting the header as a slice without padding. + let sliced_hdr = hdr.to_slice(); + // THEN: it should return the expected value. + assert_eq!(sliced_hdr, expected_hdr); + + // WHEN: getting the header as a slice with padding. + let padded_hdr = hdr.to_slice_padded(); + // THEN: it should return the expected value. + assert_eq!(padded_hdr, expected_padded_hdr); + } } From 2d9d59037d9e474fe0336c7e16708d867b63ec06 Mon Sep 17 00:00:00 2001 From: Pablo Date: Fri, 18 Oct 2024 13:08:39 +0200 Subject: [PATCH 26/62] Update indexer/Dockerfile Co-authored-by: Don <37594653+dndll@users.noreply.github.com> --- indexer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indexer/Dockerfile b/indexer/Dockerfile index 0f9cf621..09760311 100644 --- a/indexer/Dockerfile +++ b/indexer/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.79 AS builder +FROM rust:1.81 AS builder # Ensure matches rust-toolchain! WORKDIR /tmp/indexer # Copy from nearcore: From ed43e71d838c4a395bc3bdd0e0627eb5e4711d32 Mon Sep 17 00:00:00 2001 From: Lozano Date: Fri, 18 Oct 2024 18:11:15 +0200 Subject: [PATCH 27/62] chore: fix after refactor --- workers/src/bin/dvn.rs | 8 ++++---- workers/src/chain/connections.rs | 10 ++++------ workers/src/config.rs | 17 +++++++++-------- workers/src/data/extractors.rs | 2 +- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 03e1ed53..64e26f5a 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -1,6 +1,6 @@ //! Main offchain workflow for Nuff DVN. -use alloy::primitives::{Address, U256}; +use alloy::primitives::U256; use eyre::{OptionExt, Result}; use futures::stream::StreamExt; use tracing::{debug, error, info, warn}; @@ -35,8 +35,8 @@ async fn main() -> Result<()> { // Get the relevant contract ABI, and create contract. let receivelib_abi = get_abi_from_path("./abi/ReceiveLibUln302.json")?; - let contract_address = dvn_data.config.receivelib_uln302_addr.parse::
()?; - let receivelib_contract = create_contract_instance(contract_address, http_provider, receivelib_abi)?; + let receivelib_contract = + create_contract_instance(dvn_data.config.receivelib_uln302_addr, http_provider, receivelib_abi)?; info!("Listening to chain events..."); @@ -65,7 +65,7 @@ async fn main() -> Result<()> { Ok(inner_log) if dvn_data.packet.is_some() => { info!("DVNFeePaid event found and decoded."); let required_dvns = &inner_log.inner.requiredDVNs; - let own_dvn_addr = dvn_data.config.dvn_addr.parse::
()?; + let own_dvn_addr = dvn_data.config.dvn_addr; if required_dvns.contains(&own_dvn_addr) { debug!("Found DVN in required DVNs."); diff --git a/workers/src/chain/connections.rs b/workers/src/chain/connections.rs index fcef831f..be660b02 100644 --- a/workers/src/chain/connections.rs +++ b/workers/src/chain/connections.rs @@ -6,7 +6,6 @@ use crate::{ }; use alloy::{ eips::BlockNumberOrTag, - primitives::Address, providers::{Provider, ProviderBuilder, RootProvider, WsConnect}, pubsub::{PubSubFrontend, SubscriptionStream}, rpc::types::{Filter, Log}, @@ -23,19 +22,18 @@ pub async fn build_subscriptions( SubscriptionStream, )> { // Create the provider - let rpc_url = config.ws_rpc_url.clone(); - let ws = WsConnect::new(rpc_url); + let ws = WsConnect::new(config.ws_rpc_url.to_string()); let provider = ProviderBuilder::new().on_ws(ws).await?; // layerzero endpoint filter let packet_filter = Filter::new() - .address(config.l0_endpoint_addr.parse::
()?) + .address(config.l0_endpoint_addr) .event(DVNEvent::PacketSent.as_ref()) .from_block(BlockNumberOrTag::Latest); // messagelib endpoint filter let fee_paid_filter = Filter::new() - .address(config.sendlib_uln302_addr.parse::
()?) + .address(config.sendlib_uln302_addr) .event(DVNEvent::FeePaid.as_ref()) .from_block(BlockNumberOrTag::Latest); @@ -63,6 +61,6 @@ pub fn get_abi_from_path(path: &str) -> Result { /// Construct an HTTP provider given the config. pub fn get_http_provider(config: &DVNConfig) -> Result { - let http_provider = ProviderBuilder::new().on_http(config.http_rpc_url.parse()?); + let http_provider = ProviderBuilder::new().on_http(config.http_rpc_url.to_string().parse()?); Ok(http_provider) } diff --git a/workers/src/config.rs b/workers/src/config.rs index 22e49351..9b8c6425 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -1,5 +1,6 @@ //! Configuration for the DVN offchain workflow. +use alloy::primitives::Address; use config::Config; use eyre::Result; use serde::Deserialize; @@ -7,23 +8,23 @@ use serde::Deserialize; #[derive(Default, Deserialize)] pub struct DVNConfig { /// The Websocket RPC URL to connect to the Ethereum network. - pub ws_rpc_url: String, + pub ws_rpc_url: Address, /// The HTTP RPC URL to connect to the Ethereum network. - pub http_rpc_url: String, + pub http_rpc_url: Address, /// The LayerZero endpoint address. - pub l0_endpoint_addr: String, + pub l0_endpoint_addr: Address, /// The SendLib Ultra Light Node 302 address. - pub sendlib_uln302_addr: String, + pub sendlib_uln302_addr: Address, /// The ReceiveLib Ultra Light Node 302 address. - pub receivelib_uln302_addr: String, + pub receivelib_uln302_addr: Address, /// The SendLib Ultra Light Node 301 address. - pub sendlib_uln301_addr: String, + pub sendlib_uln301_addr: Address, /// The ReceiveLib Ultra Light Node 301 address. - pub receivelib_uln301_addr: String, + pub receivelib_uln301_addr: Address, /// The Ethereum network ID. pub network_eid: u64, /// Own DVN address. Used to check when the DVN is assigned to a task. - pub dvn_addr: String, + pub dvn_addr: Address, } impl DVNConfig { diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index 24c979a2..cef703a7 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -66,7 +66,7 @@ pub fn extract_header(raw_packet: &[u8]) -> Option
{ let dst_eid = buffered_packet.get_u32(); // dst_eid buffered_packet.advance(12); // skip padding let rcv_addr: FixedBytes<20> = FixedBytes::from_slice(buffered_packet.split_to(20).as_ref()); - let guid: FixedBytes<32> = FixedBytes::from_slice(buffered_packet.split_to(32).freeze()[..]); + let guid: FixedBytes<32> = FixedBytes::from_slice(&buffered_packet.split_to(32).freeze()[..]); Some(Header { version, From 0ed696ffe407b6e8556f3a18b4ed5b9d0db98789 Mon Sep 17 00:00:00 2001 From: Lozano Date: Fri, 18 Oct 2024 18:12:09 +0200 Subject: [PATCH 28/62] chore: bls bn254 signature takes two uint256 --- contracts/evm/src/dvn/interfaces/INuffClient.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/evm/src/dvn/interfaces/INuffClient.sol b/contracts/evm/src/dvn/interfaces/INuffClient.sol index 0b2ce1d7..3a3ad0bb 100644 --- a/contracts/evm/src/dvn/interfaces/INuffClient.sol +++ b/contracts/evm/src/dvn/interfaces/INuffClient.sol @@ -9,8 +9,8 @@ interface INuffClient { } struct Signature { - uint[2] X; - uint[2] Y; + uint256 X; + uint256 Y; } struct PublicKey { From ec067831d740366ee28c7833345d20be5d3f181b Mon Sep 17 00:00:00 2001 From: Lozano Date: Fri, 18 Oct 2024 18:14:04 +0200 Subject: [PATCH 29/62] chore: remove v1 contract, leaving only v2 (without version suffix) --- contracts/evm/src/dvn/NuffDVN.sol | 24 +- contracts/evm/src/dvn/NuffDVNv2.sol | 331 ---------------------------- 2 files changed, 12 insertions(+), 343 deletions(-) delete mode 100644 contracts/evm/src/dvn/NuffDVNv2.sol diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol index 197af729..4063403d 100644 --- a/contracts/evm/src/dvn/NuffDVN.sol +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -6,16 +6,19 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; -import { ILayerZeroEndpoint } from "@layerzerolabs/lz-evm-v1-0.7/contracts/interfaces/ILayerZeroEndpoint.sol"; -import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { IDVN } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IDVN.sol"; +import { ILayerZeroDVN } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/interfaces/ILayerZeroDVN.sol"; +import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; +import { IReceiveUlnE2 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IReceiveUlnE2.sol"; +import { IDVNFeeLib } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IDVNFeeLib.sol"; import { INuffClient } from "./interfaces/INuffClient.sol"; import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; import { ReentrancyGuard } from "@solady/src/utils/ReentrancyGuard.sol"; -contract NuffDVN is ILayerZeroDVN, AccessControl, ReentrancyGuard { +contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN, ReentrancyGuard { using PacketV1Codec for bytes; using ECDSA for bytes32; using MessageHashUtils for bytes32; @@ -52,13 +55,10 @@ contract NuffDVN is ILayerZeroDVN, AccessControl, ReentrancyGuard { address public feeLib; // FIXME: everything is getting stored in cold storage; use a buffer instead - mapping(uint256 => Job) public jobs; - - // eid => bool - mapping(uint32 => bool) public supportedDstChain; - mapping(uint32 dstEid => DstConfig) public dstConfig; - // srcEid => ( jobId => isVerified ) - mapping(uint32 => mapping(uint256 => bool)) public verifiedJobs; + mapping(uint256 jobId => Job job) public jobs; + mapping(uint32 eid => bool isSupported) public supportedDstChain; + mapping(uint32 dstEid => DstConfig config) public dstConfig; + mapping(uint32 srcEid => mapping(uint256 jobId => bool isVerified)) public verifiedJobs; event JobAssigned(uint256 jobId); event Verified(uint32 srcEid, uint256 jobId); @@ -95,7 +95,7 @@ contract NuffDVN is ILayerZeroDVN, AccessControl, ReentrancyGuard { bytes calldata _options ) external - nonReentrant + nonReentrant payable override onlyRole(MESSAGE_LIB_ROLE) @@ -147,7 +147,7 @@ contract NuffDVN is ILayerZeroDVN, AccessControl, ReentrancyGuard { uint64 _confirmations, address _receiver, bytes calldata _reqId, - INuffClient.BSLSign calldata _signature, + INuffClient.SchnorrSign calldata _signature, bytes calldata gatewaySignature ) external nonReentrant { require(_isLocal(_dstEid), "Invalid dstEid"); diff --git a/contracts/evm/src/dvn/NuffDVNv2.sol b/contracts/evm/src/dvn/NuffDVNv2.sol deleted file mode 100644 index de254684..00000000 --- a/contracts/evm/src/dvn/NuffDVNv2.sol +++ /dev/null @@ -1,331 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import "@openzeppelin/contracts/access/AccessControl.sol"; -import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; - -import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; -import { ISendLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; -import { IDVN } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IDVN.sol"; -import { ILayerZeroDVN } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/interfaces/ILayerZeroDVN.sol"; -import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; -import { IReceiveUlnE2 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IReceiveUlnE2.sol"; -import { IDVNFeeLib } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uld/interfaces/IDVNFeeLib.sol"; - -import { INuffClient } from "./interfaces/INuffClient.sol"; -import { INuffDVNConfig } from "./interfaces/INuffDVNConfig.sol"; - -import { ReentrancyGuard } from "@solady/src/utils/ReentrancyGuard.sol"; - -contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN, ReentrancyGuard { - using PacketV1Codec for bytes; - using ECDSA for bytes32; - using MessageHashUtils for bytes32; - - struct Job { - address origin; - uint32 srcEid; - uint32 dstEid; - bytes packetHeader; - bytes32 payloadHash; - uint64 confirmations; - address sender; - address receiver; - bytes options; - } - - bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); - bytes32 public constant MESSAGE_LIB_ROLE = keccak256("MESSAGE_LIB_ROLE"); - - ILayerZeroEndpointV2 public layerZeroEndpointV2; - ILayerZeroEndpoint public layerZeroEndpointV1; - uint32 public immutable localEid; - - uint256 public lastJobId; - - uint256 public nuffAppId; - INuffClient.PublicKey public nuffPublicKey; - INuffClient public nuff; - INuffDVNConfig public dvnConfig; - - uint16 public defaultMultiplierBps; - uint64 public quorum; - address public priceFeed; - address public feeLib; - - // FIXME: everything is getting stored in cold storage; use a buffer instead - mapping(uint256 jobId => Job job) public jobs; - mapping(uint32 eid => bool isSupported) public supportedDstChain; - mapping(uint32 dstEid => DstConfig config) public dstConfig; - mapping(uint32 srcEid => mapping(uint256 jobId => bool isVerified)) public verifiedJobs; - - event JobAssigned(uint256 jobId); - event Verified(uint32 srcEid, uint256 jobId); - event Withdraw(address lib, address to, uint256 amount); - - constructor( - uint256 _nuffAppId, - INuffClient.PublicKey memory _nuffPublicKey, - address _nuff, - address _layerZeroEndpointV2, - address _layerZeroEndpointV1, - address _dvnConfig, - uint16 _defaultMultiplierBps, - uint64 _quorum, - address _priceFeed, - address _feeLib - ) { - nuffAppId = _nuffAppId; - nuffPublicKey = _nuffPublicKey; - nuff = INuffClient(_nuff); - layerZeroEndpointV2 = ILayerZeroEndpointV2(_layerZeroEndpointV2); - layerZeroEndpointV1 = ILayerZeroEndpoint(_layerZeroEndpointV1); - dvnConfig = INuffDVNConfig(_dvnConfig); - localEid = layerZeroEndpointV2.eid(); - defaultMultiplierBps = _defaultMultiplierBps; - quorum = _quorum; - priceFeed = _priceFeed; - feeLib = _feeLib; - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - _grantRole(ADMIN_ROLE, msg.sender); - } - - function assignJob( - AssignJobParam calldata _param, - bytes calldata _options - ) - external - nonReentrant - payable - override - onlyRole(MESSAGE_LIB_ROLE) - returns (uint256 fee) - { - require(supportedDstChain[_param.dstEid], "Unsupported chain"); - - uint256 jobId = ++lastJobId; - Job storage newJob = jobs[jobId]; - - require(_param.sender != address(0), "Invalid sender address"); - - newJob.origin = msg.sender; - newJob.srcEid = localEid; - newJob.dstEid = _param.dstEid; - newJob.packetHeader = _param.packetHeader; - newJob.payloadHash = _param.payloadHash; - newJob.confirmations = _param.confirmations; - newJob.sender = _param.sender; - newJob.receiver = address( - uint160(uint256(_param.packetHeader.receiver())) - ); - newJob.options = _options; - - IDVNFeeLib.FeeParams memory feeParams = IDVNFeeLib.FeeParams( - priceFeed, - _param.dstEid, - _param.confirmations, - _param.sender, - quorum, - defaultMultiplierBps - ); - - fee = IDVNFeeLib(feeLib).getFeeOnSend( - feeParams, - dstConfig[_param.dstEid], - _options - ); - - emit JobAssigned(jobId); - } - - function verify( - uint32 _srcEid, - uint32 _dstEid, - uint256 _jobId, - bytes memory _packetHeader, - bytes32 _payloadHash, - uint64 _confirmations, - address _receiver, - bytes calldata _reqId, - INuffClient.SchnorrSign calldata _signature, - bytes calldata gatewaySignature - ) external nonReentrant { - require(_isLocal(_dstEid), "Invalid dstEid"); - require( - !verifiedJobs[_srcEid][_jobId], - "src jobId is already verified" - ); - - verifiedJobs[_srcEid][_jobId] = true; - - bytes32 hash = keccak256( - abi.encodePacked( - nuffAppId, - _reqId, - _srcEid, - _dstEid, - _jobId, - _packetHeader, - _payloadHash, - _confirmations, - _receiver - ) - ); - - _verifyNuffSig( - _reqId, - hash, - _signature, - dvnConfig.shieldNodes(_receiver), - gatewaySignature - ); - - _lzVerify( - _srcEid, - _packetHeader, - _payloadHash, - _confirmations, - _receiver - ); - - emit Verified(_srcEid, _jobId); - } - - function setNuffAppId(uint256 _nuffAppId) external onlyRole(ADMIN_ROLE) { - nuffAppId = _nuffAppId; - } - - function setNuffContract(address addr) external onlyRole(ADMIN_ROLE) { - nuff = INuffClient(addr); - } - - function setNuffPubKey( - INuffClient.PublicKey memory _nuffPublicKey - ) external onlyRole(ADMIN_ROLE) { - nuffPublicKey = _nuffPublicKey; - } - - function setLzEndpointV2( - address _layerZeroEndpointV2 - ) external onlyRole(ADMIN_ROLE) { - layerZeroEndpointV2 = ILayerZeroEndpointV2(_layerZeroEndpointV2); - } - - function updateSupportedDstChain( - uint32 eid, - bool status - ) external onlyRole(ADMIN_ROLE) { - supportedDstChain[eid] = status; - } - - function setPriceFeed(address _priceFeed) external onlyRole(ADMIN_ROLE) { - priceFeed = _priceFeed; - } - - function setDefaultMultiplierBps( - uint16 _multiplierBps - ) external onlyRole(ADMIN_ROLE) { - defaultMultiplierBps = _multiplierBps; - } - - function setDstConfig( - DstConfigParam[] calldata _params - ) external onlyRole(ADMIN_ROLE) { - for (uint256 i = 0; i < _params.length; ++i) { - DstConfigParam calldata param = _params[i]; - dstConfig[param.dstEid] = DstConfig( - param.gas, - param.multiplierBps, - param.floorMarginUSD - ); - } - emit SetDstConfig(_params); - } - - function setFeeLib(address _feeLib) external onlyRole(ADMIN_ROLE) { - feeLib = _feeLib; - } - - function withdrawFee( - address _lib, - address _to, - uint256 _amount - ) external onlyRole(ADMIN_ROLE) { - require(hasRole(MESSAGE_LIB_ROLE, _lib), "Invalid lib"); - ISendLib(_lib).withdrawFee(_to, _amount); - emit Withdraw(_lib, _to, _amount); - } - - function getFee( - uint32 _dstEid, - uint64 _confirmations, - address _sender, - bytes calldata _options - ) external nonReentrant view override returns (uint256 _fee) { - IDVNFeeLib.FeeParams memory params = IDVNFeeLib.FeeParams( - priceFeed, - _dstEid, - _confirmations, - _sender, - quorum, - defaultMultiplierBps - ); - return IDVNFeeLib(feeLib).getFee(params, dstConfig[_dstEid], _options); - } - - function _verifyNuffSig( - bytes calldata reqId, - bytes32 hash, - INuffClient.BLSSign calldata sign, - bytes calldata gatewaySignature - ) internal { - bool verified = nuff.nuffVerify( - reqId, - uint256(hash), - sign, - nuffPublicKey - ); - require(verified, "Invalid signature!"); - } - - function _lzVerify( - uint32 _srcEid, - bytes memory _packetHeader, - bytes32 _payloadHash, - uint64 _confirmations, - address _receiver - ) internal { - address receiverLib; - if (_isV2(_srcEid)) { - (receiverLib, ) = layerZeroEndpointV2.getReceiveLibrary( - _receiver, - _srcEid - ); - } else { - receiverLib = layerZeroEndpointV1.getReceiveLibraryAddress( - _receiver - ); - } - - IReceiveUlnE2(receiverLib).verify( - _packetHeader, - _payloadHash, - _confirmations - ); - } - - function _isLocal(uint32 _dstEid) internal view returns (bool) { - if (localEid == _dstEid || localEid == _dstEid + 30000) { - return true; - } - return false; - } - - function _isV2(uint32 _eid) internal pure returns (bool) { - if (_eid > 30000) { - return true; - } - return false; - } -} From 20a711c5f5e4d9ad16910b22dcec44a69cb0acd1 Mon Sep 17 00:00:00 2001 From: Lozano Date: Sun, 20 Oct 2024 18:52:49 +0200 Subject: [PATCH 30/62] chore: address comments --- contracts/evm/src/dvn/NuffDVN.sol | 2 +- workers/src/abi.rs | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol index 4063403d..ae3442c3 100644 --- a/contracts/evm/src/dvn/NuffDVN.sol +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -147,7 +147,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN, ReentrancyGuard { uint64 _confirmations, address _receiver, bytes calldata _reqId, - INuffClient.SchnorrSign calldata _signature, + INuffClient.BLSSign calldata _signature, bytes calldata gatewaySignature ) external nonReentrant { require(_isLocal(_dstEid), "Invalid dstEid"); diff --git a/workers/src/abi.rs b/workers/src/abi.rs index 3c8f6377..feebcf1e 100644 --- a/workers/src/abi.rs +++ b/workers/src/abi.rs @@ -1,6 +1,10 @@ //! Types create from the JSON ABI files. //! //! For example, to be able to decode the logs' data, or call contracts' methods. +//! +//! To obtain the corresponding ABI, there are two ways: +//! - Manually downloading the ABI from the contract's source code (we use this one for now); +//! - Using `alloy` to download the ABI from a contract's address (if possible). use alloy::sol; use serde::{Deserialize, Serialize}; @@ -13,14 +17,6 @@ sol!( "abi/SendLibUln302.json" ); -sol!( - #[allow(missing_docs)] - #[sol(abi, rpc)] - #[derive(Debug, Serialize, Deserialize)] - ReceiveLibraryAbi, - "abi/ReceiveLibUln302.json" -); - sol!( #[allow(missing_docs)] #[sol(abi, rpc)] From b19f68e5e8a881c834632a88748b680396ab5bb7 Mon Sep 17 00:00:00 2001 From: Lozano Date: Mon, 21 Oct 2024 13:17:11 +0200 Subject: [PATCH 31/62] chore: address pr comments --- contracts/evm/src/dvn/NuffDVN.sol | 4 +- workers/src/bin/dvn.rs | 1 + workers/src/chain/connections.rs | 2 +- workers/src/chain/contracts.rs | 18 ++++++++ workers/src/config.rs | 6 +-- workers/src/data/extractors.rs | 77 ++++++++++++++++++++++++------- 6 files changed, 86 insertions(+), 22 deletions(-) diff --git a/contracts/evm/src/dvn/NuffDVN.sol b/contracts/evm/src/dvn/NuffDVN.sol index ae3442c3..1e78e70b 100644 --- a/contracts/evm/src/dvn/NuffDVN.sol +++ b/contracts/evm/src/dvn/NuffDVN.sol @@ -278,7 +278,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN, ReentrancyGuard { bytes32 hash, INuffClient.BLSSign calldata sign, bytes calldata gatewaySignature - ) internal { + ) internal nonReentrant { bool verified = nuff.nuffVerify( reqId, uint256(hash), @@ -294,7 +294,7 @@ contract NuffDVNV2 is ILayerZeroDVN, AccessControl, IDVN, ReentrancyGuard { bytes32 _payloadHash, uint64 _confirmations, address _receiver - ) internal { + ) internal nonReentrant { address receiverLib; if (_isV2(_srcEid)) { (receiverLib, ) = layerZeroEndpointV2.getReceiveLibrary( diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 64e26f5a..f7bca716 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -40,6 +40,7 @@ async fn main() -> Result<()> { info!("Listening to chain events..."); + // FIXME: refactor the operations from this loop into smaller, testable containers. loop { dvn_worker.listening(); tokio::select! { diff --git a/workers/src/chain/connections.rs b/workers/src/chain/connections.rs index be660b02..1d22c8ab 100644 --- a/workers/src/chain/connections.rs +++ b/workers/src/chain/connections.rs @@ -22,7 +22,7 @@ pub async fn build_subscriptions( SubscriptionStream, )> { // Create the provider - let ws = WsConnect::new(config.ws_rpc_url.to_string()); + let ws = WsConnect::new(config.ws_rpc_url.clone()); let provider = ProviderBuilder::new().on_ws(ws).await?; // layerzero endpoint filter diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index b75dcf9d..8959dcd5 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -43,6 +43,24 @@ pub async fn get_messagelib_addr(contract: &ContractInst, eid: U256) -> Result Result { // Call the `getUlnConfig` function on the contract let uln_config = contract diff --git a/workers/src/config.rs b/workers/src/config.rs index 9b8c6425..6e754aa3 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -5,12 +5,12 @@ use config::Config; use eyre::Result; use serde::Deserialize; -#[derive(Default, Deserialize)] +#[derive(Debug, Deserialize)] pub struct DVNConfig { /// The Websocket RPC URL to connect to the Ethereum network. - pub ws_rpc_url: Address, + pub ws_rpc_url: String, /// The HTTP RPC URL to connect to the Ethereum network. - pub http_rpc_url: Address, + pub http_rpc_url: String, /// The LayerZero endpoint address. pub l0_endpoint_addr: Address, /// The SendLib Ultra Light Node 302 address. diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index cef703a7..5b66f8e2 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -16,9 +16,9 @@ pub struct Header { version: u8, nonce: u64, src_eid: u32, - sender_addr: FixedBytes<20>, + sender_addr: AddressWithType, dst_eid: u32, - rcv_addr: FixedBytes<20>, + rcv_addr: AddressWithType, guid: FixedBytes<32>, } @@ -29,9 +29,9 @@ impl Header { header.put_u8(self.version); header.put_u64(self.nonce); header.put_u32(self.src_eid); - header.put_slice(self.sender_addr.as_ref()); + header.put_slice(self.sender_addr.address.as_ref()); header.put_u32(self.dst_eid); - header.put_slice(self.rcv_addr.as_ref()); + header.put_slice(self.rcv_addr.address.as_ref()); header.put_slice(self.guid.as_ref()); header.to_vec() } @@ -43,15 +43,41 @@ impl Header { header.put_u64(self.nonce); header.put_u32(self.src_eid); header.put_slice(&[0; 12]); - header.put_slice(self.sender_addr.as_ref()); + header.put_slice(self.sender_addr.address.as_ref()); header.put_u32(self.dst_eid); header.put_slice(&[0; 12]); - header.put_slice(self.rcv_addr.as_ref()); + header.put_slice(self.rcv_addr.address.as_ref()); header.put_slice(self.guid.as_ref()); header.to_vec() } } +#[derive(Debug, PartialEq)] +struct AddressWithType { + pub address: FixedBytes<32>, + pub variant: AddressType, +} + +#[derive(Debug, PartialEq)] +enum AddressType { + Ethereum, + Solana, +} + +impl AddressWithType { + /// Expect some bytes (usually, 32 bytes) thay may encode an ETH address (padded with 12 bytes) or a Solana address (non-padded). + pub fn new(bytes_addr: &[u8]) -> Self { + println!("{:?}", bytes_addr); + let variant = if bytes_addr.starts_with(&[0; 12]) { + AddressType::Ethereum + } else { + AddressType::Solana + }; + let address = FixedBytes::<32>::from_slice(bytes_addr); + Self { variant, address } + } +} + /// When feeded a packet, return the whole header, which is everything but the message. pub fn extract_header(raw_packet: &[u8]) -> Option
{ if raw_packet.len() < MINIMUM_PACKET_LENGTH { @@ -61,11 +87,9 @@ pub fn extract_header(raw_packet: &[u8]) -> Option
{ let version = buffered_packet.get_u8(); // version let nonce = buffered_packet.get_u64(); // nonce let src_eid = buffered_packet.get_u32(); // src_eid - buffered_packet.advance(12); // skip padding - let sender_addr: FixedBytes<20> = FixedBytes::from_slice(buffered_packet.split_to(20).as_ref()); + let sender_addr = AddressWithType::new(&buffered_packet.split_to(32)); let dst_eid = buffered_packet.get_u32(); // dst_eid - buffered_packet.advance(12); // skip padding - let rcv_addr: FixedBytes<20> = FixedBytes::from_slice(buffered_packet.split_to(20).as_ref()); + let rcv_addr = AddressWithType::new(&buffered_packet.split_to(32)); let guid: FixedBytes<32> = FixedBytes::from_slice(&buffered_packet.split_to(32).freeze()[..]); Some(Header { @@ -126,6 +150,27 @@ pub fn extract_message(raw_packet: &[u8]) -> Option> { mod tests { use super::*; use alloy::hex; + use alloy::primitives::Address; + use eyre::Result; + + impl AddressWithType { + pub fn ethereum_addr(&self) -> Result
{ + match self.variant { + AddressType::Ethereum => Ok(Address::from_slice(&self.address[12..32])), + _ => Err(eyre::eyre!("This is not an Ethereum address")), + } + } + } + + #[test] + fn addresses_with_types() { + let a = AddressWithType::new(&[1; 20]); + assert_eq!(a.variant, AddressType::Ethereum); + assert!(a.address.starts_with(&[0; 12])); + + let b = AddressWithType::new(&[1; 32]); + assert_eq!(b.variant, AddressType::Solana); + } #[test] fn extract_msg() { @@ -158,8 +203,8 @@ mod tests { assert_eq!(header.nonce, 76929); assert_eq!(header.src_eid, 30110); assert_eq!( - header.sender_addr, - FixedBytes::<20>::from_slice( + header.sender_addr.ethereum_addr().unwrap(), + Address::from_slice( hex::decode("19cfce47ed54a88614648dc3f19a5980097007dd") .unwrap() .as_ref() @@ -167,8 +212,8 @@ mod tests { ); assert_eq!(header.dst_eid, 30184); assert_eq!( - header.rcv_addr, - FixedBytes::<20>::from_slice( + header.rcv_addr.ethereum_addr().unwrap(), + Address::from_slice( hex::decode("5634c4a5fed09819e3c46d86a965dd9447d86e47") .unwrap() .as_ref() @@ -190,9 +235,9 @@ mod tests { version: 1, nonce: 1, src_eid: 111, - sender_addr: FixedBytes::<20>::from_slice(&[1; 20]), + sender_addr: AddressWithType::new(&[1; 20]), dst_eid: 222, - rcv_addr: FixedBytes::<20>::from_slice(&[2; 20]), + rcv_addr: AddressWithType::new(&[2; 20]), guid: FixedBytes::<32>::from_slice(&[3; 32]), }; let expected_hdr = vec![ From 1c9a7d90c719cc15ebe91132ae0670463364646f Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Mon, 21 Oct 2024 18:04:37 +0300 Subject: [PATCH 32/62] Implement /state-root endpoint specifically for serving state root message --- aggregator/aggregator.go | 12 ++++++++ aggregator/mocks/rest_aggregator.go | 30 ++++++++++++++------ aggregator/rest_server/server.go | 28 +++++++++++++++++++ aggregator/rest_server/server_test.go | 40 +++++++++++++++++++++++++++ aggregator/types/types.go | 4 +++ go.mod | 1 + go.sum | 11 ++++++++ 7 files changed, 117 insertions(+), 9 deletions(-) diff --git a/aggregator/aggregator.go b/aggregator/aggregator.go index 526fa690..3a19e140 100644 --- a/aggregator/aggregator.go +++ b/aggregator/aggregator.go @@ -69,6 +69,7 @@ type RpcAggregatorer interface { } type RestAggregatorer interface { + GetStateRoot(rollupId uint32, blockHeight uint64) (*types.GetStateRootResponse, error) GetStateRootUpdateAggregation(rollupId uint32, blockHeight uint64) (*types.GetStateRootUpdateAggregationResponse, error) GetOperatorSetUpdateAggregation(id uint64) (*types.GetOperatorSetUpdateAggregationResponse, error) GetCheckpointMessages(fromTimestamp, toTimestamp uint64) (*types.GetCheckpointMessagesResponse, error) @@ -621,6 +622,17 @@ func (agg *Aggregator) GetRegistryCoordinatorAddress(reply *string) error { } // Rest requests +func (agg *Aggregator) GetStateRoot(rollupId uint32, blockHeight uint64) (*types.GetStateRootResponse, error) { + message, err := agg.msgDb.FetchStateRootUpdate(uint32(rollupId), blockHeight) + if err != nil { + return nil, StateRootUpdateNotFoundError + } + + return &types.GetStateRootResponse{ + Message: *message, + }, nil +} + func (agg *Aggregator) GetStateRootUpdateAggregation(rollupId uint32, blockHeight uint64) (*types.GetStateRootUpdateAggregationResponse, error) { message, err := agg.msgDb.FetchStateRootUpdate(uint32(rollupId), blockHeight) if err != nil { diff --git a/aggregator/mocks/rest_aggregator.go b/aggregator/mocks/rest_aggregator.go index 95c9b132..651c9fbd 100644 --- a/aggregator/mocks/rest_aggregator.go +++ b/aggregator/mocks/rest_aggregator.go @@ -1,18 +1,15 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/NethermindEth/near-sffl/aggregator (interfaces: RestAggregatorer) -// -// Generated by this command: -// -// mockgen -destination=./mocks/rest_aggregator.go -package=mocks github.com/NethermindEth/near-sffl/aggregator RestAggregatorer -// + // Package mocks is a generated GoMock package. package mocks import ( + gomock "go.uber.org/mock/gomock" reflect "reflect" types "github.com/NethermindEth/near-sffl/aggregator/types" - gomock "go.uber.org/mock/gomock" + //gomock "github.com/golang/mock/gomock" ) // MockRestAggregatorer is a mock of RestAggregatorer interface. @@ -48,7 +45,7 @@ func (m *MockRestAggregatorer) GetCheckpointMessages(arg0, arg1 uint64) (*types. } // GetCheckpointMessages indicates an expected call of GetCheckpointMessages. -func (mr *MockRestAggregatorerMockRecorder) GetCheckpointMessages(arg0, arg1 any) *gomock.Call { +func (mr *MockRestAggregatorerMockRecorder) GetCheckpointMessages(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCheckpointMessages", reflect.TypeOf((*MockRestAggregatorer)(nil).GetCheckpointMessages), arg0, arg1) } @@ -63,11 +60,26 @@ func (m *MockRestAggregatorer) GetOperatorSetUpdateAggregation(arg0 uint64) (*ty } // GetOperatorSetUpdateAggregation indicates an expected call of GetOperatorSetUpdateAggregation. -func (mr *MockRestAggregatorerMockRecorder) GetOperatorSetUpdateAggregation(arg0 any) *gomock.Call { +func (mr *MockRestAggregatorerMockRecorder) GetOperatorSetUpdateAggregation(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorSetUpdateAggregation", reflect.TypeOf((*MockRestAggregatorer)(nil).GetOperatorSetUpdateAggregation), arg0) } +// GetStateRoot mocks base method. +func (m *MockRestAggregatorer) GetStateRoot(arg0 uint32, arg1 uint64) (*types.GetStateRootResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetStateRoot", arg0, arg1) + ret0, _ := ret[0].(*types.GetStateRootResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetStateRoot indicates an expected call of GetStateRoot. +func (mr *MockRestAggregatorerMockRecorder) GetStateRoot(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateRoot", reflect.TypeOf((*MockRestAggregatorer)(nil).GetStateRoot), arg0, arg1) +} + // GetStateRootUpdateAggregation mocks base method. func (m *MockRestAggregatorer) GetStateRootUpdateAggregation(arg0 uint32, arg1 uint64) (*types.GetStateRootUpdateAggregationResponse, error) { m.ctrl.T.Helper() @@ -78,7 +90,7 @@ func (m *MockRestAggregatorer) GetStateRootUpdateAggregation(arg0 uint32, arg1 u } // GetStateRootUpdateAggregation indicates an expected call of GetStateRootUpdateAggregation. -func (mr *MockRestAggregatorerMockRecorder) GetStateRootUpdateAggregation(arg0, arg1 any) *gomock.Call { +func (mr *MockRestAggregatorerMockRecorder) GetStateRootUpdateAggregation(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateRootUpdateAggregation", reflect.TypeOf((*MockRestAggregatorer)(nil).GetStateRootUpdateAggregation), arg0, arg1) } diff --git a/aggregator/rest_server/server.go b/aggregator/rest_server/server.go index 7a2b9d13..28ef76fd 100644 --- a/aggregator/rest_server/server.go +++ b/aggregator/rest_server/server.go @@ -55,6 +55,7 @@ func (s *RestServer) Start() error { s.logger.Info("Starting aggregator REST API.") router := mux.NewRouter() + router.HandleFunc("/state-root", wrapRequest(s.listener.APIErrors, s.handleGetStateRootUpdateAggregation)).Methods("GET") router.HandleFunc("/aggregation/state-root-update", wrapRequest(s.listener.APIErrors, s.handleGetStateRootUpdateAggregation)).Methods("GET") router.HandleFunc("/aggregation/operator-set-update", wrapRequest(s.listener.APIErrors, s.handleGetOperatorSetUpdateAggregation)).Methods("GET") router.HandleFunc("/checkpoint/messages", wrapRequest(s.listener.APIErrors, s.handleGetCheckpointMessages)).Methods("GET") @@ -82,6 +83,33 @@ func wrapRequest(errorHandler func(), requestCallback func(w http.ResponseWriter } } +func (s *RestServer) handleGetStateRoot(w http.ResponseWriter, r *http.Request) error { + s.listener.IncStateRootUpdateRequests() // We can leave it as is, because it is similar requests + + params := r.URL.Query() + rollupId, err := strconv.ParseUint(params.Get("rollupId"), 10, 32) + if err != nil { + http.Error(w, "Invalid rollupId", http.StatusBadRequest) + return err + } + + blockHeight, err := strconv.ParseUint(params.Get("blockHeight"), 10, 64) + if err != nil { + http.Error(w, "Invalid blockHeight", http.StatusBadRequest) + return err + } + + response, err := s.app.GetStateRoot(uint32(rollupId), blockHeight) + if err != nil { + http.Error(w, err.Error(), mapErrorToCode(err)) + return err + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + return json.NewEncoder(w).Encode(*response) +} + func (s *RestServer) handleGetStateRootUpdateAggregation(w http.ResponseWriter, r *http.Request) error { s.listener.IncStateRootUpdateRequests() diff --git a/aggregator/rest_server/server_test.go b/aggregator/rest_server/server_test.go index a512b84a..42e44916 100644 --- a/aggregator/rest_server/server_test.go +++ b/aggregator/rest_server/server_test.go @@ -17,6 +17,46 @@ import ( aggtypes "github.com/NethermindEth/near-sffl/aggregator/types" ) +func TestGetStateRoot(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + logger := sdklogging.NewNoopLogger() + aggregator := mocks.NewMockRestAggregatorer(mockCtrl) + restServer := NewRestServer("", aggregator, logger) + + msg := messages.StateRootUpdateMessage{ + RollupId: 1, + BlockHeight: 2, + Timestamp: 3, + NearDaCommitment: tests.Keccak256(4), + NearDaTransactionId: tests.Keccak256(5), + StateRoot: tests.Keccak256(6), + } + + response := aggtypes.GetStateRootResponse{ + Message: msg, + } + aggregator.EXPECT().GetStateRoot(msg.RollupId, msg.BlockHeight).Return(&response, nil) + + req, err := http.NewRequest( + "GET", + fmt.Sprintf("/state-root?rollupId=%d&blockHeight=%d", msg.RollupId, msg.BlockHeight), + nil, + ) + assert.Nil(t, err) + + recorder := httptest.NewRecorder() + err = restServer.handleGetStateRoot(recorder, req) + assert.Nil(t, err) + assert.Equal(t, recorder.Code, http.StatusOK) + + var body aggtypes.GetStateRootResponse + err = json.Unmarshal(recorder.Body.Bytes(), &body) + assert.Nil(t, err) + assert.Equal(t, body, response) +} + func TestGetStateRootUpdateAggregation(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() diff --git a/aggregator/types/types.go b/aggregator/types/types.go index e1df6a02..da1710f2 100644 --- a/aggregator/types/types.go +++ b/aggregator/types/types.go @@ -25,6 +25,10 @@ type OperatorInfo struct { OperatorAddr common.Address } +type GetStateRootResponse struct { + Message messages.StateRootUpdateMessage +} + type GetStateRootUpdateAggregationResponse struct { Message messages.StateRootUpdateMessage Aggregation messages.MessageBlsAggregation diff --git a/go.mod b/go.mod index aab0b2a9..8d275bac 100644 --- a/go.mod +++ b/go.mod @@ -42,6 +42,7 @@ require ( github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/golang/mock v1.6.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/lmittmann/tint v1.0.4 // indirect diff --git a/go.sum b/go.sum index 1b0cb63f..dbb2f125 100644 --- a/go.sum +++ b/go.sum @@ -135,6 +135,8 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= @@ -299,6 +301,7 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRT github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= @@ -335,24 +338,30 @@ golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRj golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -361,6 +370,7 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= @@ -371,6 +381,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 7fe1ce9d3e18b8013602fdbf9be06e4ecf5b5f62 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Tue, 22 Oct 2024 14:20:21 +0300 Subject: [PATCH 33/62] WIP: Verifier and integration test for a verifier --- workers/src/lib.rs | 1 + workers/src/verifier.rs | 76 ++++++++++++++++++++++++++++++++++ workers/tests/verifier_test.rs | 34 +++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 workers/src/verifier.rs create mode 100644 workers/tests/verifier_test.rs diff --git a/workers/src/lib.rs b/workers/src/lib.rs index 5bfaf915..0b99f175 100644 --- a/workers/src/lib.rs +++ b/workers/src/lib.rs @@ -4,3 +4,4 @@ pub mod abi; pub mod chain; pub mod config; pub mod data; +pub mod verifier; diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs new file mode 100644 index 00000000..81a85590 --- /dev/null +++ b/workers/src/verifier.rs @@ -0,0 +1,76 @@ +use alloy::providers::{ProviderBuilder, RootProvider, WsConnect}; +use alloy::pubsub::PubSubFrontend; +use reqwest::{ClientBuilder, Url}; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; + +#[derive(Serialize, Deserialize, std::fmt::Debug)] +pub (crate) struct ResponseWrapper { + pub message: Message, +} + +#[derive(Serialize, Deserialize, std::fmt::Debug)] +pub struct Message { + #[serde(rename = "RollupId")] + pub rollup_id: i64, + #[serde(rename = "BlockHeight")] + pub block_height: i64, + #[serde(rename = "Timestamp")] + pub timestamp: i64, + #[serde(rename = "NearDaTransactionId")] + pub near_da_transaction_id: Vec, + #[serde(rename = "NearDaCommitment")] + pub near_da_commitment: Vec, + #[serde(rename = "StateRoot")] + pub state_root: Vec, +} + +pub struct Verifier { + eth_l2_provider: Arc>, + http_client: reqwest::Client, + aggregator_http_address: String, +} + +impl Verifier { + pub async fn new(agg_url: &str, rpc_url: &str) -> eyre::Result { + let ws = WsConnect::new(rpc_url); + let provider = ProviderBuilder::new().on_ws(ws).await?; + let client = ClientBuilder::new().build()?; + + let agg_http_addr = format!("{}/aggregation/state-root-update", agg_url); + + Ok(Verifier { + eth_l2_provider: Arc::new(provider), + http_client: client, + aggregator_http_address: agg_http_addr, + }) + } + + pub async fn verify(&self, rollup_id: u32, block_height: u64) -> bool { + // tokio::spawn(async { + let params = [ + ("rollupId", rollup_id.to_string()), + ("blockHeight", block_height.to_string()), + ]; + let url = Url::parse_with_params(&self.aggregator_http_address, ¶ms)?; + let res = self.http_client.get(url).send().await?; + let response_payload = res.json::().await?; + let message = &response_payload.message; + // TODO: take the state root from the LayerZero message. + message.state_root.eq(&vec![0]) + } +} + +/* +Expected JSON successful response body. +{ + "Message" : { + "RollupId" : 1, + "BlockHeight" : 2, + "Timestamp" : 3, + "NearDaTransactionId" : [ ..bytes.. ], + "NearDaCommitment" : [ ..bytes.. ], + "StateRoot" : [ ..bytes.. ] + } +} +*/ diff --git a/workers/tests/verifier_test.rs b/workers/tests/verifier_test.rs new file mode 100644 index 00000000..a66024e9 --- /dev/null +++ b/workers/tests/verifier_test.rs @@ -0,0 +1,34 @@ +use wiremock::{MockServer, Mock, ResponseTemplate}; +use wiremock::matchers::{method, path}; +use workers::verifier::Verifier; + +#[tokio::main] +#[test] +async fn main() { + // Start a background HTTP server on a random local port + let mock_server = MockServer::start().await; + setup(&mock_server).await; + + let verifier = Verifier::new("", "").await?; + assert_eq!(verifier.verify(1, 2).await, true); +} + + +async fn setup(mock_server: &MockServer) -> eyre::Result<()> { + let state_root_message = workers::verifier::Message { + rollup_id: 1, + block_height: 2, + timestamp : 3, + near_da_transaction_id : vec![4], + near_da_commitment : vec![5], + state_root: vec![6] + }; + + Mock::given(method("GET")) + .and(path("/state-root")) + .respond_with(ResponseTemplate::new(200).set_body_json(state_root_message)) + .mount(&mock_server) + .await; + + Ok(()) +} \ No newline at end of file From 20ef139c2d933f52dff0cda8f9469c44bcfca025 Mon Sep 17 00:00:00 2001 From: Pablo Lozano Date: Tue, 22 Oct 2024 14:10:49 +0200 Subject: [PATCH 34/62] chore: remove alloy-json-abi as external dep --- Cargo.lock | 1 - Cargo.toml | 2 +- workers/Cargo.toml | 1 - workers/src/chain/connections.rs | 2 +- workers/src/chain/contracts.rs | 2 +- 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 02c46931..e42b28be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9831,7 +9831,6 @@ name = "workers" version = "0.1.0" dependencies = [ "alloy", - "alloy-json-abi", "blsful", "bytes", "config", diff --git a/Cargo.toml b/Cargo.toml index 9ebdd5ed..69a7bead 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ edition = "2021" repository = "https://github.com/NethermindEth/near-sffl" [workspace.dependencies] -alloy = { version = "0.4.2", features = ["full", "node-bindings", "rpc-types-debug", "rpc-types-trace", "json-rpc", "rpc-client", "serde"] } +alloy = { version = "0.4.2", features = ["full", "node-bindings", "rpc-types-debug", "rpc-types-trace", "json-rpc", "rpc-client", "serde", "json-abi"] } alloy-primitives = "0.8.3" alloy-rpc-client = "0.4.2" alloy-rpc-types = "0.4.2" diff --git a/workers/Cargo.toml b/workers/Cargo.toml index 714536d9..69cc89a1 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -9,7 +9,6 @@ path = "src/bin/dvn.rs" [dependencies] alloy.workspace = true -alloy-json-abi = "0.8.8" blsful = "2.5.7" bytes = "1.7.2" config = { version = "0.14.0", features = ["toml"] } diff --git a/workers/src/chain/connections.rs b/workers/src/chain/connections.rs index 1d22c8ab..b1763323 100644 --- a/workers/src/chain/connections.rs +++ b/workers/src/chain/connections.rs @@ -6,11 +6,11 @@ use crate::{ }; use alloy::{ eips::BlockNumberOrTag, + json_abi::JsonAbi, providers::{Provider, ProviderBuilder, RootProvider, WsConnect}, pubsub::{PubSubFrontend, SubscriptionStream}, rpc::types::{Filter, Log}, }; -use alloy_json_abi::JsonAbi; use eyre::{OptionExt, Result}; /// Create the subscriptions for the DVN workflow. diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index 8959dcd5..e5ed92f4 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -4,11 +4,11 @@ use crate::chain::{ContractInst, HttpProvider}; use alloy::{ contract::{ContractInstance, Interface}, dyn_abi::DynSolValue, + json_abi::JsonAbi, network::Ethereum, primitives::{keccak256, Address, U256}, transports::http::{Client, Http}, }; -use alloy_json_abi::JsonAbi; use eyre::{eyre, OptionExt, Result}; use tracing::{debug, error}; From fbedff6aba315dc25002d5f36b5dce7a272d9da9 Mon Sep 17 00:00:00 2001 From: Pablo Lozano Date: Tue, 22 Oct 2024 14:12:31 +0200 Subject: [PATCH 35/62] chore: broken test to share --- workers/src/abi.rs | 16 +++++++++++ workers/src/data/extractors.rs | 51 +++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/workers/src/abi.rs b/workers/src/abi.rs index feebcf1e..5b4eb08c 100644 --- a/workers/src/abi.rs +++ b/workers/src/abi.rs @@ -24,3 +24,19 @@ sol!( L0V2EndpointAbi, "abi/L0V2Endpoint.json" ); + +sol!( + #[allow(missing_docs)] + #[sol(abi)] + #[derive(Debug, PartialEq, Eq)] + struct Packet { + uint8 version; + uint64 nonce; + uint32 srcEid; + bytes32 sender; + uint32 dstEid; + bytes32 receiver; + bytes32 guid; + bytes message; + } +); diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs index 5b66f8e2..f15bef3d 100644 --- a/workers/src/data/extractors.rs +++ b/workers/src/data/extractors.rs @@ -149,8 +149,8 @@ pub fn extract_message(raw_packet: &[u8]) -> Option> { #[cfg(test)] mod tests { use super::*; - use alloy::hex; - use alloy::primitives::Address; + use crate::abi::SendLibraryAbi; + use alloy::{hex, primitives::Address, sol_types::SolType}; use eyre::Result; impl AddressWithType { @@ -162,6 +162,49 @@ mod tests { } } + #[test] + fn abi_decode() -> Result<()> { + let hex_payload = hex!("010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"); + + let v = SendLibraryAbi::Packet::abi_decode(&hex_payload, true)?; + println!("{:?}", v); + + //// Similar to the Packet + //type MyTy = ( + // Uint<8>, + // Uint<64>, + // Uint<32>, + // FixedBytes<32>, + // Uint<32>, + // FixedBytes<32>, + // FixedBytes<32>, + // Bytes, + //); + //let v = MyTy::abi_decode(&hex_payload, true)?; + //println!("{:?}", v); + + //sol!( + // #[derive(Debug)] + // struct Packet { + // uint8 version; + // uint64 nonce; + // uint32 srcEid; + // bytes32 sender; + // uint32 dstEid; + // bytes32 receiver; + // bytes32 guid; + // bytes message; + // } + //); + //let v = Packet::abi_decode(&hex_payload, true)?; + //println!("{:?}", v); + + //let v = SendLibraryAbi::Packet::abi_decode(&hex_payload, true)?; + //println!("{:?}", v); + + Ok(()) + } + #[test] fn addresses_with_types() { let a = AddressWithType::new(&[1; 20]); @@ -221,7 +264,7 @@ mod tests { ); assert_eq!( header.guid, - FixedBytes::<32>::from_slice( + alloy::primitives::FixedBytes::<32>::from_slice( hex::decode("9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b") .unwrap() .as_ref() @@ -238,7 +281,7 @@ mod tests { sender_addr: AddressWithType::new(&[1; 20]), dst_eid: 222, rcv_addr: AddressWithType::new(&[2; 20]), - guid: FixedBytes::<32>::from_slice(&[3; 32]), + guid: alloy::primitives::FixedBytes::<32>::from_slice(&[3; 32]), }; let expected_hdr = vec![ 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 111, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, From 2931fee4332a8fc52d723e9b08411e6e4cc6d46b Mon Sep 17 00:00:00 2001 From: Pablo Lozano Date: Tue, 22 Oct 2024 15:57:20 +0200 Subject: [PATCH 36/62] chore: fix after rebase --- Cargo.lock | 279 +++++++++++++++++---------------- workers/src/bin/dvn.rs | 21 +-- workers/src/chain/contracts.rs | 4 +- 3 files changed, 149 insertions(+), 155 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e42b28be..53379e11 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -105,7 +105,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -244,7 +244,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -255,7 +255,7 @@ checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -376,9 +376,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.40" +version = "0.1.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4932d790c723181807738cf1ac68198ab581cd699545b155601332541ee47bd" +checksum = "156bfc5dcd52ef9a5f33381701fa03310317e14c65093a9430d3e3557b08dcd3" dependencies = [ "alloy-primitives", "num_enum", @@ -424,9 +424,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cce174ca699ddee3bfb2ec1fbd99ad7efd05eca20c5c888d8320db41f7e8f04" +checksum = "a54c7158ea4a394bef220d82d8fdd412fb9b1ca2d6024db539070b7bc01b6401" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -437,9 +437,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5647fce5a168f9630f935bf7821c4207b1755184edaeba783cb4e11d35058484" +checksum = "e6228abfc751a29cde117b0879b805a3e0b3b641358f063272c83ca459a56886" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -506,9 +506,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b5671117c38b1c2306891f97ad3828d85487087f54ebe2c7591a055ea5bcea7" +checksum = "d46eb5871592c216d39192499c95a99f7175cb94104f88c307e6dc960676d9f1" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -583,9 +583,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71738eb20c42c5fb149571e76536a0f309d142f3957c28791662b96baf77a3d" +checksum = "38f35429a652765189c1c5092870d8360ee7b7769b09b06d89ebaefd34676446" dependencies = [ "alloy-rlp", "bytes", @@ -688,7 +688,7 @@ checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -831,23 +831,23 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0900b83f4ee1f45c640ceee596afbc118051921b9438fdb5a3175c1a7e05f8b" +checksum = "3b2395336745358cc47207442127c47c63801a7065ecc0aa928da844f8bb5576" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41b1e78dde06b5e12e6702fa8c1d30621bf07728ba75b801fb801c9c6a0ba10" +checksum = "9ed5047c9a241df94327879c2b0729155b58b941eae7805a7ada2e19436e6b39" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -857,16 +857,16 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91dc311a561a306664393407b88d3e53ae58581624128afd8a15faa5de3627dc" +checksum = "5dee02a81f529c415082235129f0df8b8e60aa1601b9c9298ffe54d75f57210b" dependencies = [ "alloy-json-abi", "const-hex", @@ -875,15 +875,15 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.82", + "syn 2.0.79", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45d1fbee9e698f3ba176b6e7a145f4aefe6d2b746b611e8bb246fe11a0e9f6c4" +checksum = "f631f0bd9a9d79619b27c91b6b1ab2c4ef4e606a65192369a1ee05d40dcf81cc" dependencies = [ "serde", "winnow", @@ -891,9 +891,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "086f41bc6ebcd8cb15f38ba20e47be38dd03692149681ce8061c35d960dbf850" +checksum = "c2841af22d99e2c0f82a78fe107b6481be3dd20b89bfb067290092794734343a" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -1087,9 +1087,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.90" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arbitrary" @@ -1272,7 +1272,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", "synstructure", ] @@ -1284,7 +1284,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1434,7 +1434,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1451,7 +1451,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1495,7 +1495,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1576,7 +1576,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.30", "itoa", "matchit", "memchr", @@ -1692,7 +1692,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -1922,7 +1922,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", "syn_derive", ] @@ -2017,9 +2017,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -2079,9 +2079,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "jobserver", "libc", @@ -2182,7 +2182,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2654,7 +2654,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2678,7 +2678,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2689,7 +2689,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2788,7 +2788,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2820,7 +2820,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2831,7 +2831,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2844,7 +2844,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -2864,7 +2864,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", "unicode-xid", ] @@ -2935,7 +2935,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -3136,7 +3136,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -3157,7 +3157,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -3347,9 +3347,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", @@ -3482,7 +3482,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -3822,9 +3822,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -3846,9 +3846,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -3869,7 +3869,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.31", + "hyper 0.14.30", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -3882,7 +3882,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.31", + "hyper 0.14.30", "native-tls", "tokio", "tokio-native-tls", @@ -3896,7 +3896,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.0", + "hyper 1.4.1", "hyper-util", "native-tls", "tokio", @@ -3915,7 +3915,7 @@ dependencies = [ "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.5.0", + "hyper 1.4.1", "pin-project-lite", "socket2 0.5.7", "tokio", @@ -3987,9 +3987,9 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.1.8" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" +checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" [[package]] name = "impl-trait-for-tuples" @@ -4295,9 +4295,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libloading" @@ -4493,7 +4493,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -4698,7 +4698,7 @@ source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -5150,7 +5150,7 @@ dependencies = [ "opentelemetry", "parking_lot 0.12.3", "pin-project", - "protobuf 3.7.1", + "protobuf 3.6.0", "protobuf-codegen", "rand", "rayon", @@ -5233,7 +5233,7 @@ version = "2.2.1-rc.1" source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c8ac1afb2058#b3d767e7664d8e123a35313ccc66c8ac1afb2058" dependencies = [ "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -5350,7 +5350,7 @@ source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c dependencies = [ "quote", "serde", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -5360,7 +5360,7 @@ source = "git+https://github.com/near/nearcore?rev=b3d767e7664d8e123a35313ccc66c dependencies = [ "near-rpc-error-core", "serde", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -5638,7 +5638,7 @@ dependencies = [ "easy-ext", "futures", "hex", - "hyper 0.14.31", + "hyper 0.14.30", "hyper-tls 0.5.0", "indicatif", "near-async", @@ -5861,7 +5861,7 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -5908,9 +5908,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ "bitflags 2.6.0", "cfg-if 1.0.0", @@ -5929,7 +5929,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -5949,9 +5949,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -6036,9 +6036,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "4.4.0" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e7ccb95e240b7c9506a3d544f10d935e142cc90b0a1d56954fb44d89ad6b97" +checksum = "44d501f1a72f71d3c063a6bbc8f7271fa73aa09fe5d6283b6571e2ed176a2537" dependencies = [ "borsh 1.5.1", "num-traits", @@ -6387,7 +6387,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -6428,7 +6428,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -6566,12 +6566,12 @@ checksum = "aa06bd51638b6e76ac9ba9b6afb4164fa647bd2916d722f2623fbb6d1ed8bdba" [[package]] name = "prettyplease" -version = "0.2.24" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910d41a655dac3b764f1ade94821093d3610248694320cd072303a8eedcf221d" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -6656,14 +6656,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -6723,7 +6723,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -6734,9 +6734,9 @@ checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] name = "protobuf" -version = "3.7.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" +checksum = "3018844a02746180074f621e847703737d27d89d7f0721a7a4da317f88b16385" dependencies = [ "once_cell", "protobuf-support", @@ -6745,13 +6745,13 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.7.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144" +checksum = "411c15a212b4de05eb8bc989fd066a74c86bd3c04e27d6e86bd7703b806d7734" dependencies = [ "anyhow", "once_cell", - "protobuf 3.7.1", + "protobuf 3.6.0", "protobuf-parse", "regex", "tempfile", @@ -6760,14 +6760,14 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.7.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" +checksum = "06f45f16b522d92336e839b5e40680095a045e36a1e7f742ba682ddc85236772" dependencies = [ "anyhow", "indexmap 2.6.0", "log", - "protobuf 3.7.1", + "protobuf 3.6.0", "protobuf-support", "tempfile", "thiserror", @@ -6776,9 +6776,9 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.7.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" +checksum = "faf96d872914fcda2b66d66ea3fff2be7c66865d31c7bb2790cff32c0e714880" dependencies = [ "thiserror", ] @@ -7095,7 +7095,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.30", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -7136,7 +7136,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.0", + "hyper 1.4.1", "hyper-tls 0.6.0", "hyper-util", "ipnet", @@ -7452,9 +7452,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring 0.17.8", @@ -7710,9 +7710,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.211" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac55e59090389fb9f0dd9e0f3c09615afed1d19094284d0b200441f13550793" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] @@ -7759,13 +7759,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.211" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be4f245ce16bc58d57ef2716271d0d4519e0f6defa147f6e081005bcb278ff" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -7779,9 +7779,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -7797,7 +7797,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -7848,7 +7848,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8120,7 +8120,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8161,9 +8161,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.82" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -8172,14 +8172,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5e0c2ea8db64b2898b62ea2fbd60204ca95e0b2c6bdf53ff768bbe916fbe4d" +checksum = "ebfc1bfd06acc78f16d8fd3ef846bc222ee7002468d10a7dce8d703d6eab89a3" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8191,7 +8191,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8217,7 +8217,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8316,7 +8316,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8425,9 +8425,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -8470,7 +8470,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8617,7 +8617,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.30", "hyper-timeout", "percent-encoding", "pin-project", @@ -8708,7 +8708,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -8835,9 +8835,12 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicase" -version = "2.8.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] [[package]] name = "unicode-bidi" @@ -8927,9 +8930,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" [[package]] name = "valuable" @@ -9023,7 +9026,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -9057,7 +9060,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9515,7 +9518,7 @@ checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -9947,7 +9950,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] @@ -9967,7 +9970,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.79", ] [[package]] diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index f7bca716..acea2045 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -6,15 +6,12 @@ use futures::stream::StreamExt; use tracing::{debug, error, info, warn}; use tracing_subscriber::EnvFilter; use workers::{ - abi::{ - L0V2EndpointAbi::{self}, - SendLibraryAbi, - }, + abi::{L0V2EndpointAbi::PacketSent, SendLibraryAbi::DVNFeePaid}, chain::{ connections::{build_subscriptions, get_abi_from_path, get_http_provider}, contracts::{create_contract_instance, query_already_verified, query_confirmations, verify}, }, - data::Dvn, + data::dvn::Dvn, }; #[tokio::main] @@ -42,7 +39,7 @@ async fn main() -> Result<()> { // FIXME: refactor the operations from this loop into smaller, testable containers. loop { - dvn_worker.listening(); + dvn_data.listening(); tokio::select! { Some(log) = endpoint_stream.next() => { match log.log_decode::() { @@ -51,11 +48,8 @@ async fn main() -> Result<()> { } Ok(inner_log) => { debug!("PacketSent event found and decoded."); - dvn_worker.packet_received(inner_log.data().clone()); + dvn_data.packet_received(inner_log.data().clone()); }, - Err(e) => { - error!("Failed to decode `PacketSent` event: {:?}", e); - } } } Some(log) = sendlib_stream.next() => { @@ -103,7 +97,7 @@ async fn main() -> Result<()> { verify( &receivelib_contract, &dvn_data.get_header().ok_or_eyre("Cannot extract header from payload")?.to_slice(), - message_hash.as_ref(), + &message_hash.to_vec(), required_confirmations, ).await?; } @@ -123,12 +117,9 @@ async fn main() -> Result<()> { Ok(_)=> { warn!("Received a `DVNFeePaid` event but don't have information about the `Packet` to be verified"); } - Err(e) => { - error!("Failed to decode `DVNFeePaid` event: {:?}", e); - } } }, } - dvn_worker.reset_packet(); + dvn_data.reset_packet(); } } diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index e5ed92f4..28ee012e 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -126,8 +126,8 @@ pub async fn query_already_verified( pub async fn verify( contract: &ContractInst, - packet_header: &Bytes, - payload: &Bytes, + packet_header: &Vec, + payload: &Vec, confirmations: U256, ) -> Result { //// Create the hash of the payload From 69eae56d3779263927c91d53db50ba40a0c1571c Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Mon, 21 Oct 2024 18:11:09 +0300 Subject: [PATCH 37/62] WIP: Verifier and integration test for a verifier --- workers/Cargo.toml | 3 +- workers/src/bin/dvn.rs | 17 ++++++-- workers/src/config.rs | 2 + workers/src/verifier.rs | 73 +++++++++++++++++++--------------- workers/tests/verifier_test.rs | 33 +++++++++------ 5 files changed, 78 insertions(+), 50 deletions(-) diff --git a/workers/Cargo.toml b/workers/Cargo.toml index 714536d9..cf951d29 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -9,7 +9,8 @@ path = "src/bin/dvn.rs" [dependencies] alloy.workspace = true -alloy-json-abi = "0.8.8" +alloy-json-abi = "0.8.9" +#alloy-trie = "0.7.2" blsful = "2.5.7" bytes = "1.7.2" config = { version = "0.14.0", features = ["toml"] } diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index f7bca716..16369dc3 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -5,6 +5,7 @@ use eyre::{OptionExt, Result}; use futures::stream::StreamExt; use tracing::{debug, error, info, warn}; use tracing_subscriber::EnvFilter; +use workers::verifier::NFFLVerifier; use workers::{ abi::{ L0V2EndpointAbi::{self}, @@ -14,8 +15,9 @@ use workers::{ connections::{build_subscriptions, get_abi_from_path, get_http_provider}, contracts::{create_contract_instance, query_already_verified, query_confirmations, verify}, }, - data::Dvn, + config, }; +use workers::data::dvn::Dvn; #[tokio::main] async fn main() -> Result<()> { @@ -26,6 +28,7 @@ async fn main() -> Result<()> { .init(); let mut dvn_data = Dvn::new_from_env()?; + let verifier = NFFLVerifier::new_from_config(&dvn_data.config).await?; // Create the WS subscriptions for listening to the events. let (_provider, mut endpoint_stream, mut sendlib_stream) = build_subscriptions(&dvn_data.config).await?; @@ -51,7 +54,7 @@ async fn main() -> Result<()> { } Ok(inner_log) => { debug!("PacketSent event found and decoded."); - dvn_worker.packet_received(inner_log.data().clone()); + dvn_data.packet_received(inner_log.data().clone()); }, Err(e) => { error!("Failed to decode `PacketSent` event: {:?}", e); @@ -97,8 +100,14 @@ async fn main() -> Result<()> { } else { dvn_data.verifying(); debug!("Packet NOT verified. Calling verification."); + let bn = log.block_number.unwrap(); + // By invariant (Verifying status), dvn_data has a packet. + let hash = dvn_data.packet.unwrap().payload_hash; - // FIXME: logic for NFFL verification + if !verifier.verify(bn, hash).await? { + error!("Failed to verify the state root."); + continue; + } verify( &receivelib_contract, @@ -129,6 +138,6 @@ async fn main() -> Result<()> { } }, } - dvn_worker.reset_packet(); + dvn_data.reset_packet(); } } diff --git a/workers/src/config.rs b/workers/src/config.rs index 6e754aa3..fa82add2 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -25,6 +25,8 @@ pub struct DVNConfig { pub network_eid: u64, /// Own DVN address. Used to check when the DVN is assigned to a task. pub dvn_addr: Address, + /// Aggregator URL + pub aggregator_url: String, } impl DVNConfig { diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 81a85590..212d6288 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -3,6 +3,8 @@ use alloy::pubsub::PubSubFrontend; use reqwest::{ClientBuilder, Url}; use serde::{Deserialize, Serialize}; use std::sync::Arc; +use crate::config; +use crate::config::DVNConfig; #[derive(Serialize, Deserialize, std::fmt::Debug)] pub (crate) struct ResponseWrapper { @@ -12,65 +14,72 @@ pub (crate) struct ResponseWrapper { #[derive(Serialize, Deserialize, std::fmt::Debug)] pub struct Message { #[serde(rename = "RollupId")] - pub rollup_id: i64, + pub rollup_id: u32, #[serde(rename = "BlockHeight")] - pub block_height: i64, + pub block_height: u64, #[serde(rename = "Timestamp")] - pub timestamp: i64, + pub timestamp: u64, #[serde(rename = "NearDaTransactionId")] - pub near_da_transaction_id: Vec, + pub near_da_transaction_id: Vec, #[serde(rename = "NearDaCommitment")] - pub near_da_commitment: Vec, + pub near_da_commitment: Vec, #[serde(rename = "StateRoot")] - pub state_root: Vec, + pub state_root: Vec, } -pub struct Verifier { - eth_l2_provider: Arc>, +pub struct NFFLVerifier { + // eth_l2_provider: Arc>, http_client: reqwest::Client, aggregator_http_address: String, + network_id: String, } -impl Verifier { - pub async fn new(agg_url: &str, rpc_url: &str) -> eyre::Result { - let ws = WsConnect::new(rpc_url); - let provider = ProviderBuilder::new().on_ws(ws).await?; +impl NFFLVerifier { + pub async fn new(agg_url: &str, rpc_url: &str, network_id: u64) -> eyre::Result { + // let ws = WsConnect::new(rpc_url); + // let provider = ProviderBuilder::new().on_ws(ws).await?; let client = ClientBuilder::new().build()?; let agg_http_addr = format!("{}/aggregation/state-root-update", agg_url); - Ok(Verifier { - eth_l2_provider: Arc::new(provider), + Ok(NFFLVerifier { + // eth_l2_provider: Arc::new(provider), http_client: client, aggregator_http_address: agg_http_addr, + network_id: network_id.to_string() + }) + } + + pub async fn new_from_config(cfg: &DVNConfig) -> eyre::Result { + // let ws = WsConnect::new(rpc_url); + // let provider = ProviderBuilder::new().on_ws(ws).await?; + let client = ClientBuilder::new().build()?; + + let agg_http_addr = format!("{}/aggregation/state-root", cfg.aggregator_url()); + + Ok(NFFLVerifier { + // eth_l2_provider: Arc::new(provider), + http_client: client, + aggregator_http_address: agg_http_addr, + network_id: cfg.network_id().to_string() }) } - pub async fn verify(&self, rollup_id: u32, block_height: u64) -> bool { + pub async fn verify(&self, payload_hash: &[u8], block_height: u64) -> eyre::Result { // tokio::spawn(async { let params = [ - ("rollupId", rollup_id.to_string()), + ("rollupId", self.network_id.clone()), ("blockHeight", block_height.to_string()), ]; let url = Url::parse_with_params(&self.aggregator_http_address, ¶ms)?; let res = self.http_client.get(url).send().await?; let response_payload = res.json::().await?; let message = &response_payload.message; - // TODO: take the state root from the LayerZero message. - message.state_root.eq(&vec![0]) + if (message.block_height != block_height) { + return Ok(false); + } + // TODO: take the hash from the LayerZero message for Merkle proof verification. + // Ok(message.state_root.eq(&vec![0])) + Ok(true) } } - -/* -Expected JSON successful response body. -{ - "Message" : { - "RollupId" : 1, - "BlockHeight" : 2, - "Timestamp" : 3, - "NearDaTransactionId" : [ ..bytes.. ], - "NearDaCommitment" : [ ..bytes.. ], - "StateRoot" : [ ..bytes.. ] - } -} -*/ diff --git a/workers/tests/verifier_test.rs b/workers/tests/verifier_test.rs index a66024e9..29f7e321 100644 --- a/workers/tests/verifier_test.rs +++ b/workers/tests/verifier_test.rs @@ -1,27 +1,34 @@ -use wiremock::{MockServer, Mock, ResponseTemplate}; use wiremock::matchers::{method, path}; -use workers::verifier::Verifier; +use wiremock::{Mock, MockServer, ResponseTemplate}; +use workers::verifier::NFFLVerifier; #[tokio::main] #[test] -async fn main() { +async fn main() -> eyre::Result<()> { // Start a background HTTP server on a random local port let mock_server = MockServer::start().await; setup(&mock_server).await; - - let verifier = Verifier::new("", "").await?; - assert_eq!(verifier.verify(1, 2).await, true); -} + let verifier = NFFLVerifier::new( + "", + mock_server.address().to_string().as_str(), + 1, + ).await?; + let verify_result = verifier.verify(vec![].as_slice(),2).await; + assert_eq!(verify_result.is_ok(), true); + assert_eq!(verify_result.unwrap(), true); + + Ok(()) +} async fn setup(mock_server: &MockServer) -> eyre::Result<()> { let state_root_message = workers::verifier::Message { rollup_id: 1, block_height: 2, - timestamp : 3, - near_da_transaction_id : vec![4], - near_da_commitment : vec![5], - state_root: vec![6] + timestamp: 3, + near_da_transaction_id: vec![4], + near_da_commitment: vec![5], + state_root: vec![0], }; Mock::given(method("GET")) @@ -29,6 +36,6 @@ async fn setup(mock_server: &MockServer) -> eyre::Result<()> { .respond_with(ResponseTemplate::new(200).set_body_json(state_root_message)) .mount(&mock_server) .await; - + Ok(()) -} \ No newline at end of file +} From 5cbfb6406b9540cbf343e070e6a74715b18bf389 Mon Sep 17 00:00:00 2001 From: Pablo Lozano Date: Tue, 22 Oct 2024 18:10:20 +0200 Subject: [PATCH 38/62] refactor: manual encode/decode --- workers/src/abi.rs | 29 ++-- workers/src/bin/dvn.rs | 8 +- workers/src/chain/contracts.rs | 4 +- workers/src/data/bytes_utils.rs | 202 +++++++++++++++++++++++ workers/src/data/dvn.rs | 26 ++- workers/src/data/mod.rs | 3 +- workers/src/data/packet_v1_codec.rs | 239 ++++++++++++++++++++++++++++ 7 files changed, 481 insertions(+), 30 deletions(-) create mode 100644 workers/src/data/bytes_utils.rs create mode 100644 workers/src/data/packet_v1_codec.rs diff --git a/workers/src/abi.rs b/workers/src/abi.rs index 5b4eb08c..b0170fa4 100644 --- a/workers/src/abi.rs +++ b/workers/src/abi.rs @@ -25,18 +25,17 @@ sol!( "abi/L0V2Endpoint.json" ); -sol!( - #[allow(missing_docs)] - #[sol(abi)] - #[derive(Debug, PartialEq, Eq)] - struct Packet { - uint8 version; - uint64 nonce; - uint32 srcEid; - bytes32 sender; - uint32 dstEid; - bytes32 receiver; - bytes32 guid; - bytes message; - } -); +//sol!( +// #[allow(missing_docs)] +// #[sol(abi)] +// #[derive(Debug, PartialEq, Eq)] +// struct Packet { +// uint64 nonce; +// uint32 src_eid; +// bytes32 sender; +// uint32 dst_eid; +// bytes32 receiver; +// bytes32 guid; +// bytes message; +// } +//); diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index acea2045..c6d3fe31 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -96,17 +96,17 @@ async fn main() -> Result<()> { verify( &receivelib_contract, - &dvn_data.get_header().ok_or_eyre("Cannot extract header from payload")?.to_slice(), - &message_hash.to_vec(), + dvn_data.get_header().ok_or_eyre("Cannot extract header from payload")?, + message_hash.as_ref(), required_confirmations, ).await?; } } (_, None) => { - error!("Cannot payload hash"); + error!("Cannot hash payload"); } (None, _) => { - error!("Cannot message hash"); + error!("Cannot hash message"); } } } else { diff --git a/workers/src/chain/contracts.rs b/workers/src/chain/contracts.rs index 28ee012e..5614acdb 100644 --- a/workers/src/chain/contracts.rs +++ b/workers/src/chain/contracts.rs @@ -126,8 +126,8 @@ pub async fn query_already_verified( pub async fn verify( contract: &ContractInst, - packet_header: &Vec, - payload: &Vec, + packet_header: &[u8], + payload: &[u8], confirmations: U256, ) -> Result { //// Create the hash of the payload diff --git a/workers/src/data/bytes_utils.rs b/workers/src/data/bytes_utils.rs new file mode 100644 index 00000000..163c2d9b --- /dev/null +++ b/workers/src/data/bytes_utils.rs @@ -0,0 +1,202 @@ +//! Utilities for manipulating byte arrays. + +pub trait BytesUtils { + fn to_u8(&self, start: usize) -> u8; + fn to_u16(&self, start: usize) -> u16; + fn to_u32(&self, start: usize) -> u32; + fn to_u64(&self, start: usize) -> u64; + fn to_u128(&self, start: usize) -> u128; + fn to_bytes32(&self, start: usize) -> &[u8]; + fn to_byte_array(&self, start: usize) -> [u8; N]; +} + +impl BytesUtils for &[u8] { + fn to_u8(&self, start: usize) -> u8 { + self[start] + } + + fn to_u16(&self, start: usize) -> u16 { + let mut bytes: [u8; 2] = [0; 2]; + bytes.copy_from_slice(&self[start..start + 2]); + u16::from_be_bytes(bytes) + } + + fn to_u32(&self, start: usize) -> u32 { + let mut bytes: [u8; 4] = [0; 4]; + bytes.copy_from_slice(&self[start..start + 4]); + u32::from_be_bytes(bytes) + } + + fn to_u64(&self, start: usize) -> u64 { + let mut bytes: [u8; 8] = [0; 8]; + bytes.copy_from_slice(&self[start..start + 8]); + u64::from_be_bytes(bytes) + } + + fn to_u128(&self, start: usize) -> u128 { + let mut bytes: [u8; 16] = [0; 16]; + bytes.copy_from_slice(&self[start..start + 16]); + u128::from_be_bytes(bytes) + } + + fn to_bytes32(&self, start: usize) -> &[u8] { + &self[start..start + 32] + } + + fn to_byte_array(&self, start: usize) -> [u8; N] { + let mut bytes: [u8; N] = [0; N]; + bytes.copy_from_slice(&self[start..start + N]); + bytes + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_to_u8() { + let bytes = &[1_u8, 2][..]; + assert_eq!(bytes.to_u8(0), 1); + } + + #[test] + fn test_to_u8_start1() { + let bytes = &[1_u8, 2][..]; + assert_eq!(bytes.to_u8(1), 2); + } + + #[test] + fn test_to_u16() { + let bytes = &[1_u8, 1, 2][..]; + assert_eq!(bytes.to_u16(0), 2_u16.pow(8) + 1); + } + + #[test] + fn test_to_u16_start1() { + let bytes = &[1_u8, 1, 2][..]; + assert_eq!(bytes.to_u16(1), 2_u16.pow(8) + 2); + } + + #[test] + fn test_to_u32() { + let bytes = &[1_u8, 1, 1, 1, 2][..]; + assert_eq!(bytes.to_u32(0), 2_u32.pow(24) + 2_u32.pow(16) + 2_u32.pow(8) + 1); + } + + #[test] + fn test_to_u32_start1() { + let bytes = &[1_u8, 1, 1, 1, 2][..]; + assert_eq!(bytes.to_u32(1), 2_u32.pow(24) + 2_u32.pow(16) + 2_u32.pow(8) + 2); + } + + #[test] + fn test_to_u64() { + let bytes = &[1_u8, 1, 1, 1, 1, 1, 1, 1, 2][..]; + assert_eq!( + bytes.to_u64(0), + 2_u64.pow(56) + + 2_u64.pow(48) + + 2_u64.pow(40) + + 2_u64.pow(32) + + 2_u64.pow(24) + + 2_u64.pow(16) + + 2_u64.pow(8) + + 1 + ); + } + + #[test] + fn test_to_u64_start1() { + let bytes = &[1_u8, 1, 1, 1, 1, 1, 1, 1, 2][..]; + assert_eq!( + bytes.to_u64(1), + 2_u64.pow(56) + + 2_u64.pow(48) + + 2_u64.pow(40) + + 2_u64.pow(32) + + 2_u64.pow(24) + + 2_u64.pow(16) + + 2_u64.pow(8) + + 2 + ); + } + + #[test] + fn test_to_u128() { + let bytes = &[1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2][..]; + assert_eq!( + bytes.to_u128(0), + 2_u128.pow(120) + + 2_u128.pow(112) + + 2_u128.pow(104) + + 2_u128.pow(96) + + 2_u128.pow(88) + + 2_u128.pow(80) + + 2_u128.pow(72) + + 2_u128.pow(64) + + 2_u128.pow(56) + + 2_u128.pow(48) + + 2_u128.pow(40) + + 2_u128.pow(32) + + 2_u128.pow(24) + + 2_u128.pow(16) + + 2_u128.pow(8) + + 1 + ); + } + + #[test] + fn test_to_u128_start1() { + let bytes = &[1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2][..]; + assert_eq!( + bytes.to_u128(1), + 2_u128.pow(120) + + 2_u128.pow(112) + + 2_u128.pow(104) + + 2_u128.pow(96) + + 2_u128.pow(88) + + 2_u128.pow(80) + + 2_u128.pow(72) + + 2_u128.pow(64) + + 2_u128.pow(56) + + 2_u128.pow(48) + + 2_u128.pow(40) + + 2_u128.pow(32) + + 2_u128.pow(24) + + 2_u128.pow(16) + + 2_u128.pow(8) + + 2 + ); + } + + #[test] + fn test_to_bytes32() { + let bytes = &[ + 1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + ][..]; + assert_eq!(bytes.to_bytes32(0), &[1_u8; 32]); + } + + #[test] + fn test_to_bytes32_start1() { + let bytes = &[ + 2_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + ][..]; + assert_eq!(bytes.to_bytes32(1), &[1_u8; 32]); + } + + #[test] + fn test_to_byte_array() { + let bytes = &[1_u8; 64][..]; + assert_eq!(bytes.to_byte_array::<32>(0), [1_u8; 32]); + } + + #[test] + fn test_to_byte_array_start1() { + let bytes = &[ + 2_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + ][..]; + assert_eq!(bytes.to_byte_array::<32>(1), [1_u8; 32]); + } +} diff --git a/workers/src/data/dvn.rs b/workers/src/data/dvn.rs index 35b41ae0..8bb28991 100644 --- a/workers/src/data/dvn.rs +++ b/workers/src/data/dvn.rs @@ -1,10 +1,10 @@ use crate::{ abi::L0V2EndpointAbi::PacketSent, config::{self, DVNConfig}, - data::extractors::{extract_header, extract_message, Header}, + data::packet_v1_codec::{header, message}, }; use alloy::primitives::{keccak256, B256}; -use eyre::Result; +use eyre::{eyre, Result}; use tracing::debug; pub struct Dvn { @@ -52,27 +52,37 @@ impl Dvn { self.status = DvnStatus::Verifying; } - pub fn get_header(&self) -> Option
{ + pub fn get_header(&self) -> Option<&[u8]> { if let Some(packet) = self.packet.as_ref() { - extract_header(packet.encodedPayload.as_ref()) + Some(header(packet.encodedPayload.as_ref())) } else { None } } pub fn get_header_hash(&self) -> Option { + self.packet + .as_ref() + .map(|packet| keccak256(header(packet.encodedPayload.as_ref()))) + } + pub fn get_header_hash_result(&self) -> Result { if let Some(packet) = self.packet.as_ref() { - extract_header(packet.encodedPayload.as_ref()).map(|header| keccak256(header.to_slice())) + Ok(keccak256(header(packet.encodedPayload.as_ref()))) } else { - None + Err(eyre!("There's no header to hash")) } } pub fn get_message_hash(&self) -> Option { + self.packet + .as_ref() + .map(|packet| keccak256(message(packet.encodedPayload.as_ref()))) + } + pub fn get_message_hash_result(&self) -> Result { if let Some(packet) = self.packet.as_ref() { - extract_message(packet.encodedPayload.as_ref()).map(|message| keccak256(message.as_slice())) + Ok(keccak256(message(packet.encodedPayload.as_ref()))) } else { - None + Err(eyre!("There's no message to hash")) } } } diff --git a/workers/src/data/mod.rs b/workers/src/data/mod.rs index 037da295..fd9b7559 100644 --- a/workers/src/data/mod.rs +++ b/workers/src/data/mod.rs @@ -1,2 +1,3 @@ +pub mod bytes_utils; pub mod dvn; -pub mod extractors; +pub mod packet_v1_codec; diff --git a/workers/src/data/packet_v1_codec.rs b/workers/src/data/packet_v1_codec.rs new file mode 100644 index 00000000..5b8dcd8b --- /dev/null +++ b/workers/src/data/packet_v1_codec.rs @@ -0,0 +1,239 @@ +//! Encoding and decoding as PacketV1Codec from LayerZero. + +use crate::data::bytes_utils::BytesUtils; + +pub const PACKET_VERSION: u8 = 1; +pub const PACKET_HEADER_SIZE: usize = 81; + +// header (version + nonce + path) +// version +const PACKET_VERSION_OFFSET: usize = 0; +// nonce +const NONCE_OFFSET: usize = 1; +// path +const SRC_EID_OFFSET: usize = 9; +const SENDER_OFFSET: usize = 13; +const DST_EID_OFFSET: usize = 45; +const RECEIVER_OFFSET: usize = 49; +// payload (guid + message) +const GUID_OFFSET: usize = 81; +const MESSAGE_OFFSET: usize = 113; + +/// Packet struct as defined in messagelib. +pub struct Packet { + pub nonce: u64, + pub src_eid: u32, + pub sender: [u8; 32], + pub dst_eid: u32, + pub receiver: [u8; 32], + pub guid: [u8; 32], + pub message: Vec, +} + +/// Encode a whole [`Packet`] into a byte array. +pub fn encode(packet: &Packet) -> Vec { + [ + &PACKET_VERSION.to_be_bytes()[..], + &packet.nonce.to_be_bytes()[..], + &packet.src_eid.to_be_bytes()[..], + &packet.sender.to_vec()[..], + &packet.dst_eid.to_be_bytes()[..], + &packet.receiver[..], + &packet.guid[..], + &packet.message, + ] + .concat() +} + +/// Encode only the [`Packet`]'s header into a byte array. +pub fn encode_packet_header(packet: &Packet) -> Vec { + [ + &PACKET_VERSION.to_be_bytes()[..], + &packet.nonce.to_be_bytes()[..], + &packet.src_eid.to_be_bytes()[..], + &packet.sender.to_vec()[..], + &packet.dst_eid.to_be_bytes()[..], + &packet.receiver[..], + ] + .concat() +} + +pub fn header(packet: &[u8]) -> &[u8] { + &packet[0..GUID_OFFSET] +} + +pub fn version(packet: &[u8]) -> u8 { + packet.to_u8(PACKET_VERSION_OFFSET) +} + +pub fn nonce(packet: &[u8]) -> u64 { + packet.to_u64(NONCE_OFFSET) +} + +pub fn src_eid(packet: &[u8]) -> u32 { + packet.to_u32(SRC_EID_OFFSET) +} + +pub fn sender(packet: &[u8]) -> [u8; 32] { + packet.to_byte_array(SENDER_OFFSET) +} + +pub fn dst_eid(packet: &[u8]) -> u32 { + packet.to_u32(DST_EID_OFFSET) +} + +pub fn receiver(packet: &[u8]) -> [u8; 32] { + packet.to_byte_array(RECEIVER_OFFSET) +} + +pub fn guid(packet: &[u8]) -> [u8; 32] { + packet.to_byte_array(GUID_OFFSET) +} + +pub fn message(packet: &[u8]) -> &[u8] { + &packet[MESSAGE_OFFSET..] +} + +pub fn payload(packet: &[u8]) -> &[u8] { + &packet[GUID_OFFSET..] +} + +#[cfg(test)] +mod tests { + use alloy::hex; + + use super::*; + + #[test] + fn test_encode() { + let packet = Packet { + nonce: 1, + src_eid: 101, + sender: [1; 32], + dst_eid: 102, + receiver: [3; 32], + guid: [2; 32], + message: vec![1, 2, 3], + }; + + let encoded = encode(&packet); + assert_eq!(version(&encoded), PACKET_VERSION); + assert_eq!(nonce(&encoded), packet.nonce); + assert_eq!(src_eid(&encoded), packet.src_eid); + assert_eq!(sender(&encoded), packet.sender); + assert_eq!(dst_eid(&encoded), packet.dst_eid); + assert_eq!(receiver(&encoded), packet.receiver); + assert_eq!(guid(&encoded), packet.guid); + assert_eq!(message(&encoded), packet.message); + + // assert payload, should equal to guid + message + let payload_bytes = [&packet.guid[..], packet.message.as_slice()].concat(); + assert_eq!(payload(&encoded), payload_bytes.as_slice()); + + // assert header, should equal to version + nonce + path + let header_bytes = [ + // version + &PACKET_VERSION.to_be_bytes()[..], + // nonce + &packet.nonce.to_be_bytes()[..], + // path + &packet.src_eid.to_be_bytes()[..], + &packet.sender[..], + &packet.dst_eid.to_be_bytes()[..], + &packet.receiver[..], + ] + .concat(); + assert_eq!(header(&encoded), header_bytes.as_slice()); + + // assert sender + assert_eq!(sender(&encoded), packet.sender); + + // assert receiver + assert_eq!(receiver(&encoded), packet.receiver); + } + + #[test] + fn test_encode_packet_header() { + let packet = Packet { + nonce: 1, + src_eid: 101, + sender: [1; 32], + dst_eid: 102, + receiver: [3; 32], + guid: [2; 32], + message: vec![1, 2, 3], + }; + + let encoded = encode_packet_header(&packet); + assert_eq!(version(&encoded), PACKET_VERSION); + assert_eq!(nonce(&encoded), packet.nonce); + assert_eq!(src_eid(&encoded), packet.src_eid); + assert_eq!(sender(&encoded), packet.sender); + assert_eq!(dst_eid(&encoded), packet.dst_eid); + assert_eq!(receiver(&encoded), packet.receiver); + + // assert header, should equal to version + nonce + path + let header_bytes = [ + // version + &PACKET_VERSION.to_be_bytes()[..], + // nonce + &packet.nonce.to_be_bytes()[..], + // path + &packet.src_eid.to_be_bytes()[..], + &packet.sender[..], + &packet.dst_eid.to_be_bytes()[..], + &packet.receiver[..], + ] + .concat(); + assert_eq!(header(&encoded), header_bytes.as_slice()); + } + + /// Fixture using Typescript package `lz-utilities-v2` from LayerZero. + #[test] + fn decode() { + let packet = hex::decode("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00").unwrap(); + + let version = version(&packet); + assert_eq!(version, PACKET_VERSION); + + let nonce = nonce(&packet); + assert_eq!(nonce, 76929); + + let src_eid = src_eid(&packet); + assert_eq!(src_eid, 30110); + + let sender = sender(&packet); + assert_eq!( + sender, + hex::decode("0x00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd") + .unwrap() + .as_slice() + ); + + let dst_eid = dst_eid(&packet); + assert_eq!(dst_eid, 30184); + + let receiver = receiver(&packet); + assert_eq!( + receiver, + hex::decode("0x0000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e47") + .unwrap() + .as_slice() + ); + + let guid = guid(&packet); + assert_eq!( + guid, + hex::decode("0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b") + .unwrap() + .as_slice() + ); + + let payload = payload(&packet); + assert_eq!( + payload, + hex::decode("0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00") + .unwrap().as_slice() + ); + } +} From 22af924379a73cfe9b25ec2d6fef5462ac8afad3 Mon Sep 17 00:00:00 2001 From: Pablo Lozano Date: Wed, 23 Oct 2024 08:57:22 +0200 Subject: [PATCH 39/62] chore: remove unused --- workers/src/data/extractors.rs | 308 --------------------------------- 1 file changed, 308 deletions(-) delete mode 100644 workers/src/data/extractors.rs diff --git a/workers/src/data/extractors.rs b/workers/src/data/extractors.rs deleted file mode 100644 index f15bef3d..00000000 --- a/workers/src/data/extractors.rs +++ /dev/null @@ -1,308 +0,0 @@ -//! Extract data from encoded payloads. -//! -//! FIXME: couldn't make it work with `alloy`+ABI, so -//! using manual extracting for now. Added tests. -//! Re-check if it can work that way. - -use alloy::primitives::FixedBytes; -use bytes::{Buf, BufMut, BytesMut}; - -/// Minimum length of a packet. -const MINIMUM_PACKET_LENGTH: usize = 113; // 1 + 8 + 4 + 32 + 4 + 32 + 32 - -/// The whole header from the `Packet`. -#[derive(Debug)] -pub struct Header { - version: u8, - nonce: u64, - src_eid: u32, - sender_addr: AddressWithType, - dst_eid: u32, - rcv_addr: AddressWithType, - guid: FixedBytes<32>, -} - -impl Header { - /// Return the header as a collection of bytes. - pub fn to_slice(&self) -> Vec { - let mut header = BytesMut::new(); - header.put_u8(self.version); - header.put_u64(self.nonce); - header.put_u32(self.src_eid); - header.put_slice(self.sender_addr.address.as_ref()); - header.put_u32(self.dst_eid); - header.put_slice(self.rcv_addr.address.as_ref()); - header.put_slice(self.guid.as_ref()); - header.to_vec() - } - - /// Return the header as a collection of bytes but padding the addresses to 32 bytes. - pub fn to_slice_padded(&self) -> Vec { - let mut header = BytesMut::new(); - header.put_u8(self.version); - header.put_u64(self.nonce); - header.put_u32(self.src_eid); - header.put_slice(&[0; 12]); - header.put_slice(self.sender_addr.address.as_ref()); - header.put_u32(self.dst_eid); - header.put_slice(&[0; 12]); - header.put_slice(self.rcv_addr.address.as_ref()); - header.put_slice(self.guid.as_ref()); - header.to_vec() - } -} - -#[derive(Debug, PartialEq)] -struct AddressWithType { - pub address: FixedBytes<32>, - pub variant: AddressType, -} - -#[derive(Debug, PartialEq)] -enum AddressType { - Ethereum, - Solana, -} - -impl AddressWithType { - /// Expect some bytes (usually, 32 bytes) thay may encode an ETH address (padded with 12 bytes) or a Solana address (non-padded). - pub fn new(bytes_addr: &[u8]) -> Self { - println!("{:?}", bytes_addr); - let variant = if bytes_addr.starts_with(&[0; 12]) { - AddressType::Ethereum - } else { - AddressType::Solana - }; - let address = FixedBytes::<32>::from_slice(bytes_addr); - Self { variant, address } - } -} - -/// When feeded a packet, return the whole header, which is everything but the message. -pub fn extract_header(raw_packet: &[u8]) -> Option
{ - if raw_packet.len() < MINIMUM_PACKET_LENGTH { - return None; - } - let mut buffered_packet = BytesMut::from(raw_packet); - let version = buffered_packet.get_u8(); // version - let nonce = buffered_packet.get_u64(); // nonce - let src_eid = buffered_packet.get_u32(); // src_eid - let sender_addr = AddressWithType::new(&buffered_packet.split_to(32)); - let dst_eid = buffered_packet.get_u32(); // dst_eid - let rcv_addr = AddressWithType::new(&buffered_packet.split_to(32)); - let guid: FixedBytes<32> = FixedBytes::from_slice(&buffered_packet.split_to(32).freeze()[..]); - - Some(Header { - version, - nonce, - src_eid, - sender_addr, - dst_eid, - rcv_addr, - guid, - }) -} - -/// When feeded a packet, return the whole message, which is everything but the header. -pub fn extract_message(raw_packet: &[u8]) -> Option> { - // If there's no message to be loaded, return `None`. - if raw_packet.len() < MINIMUM_PACKET_LENGTH { - return None; - } - let mut buffered_packet = BytesMut::from(raw_packet); - // Skip the header. - buffered_packet.advance(MINIMUM_PACKET_LENGTH); - let message = buffered_packet.freeze().to_vec(); - - Some(message) -} - -/// Test the extraction of the header and the message from a packet. -/// -/// An encodedPayload from a transaction is used as mockup data, -/// and to test that it correctly decodes it, a LayerZero's library -/// in typescript has been used to check it: -/// -/// ```typescript -/// import { PacketSerializer } from "@layerzerolabs/lz-v2-utilities"; -/// -/// const des = PacketSerializer.deserialize("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"); -/// -/// console.log(des); -/// ``` -/// -/// And its output is: -/// ``` -/// { -/// version: 1, -/// nonce: '76929', -/// srcEid: 30110, -/// sender: '0x00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd', -/// dstEid: 30184, -/// receiver: '0x0000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e47', -/// guid: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b', -/// message: '0x0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00', -/// payload: '0x9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00' -/// } -/// ``` -/// Note: The payload is the concatenation of the guid and the message. -#[cfg(test)] -mod tests { - use super::*; - use crate::abi::SendLibraryAbi; - use alloy::{hex, primitives::Address, sol_types::SolType}; - use eyre::Result; - - impl AddressWithType { - pub fn ethereum_addr(&self) -> Result
{ - match self.variant { - AddressType::Ethereum => Ok(Address::from_slice(&self.address[12..32])), - _ => Err(eyre::eyre!("This is not an Ethereum address")), - } - } - } - - #[test] - fn abi_decode() -> Result<()> { - let hex_payload = hex!("010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"); - - let v = SendLibraryAbi::Packet::abi_decode(&hex_payload, true)?; - println!("{:?}", v); - - //// Similar to the Packet - //type MyTy = ( - // Uint<8>, - // Uint<64>, - // Uint<32>, - // FixedBytes<32>, - // Uint<32>, - // FixedBytes<32>, - // FixedBytes<32>, - // Bytes, - //); - //let v = MyTy::abi_decode(&hex_payload, true)?; - //println!("{:?}", v); - - //sol!( - // #[derive(Debug)] - // struct Packet { - // uint8 version; - // uint64 nonce; - // uint32 srcEid; - // bytes32 sender; - // uint32 dstEid; - // bytes32 receiver; - // bytes32 guid; - // bytes message; - // } - //); - //let v = Packet::abi_decode(&hex_payload, true)?; - //println!("{:?}", v); - - //let v = SendLibraryAbi::Packet::abi_decode(&hex_payload, true)?; - //println!("{:?}", v); - - Ok(()) - } - - #[test] - fn addresses_with_types() { - let a = AddressWithType::new(&[1; 20]); - assert_eq!(a.variant, AddressType::Ethereum); - assert!(a.address.starts_with(&[0; 12])); - - let b = AddressWithType::new(&[1; 32]); - assert_eq!(b.variant, AddressType::Solana); - } - - #[test] - fn extract_msg() { - // GIVEN: a known encodedPayload - let hex_payload = "0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00"; - - // WHEN: the values are extracted from it. - let payload: Vec = hex::decode(hex_payload).unwrap(); - let message = extract_message(&payload).unwrap(); - - // THEN: the message is correctly extracted. - // Check the extracted value isn't altered. - assert!(hex_payload.contains(&hex::encode(&message))); - // Check the obtained value is the same as the expected one (see above to know - // where this comes from). - let expected_message = hex::decode("0x0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00").unwrap(); - assert_eq!(message, expected_message); - } - - #[test] - fn extract_hdr() { - // GIVEN: a known encodedPayload - let payload: Vec = hex::decode("0x010000000000012c810000759e00000000000000000000000019cfce47ed54a88614648dc3f19a5980097007dd000075e80000000000000000000000005634c4a5fed09819e3c46d86a965dd9447d86e479527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b0200000000000000000000000000000000000000000000000000002d79883d2000000d00000000000000000000000051a9ffd0c6026dcd59b5f2f42cc119deaa7347d0000000000000000e00000d0000000000000000000000005c8fbdbbc01d3474e7e40de14538e1e58fd485b3000000000000206b00").unwrap(); - - // WHEN: the header is extracted from it. - let header = extract_header(&payload).unwrap(); - - // THEN: the header values are correctly extracted. - assert_eq!(header.version, 1); - assert_eq!(header.nonce, 76929); - assert_eq!(header.src_eid, 30110); - assert_eq!( - header.sender_addr.ethereum_addr().unwrap(), - Address::from_slice( - hex::decode("19cfce47ed54a88614648dc3f19a5980097007dd") - .unwrap() - .as_ref() - ) - ); - assert_eq!(header.dst_eid, 30184); - assert_eq!( - header.rcv_addr.ethereum_addr().unwrap(), - Address::from_slice( - hex::decode("5634c4a5fed09819e3c46d86a965dd9447d86e47") - .unwrap() - .as_ref() - ) - ); - assert_eq!( - header.guid, - alloy::primitives::FixedBytes::<32>::from_slice( - hex::decode("9527645d4aecaa3325a0225a2b593eea5f0d26a44b97af7276bc0a80ed43047b") - .unwrap() - .as_ref() - ) - ); - } - - #[test] - fn slice_header() { - let hdr = Header { - version: 1, - nonce: 1, - src_eid: 111, - sender_addr: AddressWithType::new(&[1; 20]), - dst_eid: 222, - rcv_addr: AddressWithType::new(&[2; 20]), - guid: alloy::primitives::FixedBytes::<32>::from_slice(&[3; 32]), - }; - let expected_hdr = vec![ - 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 111, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 222, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - ]; - let expected_padded_hdr = vec![ - 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, - ]; - - // WHEN: getting the header as a slice without padding. - let sliced_hdr = hdr.to_slice(); - // THEN: it should return the expected value. - assert_eq!(sliced_hdr, expected_hdr); - - // WHEN: getting the header as a slice with padding. - let padded_hdr = hdr.to_slice_padded(); - // THEN: it should return the expected value. - assert_eq!(padded_hdr, expected_padded_hdr); - } -} From 0dc5dfab654591c9b1f9b480c3ede6466b559e80 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Wed, 23 Oct 2024 18:57:45 +0300 Subject: [PATCH 40/62] WIP: Verifier V1 according to algorithm --- Cargo.lock | 143 +++++++++++++++++++++++++++++++-- Cargo.toml | 25 +++--- workers/Cargo.toml | 3 + workers/src/abi.rs | 4 +- workers/src/bin/dvn.rs | 12 ++- workers/src/verifier.rs | 140 ++++++++++++++++++++++++-------- workers/tests/verifier_test.rs | 41 ---------- 7 files changed, 265 insertions(+), 103 deletions(-) delete mode 100644 workers/tests/verifier_test.rs diff --git a/Cargo.lock b/Cargo.lock index 53379e11..258d4ec0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -79,7 +79,7 @@ dependencies = [ "encoding_rs", "flate2", "futures-core", - "h2", + "h2 0.3.26", "http 0.2.12", "httparse", "httpdate", @@ -973,6 +973,22 @@ dependencies = [ "ws_stream_wasm", ] +[[package]] +name = "alloy-trie" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd7f8b3a7c65ca09b3c7bdd7c7d72d7423d026f5247eda96af53d24e58315c1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec 0.7.6", + "derive_more 1.0.0", + "nybbles", + "serde", + "smallvec", + "tracing", +] + [[package]] name = "amq-protocol" version = "7.2.2" @@ -1287,6 +1303,16 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "assert_matches" version = "1.5.0" @@ -1523,7 +1549,7 @@ dependencies = [ "derive_more 0.99.18", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "itoa", "log", @@ -3638,6 +3664,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.6.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.11.2" @@ -3830,7 +3875,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -3853,9 +3898,11 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2 0.4.6", "http 1.1.0", "http-body 1.0.1", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -3863,6 +3910,23 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-timeout" version = "0.4.1" @@ -5870,6 +5934,19 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" +[[package]] +name = "nybbles" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95f06be0417d97f81fe4e5c86d7d01b392655a9cac9c19a848aa033e18937b23" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", +] + [[package]] name = "object" version = "0.32.2" @@ -7092,7 +7169,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", @@ -7110,7 +7187,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration", + "system-configuration 0.5.1", "tokio", "tokio-native-tls", "tokio-util", @@ -7131,12 +7208,15 @@ checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-core", "futures-util", + "h2 0.4.6", "http 1.1.0", "http-body 1.0.1", "http-body-util", "hyper 1.4.1", + "hyper-rustls", "hyper-tls 0.6.0", "hyper-util", "ipnet", @@ -7152,6 +7232,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", + "system-configuration 0.6.1", "tokio", "tokio-native-tls", "tower-service", @@ -8243,7 +8324,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", ] [[package]] @@ -8256,6 +8348,16 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tap" version = "1.0.1" @@ -8614,7 +8716,7 @@ dependencies = [ "axum", "base64 0.21.7", "bytes", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", @@ -9829,21 +9931,48 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wiremock" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fff469918e7ca034884c7fd8f93fe27bacb7fcb599fd879df6c7b429a29b646" +dependencies = [ + "assert-json-diff", + "async-trait", + "base64 0.22.1", + "deadpool", + "futures", + "http 1.1.0", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "log", + "once_cell", + "regex", + "serde", + "serde_json", + "tokio", + "url", +] + [[package]] name = "workers" version = "0.1.0" dependencies = [ "alloy", + "alloy-trie", "blsful", "bytes", "config", "eyre", "futures", + "reqwest 0.12.8", "serde", "serde_json", "tokio", "tracing", "tracing-subscriber", + "wiremock", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 69a7bead..0e5978a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,26 +16,27 @@ repository = "https://github.com/NethermindEth/near-sffl" [workspace.dependencies] alloy = { version = "0.4.2", features = ["full", "node-bindings", "rpc-types-debug", "rpc-types-trace", "json-rpc", "rpc-client", "serde", "json-abi"] } alloy-primitives = "0.8.3" +alloy-rlp = "0.3.8" alloy-rpc-client = "0.4.2" alloy-rpc-types = "0.4.2" alloy-transport-ws = "0.4.2" -alloy-rlp = "0.3.8" -tokio = { version = "1.0", features = ["full"] } +anyhow = "1.0" +async-trait = "0.1" +bincode = "1.3" +clap = "4.5.18" +core-rs = { path = "core-rs" } +eyre = "0.6" +futures-util = "0.3.30" +log = "0.4" prometheus = "0.13" +reqwest = "0.12.8" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -anyhow = "1.0" -tracing = "0.1" -tracing-subscriber = "0.3" -futures-util = "0.3.30" -eyre = "0.6" -bincode = "1.3" serde_yaml = "0.9" -clap = "4.5.18" tempfile = "3.10.0" -async-trait = "0.1" -log = "0.4" -core-rs = { path = "core-rs" } +tokio = { version = "1.0", features = ["full"] } +tracing = "0.1" +tracing-subscriber = "0.3" [patch.crates-io] parity-secp256k1 = { git = 'https://github.com/paritytech/rust-secp256k1.git' } diff --git a/workers/Cargo.toml b/workers/Cargo.toml index 69cc89a1..81f74320 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -9,13 +9,16 @@ path = "src/bin/dvn.rs" [dependencies] alloy.workspace = true +alloy-trie = "0.7.2" blsful = "2.5.7" bytes = "1.7.2" config = { version = "0.14.0", features = ["toml"] } eyre.workspace = true futures = "0.3.31" +reqwest.workspace = true serde.workspace = true serde_json.workspace = true tokio.workspace = true tracing.workspace = true tracing-subscriber = {workspace = true, features = ["env-filter"] } +wiremock = "0.6.2" diff --git a/workers/src/abi.rs b/workers/src/abi.rs index b0170fa4..6c126be1 100644 --- a/workers/src/abi.rs +++ b/workers/src/abi.rs @@ -14,7 +14,7 @@ sol!( #[sol(abi, rpc)] #[derive(Debug, Serialize, Deserialize)] SendLibraryAbi, - "abi/SendLibUln302.json" + "./abi/SendLibUln302.json" ); sol!( @@ -22,7 +22,7 @@ sol!( #[sol(abi, rpc)] #[derive(Debug, Serialize, Deserialize)] L0V2EndpointAbi, - "abi/L0V2Endpoint.json" + "./abi/L0V2Endpoint.json" ); //sol!( diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index fdade5b2..d594df49 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -1,10 +1,11 @@ -//! Main offchain workflow for Nuff DVN. +//! Main off-chain workflow for Nuff DVN. use alloy::primitives::U256; use eyre::{OptionExt, Result}; use futures::stream::StreamExt; use tracing::{debug, error, info, warn}; use tracing_subscriber::EnvFilter; +use workers::data::dvn::Dvn; use workers::verifier::NFFLVerifier; use workers::{ abi::{L0V2EndpointAbi::PacketSent, SendLibraryAbi::DVNFeePaid}, @@ -12,9 +13,7 @@ use workers::{ connections::{build_subscriptions, get_abi_from_path, get_http_provider}, contracts::{create_contract_instance, query_already_verified, query_confirmations, verify}, }, - data::dvn::Dvn, }; -use workers::data::dvn::Dvn; #[tokio::main] async fn main() -> Result<()> { @@ -61,6 +60,8 @@ async fn main() -> Result<()> { error!("Received a `DVNFeePaid` event but failed to decode it: {:?}", e); } Ok(inner_log) if dvn_data.packet.is_some() => { + log. + info!("DVNFeePaid event found and decoded."); let required_dvns = &inner_log.inner.requiredDVNs; let own_dvn_addr = dvn_data.config.dvn_addr; @@ -94,11 +95,8 @@ async fn main() -> Result<()> { } else { dvn_data.verifying(); debug!("Packet NOT verified. Calling verification."); - let bn = log.block_number.unwrap(); - // By invariant (Verifying status), dvn_data has a packet. - let hash = dvn_data.packet.unwrap().payload_hash; - if !verifier.verify(bn, hash).await? { + if !verifier.verify(log.block_number.unwrap()).await? { error!("Failed to verify the state root."); continue; } diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 212d6288..7474da1f 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -1,13 +1,13 @@ -use alloy::providers::{ProviderBuilder, RootProvider, WsConnect}; -use alloy::pubsub::PubSubFrontend; -use reqwest::{ClientBuilder, Url}; -use serde::{Deserialize, Serialize}; -use std::sync::Arc; -use crate::config; use crate::config::DVNConfig; +use alloy::eips::BlockNumberOrTag; +use alloy::network::Ethereum; +use alloy::primitives::B256; +use alloy::providers::{Provider, ProviderBuilder, ReqwestProvider}; +use reqwest::{Client, ClientBuilder, Url}; +use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, std::fmt::Debug)] -pub (crate) struct ResponseWrapper { +pub(crate) struct ResponseWrapper { pub message: Message, } @@ -27,59 +27,131 @@ pub struct Message { pub state_root: Vec, } +// TODO: Generify in a future for other networks, like Solana. pub struct NFFLVerifier { - // eth_l2_provider: Arc>, - http_client: reqwest::Client, + http_client: Client, + eth_l2_provider: ReqwestProvider, aggregator_http_address: String, network_id: String, } impl NFFLVerifier { - pub async fn new(agg_url: &str, rpc_url: &str, network_id: u64) -> eyre::Result { - // let ws = WsConnect::new(rpc_url); - // let provider = ProviderBuilder::new().on_ws(ws).await?; + /// For test purposes only + pub(crate) async fn new(agg_url: &str, eth_l2_url: &str, network_id: u64) -> eyre::Result { let client = ClientBuilder::new().build()?; - + let url: Url = eth_l2_url.parse()?; + let provider = ProviderBuilder::new().on_http(url); let agg_http_addr = format!("{}/aggregation/state-root-update", agg_url); Ok(NFFLVerifier { - // eth_l2_provider: Arc::new(provider), + eth_l2_provider: provider, http_client: client, aggregator_http_address: agg_http_addr, - network_id: network_id.to_string() + network_id: network_id.to_string(), }) - } - + } + pub async fn new_from_config(cfg: &DVNConfig) -> eyre::Result { - // let ws = WsConnect::new(rpc_url); - // let provider = ProviderBuilder::new().on_ws(ws).await?; let client = ClientBuilder::new().build()?; - - let agg_http_addr = format!("{}/aggregation/state-root", cfg.aggregator_url()); + let provider = ProviderBuilder::new().on_http(cfg.http_rpc_url.parse()?); + let agg_http_addr = format!("{}/aggregation/state-root-update", cfg.aggregator_url); Ok(NFFLVerifier { - // eth_l2_provider: Arc::new(provider), + eth_l2_provider: provider, http_client: client, aggregator_http_address: agg_http_addr, - network_id: cfg.network_id().to_string() + network_id: cfg.network_eid.to_string(), }) } - pub async fn verify(&self, payload_hash: &[u8], block_height: u64) -> eyre::Result { - // tokio::spawn(async { + /// Verifies the state root of a block. In case if any request future + /// is interrupted, or finishes unsuccessfully, returns Ok(false). + pub async fn verify(&self, block_height: u64) -> eyre::Result { + match tokio::try_join!( + self.get_aggregator_root_state(block_height), + self.get_block_state_root(block_height), + ) { + Ok((agg_response, block_state_root)) => { + let state_root_slice: &[u8] = agg_response.message.state_root.as_slice(); + let aggregator_state_root: B256 = B256::from_slice(state_root_slice); + if agg_response.message.block_height != block_height { + return Ok(false); + } + Ok(block_state_root.eq(&aggregator_state_root)) + } + Err(_) => Ok(false), + } + } + + /// Fetches the root state from the NFFL aggregator via HTTP. + pub(crate) async fn get_aggregator_root_state(&self, block_height: u64) -> eyre::Result { let params = [ ("rollupId", self.network_id.clone()), ("blockHeight", block_height.to_string()), ]; - let url = Url::parse_with_params(&self.aggregator_http_address, ¶ms)?; - let res = self.http_client.get(url).send().await?; - let response_payload = res.json::().await?; - let message = &response_payload.message; - if (message.block_height != block_height) { - return Ok(false); + match Url::parse_with_params(&self.aggregator_http_address, ¶ms) { + Ok(url) => { + let response = self.http_client.get(url).send().await?; + response.json::().await.map_err(|e| e.into()) + } + Err(e) => Err(e.into()), + } + } + + /// Fetches the block state root from the Ethereum L2 provider + /// via JSON-RPC API, backed by alloy-rs. + pub(crate) async fn get_block_state_root(&self, block_number: u64) -> eyre::Result { + let b_number = BlockNumberOrTag::from(block_number); + match self.eth_l2_provider.get_block_by_number(b_number, true).await? { + Some(block) => Ok(block.header.state_root), + None => Err(eyre::eyre!("Block not found")), } - // TODO: take the hash from the LayerZero message for Merkle proof verification. - // Ok(message.state_root.eq(&vec![0])) - Ok(true) + } +} + +#[cfg(test)] +mod tests { + use crate::verifier::{Message, NFFLVerifier}; + use wiremock::matchers::{method, path}; + use wiremock::{Mock, MockServer, ResponseTemplate}; + + #[tokio::test] + async fn test_aggregator_root_state_mock_ok() { + let mock_server = MockServer::start().await; + setup(&mock_server).await; + + let verifier_result = NFFLVerifier::new( + format!("http://{addr}", addr = mock_server.address()).as_str(), + "https://arbitrum.drpc.org", + 1, + ) + .await; + + assert!(verifier_result.is_ok()); + + let verifier = verifier_result.unwrap(); + + let state_root_resp_res = verifier.get_aggregator_root_state(2).await; + assert!(state_root_resp_res.is_ok()); // TODO: why not OK? + + let state_root = state_root_resp_res.unwrap().message.state_root; + assert_eq!(state_root, vec![1, 1, 1]); + } + + async fn setup(mock_server: &MockServer) { + let state_root_message = Message { + rollup_id: 1, + block_height: 2, + timestamp: 3, + near_da_transaction_id: vec![4], + near_da_commitment: vec![5], + state_root: vec![1, 1, 1], + }; + + Mock::given(method("GET")) + .and(path("/state-root")) + .respond_with(ResponseTemplate::new(200).set_body_json(state_root_message)) + .mount(mock_server) + .await; } } diff --git a/workers/tests/verifier_test.rs b/workers/tests/verifier_test.rs deleted file mode 100644 index 29f7e321..00000000 --- a/workers/tests/verifier_test.rs +++ /dev/null @@ -1,41 +0,0 @@ -use wiremock::matchers::{method, path}; -use wiremock::{Mock, MockServer, ResponseTemplate}; -use workers::verifier::NFFLVerifier; - -#[tokio::main] -#[test] -async fn main() -> eyre::Result<()> { - // Start a background HTTP server on a random local port - let mock_server = MockServer::start().await; - setup(&mock_server).await; - - let verifier = NFFLVerifier::new( - "", - mock_server.address().to_string().as_str(), - 1, - ).await?; - let verify_result = verifier.verify(vec![].as_slice(),2).await; - assert_eq!(verify_result.is_ok(), true); - assert_eq!(verify_result.unwrap(), true); - - Ok(()) -} - -async fn setup(mock_server: &MockServer) -> eyre::Result<()> { - let state_root_message = workers::verifier::Message { - rollup_id: 1, - block_height: 2, - timestamp: 3, - near_da_transaction_id: vec![4], - near_da_commitment: vec![5], - state_root: vec![0], - }; - - Mock::given(method("GET")) - .and(path("/state-root")) - .respond_with(ResponseTemplate::new(200).set_body_json(state_root_message)) - .mount(&mock_server) - .await; - - Ok(()) -} From 90b5f5c9cd2448728348aa55a23b28ed581259f4 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 11:43:56 +0300 Subject: [PATCH 41/62] Fix test --- workers/src/verifier.rs | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 7474da1f..cc43ffe4 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -41,7 +41,7 @@ impl NFFLVerifier { let client = ClientBuilder::new().build()?; let url: Url = eth_l2_url.parse()?; let provider = ProviderBuilder::new().on_http(url); - let agg_http_addr = format!("{}/aggregation/state-root-update", agg_url); + let agg_http_addr = format!("{}/state-root", agg_url); Ok(NFFLVerifier { eth_l2_provider: provider, @@ -54,7 +54,7 @@ impl NFFLVerifier { pub async fn new_from_config(cfg: &DVNConfig) -> eyre::Result { let client = ClientBuilder::new().build()?; let provider = ProviderBuilder::new().on_http(cfg.http_rpc_url.parse()?); - let agg_http_addr = format!("{}/aggregation/state-root-update", cfg.aggregator_url); + let agg_http_addr = format!("{}/state-root", cfg.aggregator_url); Ok(NFFLVerifier { eth_l2_provider: provider, @@ -89,11 +89,9 @@ impl NFFLVerifier { ("rollupId", self.network_id.clone()), ("blockHeight", block_height.to_string()), ]; - match Url::parse_with_params(&self.aggregator_http_address, ¶ms) { - Ok(url) => { - let response = self.http_client.get(url).send().await?; - response.json::().await.map_err(|e| e.into()) - } + let url = Url::parse_with_params(&self.aggregator_http_address, ¶ms)?; + match self.http_client.get(url).send().await { + Ok(response) => response.json::().await.map_err(|e| e.into()), Err(e) => Err(e.into()), } } @@ -111,8 +109,8 @@ impl NFFLVerifier { #[cfg(test)] mod tests { - use crate::verifier::{Message, NFFLVerifier}; - use wiremock::matchers::{method, path}; + use crate::verifier::{Message, NFFLVerifier, ResponseWrapper}; + use wiremock::matchers::{method, path, query_param_contains}; use wiremock::{Mock, MockServer, ResponseTemplate}; #[tokio::test] @@ -120,12 +118,7 @@ mod tests { let mock_server = MockServer::start().await; setup(&mock_server).await; - let verifier_result = NFFLVerifier::new( - format!("http://{addr}", addr = mock_server.address()).as_str(), - "https://arbitrum.drpc.org", - 1, - ) - .await; + let verifier_result = NFFLVerifier::new(mock_server.uri().as_str(), "https://arbitrum.drpc.org", 1).await; assert!(verifier_result.is_ok()); @@ -148,9 +141,14 @@ mod tests { state_root: vec![1, 1, 1], }; + let state_root_resp = ResponseWrapper { + message: state_root_message, + }; + Mock::given(method("GET")) .and(path("/state-root")) - .respond_with(ResponseTemplate::new(200).set_body_json(state_root_message)) + .and(query_param_contains("blockHeight", "2")) + .respond_with(ResponseTemplate::new(200).set_body_json(state_root_resp)) .mount(mock_server) .await; } From d0fdf0a16345bef052d96e689f423c33e17dc27b Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 12:48:19 +0300 Subject: [PATCH 42/62] Small notes --- workers/src/bin/dvn.rs | 3 +-- workers/src/verifier.rs | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index d594df49..6fe80b4c 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -60,8 +60,6 @@ async fn main() -> Result<()> { error!("Received a `DVNFeePaid` event but failed to decode it: {:?}", e); } Ok(inner_log) if dvn_data.packet.is_some() => { - log. - info!("DVNFeePaid event found and decoded."); let required_dvns = &inner_log.inner.requiredDVNs; let own_dvn_addr = dvn_data.config.dvn_addr; @@ -96,6 +94,7 @@ async fn main() -> Result<()> { dvn_data.verifying(); debug!("Packet NOT verified. Calling verification."); + // Note: by invariant, block number is already Some(...). if !verifier.verify(log.block_number.unwrap()).await? { error!("Failed to verify the state root."); continue; diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index cc43ffe4..6daa9d3e 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -98,6 +98,7 @@ impl NFFLVerifier { /// Fetches the block state root from the Ethereum L2 provider /// via JSON-RPC API, backed by alloy-rs. + /// Note: an author didn't write a test for that, because he doesn't know how to mock RPC :( pub(crate) async fn get_block_state_root(&self, block_number: u64) -> eyre::Result { let b_number = BlockNumberOrTag::from(block_number); match self.eth_l2_provider.get_block_by_number(b_number, true).await? { From 2b42a24a2f50a946a6713fcf3c6a783d0cdb7b1a Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 14:32:39 +0300 Subject: [PATCH 43/62] Get rid of fastnear, should be added as separate PR --- indexer/FastIndexer.dockerfile | 47 ------ setup/fastnear-indexer/docker-compose.yml | 60 -------- setup/i-r-a/docker-compose.yml | 138 ------------------ .../docker-compose.yml | 94 ------------ 4 files changed, 339 deletions(-) delete mode 100644 indexer/FastIndexer.dockerfile delete mode 100644 setup/fastnear-indexer/docker-compose.yml delete mode 100644 setup/i-r-a/docker-compose.yml delete mode 100644 setup/indexer-relayer-testnet/docker-compose.yml diff --git a/indexer/FastIndexer.dockerfile b/indexer/FastIndexer.dockerfile deleted file mode 100644 index 5e898fec..00000000 --- a/indexer/FastIndexer.dockerfile +++ /dev/null @@ -1,47 +0,0 @@ -FROM rust:1.79 AS builder -WORKDIR /tmp/indexer - -# Copy from nearcore: -# https://github.com/near/nearcore/blob/master/Dockerfile -RUN apt-get update -qq && \ - apt-get install -y \ - git \ - cmake \ - g++ \ - pkg-config \ - libssl-dev \ - curl \ - llvm \ - clang - -COPY ./Cargo.toml . -RUN mkdir ./src && echo "fn main() {}" > ./src/main.rs -RUN cargo build --release -p indexer --features use_fastnear - -COPY . . -RUN touch ./src/main.rs - -RUN cargo build --release -p indexer --features use_fastnear - -FROM debian:bookworm-slim as runtime -WORKDIR /indexer-app - -RUN apt update && apt install -yy openssl ca-certificates jq curl - -COPY --from=builder /tmp/indexer/target/release/indexer . -COPY entrypoint.sh ./entrypoint.sh -RUN chmod +x ./entrypoint.sh - -EXPOSE 3030 - -HEALTHCHECK --interval=20s --timeout=30s --retries=10000 \ - CMD (curl -f -s -X POST -H "Content-Type: application/json" \ - -d '{"jsonrpc":"2.0","method":"block","params":{"finality":"optimistic"},"id":"dontcare"}' \ - http://localhost:3030 | \ - jq -es 'if . == [] then null else .[] | (now - (.result.header.timestamp / 1000000000)) < 10 end') && \ - (curl -f -s -X POST -H "Content-Type: application/json" \ - -d '{"jsonrpc":"2.0","method":"status","params":[],"id":"dontcare"}' \ - http://localhost:3030 | \ - jq -es 'if . == [] then null else .[] | .result.sync_info.syncing == false end') - -ENTRYPOINT [ "./entrypoint.sh" ] diff --git a/setup/fastnear-indexer/docker-compose.yml b/setup/fastnear-indexer/docker-compose.yml deleted file mode 100644 index 0285e111..00000000 --- a/setup/fastnear-indexer/docker-compose.yml +++ /dev/null @@ -1,60 +0,0 @@ -networks: - fastnear: - name: fastnear - driver: bridge - -services: - rmq: - image: rabbitmq:3-management-alpine - container_name: rmq - user: rabbitmq - ports: - - "127.0.0.1:5672:5672" - - "127.0.0.1:15672:15672" - environment: - - RABBITMQ_DEFAULT_USER=guest - - RABBITMQ_DEFAULT_PASS=guest - healthcheck: - test: rabbitmq-diagnostics check_port_connectivity - interval: 1s - timeout: 3s - retries: 30 - networks: - - fastnear - - fastnear-indexer: - profiles: [indexer] - build: - context: ../../indexer - dockerfile: FastIndexer.dockerfile - container_name: fastnear-indexer - depends_on: - rmq: - condition: service_healthy - ports: - - "127.0.0.1:3030:3030" - - "127.0.0.1:9092:9092" - environment: - - CHAIN_ID=${NEAR_CHAIN_ID:-testnet} - volumes: - - ./:/fastnear-indexer/ - - ${NEAR_HOME_DIR:-~/.near}:/root/.near - - ${NEAR_KEYS_DIR:-~/.near-credentials}:/root/.near-credentials - command: - - run - - --da-contract-ids - - da.testnet - - --rollup-ids - - "2" - - --rmq-address - - "amqp://rmq:5672" - entrypoint: ["/indexer-app/indexer"] - restart: unless-stopped - networks: - - fastnear - logging: - driver: "json-file" - options: - max-size: "1g" - max-file: "10" - compress: "true" \ No newline at end of file diff --git a/setup/i-r-a/docker-compose.yml b/setup/i-r-a/docker-compose.yml deleted file mode 100644 index d526529f..00000000 --- a/setup/i-r-a/docker-compose.yml +++ /dev/null @@ -1,138 +0,0 @@ -version: "3" - -networks: - fastnear: - name: fastnear - driver: bridge - near-sffl-relayer-rs: - driver: bridge - -services: - rmq: - image: rabbitmq:3-management-alpine - container_name: rmq - user: rabbitmq - ports: - - "127.0.0.1:5672:5672" - - "127.0.0.1:15672:15672" - environment: - - RABBITMQ_DEFAULT_USER=guest - - RABBITMQ_DEFAULT_PASS=guest - healthcheck: - test: rabbitmq-diagnostics check_port_connectivity - interval: 1s - timeout: 3s - retries: 30 - networks: - - fastnear - - fastnear-indexer: - build: - context: ../../indexer - dockerfile: FastIndexer.dockerfile - container_name: fastnear-indexer - depends_on: - rmq: - condition: service_healthy - ports: - - "127.0.0.1:3030:3030" - - "127.0.0.1:9092:9092" - environment: - - CHAIN_ID=${NEAR_CHAIN_ID:-testnet} - volumes: - - ./:/fastnear-indexer/ - - ${NEAR_HOME_DIR:-~/.near}:/root/.near - - ${NEAR_KEYS_DIR:-~/.near-credentials}:/root/.near-credentials - command: - - run - - --da-contract-ids - - sfrelayer21155420-2.testnet - - --rollup-ids - - "2" - - --rmq-address - - "amqp://rmq:5672" - entrypoint: ["/indexer-app/indexer"] - restart: unless-stopped - networks: - - fastnear - logging: - driver: "json-file" - options: - max-size: "1g" - max-file: "10" - compress: "true" - - relayer_11155420_rs: - build: - context: ../../relayer-rs - dockerfile: Dockerfile - container_name: near-sffl-relayer-rs-21155420 - volumes: - - ${NEAR_KEYS_DIR}:/root/.near-credentials - networks: - - near-sffl-relayer-rs - expose: - - 9094 - command: - - run-args - - --rpc-url - - wss://optimism-sepolia-rpc.publicnode.com - - --da-account-id - - sfrelayer21155420-2.testnet - - --key-path - - /root/.near-credentials/${NEAR_CHAIN_ID}/sfrelayer21155420-2.testnet.json - - --network - - ${NEAR_RPC_URL} - - --metrics-ip-port-address - - near-sffl-relayer-rs-21155420:9094 - restart: unless-stopped - logging: - driver: "json-file" - options: - max-size: "1g" - max-file: "20" - compress: "true" - - operator-rs: - build: - context: ../.. # Set this to the parent directory of both operator-rs and core-rs - dockerfile: operator-rs/Dockerfile - container_name: near-sffl-operator-rs - volumes: - - ./config:/near-sffl/config - - ${NEAR_KEYS_DIR:-~/.near-credentials}:/root/.near-credentials - - ../../tests/keys/bls:/near-sffl/bls_keys - networks: - - fastnear - - near-sffl-relayer-rs - expose: - - ${OPERATOR_METRICS_PORT:-9095} - environment: - - PRODUCTION=${PRODUCTION:-false} - - ETH_RPC_URL=${ETH_RPC_URL:-https://optimism-sepolia-rpc.publicnode.com} - - ETH_WS_URL=${ETH_WS_URL:-wss://optimism-sepolia-rpc.publicnode.com} - - OPERATOR_ADDRESS=${OPERATOR_ADDRESS} - - BLS_KEY_PATH=/near-sffl/bls_keys/1/key.json - - BLS_KEY_PASSWORD_PATH=/near-sffl/bls_keys/1/password.txt - - ECDSA_KEY_PATH=${ECDSA_KEY_PATH:-/root/.near-credentials/ecdsa_key.json} - - AVS_REGISTRY_COORDINATOR_ADDRESS=${AVS_REGISTRY_COORDINATOR_ADDRESS} - - OPERATOR_STATE_RETRIEVER_ADDRESS=${OPERATOR_STATE_RETRIEVER_ADDRESS} - - AGGREGATOR_SERVER_IP_PORT=${AGGREGATOR_SERVER_IP_PORT} - - ENABLE_METRICS=${ENABLE_METRICS:-true} - - EIGEN_METRICS_IP_PORT=${EIGEN_METRICS_IP_PORT:-0.0.0.0:9095} - - NEAR_DA_INDEXER_RMQ_ADDRESS=${NEAR_DA_INDEXER_RMQ_ADDRESS:-amqp://rmq:5672} - - NEAR_DA_INDEXER_ROLLUP_IDS=${NEAR_DA_INDEXER_ROLLUP_IDS:-2} - - ROLLUP_IDS_TO_RPC_URLS=${ROLLUP_IDS_TO_RPC_URLS:-2:https://optimism-sepolia-rpc.publicnode.com} - - TASK_RESPONSE_WAIT_MS=${TASK_RESPONSE_WAIT_MS:-60000} - - TOKEN_STRATEGY_ADDR=${TOKEN_STRATEGY_ADDR:-0x0000000000000000000000000000000000000000} - command: - - run-config - - --path - - /near-sffl/config/operator.yaml - restart: unless-stopped - logging: - driver: "json-file" - options: - max-size: "1g" - max-file: "20" - compress: "true" diff --git a/setup/indexer-relayer-testnet/docker-compose.yml b/setup/indexer-relayer-testnet/docker-compose.yml deleted file mode 100644 index 6962b6c8..00000000 --- a/setup/indexer-relayer-testnet/docker-compose.yml +++ /dev/null @@ -1,94 +0,0 @@ -version: "3" - -networks: - fastnear: - name: fastnear - driver: bridge - near-sffl-relayer-rs: - driver: bridge - -services: - rmq: - image: rabbitmq:3-management-alpine - container_name: rmq - user: rabbitmq - ports: - - "127.0.0.1:5672:5672" - - "127.0.0.1:15672:15672" - environment: - - RABBITMQ_DEFAULT_USER=guest - - RABBITMQ_DEFAULT_PASS=guest - healthcheck: - test: rabbitmq-diagnostics check_port_connectivity - interval: 1s - timeout: 3s - retries: 30 - networks: - - fastnear - - fastnear-indexer: - build: - context: ../../indexer - dockerfile: FastIndexer.dockerfile - container_name: fastnear-indexer - depends_on: - rmq: - condition: service_healthy - ports: - - "127.0.0.1:3030:3030" - - "127.0.0.1:9092:9092" - environment: - - CHAIN_ID=${NEAR_CHAIN_ID:-testnet} - volumes: - - ./:/fastnear-indexer/ - - ${NEAR_HOME_DIR:-~/.near}:/root/.near - - ${NEAR_KEYS_DIR:-~/.near-credentials}:/root/.near-credentials - command: - - run - - --da-contract-ids - - sfrelayer21155420-2.testnet - - --rollup-ids - - "2" - - --rmq-address - - "amqp://rmq:5672" - entrypoint: ["/indexer-app/indexer"] - restart: unless-stopped - networks: - - fastnear - logging: - driver: "json-file" - options: - max-size: "1g" - max-file: "10" - compress: "true" - - relayer_11155420_rs: - build: - context: ../../relayer-rs - dockerfile: Dockerfile - container_name: near-sffl-relayer-rs-21155420 - volumes: - - ${NEAR_KEYS_DIR}:/root/.near-credentials - networks: - - near-sffl-relayer-rs - expose: - - 9094 - command: - - run-args - - --rpc-url - - wss://optimism-sepolia-rpc.publicnode.com - - --da-account-id - - sfrelayer21155420-2.testnet - - --key-path - - /root/.near-credentials/${NEAR_CHAIN_ID}/sfrelayer21155420-2.testnet.json - - --network - - ${NEAR_RPC_URL} - - --metrics-ip-port-address - - near-sffl-relayer-rs-21155420:9094 - restart: unless-stopped - logging: - driver: "json-file" - options: - max-size: "1g" - max-file: "20" - compress: "true" \ No newline at end of file From 60509bfbf4b8a83a97830232cc989c9d71124412 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 14:34:15 +0300 Subject: [PATCH 44/62] Dont change gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index d367a739..fbd735af 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,6 @@ setup/plugin/config/keys/ecdsa.json # Near DA RPC libs libnear_da_rpc_sys.* +# Ignore configuration for DVN or Executor +**/config_dvn.toml +**/config_executor.toml From 14916fcf4dcb9f0ee8a786a818807d94e1225778 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 14:45:59 +0300 Subject: [PATCH 45/62] Cleanup --- workers/src/verifier.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 6daa9d3e..6f970cbe 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -126,7 +126,7 @@ mod tests { let verifier = verifier_result.unwrap(); let state_root_resp_res = verifier.get_aggregator_root_state(2).await; - assert!(state_root_resp_res.is_ok()); // TODO: why not OK? + assert!(state_root_resp_res.is_ok()); let state_root = state_root_resp_res.unwrap().message.state_root; assert_eq!(state_root, vec![1, 1, 1]); From f8cbb1f13d2e852f7f117dfd08b02b885b83f515 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 15:06:13 +0300 Subject: [PATCH 46/62] AI review comments --- workers/src/bin/dvn.rs | 6 +++++- workers/src/config.rs | 2 +- workers/src/verifier.rs | 30 +++++++++++++----------------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 6fe80b4c..175e4128 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -94,7 +94,11 @@ async fn main() -> Result<()> { dvn_data.verifying(); debug!("Packet NOT verified. Calling verification."); - // Note: by invariant, block number is already Some(...). + if log.block_number.is_none() { + error!("Block number is None, can't verify Packet."); + continue; + } + if !verifier.verify(log.block_number.unwrap()).await? { error!("Failed to verify the state root."); continue; diff --git a/workers/src/config.rs b/workers/src/config.rs index fa82add2..45cfc5d2 100644 --- a/workers/src/config.rs +++ b/workers/src/config.rs @@ -25,7 +25,7 @@ pub struct DVNConfig { pub network_eid: u64, /// Own DVN address. Used to check when the DVN is assigned to a task. pub dvn_addr: Address, - /// Aggregator URL + /// NFFL Aggregator URL pub aggregator_url: String, } diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 6f970cbe..b63310e8 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -12,7 +12,7 @@ pub(crate) struct ResponseWrapper { } #[derive(Serialize, Deserialize, std::fmt::Debug)] -pub struct Message { +pub(crate) struct Message { #[serde(rename = "RollupId")] pub rollup_id: u32, #[serde(rename = "BlockHeight")] @@ -28,6 +28,12 @@ pub struct Message { } // TODO: Generify in a future for other networks, like Solana. +/// Verifies state roots for the Decentralized Verification Network (DVN). +/// +/// This verifier implements the V1 verification algorithm which: +/// 1. Fetches the state root from the aggregator +/// 2. Retrieves the block state root using the chain RPC API +/// 3. Compares the two state roots to determine message validity pub struct NFFLVerifier { http_client: Client, eth_l2_provider: ReqwestProvider, @@ -52,16 +58,7 @@ impl NFFLVerifier { } pub async fn new_from_config(cfg: &DVNConfig) -> eyre::Result { - let client = ClientBuilder::new().build()?; - let provider = ProviderBuilder::new().on_http(cfg.http_rpc_url.parse()?); - let agg_http_addr = format!("{}/state-root", cfg.aggregator_url); - - Ok(NFFLVerifier { - eth_l2_provider: provider, - http_client: client, - aggregator_http_address: agg_http_addr, - network_id: cfg.network_eid.to_string(), - }) + Self::new(&cfg.aggregator_url, &cfg.http_rpc_url, cfg.network_eid).await } /// Verifies the state root of a block. In case if any request future @@ -90,20 +87,19 @@ impl NFFLVerifier { ("blockHeight", block_height.to_string()), ]; let url = Url::parse_with_params(&self.aggregator_http_address, ¶ms)?; - match self.http_client.get(url).send().await { - Ok(response) => response.json::().await.map_err(|e| e.into()), - Err(e) => Err(e.into()), - } + let response = self.http_client.get(url).send().await?; + let result = response.json::().await?; + Ok(result) } /// Fetches the block state root from the Ethereum L2 provider /// via JSON-RPC API, backed by alloy-rs. - /// Note: an author didn't write a test for that, because he doesn't know how to mock RPC :( + /// Note: an author didn't write a test for that, because he doesn't know how to mock RPC :( pub(crate) async fn get_block_state_root(&self, block_number: u64) -> eyre::Result { let b_number = BlockNumberOrTag::from(block_number); match self.eth_l2_provider.get_block_by_number(b_number, true).await? { Some(block) => Ok(block.header.state_root), - None => Err(eyre::eyre!("Block not found")), + None => Err(eyre::eyre!("Block {block_number} not found")), } } } From f61cb8b3c63bfa5a92321dd5f63a80f9e13498e3 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Wed, 2 Oct 2024 11:20:13 +0300 Subject: [PATCH 47/62] Fixes compilation error in `block_listener` test suite (cherry picked from commit f0925616ef1d6c7f63105300afd24f82b8fcdb56) --- indexer/src/block_listener.rs | 3 +++ .../7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5.json | 2 +- .../9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b.json | 2 +- .../AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa.json | 2 +- .../HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18.json | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/indexer/src/block_listener.rs b/indexer/src/block_listener.rs index a9a6c643..b5941855 100644 --- a/indexer/src/block_listener.rs +++ b/indexer/src/block_listener.rs @@ -338,6 +338,7 @@ mod tests { gas: 100, deposit: 100, }], + priority_fee: 0, signature: Signature::default(), hash: CryptoHash::default(), }, @@ -355,6 +356,7 @@ mod tests { nonce: 0, receiver_id: da_contract_id, actions: vec![ActionView::CreateAccount], + priority_fee: 0, signature: Signature::default(), hash: CryptoHash::default(), }, @@ -415,6 +417,7 @@ mod tests { nonce: 0, receiver_id: da_contract_id.clone(), actions, + priority_fee: 0, signature: Signature::default(), hash: CryptoHash::hash_bytes(b"test_tx_id"), }, diff --git a/indexer/test_data/candidates/7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5.json b/indexer/test_data/candidates/7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5.json index d23927fe..6949faa2 100644 --- a/indexer/test_data/candidates/7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5.json +++ b/indexer/test_data/candidates/7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5.json @@ -1 +1 @@ -{"block":{"author":"test.near","header":{"height":45494,"prev_height":45493,"epoch_id":"8VT78YkYJRLxPHryKdzL7dFeREwiDaKhV5ygwLs7KUWV","next_epoch_id":"DyJqzm3mAuDc36X7nqEfZe8ASkLWFHtt3e7Hqey66WB8","hash":"7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5","prev_hash":"BGjj89jehuAAsevRuYxjUJQYCHPy83yMB15efc3QFBsx","prev_state_root":"5Gh6w63sJCuA9uaGaVPhKdtFRh92Hsb87CrEveRQuA6n","block_body_hash":"5o7GkxhPYpvjo9dJyJ5QHxSSqQXekygqKzwAZ5BirzTn","chunk_receipts_root":"9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv","chunk_headers_root":"CVcKzGspBhjLUW6zmhm2csDkZJF24Pnc8jrE67zbrVWx","chunk_tx_root":"5pWHvE8RAVrDgor1avRnkGzGjY6H5qJSu19BqQHaGGsj","outcome_root":"7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t","chunks_included":1,"challenges_root":"11111111111111111111111111111111","timestamp":1712136268560478000,"timestamp_nanosec":"1712136268560478000","random_value":"7kb1ZaogF1tuYDm2Wt5wQ2yrRgMaf7baCFjwUtnHPXP","validator_proposals":[],"chunk_mask":[true],"gas_price":"100000000","block_ordinal":45390,"rent_paid":"0","validator_reward":"0","total_supply":"2078635437075814263799527848111711","challenges_result":[],"last_final_block":"9HE1KKUEv7jh15BP4z1GxJpQjsw16L9BjWFYvkAfzkL1","last_ds_final_block":"BGjj89jehuAAsevRuYxjUJQYCHPy83yMB15efc3QFBsx","next_bp_hash":"DfVYbWFJSgjEXZCsh8EsWevHm5bvPKauFeCA5otu7Rka","block_merkle_root":"9fXi7aPKFDujAW4RLeA52r3UV5WGjHh7jedZhXRTjzct","epoch_sync_data_hash":null,"approvals":["ed25519:mrFqGkHWqVsUVwL1b72KipzCjxMT5NefDVWkrpcYnAffhB5wEvCSZnisQSHmQhUEKZjKuUwVfSGmAdb4uv7SFAe"],"signature":"ed25519:3Rdf8DpcA9P6JmnE4mSUyTTGpo8hhJPXuuApqzKL3ur1a4GeWuRd5oDcisnaVsf2eDPnWfYnk98E5MQ7AUYtwrNd","latest_protocol_version":64},"chunks":[{"chunk_hash":"23ciqLqeRf5ia3Zase13968vuyYXdy9sy1UmNzH4g8LQ","prev_block_hash":"BGjj89jehuAAsevRuYxjUJQYCHPy83yMB15efc3QFBsx","outcome_root":"11111111111111111111111111111111","prev_state_root":"GCUxiSvoF2pyuBJpGgDWAkXf7c9zruW6dP2SjgknemVF","encoded_merkle_root":"8fDpQiLoCjcp4HgN8BdKQpHdksxFDya88gvDwRHbLrZs","encoded_length":237,"height_created":45494,"height_included":45494,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"BrLejsYGeZL2doe6ZpXQ765Da5pKqizetksozpHiiucS","validator_proposals":[],"signature":"ed25519:34xLVAsZgpX7hxDcZEqzc4xCnw5WGueXDLHukU1iDQ7LDGcvsM8zqsEi5Ryag2rzQyKZ1FdEjCnEFEYaktX2GiNY"}]},"shards":[{"shard_id":0,"chunk":{"author":"test.near","header":{"chunk_hash":"23ciqLqeRf5ia3Zase13968vuyYXdy9sy1UmNzH4g8LQ","prev_block_hash":"BGjj89jehuAAsevRuYxjUJQYCHPy83yMB15efc3QFBsx","outcome_root":"11111111111111111111111111111111","prev_state_root":"GCUxiSvoF2pyuBJpGgDWAkXf7c9zruW6dP2SjgknemVF","encoded_merkle_root":"8fDpQiLoCjcp4HgN8BdKQpHdksxFDya88gvDwRHbLrZs","encoded_length":237,"height_created":45494,"height_included":0,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"BrLejsYGeZL2doe6ZpXQ765Da5pKqizetksozpHiiucS","validator_proposals":[],"signature":"ed25519:34xLVAsZgpX7hxDcZEqzc4xCnw5WGueXDLHukU1iDQ7LDGcvsM8zqsEi5Ryag2rzQyKZ1FdEjCnEFEYaktX2GiNY"},"transactions":[{"transaction":{"signer_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","nonce":6781000075,"receiver_id":"da.test.near","actions":[{"FunctionCall":{"method_name":"submit","args":"eyJ0ZXh0IjoiQWxvaGEifQ==","gas":30000000000000,"deposit":"0"}}],"signature":"ed25519:25b72WYZjSyiddaqhp8yw6GEmYtFLxUE5eeBCakidfWobk2EVzPrDrpSKW53v5T4LzXpkeLBGDPk2trKegtoozyW","hash":"5yfvfYtXqcLgfVifZyVgfUnmL8QiY5WCWoj21CYMuJi9"},"outcome":{"execution_outcome":{"proof":[{"hash":"Bt9voNmDne2LRW2Wt5VCgRPso2Jy5fc8NUPtuxNjHZ7s","direction":"Right"}],"block_hash":"7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5","id":"5yfvfYtXqcLgfVifZyVgfUnmL8QiY5WCWoj21CYMuJi9","outcome":{"logs":[],"receipt_ids":["8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm"],"gas_burnt":2427970190548,"tokens_burnt":"242797019054800000000","executor_id":"da.test.near","status":{"SuccessReceiptId":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm"},"metadata":{"version":1,"gas_profile":null}}},"receipt":null}}],"receipts":[{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm","receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJ0ZXh0IjoiQWxvaGEifQ==","gas":30000000000000,"deposit":"0"}}]}}}]},"receipt_execution_outcomes":[{"execution_outcome":{"proof":[{"hash":"B9RpVa877vT2uLbYVwPBzWSsMV3K6DiDSehKk7L9NvSL","direction":"Left"}],"block_hash":"7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5","id":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm","outcome":{"logs":[],"receipt_ids":["7bcvBfjp3H9F6VQJdVf9orWzbz4H1YVWPMCgbPnSpcXc"],"gas_burnt":2575843020487,"tokens_burnt":"257584302048700000000","executor_id":"da.test.near","status":{"SuccessValue":""},"metadata":{"version":3,"gas_profile":[{"cost_category":"WASM_HOST_COST","cost":"BASE","gas_used":"2647681110"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BASE","gas_used":"35445963"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BYTES","gas_used":"1874020500"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BASE","gas_used":"5219726400"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BYTE","gas_used":"7602666"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BASE","gas_used":"7551495558"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BYTE","gas_used":"3942480"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BASE","gas_used":"54039896625"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BYTE","gas_used":"30790845"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_BASE","gas_used":"56356845750"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_KEY_BYTE","gas_used":"30952533"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_VALUE_BYTE","gas_used":"67332060"},{"cost_category":"WASM_HOST_COST","cost":"WASM_INSTRUCTION","gas_used":"2738131968"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BASE","gas_used":"8411384583"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BYTE","gas_used":"108950880"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BASE","gas_used":"8596567458"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BYTE","gas_used":"152062560"}]}}},"receipt":{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm","receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJ0ZXh0IjoiQWxvaGEifQ==","gas":30000000000000,"deposit":"0"}}]}}}}],"state_changes":[{"cause":{"type":"transaction_processing","tx_hash":"5yfvfYtXqcLgfVifZyVgfUnmL8QiY5WCWoj21CYMuJi9"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959578806260191572233960","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"receipt_processing","receipt_hash":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959578806260191572233960","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"action_receipt_gas_reward","receipt_hash":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959583242445089672233960","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"transaction_processing","tx_hash":"5yfvfYtXqcLgfVifZyVgfUnmL8QiY5WCWoj21CYMuJi9"},"type":"access_key_update","change":{"account_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","access_key":{"nonce":6781000075,"permission":"FullAccess"}}}]}]} \ No newline at end of file +{"block":{"author":"test.near","header":{"height":45494,"prev_height":45493,"epoch_id":"8VT78YkYJRLxPHryKdzL7dFeREwiDaKhV5ygwLs7KUWV","next_epoch_id":"DyJqzm3mAuDc36X7nqEfZe8ASkLWFHtt3e7Hqey66WB8","hash":"7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5","prev_hash":"BGjj89jehuAAsevRuYxjUJQYCHPy83yMB15efc3QFBsx","prev_state_root":"5Gh6w63sJCuA9uaGaVPhKdtFRh92Hsb87CrEveRQuA6n","block_body_hash":"5o7GkxhPYpvjo9dJyJ5QHxSSqQXekygqKzwAZ5BirzTn","chunk_receipts_root":"9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv","chunk_headers_root":"CVcKzGspBhjLUW6zmhm2csDkZJF24Pnc8jrE67zbrVWx","chunk_tx_root":"5pWHvE8RAVrDgor1avRnkGzGjY6H5qJSu19BqQHaGGsj","outcome_root":"7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t","chunks_included":1,"challenges_root":"11111111111111111111111111111111","timestamp":1712136268560478000,"timestamp_nanosec":"1712136268560478000","random_value":"7kb1ZaogF1tuYDm2Wt5wQ2yrRgMaf7baCFjwUtnHPXP","validator_proposals":[],"chunk_mask":[true],"gas_price":"100000000","block_ordinal":45390,"rent_paid":"0","validator_reward":"0","total_supply":"2078635437075814263799527848111711","challenges_result":[],"last_final_block":"9HE1KKUEv7jh15BP4z1GxJpQjsw16L9BjWFYvkAfzkL1","last_ds_final_block":"BGjj89jehuAAsevRuYxjUJQYCHPy83yMB15efc3QFBsx","next_bp_hash":"DfVYbWFJSgjEXZCsh8EsWevHm5bvPKauFeCA5otu7Rka","block_merkle_root":"9fXi7aPKFDujAW4RLeA52r3UV5WGjHh7jedZhXRTjzct","epoch_sync_data_hash":null,"approvals":["ed25519:mrFqGkHWqVsUVwL1b72KipzCjxMT5NefDVWkrpcYnAffhB5wEvCSZnisQSHmQhUEKZjKuUwVfSGmAdb4uv7SFAe"],"signature":"ed25519:3Rdf8DpcA9P6JmnE4mSUyTTGpo8hhJPXuuApqzKL3ur1a4GeWuRd5oDcisnaVsf2eDPnWfYnk98E5MQ7AUYtwrNd","latest_protocol_version":64},"chunks":[{"chunk_hash":"23ciqLqeRf5ia3Zase13968vuyYXdy9sy1UmNzH4g8LQ","prev_block_hash":"BGjj89jehuAAsevRuYxjUJQYCHPy83yMB15efc3QFBsx","outcome_root":"11111111111111111111111111111111","prev_state_root":"GCUxiSvoF2pyuBJpGgDWAkXf7c9zruW6dP2SjgknemVF","encoded_merkle_root":"8fDpQiLoCjcp4HgN8BdKQpHdksxFDya88gvDwRHbLrZs","encoded_length":237,"height_created":45494,"height_included":45494,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"BrLejsYGeZL2doe6ZpXQ765Da5pKqizetksozpHiiucS","validator_proposals":[],"signature":"ed25519:34xLVAsZgpX7hxDcZEqzc4xCnw5WGueXDLHukU1iDQ7LDGcvsM8zqsEi5Ryag2rzQyKZ1FdEjCnEFEYaktX2GiNY"}]},"shards":[{"shard_id":0,"chunk":{"author":"test.near","header":{"chunk_hash":"23ciqLqeRf5ia3Zase13968vuyYXdy9sy1UmNzH4g8LQ","prev_block_hash":"BGjj89jehuAAsevRuYxjUJQYCHPy83yMB15efc3QFBsx","outcome_root":"11111111111111111111111111111111","prev_state_root":"GCUxiSvoF2pyuBJpGgDWAkXf7c9zruW6dP2SjgknemVF","encoded_merkle_root":"8fDpQiLoCjcp4HgN8BdKQpHdksxFDya88gvDwRHbLrZs","encoded_length":237,"height_created":45494,"height_included":0,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"BrLejsYGeZL2doe6ZpXQ765Da5pKqizetksozpHiiucS","validator_proposals":[],"signature":"ed25519:34xLVAsZgpX7hxDcZEqzc4xCnw5WGueXDLHukU1iDQ7LDGcvsM8zqsEi5Ryag2rzQyKZ1FdEjCnEFEYaktX2GiNY"},"transactions":[{"transaction":{"priority_fee":0,"signer_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","nonce":6781000075,"receiver_id":"da.test.near","actions":[{"FunctionCall":{"method_name":"submit","args":"eyJ0ZXh0IjoiQWxvaGEifQ==","gas":30000000000000,"deposit":"0"}}],"signature":"ed25519:25b72WYZjSyiddaqhp8yw6GEmYtFLxUE5eeBCakidfWobk2EVzPrDrpSKW53v5T4LzXpkeLBGDPk2trKegtoozyW","hash":"5yfvfYtXqcLgfVifZyVgfUnmL8QiY5WCWoj21CYMuJi9"},"outcome":{"execution_outcome":{"proof":[{"hash":"Bt9voNmDne2LRW2Wt5VCgRPso2Jy5fc8NUPtuxNjHZ7s","direction":"Right"}],"block_hash":"7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5","id":"5yfvfYtXqcLgfVifZyVgfUnmL8QiY5WCWoj21CYMuJi9","outcome":{"logs":[],"receipt_ids":["8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm"],"gas_burnt":2427970190548,"tokens_burnt":"242797019054800000000","executor_id":"da.test.near","status":{"SuccessReceiptId":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm"},"metadata":{"version":1,"gas_profile":null}}},"receipt":null}}],"receipts":[{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm","priority":0,"receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJ0ZXh0IjoiQWxvaGEifQ==","gas":30000000000000,"deposit":"0"}}]}}}]},"receipt_execution_outcomes":[{"execution_outcome":{"proof":[{"hash":"B9RpVa877vT2uLbYVwPBzWSsMV3K6DiDSehKk7L9NvSL","direction":"Left"}],"block_hash":"7dVA5Z3B4tVN38Cr3UzfEwy9RBGBKifFkTENuy7x1rR5","id":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm","outcome":{"logs":[],"receipt_ids":["7bcvBfjp3H9F6VQJdVf9orWzbz4H1YVWPMCgbPnSpcXc"],"gas_burnt":2575843020487,"tokens_burnt":"257584302048700000000","executor_id":"da.test.near","status":{"SuccessValue":""},"metadata":{"version":3,"gas_profile":[{"cost_category":"WASM_HOST_COST","cost":"BASE","gas_used":"2647681110"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BASE","gas_used":"35445963"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BYTES","gas_used":"1874020500"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BASE","gas_used":"5219726400"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BYTE","gas_used":"7602666"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BASE","gas_used":"7551495558"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BYTE","gas_used":"3942480"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BASE","gas_used":"54039896625"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BYTE","gas_used":"30790845"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_BASE","gas_used":"56356845750"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_KEY_BYTE","gas_used":"30952533"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_VALUE_BYTE","gas_used":"67332060"},{"cost_category":"WASM_HOST_COST","cost":"WASM_INSTRUCTION","gas_used":"2738131968"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BASE","gas_used":"8411384583"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BYTE","gas_used":"108950880"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BASE","gas_used":"8596567458"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BYTE","gas_used":"152062560"}]}}},"receipt":{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm","priority":0,"receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJ0ZXh0IjoiQWxvaGEifQ==","gas":30000000000000,"deposit":"0"}}]}}}}],"state_changes":[{"cause":{"type":"transaction_processing","tx_hash":"5yfvfYtXqcLgfVifZyVgfUnmL8QiY5WCWoj21CYMuJi9"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959578806260191572233960","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"receipt_processing","receipt_hash":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959578806260191572233960","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"action_receipt_gas_reward","receipt_hash":"8ZwSFbNdHpWVx46w9K5tpzirwJDp9YsScmp4655Vpbwm"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959583242445089672233960","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"transaction_processing","tx_hash":"5yfvfYtXqcLgfVifZyVgfUnmL8QiY5WCWoj21CYMuJi9"},"type":"access_key_update","change":{"account_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","access_key":{"nonce":6781000075,"permission":"FullAccess"}}}]}]} \ No newline at end of file diff --git a/indexer/test_data/candidates/9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b.json b/indexer/test_data/candidates/9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b.json index d87ad8e6..9351c945 100644 --- a/indexer/test_data/candidates/9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b.json +++ b/indexer/test_data/candidates/9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b.json @@ -1 +1 @@ -{"block":{"author":"test.near","header":{"height":20698,"prev_height":20697,"epoch_id":"CMnJcardk5opU55K3Et8BXYqnkgVGT3KtTWGqcLHtmMW","next_epoch_id":"9nUfmUGN4N723qzHvz9iadU2ZyBMKgGLmMZFbGUWpqKf","hash":"9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b","prev_hash":"6zn12vnznJwmoSX8stU4dSpsuxW8FnrixXkhuSsVktrC","prev_state_root":"3VsNYUDXjziK1Gh5cRcJyXpjudPh3cjTzS8XR1Atv1k1","block_body_hash":"CJHjip8XBJryCjV8mbtMjH3UgjWjQHFYVDJPWAV3PoJh","chunk_receipts_root":"9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv","chunk_headers_root":"3NW4xy9p4EjHQYZ3cgLSTfpRTbnrYt3JxamSAfwNsThm","chunk_tx_root":"8HsRHvCQMDRPRFsAgDRjsZjs98LsnbuyARNXswb9FPFk","outcome_root":"7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t","chunks_included":1,"challenges_root":"11111111111111111111111111111111","timestamp":1705483122040186000,"timestamp_nanosec":"1705483122040186000","random_value":"GRxxxAVLQQuN7sAXqay9oCzynrndSuphTG9mrXh6fiY","validator_proposals":[],"chunk_mask":[true],"gas_price":"100000000","block_ordinal":20619,"rent_paid":"0","validator_reward":"0","total_supply":"2057726651765659617454023914896514","challenges_result":[],"last_final_block":"FFV2akG4vMF1LJ17ff2Jy2u21W4mFKzXwepCVRsxmWx","last_ds_final_block":"6zn12vnznJwmoSX8stU4dSpsuxW8FnrixXkhuSsVktrC","next_bp_hash":"C91UJTp3cn2wKoVpAArhq6hRXWFKBxjJ56cCxQaTR9f8","block_merkle_root":"6zw3KU77Zh7mXV5HFBtascbumiJdYSnZAEanY51mShSt","epoch_sync_data_hash":null,"approvals":["ed25519:5iJTKgspRYNzdwe72tnwtUnq77gfLgG3chM26sZicXkguSPTwcSoAwMm8yFm7GF13X7NFXhQNBrK43t8q9aBmgsQ"],"signature":"ed25519:63QB6kY4RrjT4CwhhDddHcguJNk4jppnX5mFgP6kFNdVPS574p6XGfDKuEFNZBFNLoYsKPBFvWJ3aK2wc9B91Y2n","latest_protocol_version":64},"chunks":[{"chunk_hash":"79Sa7iLgt6gMmPZvHXRXCVjQUReRsbvCLmCFXwFmoMey","prev_block_hash":"6zn12vnznJwmoSX8stU4dSpsuxW8FnrixXkhuSsVktrC","outcome_root":"11111111111111111111111111111111","prev_state_root":"81SNysrQR7Cyfirm4ZX3yB3YySxUTien5LSPNzGh1SoP","encoded_merkle_root":"BKK9nmVJimi6VgcwkdLesrXNP324SAhVgknj3Czj123W","encoded_length":240,"height_created":20698,"height_included":20698,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"3hS1fKVbrG5LiBcKwtsmKjrQN8mrURZcaqrzrCAbcMtz","validator_proposals":[],"signature":"ed25519:5CjxmCb34FdWZerQKNh3JQQpwbmPBkFyUyydkrd4X3e4Hazo5ExXLrsZKnutoAcfbQxR5vGU2obs9mptjsyJ6ABb"}]},"shards":[{"shard_id":0,"chunk":{"author":"test.near","header":{"chunk_hash":"79Sa7iLgt6gMmPZvHXRXCVjQUReRsbvCLmCFXwFmoMey","prev_block_hash":"6zn12vnznJwmoSX8stU4dSpsuxW8FnrixXkhuSsVktrC","outcome_root":"11111111111111111111111111111111","prev_state_root":"81SNysrQR7Cyfirm4ZX3yB3YySxUTien5LSPNzGh1SoP","encoded_merkle_root":"BKK9nmVJimi6VgcwkdLesrXNP324SAhVgknj3Czj123W","encoded_length":240,"height_created":20698,"height_included":0,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"3hS1fKVbrG5LiBcKwtsmKjrQN8mrURZcaqrzrCAbcMtz","validator_proposals":[],"signature":"ed25519:5CjxmCb34FdWZerQKNh3JQQpwbmPBkFyUyydkrd4X3e4Hazo5ExXLrsZKnutoAcfbQxR5vGU2obs9mptjsyJ6ABb"},"transactions":[{"transaction":{"signer_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","nonce":6781000048,"receiver_id":"da.test.near","actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmczIjozLCJhcmc0IjoyfQ==","gas":30000000000000,"deposit":"0"}}],"signature":"ed25519:5EQ5FW8Gpp3MFbh5JNfL1ZtWfyDZDGz58DYbUWVgoqg6YnzJA6jESnJE9KjbuXYghdGMgP48yhCsdmNUy4VKd9J7","hash":"Hm9eSkit6WDrLRpjjvTe78kyR4fFd52hvhMcPqKoa1ef"},"outcome":{"execution_outcome":{"proof":[{"hash":"4MRZWSWoMPm34NzVQXHa36GicmKGym2uudNqCPH72xzc","direction":"Right"}],"block_hash":"9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b","id":"Hm9eSkit6WDrLRpjjvTe78kyR4fFd52hvhMcPqKoa1ef","outcome":{"logs":[],"receipt_ids":["D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG"],"gas_burnt":2427976898350,"tokens_burnt":"242797689835000000000","executor_id":"da.test.near","status":{"SuccessReceiptId":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG"},"metadata":{"version":1,"gas_profile":null}}},"receipt":null}}],"receipts":[{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG","receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmczIjozLCJhcmc0IjoyfQ==","gas":30000000000000,"deposit":"0"}}]}}}]},"receipt_execution_outcomes":[{"execution_outcome":{"proof":[{"hash":"746yoMpBrdHCKGbb5v88Wz7cV2pGLui51XvcEreeer84","direction":"Left"}],"block_hash":"9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b","id":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG","outcome":{"logs":[],"receipt_ids":["DLM5dSvfNb5BPasqU8xNjwZBajR5FZQVmew7Swq9jHJ4"],"gas_burnt":2575869599983,"tokens_burnt":"257586959998300000000","executor_id":"da.test.near","status":{"SuccessValue":""},"metadata":{"version":3,"gas_profile":[{"cost_category":"WASM_HOST_COST","cost":"BASE","gas_used":"2647681110"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BASE","gas_used":"35445963"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BYTES","gas_used":"1874020500"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BASE","gas_used":"5219726400"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BYTE","gas_used":"7602666"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BASE","gas_used":"7551495558"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BYTE","gas_used":"4238166"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BASE","gas_used":"54039896625"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BYTE","gas_used":"30790845"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_BASE","gas_used":"56356845750"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_KEY_BYTE","gas_used":"30952533"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_VALUE_BYTE","gas_used":"67332060"},{"cost_category":"WASM_HOST_COST","cost":"WASM_INSTRUCTION","gas_used":"2738131968"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BASE","gas_used":"8411384583"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BYTE","gas_used":"117122196"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BASE","gas_used":"8596567458"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BYTE","gas_used":"163467252"}]}}},"receipt":{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG","receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmczIjozLCJhcmc0IjoyfQ==","gas":30000000000000,"deposit":"0"}}]}}}}],"state_changes":[{"cause":{"type":"transaction_processing","tx_hash":"Hm9eSkit6WDrLRpjjvTe78kyR4fFd52hvhMcPqKoa1ef"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99972928372489495131629500","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"receipt_processing","receipt_hash":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99972928372489495131629500","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"action_receipt_gas_reward","receipt_hash":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99972932809270544031629500","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"transaction_processing","tx_hash":"Hm9eSkit6WDrLRpjjvTe78kyR4fFd52hvhMcPqKoa1ef"},"type":"access_key_update","change":{"account_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","access_key":{"nonce":6781000048,"permission":"FullAccess"}}}]}]} \ No newline at end of file +{"block":{"author":"test.near","header":{"height":20698,"prev_height":20697,"epoch_id":"CMnJcardk5opU55K3Et8BXYqnkgVGT3KtTWGqcLHtmMW","next_epoch_id":"9nUfmUGN4N723qzHvz9iadU2ZyBMKgGLmMZFbGUWpqKf","hash":"9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b","prev_hash":"6zn12vnznJwmoSX8stU4dSpsuxW8FnrixXkhuSsVktrC","prev_state_root":"3VsNYUDXjziK1Gh5cRcJyXpjudPh3cjTzS8XR1Atv1k1","block_body_hash":"CJHjip8XBJryCjV8mbtMjH3UgjWjQHFYVDJPWAV3PoJh","chunk_receipts_root":"9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv","chunk_headers_root":"3NW4xy9p4EjHQYZ3cgLSTfpRTbnrYt3JxamSAfwNsThm","chunk_tx_root":"8HsRHvCQMDRPRFsAgDRjsZjs98LsnbuyARNXswb9FPFk","outcome_root":"7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t","chunks_included":1,"challenges_root":"11111111111111111111111111111111","timestamp":1705483122040186000,"timestamp_nanosec":"1705483122040186000","random_value":"GRxxxAVLQQuN7sAXqay9oCzynrndSuphTG9mrXh6fiY","validator_proposals":[],"chunk_mask":[true],"gas_price":"100000000","block_ordinal":20619,"rent_paid":"0","validator_reward":"0","total_supply":"2057726651765659617454023914896514","challenges_result":[],"last_final_block":"FFV2akG4vMF1LJ17ff2Jy2u21W4mFKzXwepCVRsxmWx","last_ds_final_block":"6zn12vnznJwmoSX8stU4dSpsuxW8FnrixXkhuSsVktrC","next_bp_hash":"C91UJTp3cn2wKoVpAArhq6hRXWFKBxjJ56cCxQaTR9f8","block_merkle_root":"6zw3KU77Zh7mXV5HFBtascbumiJdYSnZAEanY51mShSt","epoch_sync_data_hash":null,"approvals":["ed25519:5iJTKgspRYNzdwe72tnwtUnq77gfLgG3chM26sZicXkguSPTwcSoAwMm8yFm7GF13X7NFXhQNBrK43t8q9aBmgsQ"],"signature":"ed25519:63QB6kY4RrjT4CwhhDddHcguJNk4jppnX5mFgP6kFNdVPS574p6XGfDKuEFNZBFNLoYsKPBFvWJ3aK2wc9B91Y2n","latest_protocol_version":64},"chunks":[{"chunk_hash":"79Sa7iLgt6gMmPZvHXRXCVjQUReRsbvCLmCFXwFmoMey","prev_block_hash":"6zn12vnznJwmoSX8stU4dSpsuxW8FnrixXkhuSsVktrC","outcome_root":"11111111111111111111111111111111","prev_state_root":"81SNysrQR7Cyfirm4ZX3yB3YySxUTien5LSPNzGh1SoP","encoded_merkle_root":"BKK9nmVJimi6VgcwkdLesrXNP324SAhVgknj3Czj123W","encoded_length":240,"height_created":20698,"height_included":20698,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"3hS1fKVbrG5LiBcKwtsmKjrQN8mrURZcaqrzrCAbcMtz","validator_proposals":[],"signature":"ed25519:5CjxmCb34FdWZerQKNh3JQQpwbmPBkFyUyydkrd4X3e4Hazo5ExXLrsZKnutoAcfbQxR5vGU2obs9mptjsyJ6ABb"}]},"shards":[{"shard_id":0,"chunk":{"author":"test.near","header":{"chunk_hash":"79Sa7iLgt6gMmPZvHXRXCVjQUReRsbvCLmCFXwFmoMey","prev_block_hash":"6zn12vnznJwmoSX8stU4dSpsuxW8FnrixXkhuSsVktrC","outcome_root":"11111111111111111111111111111111","prev_state_root":"81SNysrQR7Cyfirm4ZX3yB3YySxUTien5LSPNzGh1SoP","encoded_merkle_root":"BKK9nmVJimi6VgcwkdLesrXNP324SAhVgknj3Czj123W","encoded_length":240,"height_created":20698,"height_included":0,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"3hS1fKVbrG5LiBcKwtsmKjrQN8mrURZcaqrzrCAbcMtz","validator_proposals":[],"signature":"ed25519:5CjxmCb34FdWZerQKNh3JQQpwbmPBkFyUyydkrd4X3e4Hazo5ExXLrsZKnutoAcfbQxR5vGU2obs9mptjsyJ6ABb"},"transactions":[{"transaction":{"signer_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","nonce":6781000048,"receiver_id":"da.test.near","priority_fee":0,"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmczIjozLCJhcmc0IjoyfQ==","gas":30000000000000,"deposit":"0"}}],"signature":"ed25519:5EQ5FW8Gpp3MFbh5JNfL1ZtWfyDZDGz58DYbUWVgoqg6YnzJA6jESnJE9KjbuXYghdGMgP48yhCsdmNUy4VKd9J7","hash":"Hm9eSkit6WDrLRpjjvTe78kyR4fFd52hvhMcPqKoa1ef"},"outcome":{"execution_outcome":{"proof":[{"hash":"4MRZWSWoMPm34NzVQXHa36GicmKGym2uudNqCPH72xzc","direction":"Right"}],"block_hash":"9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b","id":"Hm9eSkit6WDrLRpjjvTe78kyR4fFd52hvhMcPqKoa1ef","outcome":{"logs":[],"receipt_ids":["D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG"],"gas_burnt":2427976898350,"tokens_burnt":"242797689835000000000","executor_id":"da.test.near","status":{"SuccessReceiptId":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG"},"metadata":{"version":1,"gas_profile":null}}},"receipt":null}}],"receipts":[{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG","priority":0,"receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmczIjozLCJhcmc0IjoyfQ==","gas":30000000000000,"deposit":"0"}}]}}}]},"receipt_execution_outcomes":[{"execution_outcome":{"proof":[{"hash":"746yoMpBrdHCKGbb5v88Wz7cV2pGLui51XvcEreeer84","direction":"Left"}],"block_hash":"9zwSzRUA9xH3SXoeZkS7tQXFupEJz9f5XZdNbB3sgK2b","id":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG","outcome":{"logs":[],"receipt_ids":["DLM5dSvfNb5BPasqU8xNjwZBajR5FZQVmew7Swq9jHJ4"],"gas_burnt":2575869599983,"tokens_burnt":"257586959998300000000","executor_id":"da.test.near","status":{"SuccessValue":""},"metadata":{"version":3,"gas_profile":[{"cost_category":"WASM_HOST_COST","cost":"BASE","gas_used":"2647681110"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BASE","gas_used":"35445963"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BYTES","gas_used":"1874020500"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BASE","gas_used":"5219726400"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BYTE","gas_used":"7602666"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BASE","gas_used":"7551495558"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BYTE","gas_used":"4238166"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BASE","gas_used":"54039896625"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BYTE","gas_used":"30790845"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_BASE","gas_used":"56356845750"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_KEY_BYTE","gas_used":"30952533"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_VALUE_BYTE","gas_used":"67332060"},{"cost_category":"WASM_HOST_COST","cost":"WASM_INSTRUCTION","gas_used":"2738131968"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BASE","gas_used":"8411384583"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BYTE","gas_used":"117122196"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BASE","gas_used":"8596567458"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BYTE","gas_used":"163467252"}]}}},"receipt":{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG","priority":0,"receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmczIjozLCJhcmc0IjoyfQ==","gas":30000000000000,"deposit":"0"}}]}}}}],"state_changes":[{"cause":{"type":"transaction_processing","tx_hash":"Hm9eSkit6WDrLRpjjvTe78kyR4fFd52hvhMcPqKoa1ef"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99972928372489495131629500","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"receipt_processing","receipt_hash":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99972928372489495131629500","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"action_receipt_gas_reward","receipt_hash":"D8amXow9Y2DxE57PwyYN6UQHezbQXTqSt7q51bVweErG"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99972932809270544031629500","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"transaction_processing","tx_hash":"Hm9eSkit6WDrLRpjjvTe78kyR4fFd52hvhMcPqKoa1ef"},"type":"access_key_update","change":{"account_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","access_key":{"nonce":6781000048,"permission":"FullAccess"}}}]}]} \ No newline at end of file diff --git a/indexer/test_data/candidates/AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa.json b/indexer/test_data/candidates/AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa.json index 4a0d19ec..5682ed32 100644 --- a/indexer/test_data/candidates/AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa.json +++ b/indexer/test_data/candidates/AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa.json @@ -1 +1 @@ -{"block":{"author":"test.near","header":{"height":45573,"prev_height":45572,"epoch_id":"DyJqzm3mAuDc36X7nqEfZe8ASkLWFHtt3e7Hqey66WB8","next_epoch_id":"Ch4bp426GrTbuuMxhoFhoBV7oCzeRyw7rPP6BNARnaHu","hash":"AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa","prev_hash":"2vqoUi31iNeE6GFeEZFqyeWXBJNRNzahNxfY7thVAkYX","prev_state_root":"F4YR5JhTXneH5ZLhcHWZDX3QESb2DHy6TGscyVBvsysM","block_body_hash":"DiQXUS7TsqxhCErhSqbkK9WxT2QgXEk6iutAv5PMGbmX","chunk_receipts_root":"9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv","chunk_headers_root":"DZL9zXLwRYYVZsCVtDePEniVDCT4ityddiEipj8QnDA5","chunk_tx_root":"G2MjizDEzxCHhkoNu7U7oJT2cWCpS28oSmxs4zcoheQm","outcome_root":"7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t","chunks_included":1,"challenges_root":"11111111111111111111111111111111","timestamp":1712136317429970000,"timestamp_nanosec":"1712136317429970000","random_value":"DHh3hX4JKtStebCthdCgnETf9MXAEoP68iT75C449gtw","validator_proposals":[],"chunk_mask":[true],"gas_price":"100000000","block_ordinal":45469,"rent_paid":"0","validator_reward":"0","total_supply":"2080376991499652586745873350984976","challenges_result":[],"last_final_block":"AcmtUMM4KEuFZvEL6C31eKRCb8H1BE9HDt4DoQgssWx","last_ds_final_block":"2vqoUi31iNeE6GFeEZFqyeWXBJNRNzahNxfY7thVAkYX","next_bp_hash":"BUt5pmFdnnPQ98hvyHEiXhXR2N3DYUpRJ8RLA27AXpKE","block_merkle_root":"3Keqa5hNyihtjTXJDpPxuP8Kvic8Ryq9V6hMoH8iQUiT","epoch_sync_data_hash":null,"approvals":["ed25519:4h6dY8dYhNgwDdWXYNtK4YcXAK55DPaN1zEkUDGZTTFXrVPV7sdA9Xm8j946aNWRB5vkSHzrHXj5k1pE9J77VSpP"],"signature":"ed25519:2J87gEM3FPhaExwdmCASARmHfPgQN7ho8KJd17YmkF7d1BLM74jyqcmEagxUhcDZuyGARpaUTs7eE29iFjkdppBm","latest_protocol_version":64},"chunks":[{"chunk_hash":"F7KdAxV81d9U2vAz2Z2aiPLJZm9mpzWRDbVNNvyK5ZXr","prev_block_hash":"2vqoUi31iNeE6GFeEZFqyeWXBJNRNzahNxfY7thVAkYX","outcome_root":"11111111111111111111111111111111","prev_state_root":"B5BvEvy7qeCoGt7dAodXjhKrU6vvPuRiyTC12C8FEcx1","encoded_merkle_root":"26BSZwi83ryJvvUQddsJz4XxwrjwdoQjxa7XMtxYNA1p","encoded_length":230,"height_created":45573,"height_included":45573,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"HR9J4UXCrtSDJwRQQBGpwL5jrhVUNc1Sj13fKAqziHrB","validator_proposals":[],"signature":"ed25519:YwWRjmTxLRqCpbqLVhZYxthHLWJow8TaGeVqyXTH7gaaDWkUDDPcrKdp6mDQNqS9H8qZLqjhavd67oBEpz6YzqT"}]},"shards":[{"shard_id":0,"chunk":{"author":"test.near","header":{"chunk_hash":"F7KdAxV81d9U2vAz2Z2aiPLJZm9mpzWRDbVNNvyK5ZXr","prev_block_hash":"2vqoUi31iNeE6GFeEZFqyeWXBJNRNzahNxfY7thVAkYX","outcome_root":"11111111111111111111111111111111","prev_state_root":"B5BvEvy7qeCoGt7dAodXjhKrU6vvPuRiyTC12C8FEcx1","encoded_merkle_root":"26BSZwi83ryJvvUQddsJz4XxwrjwdoQjxa7XMtxYNA1p","encoded_length":230,"height_created":45573,"height_included":0,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"HR9J4UXCrtSDJwRQQBGpwL5jrhVUNc1Sj13fKAqziHrB","validator_proposals":[],"signature":"ed25519:YwWRjmTxLRqCpbqLVhZYxthHLWJow8TaGeVqyXTH7gaaDWkUDDPcrKdp6mDQNqS9H8qZLqjhavd67oBEpz6YzqT"},"transactions":[{"transaction":{"signer_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","nonce":6781000077,"receiver_id":"da.test.near","actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}],"signature":"ed25519:4JZH6mE4q4wGPiNZJK1WVwxnySJkWVJbDR2KhorRdT5Bo4dhVE8pb6TEMumC19FS4zbNeHAb3tcirau18WzeVxUT","hash":"EpYUUmFnkQo2kh958m7mNr7UPb2fiqSWkASWF5wzLDWc"},"outcome":{"execution_outcome":{"proof":[{"hash":"BkqKwPwa95NHHyyskKd1NjCKN5xwKRFc4y5fMz56MDpL","direction":"Right"}],"block_hash":"AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa","id":"EpYUUmFnkQo2kh958m7mNr7UPb2fiqSWkASWF5wzLDWc","outcome":{"logs":[],"receipt_ids":["8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou"],"gas_burnt":2427954539010,"tokens_burnt":"242795453901000000000","executor_id":"da.test.near","status":{"SuccessReceiptId":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou"},"metadata":{"version":1,"gas_profile":null}}},"receipt":null}}],"receipts":[{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou","receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}]}}}]},"receipt_execution_outcomes":[{"execution_outcome":{"proof":[{"hash":"AkdF2JbB9Eyb3CL6QqKFMCSbnRGoLyd5nLuXjJ9ZhLtw","direction":"Left"}],"block_hash":"AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa","id":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou","outcome":{"logs":[],"receipt_ids":["EExgvxnFr9ViJyrfPwsGu3nWVyqmCq2YChp7NECTfDqk"],"gas_burnt":2575781001663,"tokens_burnt":"257578100166300000000","executor_id":"da.test.near","status":{"SuccessValue":""},"metadata":{"version":3,"gas_profile":[{"cost_category":"WASM_HOST_COST","cost":"BASE","gas_used":"2647681110"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BASE","gas_used":"35445963"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BYTES","gas_used":"1874020500"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BASE","gas_used":"5219726400"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BYTE","gas_used":"7602666"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BASE","gas_used":"7551495558"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BYTE","gas_used":"3252546"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BASE","gas_used":"54039896625"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BYTE","gas_used":"30790845"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_BASE","gas_used":"56356845750"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_KEY_BYTE","gas_used":"30952533"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_VALUE_BYTE","gas_used":"67332060"},{"cost_category":"WASM_HOST_COST","cost":"WASM_INSTRUCTION","gas_used":"2738131968"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BASE","gas_used":"8411384583"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BYTE","gas_used":"89884476"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BASE","gas_used":"8596567458"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BYTE","gas_used":"125451612"}]}}},"receipt":{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou","receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}]}}}}],"state_changes":[{"cause":{"type":"transaction_processing","tx_hash":"EpYUUmFnkQo2kh958m7mNr7UPb2fiqSWkASWF5wzLDWc"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99958586925797827666977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"receipt_processing","receipt_hash":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99958586925797827666977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"action_receipt_gas_reward","receipt_hash":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99958591360591707166977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"transaction_processing","tx_hash":"EpYUUmFnkQo2kh958m7mNr7UPb2fiqSWkASWF5wzLDWc"},"type":"access_key_update","change":{"account_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","access_key":{"nonce":6781000077,"permission":"FullAccess"}}}]}]} \ No newline at end of file +{"block":{"author":"test.near","header":{"height":45573,"prev_height":45572,"epoch_id":"DyJqzm3mAuDc36X7nqEfZe8ASkLWFHtt3e7Hqey66WB8","next_epoch_id":"Ch4bp426GrTbuuMxhoFhoBV7oCzeRyw7rPP6BNARnaHu","hash":"AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa","prev_hash":"2vqoUi31iNeE6GFeEZFqyeWXBJNRNzahNxfY7thVAkYX","prev_state_root":"F4YR5JhTXneH5ZLhcHWZDX3QESb2DHy6TGscyVBvsysM","block_body_hash":"DiQXUS7TsqxhCErhSqbkK9WxT2QgXEk6iutAv5PMGbmX","chunk_receipts_root":"9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv","chunk_headers_root":"DZL9zXLwRYYVZsCVtDePEniVDCT4ityddiEipj8QnDA5","chunk_tx_root":"G2MjizDEzxCHhkoNu7U7oJT2cWCpS28oSmxs4zcoheQm","outcome_root":"7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t","chunks_included":1,"challenges_root":"11111111111111111111111111111111","timestamp":1712136317429970000,"timestamp_nanosec":"1712136317429970000","random_value":"DHh3hX4JKtStebCthdCgnETf9MXAEoP68iT75C449gtw","validator_proposals":[],"chunk_mask":[true],"gas_price":"100000000","block_ordinal":45469,"rent_paid":"0","validator_reward":"0","total_supply":"2080376991499652586745873350984976","challenges_result":[],"last_final_block":"AcmtUMM4KEuFZvEL6C31eKRCb8H1BE9HDt4DoQgssWx","last_ds_final_block":"2vqoUi31iNeE6GFeEZFqyeWXBJNRNzahNxfY7thVAkYX","next_bp_hash":"BUt5pmFdnnPQ98hvyHEiXhXR2N3DYUpRJ8RLA27AXpKE","block_merkle_root":"3Keqa5hNyihtjTXJDpPxuP8Kvic8Ryq9V6hMoH8iQUiT","epoch_sync_data_hash":null,"approvals":["ed25519:4h6dY8dYhNgwDdWXYNtK4YcXAK55DPaN1zEkUDGZTTFXrVPV7sdA9Xm8j946aNWRB5vkSHzrHXj5k1pE9J77VSpP"],"signature":"ed25519:2J87gEM3FPhaExwdmCASARmHfPgQN7ho8KJd17YmkF7d1BLM74jyqcmEagxUhcDZuyGARpaUTs7eE29iFjkdppBm","latest_protocol_version":64},"chunks":[{"chunk_hash":"F7KdAxV81d9U2vAz2Z2aiPLJZm9mpzWRDbVNNvyK5ZXr","prev_block_hash":"2vqoUi31iNeE6GFeEZFqyeWXBJNRNzahNxfY7thVAkYX","outcome_root":"11111111111111111111111111111111","prev_state_root":"B5BvEvy7qeCoGt7dAodXjhKrU6vvPuRiyTC12C8FEcx1","encoded_merkle_root":"26BSZwi83ryJvvUQddsJz4XxwrjwdoQjxa7XMtxYNA1p","encoded_length":230,"height_created":45573,"height_included":45573,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"HR9J4UXCrtSDJwRQQBGpwL5jrhVUNc1Sj13fKAqziHrB","validator_proposals":[],"signature":"ed25519:YwWRjmTxLRqCpbqLVhZYxthHLWJow8TaGeVqyXTH7gaaDWkUDDPcrKdp6mDQNqS9H8qZLqjhavd67oBEpz6YzqT"}]},"shards":[{"shard_id":0,"chunk":{"author":"test.near","header":{"chunk_hash":"F7KdAxV81d9U2vAz2Z2aiPLJZm9mpzWRDbVNNvyK5ZXr","prev_block_hash":"2vqoUi31iNeE6GFeEZFqyeWXBJNRNzahNxfY7thVAkYX","outcome_root":"11111111111111111111111111111111","prev_state_root":"B5BvEvy7qeCoGt7dAodXjhKrU6vvPuRiyTC12C8FEcx1","encoded_merkle_root":"26BSZwi83ryJvvUQddsJz4XxwrjwdoQjxa7XMtxYNA1p","encoded_length":230,"height_created":45573,"height_included":0,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"HR9J4UXCrtSDJwRQQBGpwL5jrhVUNc1Sj13fKAqziHrB","validator_proposals":[],"signature":"ed25519:YwWRjmTxLRqCpbqLVhZYxthHLWJow8TaGeVqyXTH7gaaDWkUDDPcrKdp6mDQNqS9H8qZLqjhavd67oBEpz6YzqT"},"transactions":[{"transaction":{"priority_fee":0,"signer_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","nonce":6781000077,"receiver_id":"da.test.near","actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}],"signature":"ed25519:4JZH6mE4q4wGPiNZJK1WVwxnySJkWVJbDR2KhorRdT5Bo4dhVE8pb6TEMumC19FS4zbNeHAb3tcirau18WzeVxUT","hash":"EpYUUmFnkQo2kh958m7mNr7UPb2fiqSWkASWF5wzLDWc"},"outcome":{"execution_outcome":{"proof":[{"hash":"BkqKwPwa95NHHyyskKd1NjCKN5xwKRFc4y5fMz56MDpL","direction":"Right"}],"block_hash":"AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa","id":"EpYUUmFnkQo2kh958m7mNr7UPb2fiqSWkASWF5wzLDWc","outcome":{"logs":[],"receipt_ids":["8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou"],"gas_burnt":2427954539010,"tokens_burnt":"242795453901000000000","executor_id":"da.test.near","status":{"SuccessReceiptId":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou"},"metadata":{"version":1,"gas_profile":null}}},"receipt":null}}],"receipts":[{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou","priority":0,"receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}]}}}]},"receipt_execution_outcomes":[{"execution_outcome":{"proof":[{"hash":"AkdF2JbB9Eyb3CL6QqKFMCSbnRGoLyd5nLuXjJ9ZhLtw","direction":"Left"}],"block_hash":"AFhRAEcgFpV3SPvAQ4DF5QArCiPQgu6aSibPLCqsrvWa","id":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou","outcome":{"logs":[],"receipt_ids":["EExgvxnFr9ViJyrfPwsGu3nWVyqmCq2YChp7NECTfDqk"],"gas_burnt":2575781001663,"tokens_burnt":"257578100166300000000","executor_id":"da.test.near","status":{"SuccessValue":""},"metadata":{"version":3,"gas_profile":[{"cost_category":"WASM_HOST_COST","cost":"BASE","gas_used":"2647681110"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BASE","gas_used":"35445963"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BYTES","gas_used":"1874020500"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BASE","gas_used":"5219726400"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BYTE","gas_used":"7602666"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BASE","gas_used":"7551495558"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BYTE","gas_used":"3252546"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BASE","gas_used":"54039896625"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BYTE","gas_used":"30790845"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_BASE","gas_used":"56356845750"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_KEY_BYTE","gas_used":"30952533"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_VALUE_BYTE","gas_used":"67332060"},{"cost_category":"WASM_HOST_COST","cost":"WASM_INSTRUCTION","gas_used":"2738131968"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BASE","gas_used":"8411384583"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BYTE","gas_used":"89884476"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BASE","gas_used":"8596567458"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BYTE","gas_used":"125451612"}]}}},"receipt":{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou","priority":0,"receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}]}}}}],"state_changes":[{"cause":{"type":"transaction_processing","tx_hash":"EpYUUmFnkQo2kh958m7mNr7UPb2fiqSWkASWF5wzLDWc"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99958586925797827666977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"receipt_processing","receipt_hash":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99958586925797827666977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"action_receipt_gas_reward","receipt_hash":"8k43iA164wRGKDZekjHuNTVNFVexPFUmz71cNCnRh2ou"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99958591360591707166977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"transaction_processing","tx_hash":"EpYUUmFnkQo2kh958m7mNr7UPb2fiqSWkASWF5wzLDWc"},"type":"access_key_update","change":{"account_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","access_key":{"nonce":6781000077,"permission":"FullAccess"}}}]}]} \ No newline at end of file diff --git a/indexer/test_data/candidates/HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18.json b/indexer/test_data/candidates/HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18.json index d40507a2..731e2f17 100644 --- a/indexer/test_data/candidates/HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18.json +++ b/indexer/test_data/candidates/HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18.json @@ -1 +1 @@ -{"block":{"author":"test.near","header":{"height":45546,"prev_height":45545,"epoch_id":"DyJqzm3mAuDc36X7nqEfZe8ASkLWFHtt3e7Hqey66WB8","next_epoch_id":"Ch4bp426GrTbuuMxhoFhoBV7oCzeRyw7rPP6BNARnaHu","hash":"HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18","prev_hash":"3DE7kshnvgRRc8fi4aL7HwFsdA9z86bUrAVjiM1mhk4g","prev_state_root":"FgSyVMwKpZNEkZGypzqytUafT8HFsL9GphDgSsKq8Goi","block_body_hash":"79tJRBZpaGWUTLH2EGGAGfSqteHFMcoH4uRFnRdY69F","chunk_receipts_root":"9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv","chunk_headers_root":"o97r29NVyeCBhFZp23TZe8Pi6EmNGeFgJpd4Rji9pSj","chunk_tx_root":"7ny5Z55CtZpCxfCjg7vBa9uxcKWuLjc9JcAJeSWMg4m1","outcome_root":"7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t","chunks_included":1,"challenges_root":"11111111111111111111111111111111","timestamp":1712136300728082000,"timestamp_nanosec":"1712136300728082000","random_value":"GuafCAcM7WTzWjGov8cF8sMnBffL1TEkEeKrhwqUkFFt","validator_proposals":[],"chunk_mask":[true],"gas_price":"100000000","block_ordinal":45442,"rent_paid":"0","validator_reward":"0","total_supply":"2080376991500148525506061150984976","challenges_result":[],"last_final_block":"FVKB7J3qLRTGb3t7P41sdzx1YFqQYKySJAmKF8Do8r9U","last_ds_final_block":"3DE7kshnvgRRc8fi4aL7HwFsdA9z86bUrAVjiM1mhk4g","next_bp_hash":"BUt5pmFdnnPQ98hvyHEiXhXR2N3DYUpRJ8RLA27AXpKE","block_merkle_root":"9nxsfJV5hG4r2hmYes8MPFEQbkvSgRLnMWpAy1CJgsZE","epoch_sync_data_hash":null,"approvals":["ed25519:s6WvBGZPtmE5U5XTmJhMEz6kvMVZSqYQqu8GXryPvtyodcpizG3rg7PwS3yog9ThGEH71yoC21NMPgfQFgM9eus"],"signature":"ed25519:4xEaEKXKBt4ciBsC9cFsWD2pfDMSC2tX7p7c4eFPdwD7XiT1Zcbzj12nCeouaDpfnjJch7R4ku9v7JHGYRNr1pfg","latest_protocol_version":64},"chunks":[{"chunk_hash":"6NXsCLF2HWSn8pRw7Nonb34VtZyiyFyK3iVm8ycPucHK","prev_block_hash":"3DE7kshnvgRRc8fi4aL7HwFsdA9z86bUrAVjiM1mhk4g","outcome_root":"11111111111111111111111111111111","prev_state_root":"Fwep6RG6Jt4YstGrJ5Z51bFHtojhsE62m43oyxjTPVPC","encoded_merkle_root":"GpVdeADTkxm73mHYaZv6RWvGDv8J8HE27zusK1roToA1","encoded_length":230,"height_created":45546,"height_included":45546,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"GekgbPeYX2tM2cguXPiXAy4PrxoNriL3Vc75w3tPquFx","validator_proposals":[],"signature":"ed25519:AJC4BwFn6m1aRXPFomLZf347ChmSX6MfGqJwHsmRZC54B9757PkobH9c6j6qNjmLuiwyTmtPF11Q6cuwzXcTFHr"}]},"shards":[{"shard_id":0,"chunk":{"author":"test.near","header":{"chunk_hash":"6NXsCLF2HWSn8pRw7Nonb34VtZyiyFyK3iVm8ycPucHK","prev_block_hash":"3DE7kshnvgRRc8fi4aL7HwFsdA9z86bUrAVjiM1mhk4g","outcome_root":"11111111111111111111111111111111","prev_state_root":"Fwep6RG6Jt4YstGrJ5Z51bFHtojhsE62m43oyxjTPVPC","encoded_merkle_root":"GpVdeADTkxm73mHYaZv6RWvGDv8J8HE27zusK1roToA1","encoded_length":230,"height_created":45546,"height_included":0,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"GekgbPeYX2tM2cguXPiXAy4PrxoNriL3Vc75w3tPquFx","validator_proposals":[],"signature":"ed25519:AJC4BwFn6m1aRXPFomLZf347ChmSX6MfGqJwHsmRZC54B9757PkobH9c6j6qNjmLuiwyTmtPF11Q6cuwzXcTFHr"},"transactions":[{"transaction":{"signer_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","nonce":6781000076,"receiver_id":"da.test.near","actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}],"signature":"ed25519:2rRkV7oSqiBKBcw9Npd79U1Sud84zGeaU12iQQV7YVfofXYd6AbiqkSBD94T7mvfbeHphr7swp5hvuTPK175UALz","hash":"J7Rq24qywM5XiyZX1cmbEkrBWN77gh4i4mcMFA52S6R8"},"outcome":{"execution_outcome":{"proof":[{"hash":"7rjuH4tf61MM2vo2XxT6LcwpY36xurWUFuEVFmr3JA8N","direction":"Right"}],"block_hash":"HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18","id":"J7Rq24qywM5XiyZX1cmbEkrBWN77gh4i4mcMFA52S6R8","outcome":{"logs":[],"receipt_ids":["7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD"],"gas_burnt":2427954539010,"tokens_burnt":"242795453901000000000","executor_id":"da.test.near","status":{"SuccessReceiptId":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD"},"metadata":{"version":1,"gas_profile":null}}},"receipt":null}}],"receipts":[{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD","receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}]}}}]},"receipt_execution_outcomes":[{"execution_outcome":{"proof":[{"hash":"AJ46727JkMeoQyhkV9JmiBSKQvhMA17xAv4JBR7ozACk","direction":"Left"}],"block_hash":"HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18","id":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD","outcome":{"logs":[],"receipt_ids":["2y5YoNEmN5GioXbHJaYb6H12ky3BCmCFHtiaHnmyjUmq"],"gas_burnt":2575781001663,"tokens_burnt":"257578100166300000000","executor_id":"da.test.near","status":{"SuccessValue":""},"metadata":{"version":3,"gas_profile":[{"cost_category":"WASM_HOST_COST","cost":"BASE","gas_used":"2647681110"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BASE","gas_used":"35445963"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BYTES","gas_used":"1874020500"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BASE","gas_used":"5219726400"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BYTE","gas_used":"7602666"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BASE","gas_used":"7551495558"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BYTE","gas_used":"3252546"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BASE","gas_used":"54039896625"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BYTE","gas_used":"30790845"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_BASE","gas_used":"56356845750"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_KEY_BYTE","gas_used":"30952533"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_VALUE_BYTE","gas_used":"67332060"},{"cost_category":"WASM_HOST_COST","cost":"WASM_INSTRUCTION","gas_used":"2738131968"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BASE","gas_used":"8411384583"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BYTE","gas_used":"89884476"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BASE","gas_used":"8596567458"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BYTE","gas_used":"125451612"}]}}},"receipt":{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD","receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}]}}}}],"state_changes":[{"cause":{"type":"transaction_processing","tx_hash":"J7Rq24qywM5XiyZX1cmbEkrBWN77gh4i4mcMFA52S6R8"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959082864558015466977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"receipt_processing","receipt_hash":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959082864558015466977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"action_receipt_gas_reward","receipt_hash":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959087299351894966977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"transaction_processing","tx_hash":"J7Rq24qywM5XiyZX1cmbEkrBWN77gh4i4mcMFA52S6R8"},"type":"access_key_update","change":{"account_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","access_key":{"nonce":6781000076,"permission":"FullAccess"}}}]}]} \ No newline at end of file +{"block":{"author":"test.near","header":{"height":45546,"prev_height":45545,"epoch_id":"DyJqzm3mAuDc36X7nqEfZe8ASkLWFHtt3e7Hqey66WB8","next_epoch_id":"Ch4bp426GrTbuuMxhoFhoBV7oCzeRyw7rPP6BNARnaHu","hash":"HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18","prev_hash":"3DE7kshnvgRRc8fi4aL7HwFsdA9z86bUrAVjiM1mhk4g","prev_state_root":"FgSyVMwKpZNEkZGypzqytUafT8HFsL9GphDgSsKq8Goi","block_body_hash":"79tJRBZpaGWUTLH2EGGAGfSqteHFMcoH4uRFnRdY69F","chunk_receipts_root":"9ETNjrt6MkwTgSVMMbpukfxRshSD1avBUUa4R4NuqwHv","chunk_headers_root":"o97r29NVyeCBhFZp23TZe8Pi6EmNGeFgJpd4Rji9pSj","chunk_tx_root":"7ny5Z55CtZpCxfCjg7vBa9uxcKWuLjc9JcAJeSWMg4m1","outcome_root":"7tkzFg8RHBmMw1ncRJZCCZAizgq4rwCftTKYLce8RU8t","chunks_included":1,"challenges_root":"11111111111111111111111111111111","timestamp":1712136300728082000,"timestamp_nanosec":"1712136300728082000","random_value":"GuafCAcM7WTzWjGov8cF8sMnBffL1TEkEeKrhwqUkFFt","validator_proposals":[],"chunk_mask":[true],"gas_price":"100000000","block_ordinal":45442,"rent_paid":"0","validator_reward":"0","total_supply":"2080376991500148525506061150984976","challenges_result":[],"last_final_block":"FVKB7J3qLRTGb3t7P41sdzx1YFqQYKySJAmKF8Do8r9U","last_ds_final_block":"3DE7kshnvgRRc8fi4aL7HwFsdA9z86bUrAVjiM1mhk4g","next_bp_hash":"BUt5pmFdnnPQ98hvyHEiXhXR2N3DYUpRJ8RLA27AXpKE","block_merkle_root":"9nxsfJV5hG4r2hmYes8MPFEQbkvSgRLnMWpAy1CJgsZE","epoch_sync_data_hash":null,"approvals":["ed25519:s6WvBGZPtmE5U5XTmJhMEz6kvMVZSqYQqu8GXryPvtyodcpizG3rg7PwS3yog9ThGEH71yoC21NMPgfQFgM9eus"],"signature":"ed25519:4xEaEKXKBt4ciBsC9cFsWD2pfDMSC2tX7p7c4eFPdwD7XiT1Zcbzj12nCeouaDpfnjJch7R4ku9v7JHGYRNr1pfg","latest_protocol_version":64},"chunks":[{"chunk_hash":"6NXsCLF2HWSn8pRw7Nonb34VtZyiyFyK3iVm8ycPucHK","prev_block_hash":"3DE7kshnvgRRc8fi4aL7HwFsdA9z86bUrAVjiM1mhk4g","outcome_root":"11111111111111111111111111111111","prev_state_root":"Fwep6RG6Jt4YstGrJ5Z51bFHtojhsE62m43oyxjTPVPC","encoded_merkle_root":"GpVdeADTkxm73mHYaZv6RWvGDv8J8HE27zusK1roToA1","encoded_length":230,"height_created":45546,"height_included":45546,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"GekgbPeYX2tM2cguXPiXAy4PrxoNriL3Vc75w3tPquFx","validator_proposals":[],"signature":"ed25519:AJC4BwFn6m1aRXPFomLZf347ChmSX6MfGqJwHsmRZC54B9757PkobH9c6j6qNjmLuiwyTmtPF11Q6cuwzXcTFHr"}]},"shards":[{"shard_id":0,"chunk":{"author":"test.near","header":{"chunk_hash":"6NXsCLF2HWSn8pRw7Nonb34VtZyiyFyK3iVm8ycPucHK","prev_block_hash":"3DE7kshnvgRRc8fi4aL7HwFsdA9z86bUrAVjiM1mhk4g","outcome_root":"11111111111111111111111111111111","prev_state_root":"Fwep6RG6Jt4YstGrJ5Z51bFHtojhsE62m43oyxjTPVPC","encoded_merkle_root":"GpVdeADTkxm73mHYaZv6RWvGDv8J8HE27zusK1roToA1","encoded_length":230,"height_created":45546,"height_included":0,"shard_id":0,"gas_used":0,"gas_limit":1000000000000000,"rent_paid":"0","validator_reward":"0","balance_burnt":"0","outgoing_receipts_root":"H4Rd6SGeEBTbxkitsCdzfu9xL9HtZ2eHoPCQXUeZ6bW4","tx_root":"GekgbPeYX2tM2cguXPiXAy4PrxoNriL3Vc75w3tPquFx","validator_proposals":[],"signature":"ed25519:AJC4BwFn6m1aRXPFomLZf347ChmSX6MfGqJwHsmRZC54B9757PkobH9c6j6qNjmLuiwyTmtPF11Q6cuwzXcTFHr"},"transactions":[{"transaction":{"priority_fee":0,"signer_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","nonce":6781000076,"receiver_id":"da.test.near","actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}],"signature":"ed25519:2rRkV7oSqiBKBcw9Npd79U1Sud84zGeaU12iQQV7YVfofXYd6AbiqkSBD94T7mvfbeHphr7swp5hvuTPK175UALz","hash":"J7Rq24qywM5XiyZX1cmbEkrBWN77gh4i4mcMFA52S6R8"},"outcome":{"execution_outcome":{"proof":[{"hash":"7rjuH4tf61MM2vo2XxT6LcwpY36xurWUFuEVFmr3JA8N","direction":"Right"}],"block_hash":"HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18","id":"J7Rq24qywM5XiyZX1cmbEkrBWN77gh4i4mcMFA52S6R8","outcome":{"logs":[],"receipt_ids":["7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD"],"gas_burnt":2427954539010,"tokens_burnt":"242795453901000000000","executor_id":"da.test.near","status":{"SuccessReceiptId":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD"},"metadata":{"version":1,"gas_profile":null}}},"receipt":null}}],"receipts":[{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD","priority":0,"receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}]}}}]},"receipt_execution_outcomes":[{"execution_outcome":{"proof":[{"hash":"AJ46727JkMeoQyhkV9JmiBSKQvhMA17xAv4JBR7ozACk","direction":"Left"}],"block_hash":"HKnmoD4cpBStpdWC1Mahm1NRWc4FZayjUEURzGuWpU18","id":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD","outcome":{"logs":[],"receipt_ids":["2y5YoNEmN5GioXbHJaYb6H12ky3BCmCFHtiaHnmyjUmq"],"gas_burnt":2575781001663,"tokens_burnt":"257578100166300000000","executor_id":"da.test.near","status":{"SuccessValue":""},"metadata":{"version":3,"gas_profile":[{"cost_category":"WASM_HOST_COST","cost":"BASE","gas_used":"2647681110"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BASE","gas_used":"35445963"},{"cost_category":"WASM_HOST_COST","cost":"CONTRACT_LOADING_BYTES","gas_used":"1874020500"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BASE","gas_used":"5219726400"},{"cost_category":"WASM_HOST_COST","cost":"READ_MEMORY_BYTE","gas_used":"7602666"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BASE","gas_used":"7551495558"},{"cost_category":"WASM_HOST_COST","cost":"READ_REGISTER_BYTE","gas_used":"3252546"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BASE","gas_used":"54039896625"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_HAS_KEY_BYTE","gas_used":"30790845"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_BASE","gas_used":"56356845750"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_KEY_BYTE","gas_used":"30952533"},{"cost_category":"WASM_HOST_COST","cost":"STORAGE_READ_VALUE_BYTE","gas_used":"67332060"},{"cost_category":"WASM_HOST_COST","cost":"WASM_INSTRUCTION","gas_used":"2738131968"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BASE","gas_used":"8411384583"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_MEMORY_BYTE","gas_used":"89884476"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BASE","gas_used":"8596567458"},{"cost_category":"WASM_HOST_COST","cost":"WRITE_REGISTER_BYTE","gas_used":"125451612"}]}}},"receipt":{"predecessor_id":"da.test.near","receiver_id":"da.test.near","receipt_id":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD","priority":0,"receipt":{"Action":{"signer_id":"da.test.near","signer_public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","gas_price":"119405230","output_data_receivers":[],"input_data_ids":[],"actions":[{"FunctionCall":{"method_name":"submit","args":"eyJhcmciOjF9","gas":30000000000000,"deposit":"0"}}]}}}}],"state_changes":[{"cause":{"type":"transaction_processing","tx_hash":"J7Rq24qywM5XiyZX1cmbEkrBWN77gh4i4mcMFA52S6R8"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959082864558015466977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"receipt_processing","receipt_hash":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959082864558015466977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"action_receipt_gas_reward","receipt_hash":"7rbQU1cWoGiQuUQjTTKoxzpQkQmA3cGLKLYSaSQsM5GD"},"type":"account_update","change":{"account_id":"da.test.near","amount":"99959087299351894966977700","locked":"0","code_hash":"AGe5t2yJ1NgyxxfvNfSenyY5w1mJybuoK3fKcY1juNwd","storage_usage":8923,"storage_paid_at":0}},{"cause":{"type":"transaction_processing","tx_hash":"J7Rq24qywM5XiyZX1cmbEkrBWN77gh4i4mcMFA52S6R8"},"type":"access_key_update","change":{"account_id":"da.test.near","public_key":"ed25519:H2BvchWN5XvzhCzoCqRzapPwe6zDfMDw6nrFuxnMyha","access_key":{"nonce":6781000076,"permission":"FullAccess"}}}]}]} \ No newline at end of file From cdd1714768eaf47d07d632b5f3f0317f713b4b54 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 15:22:20 +0300 Subject: [PATCH 48/62] AI review comments-2 --- workers/src/verifier.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index b63310e8..14486565 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -14,17 +14,17 @@ pub(crate) struct ResponseWrapper { #[derive(Serialize, Deserialize, std::fmt::Debug)] pub(crate) struct Message { #[serde(rename = "RollupId")] - pub rollup_id: u32, + rollup_id: u32, #[serde(rename = "BlockHeight")] - pub block_height: u64, + block_height: u64, #[serde(rename = "Timestamp")] - pub timestamp: u64, + timestamp: u64, #[serde(rename = "NearDaTransactionId")] - pub near_da_transaction_id: Vec, + near_da_transaction_id: Vec, #[serde(rename = "NearDaCommitment")] - pub near_da_commitment: Vec, + near_da_commitment: Vec, #[serde(rename = "StateRoot")] - pub state_root: Vec, + pub(crate) state_root: Vec, } // TODO: Generify in a future for other networks, like Solana. From 6336376300f2e92d7890bf1cd141cf6c035f5e49 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 15:27:55 +0300 Subject: [PATCH 49/62] Try to make CI happier --- Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0e5978a8..1d6605c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,11 +20,10 @@ alloy-rlp = "0.3.8" alloy-rpc-client = "0.4.2" alloy-rpc-types = "0.4.2" alloy-transport-ws = "0.4.2" -anyhow = "1.0" +anyhow = "1.0.79" async-trait = "0.1" bincode = "1.3" clap = "4.5.18" -core-rs = { path = "core-rs" } eyre = "0.6" futures-util = "0.3.30" log = "0.4" From 2aa63d2608bafee6038b9f282feb53b04455a625 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 15:53:59 +0300 Subject: [PATCH 50/62] Revert changes, fix them in a separate PR --- indexer/Cargo.toml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/indexer/Cargo.toml b/indexer/Cargo.toml index 4b1f02cf..047b5e69 100644 --- a/indexer/Cargo.toml +++ b/indexer/Cargo.toml @@ -9,22 +9,22 @@ edition = "2021" actix = "0.13.1" actix-web = "4.5.1" futures = "0.3.5" -tokio = { workspace = true } +tokio = { version = "1.28.2", features = ["sync", "time"] } deadpool = "0.10.0" lapin = "2.3.1" deadpool-lapin = "0.11.0" tokio-executor-trait = "2.1.0" tokio-reactor-trait = "1.1.0" -prometheus = { workspace = true } +prometheus = "0.13.3" -clap = { workspace = true } +clap = { version = "4.4.11", features = ["color", "derive", "env"] } openssl-probe = "0.1.4" -serde = { workspace = true } -serde_json = { workspace = true } +serde = { version = "1", features = ["derive"] } +serde_json = "1.0.68" -tracing = { workspace = true } +tracing = { version = "0.1.36", features = ["std"] } thiserror = "1.0.56" -anyhow = { workspace = true } +anyhow = "1.0.79" near-indexer = { git = "https://github.com/near/nearcore", rev = "93073d762ff377382ebf54e7cbff448b492e72c6" } near-client = { git = "https://github.com/near/nearcore", rev = "93073d762ff377382ebf54e7cbff448b492e72c6" } @@ -32,7 +32,7 @@ near-o11y = { git = "https://github.com/near/nearcore", rev = "93073d762ff377382 near-config-utils = { git = "https://github.com/near/nearcore", rev = "93073d762ff377382ebf54e7cbff448b492e72c6" } near-client-primitives = { git = "https://github.com/near/nearcore", rev = "93073d762ff377382ebf54e7cbff448b492e72c6" } borsh = { version = "1.0.0", features = ["derive", "rc"] } -serde_yaml = { workspace = true } +serde_yaml = "0.9.34" [dev-dependencies] near-crypto = { git = "https://github.com/near/nearcore", rev = "93073d762ff377382ebf54e7cbff448b492e72c6" } From c8d6e36c08de26ca750d219b3aa558c53619266f Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 16:06:03 +0300 Subject: [PATCH 51/62] Tokio :) --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 1d6605c1..eaba25f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_yaml = "0.9" tempfile = "3.10.0" -tokio = { version = "1.0", features = ["full"] } +tokio = { version = "1", features = ["full"] } tracing = "0.1" tracing-subscriber = "0.3" From 46cd2b4e14a96a9cf36f6b43c60019605236e630 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Thu, 24 Oct 2024 17:44:28 +0300 Subject: [PATCH 52/62] Another review round --- workers/Cargo.toml | 2 ++ workers/src/bin/dvn.rs | 2 +- workers/src/verifier.rs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/workers/Cargo.toml b/workers/Cargo.toml index 57004a24..9f021ae9 100644 --- a/workers/Cargo.toml +++ b/workers/Cargo.toml @@ -20,4 +20,6 @@ serde_json.workspace = true tokio.workspace = true tracing.workspace = true tracing-subscriber = {workspace = true, features = ["env-filter"] } + +[dev-dependencies] wiremock = "0.6.2" diff --git a/workers/src/bin/dvn.rs b/workers/src/bin/dvn.rs index 175e4128..753c6d9d 100644 --- a/workers/src/bin/dvn.rs +++ b/workers/src/bin/dvn.rs @@ -98,7 +98,7 @@ async fn main() -> Result<()> { error!("Block number is None, can't verify Packet."); continue; } - + if !verifier.verify(log.block_number.unwrap()).await? { error!("Failed to verify the state root."); continue; diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 14486565..7634c0d1 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -61,7 +61,7 @@ impl NFFLVerifier { Self::new(&cfg.aggregator_url, &cfg.http_rpc_url, cfg.network_eid).await } - /// Verifies the state root of a block. In case if any request future + /// Verifies the state root of a block. In case any request future /// is interrupted, or finishes unsuccessfully, returns Ok(false). pub async fn verify(&self, block_height: u64) -> eyre::Result { match tokio::try_join!( From 93f4434f51e1cc529561660a176e79e70bf85a5b Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Fri, 25 Oct 2024 13:08:31 +0300 Subject: [PATCH 53/62] Timeout handling --- workers/src/verifier.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 7634c0d1..ae7d66ed 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -5,6 +5,8 @@ use alloy::primitives::B256; use alloy::providers::{Provider, ProviderBuilder, ReqwestProvider}; use reqwest::{Client, ClientBuilder, Url}; use serde::{Deserialize, Serialize}; +use std::time::Duration; +use tracing::error; #[derive(Serialize, Deserialize, std::fmt::Debug)] pub(crate) struct ResponseWrapper { @@ -43,6 +45,7 @@ pub struct NFFLVerifier { impl NFFLVerifier { /// For test purposes only + #[cfg(test)] pub(crate) async fn new(agg_url: &str, eth_l2_url: &str, network_id: u64) -> eyre::Result { let client = ClientBuilder::new().build()?; let url: Url = eth_l2_url.parse()?; @@ -64,11 +67,12 @@ impl NFFLVerifier { /// Verifies the state root of a block. In case any request future /// is interrupted, or finishes unsuccessfully, returns Ok(false). pub async fn verify(&self, block_height: u64) -> eyre::Result { + const TIMEOUT: Duration = Duration::from_secs(10); match tokio::try_join!( - self.get_aggregator_root_state(block_height), - self.get_block_state_root(block_height), + tokio::time::timeout(TIMEOUT, self.get_aggregator_root_state(block_height)), + tokio::time::timeout(TIMEOUT, self.get_block_state_root(block_height)), ) { - Ok((agg_response, block_state_root)) => { + Ok((Ok(agg_response), Ok(block_state_root))) => { let state_root_slice: &[u8] = agg_response.message.state_root.as_slice(); let aggregator_state_root: B256 = B256::from_slice(state_root_slice); if agg_response.message.block_height != block_height { @@ -76,7 +80,11 @@ impl NFFLVerifier { } Ok(block_state_root.eq(&aggregator_state_root)) } - Err(_) => Ok(false), + Err(e) => { + error!("Error while verifying state root: {:?}", e); + Ok(false) + } + _ => Ok(false), } } From 65e544ff2212b88743c1f29cb7bf209a9d5a81f7 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Fri, 25 Oct 2024 13:18:45 +0300 Subject: [PATCH 54/62] Revert back --- workers/src/verifier.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index ae7d66ed..f9c76db8 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -44,8 +44,6 @@ pub struct NFFLVerifier { } impl NFFLVerifier { - /// For test purposes only - #[cfg(test)] pub(crate) async fn new(agg_url: &str, eth_l2_url: &str, network_id: u64) -> eyre::Result { let client = ClientBuilder::new().build()?; let url: Url = eth_l2_url.parse()?; From 135937416d113006508374827d78dce3f128a093 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Fri, 25 Oct 2024 13:54:22 +0300 Subject: [PATCH 55/62] Add tests --- workers/src/verifier.rs | 100 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 5 deletions(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index f9c76db8..a551dd31 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -116,12 +116,38 @@ mod tests { use wiremock::matchers::{method, path, query_param_contains}; use wiremock::{Mock, MockServer, ResponseTemplate}; + #[tokio::test] + async fn test_verify_mock_ok() { + let mock_server = MockServer::start().await; + setup(&mock_server, true).await; + + let verifier_result = NFFLVerifier::new(mock_server.uri().as_str(), mock_server.uri().as_str(), 1).await; + + assert!(verifier_result.is_ok()); + + let verifier = verifier_result.unwrap(); + assert!(verifier.verify(2).await.unwrap()); + } + + #[tokio::test] + async fn test_verify_mock_fails() { + let mock_server = MockServer::start().await; + setup(&mock_server, false).await; + + let verifier_result = NFFLVerifier::new(mock_server.uri().as_str(), mock_server.uri().as_str(), 1).await; + + assert!(verifier_result.is_ok()); + + let verifier = verifier_result.unwrap(); + assert!(!verifier.verify(2).await.unwrap()); + } + #[tokio::test] async fn test_aggregator_root_state_mock_ok() { let mock_server = MockServer::start().await; - setup(&mock_server).await; + setup(&mock_server, true).await; - let verifier_result = NFFLVerifier::new(mock_server.uri().as_str(), "https://arbitrum.drpc.org", 1).await; + let verifier_result = NFFLVerifier::new(mock_server.uri().as_str(), mock_server.uri().as_str(), 1).await; assert!(verifier_result.is_ok()); @@ -131,17 +157,46 @@ mod tests { assert!(state_root_resp_res.is_ok()); let state_root = state_root_resp_res.unwrap().message.state_root; - assert_eq!(state_root, vec![1, 1, 1]); + assert_eq!(state_root, vec![99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, + 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, + 227, 111, 15, 243, 171, 37, 156, 154, 71, 240]); + } + + #[tokio::test] + async fn test_block_root_state_mock_ok() { + let mock_server = MockServer::start().await; + setup(&mock_server, true).await; + + let verifier_result = NFFLVerifier::new(mock_server.uri().as_str(), mock_server.uri().as_str(), 1).await; + + assert!(verifier_result.is_ok()); + + let verifier = verifier_result.unwrap(); + + let state_root_resp_res = verifier.get_block_state_root(2).await; + assert!(state_root_resp_res.is_ok()); + + let state_root = state_root_resp_res.unwrap().to_vec(); + assert_eq!(state_root, vec![99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, + 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, + 227, 111, 15, 243, 171, 37, 156, 154, 71, 240]); } - async fn setup(mock_server: &MockServer) { + async fn setup(mock_server: &MockServer, should_pass: bool) { + let expected_state_root: Vec = match should_pass { + true => vec![99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, + 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, + 227, 111, 15, 243, 171, 37, 156, 154, 71, 240], + false => vec![0; 32] + }; + let state_root_message = Message { rollup_id: 1, block_height: 2, timestamp: 3, near_da_transaction_id: vec![4], near_da_commitment: vec![5], - state_root: vec![1, 1, 1], + state_root: expected_state_root, }; let state_root_resp = ResponseWrapper { @@ -154,5 +209,40 @@ mod tests { .respond_with(ResponseTemplate::new(200).set_body_json(state_root_resp)) .mount(mock_server) .await; + + Mock::given(method("POST")) + .and(path("/")) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x1913ff69551dac", + "extraData": "0xe4b883e5bda9e7a59ee4bb99e9b1bc000921", + "gasLimit": "0xe4e1b2", + "gasUsed": "0xe4d737", + "hash": "0xa917fcc721a5465a484e9be17cda0cc5493933dd3bc70c9adbee192cb419c9d7", + "logsBloom": "0x00af00124b82093253a6960ab5a003170000318c0a00c18d418505009c10c905810e05d4a4511044b6245a062122010233958626c80039250781851410a468418101040c0100f178088a4e89000140e00001880c1c601413ac47bc5882854701180b9404422202202521584000808843030a552488a80e60c804c8d8004d0480422585320e068028d2e190508130022600024a51c116151a07612040081000088ba5c891064920a846b36288a40280820212b20940280056b233060818988945f33460426105024024040923447ad1102000028b8f0e001e810021031840a2801831a0113b003a5485843004c10c4c10d6a04060a84d88500038ab10875a382c", + "miner": "0x829bd824b016326a401d083b33d092293333a830", + "mixHash": "0x7d416c4a24dc3b43898040ea788922d8563d44a5193e6c4a1d9c70990775c879", + "nonce": "0xe6e41732385c71d6", + "number": "0xc5043f", + "parentHash": "0xd1c4628a6710d8dec345e5bca6b8093abf3f830516e05e36f419f993334d10ef", + "receiptsRoot": "0x7eadd994da137c7720fe2bf2935220409ed23a06ec6470ffd2d478e41af0255b", + "sha3Uncles": "0x7d9ce61d799ddcb5dfe1644ec7224ae7018f24ecb682f077b4c477da192e8553", + "size": "0xa244", + "stateRoot": "0x6350d0454245fb410fc0fb93f6648c5b9047a6081441e36f0ff3ab259c9a47f0", + "timestamp": "0x6100bc82", + "totalDifficulty": "0x5f35fb5663cdc988403", + "transactions": [ + "0x3dc2776aa483c0eee09c2ccc654bf81dccebead40e9bb664289637bfb5e7e954" + ], + "transactionsRoot": "0xa17c2a87a6ff2fd790d517e48279e02f2e092a05309300c976363e47e0012672", + "uncles": [ + "0xd3946359c70281162cf00c8164d99ca14801e8008715cb1fad93b9cecaf9f7d8" + ] + } + }))) + .mount(mock_server) + .await; } } From d417889dfe54eedfe7f9754efe801ddef43d1deb Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Fri, 25 Oct 2024 14:29:28 +0300 Subject: [PATCH 56/62] Timeout test --- workers/src/verifier.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index a551dd31..a1aecf38 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -112,6 +112,7 @@ impl NFFLVerifier { #[cfg(test)] mod tests { + use std::time::Duration; use crate::verifier::{Message, NFFLVerifier, ResponseWrapper}; use wiremock::matchers::{method, path, query_param_contains}; use wiremock::{Mock, MockServer, ResponseTemplate}; @@ -140,7 +141,26 @@ mod tests { let verifier = verifier_result.unwrap(); assert!(!verifier.verify(2).await.unwrap()); - } + } + + #[tokio::test] + async fn test_verify_timeout_fail() { + let mock_server = MockServer::start().await; + + // Mock that delays longer than timeout + Mock::given(method("GET")) + .respond_with(ResponseTemplate::new(200).set_delay(Duration::from_secs(11))) + .mount(&mock_server) + .await; + + let verifier = NFFLVerifier::new( + mock_server.uri().as_str(), + mock_server.uri().as_str(), + 1 + ).await.unwrap(); + + assert!(!verifier.verify(2).await.unwrap()); + } #[tokio::test] async fn test_aggregator_root_state_mock_ok() { From 43728269721f2ed2133ff4839a64acaa4c1760df Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Mon, 28 Oct 2024 09:15:13 +0200 Subject: [PATCH 57/62] Update verifier.rs --- workers/src/verifier.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index a1aecf38..312ff6ac 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -100,7 +100,6 @@ impl NFFLVerifier { /// Fetches the block state root from the Ethereum L2 provider /// via JSON-RPC API, backed by alloy-rs. - /// Note: an author didn't write a test for that, because he doesn't know how to mock RPC :( pub(crate) async fn get_block_state_root(&self, block_number: u64) -> eyre::Result { let b_number = BlockNumberOrTag::from(block_number); match self.eth_l2_provider.get_block_by_number(b_number, true).await? { From 5296a3f7dc7dc5cfcbb9158ae9a7ef9eaeb3bb22 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Mon, 28 Oct 2024 11:35:00 +0200 Subject: [PATCH 58/62] Review comments --- workers/src/verifier.rs | 67 ++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index a1aecf38..12f15995 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -74,12 +74,24 @@ impl NFFLVerifier { let state_root_slice: &[u8] = agg_response.message.state_root.as_slice(); let aggregator_state_root: B256 = B256::from_slice(state_root_slice); if agg_response.message.block_height != block_height { + error!( + "Block heights are not equal for comparing state roots.\ + Aggregator height: {:?}, L2-provided height: {:?}", + agg_response.message.block_height, block_height + ); return Ok(false); } - Ok(block_state_root.eq(&aggregator_state_root)) + let comparison_result = block_state_root.eq(&aggregator_state_root); + if !comparison_result { + error!( + "State roots are not equal. Aggregator: {:?}, L2-provided: {:?}", + aggregator_state_root, block_state_root + ); + } + Ok(comparison_result) } Err(e) => { - error!("Error while verifying state root: {:?}", e); + error!("Timeout error while verifying state root: {:?}", e); Ok(false) } _ => Ok(false), @@ -89,8 +101,8 @@ impl NFFLVerifier { /// Fetches the root state from the NFFL aggregator via HTTP. pub(crate) async fn get_aggregator_root_state(&self, block_height: u64) -> eyre::Result { let params = [ - ("rollupId", self.network_id.clone()), - ("blockHeight", block_height.to_string()), + ("rollupId", &self.network_id), + ("blockHeight", &block_height.to_string()), ]; let url = Url::parse_with_params(&self.aggregator_http_address, ¶ms)?; let response = self.http_client.get(url).send().await?; @@ -112,8 +124,8 @@ impl NFFLVerifier { #[cfg(test)] mod tests { - use std::time::Duration; use crate::verifier::{Message, NFFLVerifier, ResponseWrapper}; + use std::time::Duration; use wiremock::matchers::{method, path, query_param_contains}; use wiremock::{Mock, MockServer, ResponseTemplate}; @@ -128,8 +140,8 @@ mod tests { let verifier = verifier_result.unwrap(); assert!(verifier.verify(2).await.unwrap()); - } - + } + #[tokio::test] async fn test_verify_mock_fails() { let mock_server = MockServer::start().await; @@ -153,15 +165,13 @@ mod tests { .mount(&mock_server) .await; - let verifier = NFFLVerifier::new( - mock_server.uri().as_str(), - mock_server.uri().as_str(), - 1 - ).await.unwrap(); + let verifier = NFFLVerifier::new(mock_server.uri().as_str(), mock_server.uri().as_str(), 1) + .await + .unwrap(); assert!(!verifier.verify(2).await.unwrap()); } - + #[tokio::test] async fn test_aggregator_root_state_mock_ok() { let mock_server = MockServer::start().await; @@ -177,9 +187,13 @@ mod tests { assert!(state_root_resp_res.is_ok()); let state_root = state_root_resp_res.unwrap().message.state_root; - assert_eq!(state_root, vec![99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, - 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, - 227, 111, 15, 243, 171, 37, 156, 154, 71, 240]); + assert_eq!( + state_root, + vec![ + 99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, 227, + 111, 15, 243, 171, 37, 156, 154, 71, 240 + ] + ); } #[tokio::test] @@ -197,19 +211,24 @@ mod tests { assert!(state_root_resp_res.is_ok()); let state_root = state_root_resp_res.unwrap().to_vec(); - assert_eq!(state_root, vec![99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, - 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, - 227, 111, 15, 243, 171, 37, 156, 154, 71, 240]); + assert_eq!( + state_root, + vec![ + 99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, 227, + 111, 15, 243, 171, 37, 156, 154, 71, 240 + ] + ); } async fn setup(mock_server: &MockServer, should_pass: bool) { let expected_state_root: Vec = match should_pass { - true => vec![99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, - 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, - 227, 111, 15, 243, 171, 37, 156, 154, 71, 240], - false => vec![0; 32] + true => vec![ + 99, 80, 208, 69, 66, 69, 251, 65, 15, 192, 251, 147, 246, 100, 140, 91, 144, 71, 166, 8, 20, 65, 227, + 111, 15, 243, 171, 37, 156, 154, 71, 240, + ], + false => vec![0; 32], }; - + let state_root_message = Message { rollup_id: 1, block_height: 2, From 39317dd6adf8aa7b2a8e5d576f00451065537ea7 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Mon, 28 Oct 2024 11:45:07 +0200 Subject: [PATCH 59/62] Revert "Implement /state-root endpoint specifically for serving state root message" This reverts commit 1c9a7d90c719cc15ebe91132ae0670463364646f. --- aggregator/aggregator.go | 12 -------- aggregator/mocks/rest_aggregator.go | 30 ++++++-------------- aggregator/rest_server/server.go | 28 ------------------- aggregator/rest_server/server_test.go | 40 --------------------------- aggregator/types/types.go | 4 --- go.mod | 1 - go.sum | 11 -------- 7 files changed, 9 insertions(+), 117 deletions(-) diff --git a/aggregator/aggregator.go b/aggregator/aggregator.go index 3a19e140..526fa690 100644 --- a/aggregator/aggregator.go +++ b/aggregator/aggregator.go @@ -69,7 +69,6 @@ type RpcAggregatorer interface { } type RestAggregatorer interface { - GetStateRoot(rollupId uint32, blockHeight uint64) (*types.GetStateRootResponse, error) GetStateRootUpdateAggregation(rollupId uint32, blockHeight uint64) (*types.GetStateRootUpdateAggregationResponse, error) GetOperatorSetUpdateAggregation(id uint64) (*types.GetOperatorSetUpdateAggregationResponse, error) GetCheckpointMessages(fromTimestamp, toTimestamp uint64) (*types.GetCheckpointMessagesResponse, error) @@ -622,17 +621,6 @@ func (agg *Aggregator) GetRegistryCoordinatorAddress(reply *string) error { } // Rest requests -func (agg *Aggregator) GetStateRoot(rollupId uint32, blockHeight uint64) (*types.GetStateRootResponse, error) { - message, err := agg.msgDb.FetchStateRootUpdate(uint32(rollupId), blockHeight) - if err != nil { - return nil, StateRootUpdateNotFoundError - } - - return &types.GetStateRootResponse{ - Message: *message, - }, nil -} - func (agg *Aggregator) GetStateRootUpdateAggregation(rollupId uint32, blockHeight uint64) (*types.GetStateRootUpdateAggregationResponse, error) { message, err := agg.msgDb.FetchStateRootUpdate(uint32(rollupId), blockHeight) if err != nil { diff --git a/aggregator/mocks/rest_aggregator.go b/aggregator/mocks/rest_aggregator.go index 651c9fbd..95c9b132 100644 --- a/aggregator/mocks/rest_aggregator.go +++ b/aggregator/mocks/rest_aggregator.go @@ -1,15 +1,18 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/NethermindEth/near-sffl/aggregator (interfaces: RestAggregatorer) - +// +// Generated by this command: +// +// mockgen -destination=./mocks/rest_aggregator.go -package=mocks github.com/NethermindEth/near-sffl/aggregator RestAggregatorer +// // Package mocks is a generated GoMock package. package mocks import ( - gomock "go.uber.org/mock/gomock" reflect "reflect" types "github.com/NethermindEth/near-sffl/aggregator/types" - //gomock "github.com/golang/mock/gomock" + gomock "go.uber.org/mock/gomock" ) // MockRestAggregatorer is a mock of RestAggregatorer interface. @@ -45,7 +48,7 @@ func (m *MockRestAggregatorer) GetCheckpointMessages(arg0, arg1 uint64) (*types. } // GetCheckpointMessages indicates an expected call of GetCheckpointMessages. -func (mr *MockRestAggregatorerMockRecorder) GetCheckpointMessages(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockRestAggregatorerMockRecorder) GetCheckpointMessages(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCheckpointMessages", reflect.TypeOf((*MockRestAggregatorer)(nil).GetCheckpointMessages), arg0, arg1) } @@ -60,26 +63,11 @@ func (m *MockRestAggregatorer) GetOperatorSetUpdateAggregation(arg0 uint64) (*ty } // GetOperatorSetUpdateAggregation indicates an expected call of GetOperatorSetUpdateAggregation. -func (mr *MockRestAggregatorerMockRecorder) GetOperatorSetUpdateAggregation(arg0 interface{}) *gomock.Call { +func (mr *MockRestAggregatorerMockRecorder) GetOperatorSetUpdateAggregation(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorSetUpdateAggregation", reflect.TypeOf((*MockRestAggregatorer)(nil).GetOperatorSetUpdateAggregation), arg0) } -// GetStateRoot mocks base method. -func (m *MockRestAggregatorer) GetStateRoot(arg0 uint32, arg1 uint64) (*types.GetStateRootResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetStateRoot", arg0, arg1) - ret0, _ := ret[0].(*types.GetStateRootResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetStateRoot indicates an expected call of GetStateRoot. -func (mr *MockRestAggregatorerMockRecorder) GetStateRoot(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateRoot", reflect.TypeOf((*MockRestAggregatorer)(nil).GetStateRoot), arg0, arg1) -} - // GetStateRootUpdateAggregation mocks base method. func (m *MockRestAggregatorer) GetStateRootUpdateAggregation(arg0 uint32, arg1 uint64) (*types.GetStateRootUpdateAggregationResponse, error) { m.ctrl.T.Helper() @@ -90,7 +78,7 @@ func (m *MockRestAggregatorer) GetStateRootUpdateAggregation(arg0 uint32, arg1 u } // GetStateRootUpdateAggregation indicates an expected call of GetStateRootUpdateAggregation. -func (mr *MockRestAggregatorerMockRecorder) GetStateRootUpdateAggregation(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockRestAggregatorerMockRecorder) GetStateRootUpdateAggregation(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStateRootUpdateAggregation", reflect.TypeOf((*MockRestAggregatorer)(nil).GetStateRootUpdateAggregation), arg0, arg1) } diff --git a/aggregator/rest_server/server.go b/aggregator/rest_server/server.go index 28ef76fd..7a2b9d13 100644 --- a/aggregator/rest_server/server.go +++ b/aggregator/rest_server/server.go @@ -55,7 +55,6 @@ func (s *RestServer) Start() error { s.logger.Info("Starting aggregator REST API.") router := mux.NewRouter() - router.HandleFunc("/state-root", wrapRequest(s.listener.APIErrors, s.handleGetStateRootUpdateAggregation)).Methods("GET") router.HandleFunc("/aggregation/state-root-update", wrapRequest(s.listener.APIErrors, s.handleGetStateRootUpdateAggregation)).Methods("GET") router.HandleFunc("/aggregation/operator-set-update", wrapRequest(s.listener.APIErrors, s.handleGetOperatorSetUpdateAggregation)).Methods("GET") router.HandleFunc("/checkpoint/messages", wrapRequest(s.listener.APIErrors, s.handleGetCheckpointMessages)).Methods("GET") @@ -83,33 +82,6 @@ func wrapRequest(errorHandler func(), requestCallback func(w http.ResponseWriter } } -func (s *RestServer) handleGetStateRoot(w http.ResponseWriter, r *http.Request) error { - s.listener.IncStateRootUpdateRequests() // We can leave it as is, because it is similar requests - - params := r.URL.Query() - rollupId, err := strconv.ParseUint(params.Get("rollupId"), 10, 32) - if err != nil { - http.Error(w, "Invalid rollupId", http.StatusBadRequest) - return err - } - - blockHeight, err := strconv.ParseUint(params.Get("blockHeight"), 10, 64) - if err != nil { - http.Error(w, "Invalid blockHeight", http.StatusBadRequest) - return err - } - - response, err := s.app.GetStateRoot(uint32(rollupId), blockHeight) - if err != nil { - http.Error(w, err.Error(), mapErrorToCode(err)) - return err - } - - w.WriteHeader(http.StatusOK) - w.Header().Set("Content-Type", "application/json") - return json.NewEncoder(w).Encode(*response) -} - func (s *RestServer) handleGetStateRootUpdateAggregation(w http.ResponseWriter, r *http.Request) error { s.listener.IncStateRootUpdateRequests() diff --git a/aggregator/rest_server/server_test.go b/aggregator/rest_server/server_test.go index 42e44916..a512b84a 100644 --- a/aggregator/rest_server/server_test.go +++ b/aggregator/rest_server/server_test.go @@ -17,46 +17,6 @@ import ( aggtypes "github.com/NethermindEth/near-sffl/aggregator/types" ) -func TestGetStateRoot(t *testing.T) { - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - - logger := sdklogging.NewNoopLogger() - aggregator := mocks.NewMockRestAggregatorer(mockCtrl) - restServer := NewRestServer("", aggregator, logger) - - msg := messages.StateRootUpdateMessage{ - RollupId: 1, - BlockHeight: 2, - Timestamp: 3, - NearDaCommitment: tests.Keccak256(4), - NearDaTransactionId: tests.Keccak256(5), - StateRoot: tests.Keccak256(6), - } - - response := aggtypes.GetStateRootResponse{ - Message: msg, - } - aggregator.EXPECT().GetStateRoot(msg.RollupId, msg.BlockHeight).Return(&response, nil) - - req, err := http.NewRequest( - "GET", - fmt.Sprintf("/state-root?rollupId=%d&blockHeight=%d", msg.RollupId, msg.BlockHeight), - nil, - ) - assert.Nil(t, err) - - recorder := httptest.NewRecorder() - err = restServer.handleGetStateRoot(recorder, req) - assert.Nil(t, err) - assert.Equal(t, recorder.Code, http.StatusOK) - - var body aggtypes.GetStateRootResponse - err = json.Unmarshal(recorder.Body.Bytes(), &body) - assert.Nil(t, err) - assert.Equal(t, body, response) -} - func TestGetStateRootUpdateAggregation(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() diff --git a/aggregator/types/types.go b/aggregator/types/types.go index da1710f2..e1df6a02 100644 --- a/aggregator/types/types.go +++ b/aggregator/types/types.go @@ -25,10 +25,6 @@ type OperatorInfo struct { OperatorAddr common.Address } -type GetStateRootResponse struct { - Message messages.StateRootUpdateMessage -} - type GetStateRootUpdateAggregationResponse struct { Message messages.StateRootUpdateMessage Aggregation messages.MessageBlsAggregation diff --git a/go.mod b/go.mod index 8d275bac..aab0b2a9 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,6 @@ require ( github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang/mock v1.6.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/lmittmann/tint v1.0.4 // indirect diff --git a/go.sum b/go.sum index dbb2f125..1b0cb63f 100644 --- a/go.sum +++ b/go.sum @@ -135,8 +135,6 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= @@ -301,7 +299,6 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRT github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= @@ -338,30 +335,24 @@ golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRj golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -370,7 +361,6 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= @@ -381,7 +371,6 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 119506078ac821d02fac3db4637615b2a827162f Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Mon, 28 Oct 2024 12:21:28 +0200 Subject: [PATCH 60/62] Review comments-2 --- workers/src/verifier.rs | 69 ++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index b87b5faa..973b0a47 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -8,23 +8,12 @@ use serde::{Deserialize, Serialize}; use std::time::Duration; use tracing::error; -#[derive(Serialize, Deserialize, std::fmt::Debug)] -pub(crate) struct ResponseWrapper { - pub message: Message, -} - #[derive(Serialize, Deserialize, std::fmt::Debug)] pub(crate) struct Message { #[serde(rename = "RollupId")] rollup_id: u32, #[serde(rename = "BlockHeight")] block_height: u64, - #[serde(rename = "Timestamp")] - timestamp: u64, - #[serde(rename = "NearDaTransactionId")] - near_da_transaction_id: Vec, - #[serde(rename = "NearDaCommitment")] - near_da_commitment: Vec, #[serde(rename = "StateRoot")] pub(crate) state_root: Vec, } @@ -48,7 +37,7 @@ impl NFFLVerifier { let client = ClientBuilder::new().build()?; let url: Url = eth_l2_url.parse()?; let provider = ProviderBuilder::new().on_http(url); - let agg_http_addr = format!("{}/state-root", agg_url); + let agg_http_addr = format!("{}/aggregation/state-root-update", agg_url); Ok(NFFLVerifier { eth_l2_provider: provider, @@ -71,13 +60,13 @@ impl NFFLVerifier { tokio::time::timeout(TIMEOUT, self.get_block_state_root(block_height)), ) { Ok((Ok(agg_response), Ok(block_state_root))) => { - let state_root_slice: &[u8] = agg_response.message.state_root.as_slice(); + let state_root_slice: &[u8] = agg_response.state_root.as_slice(); let aggregator_state_root: B256 = B256::from_slice(state_root_slice); - if agg_response.message.block_height != block_height { + if agg_response.block_height != block_height { error!( "Block heights are not equal for comparing state roots.\ Aggregator height: {:?}, L2-provided height: {:?}", - agg_response.message.block_height, block_height + agg_response.block_height, block_height ); return Ok(false); } @@ -99,15 +88,16 @@ impl NFFLVerifier { } /// Fetches the root state from the NFFL aggregator via HTTP. - pub(crate) async fn get_aggregator_root_state(&self, block_height: u64) -> eyre::Result { + pub(crate) async fn get_aggregator_root_state(&self, block_height: u64) -> eyre::Result { let params = [ ("rollupId", &self.network_id), ("blockHeight", &block_height.to_string()), ]; let url = Url::parse_with_params(&self.aggregator_http_address, ¶ms)?; let response = self.http_client.get(url).send().await?; - let result = response.json::().await?; - Ok(result) + let mut result: serde_json::Value = response.json().await?; + + serde_json::from_value(result["Message"].take()).map_err(Into::into) } /// Fetches the block state root from the Ethereum L2 provider @@ -123,7 +113,7 @@ impl NFFLVerifier { #[cfg(test)] mod tests { - use crate::verifier::{Message, NFFLVerifier, ResponseWrapper}; + use crate::verifier::NFFLVerifier; use std::time::Duration; use wiremock::matchers::{method, path, query_param_contains}; use wiremock::{Mock, MockServer, ResponseTemplate}; @@ -185,7 +175,7 @@ mod tests { let state_root_resp_res = verifier.get_aggregator_root_state(2).await; assert!(state_root_resp_res.is_ok()); - let state_root = state_root_resp_res.unwrap().message.state_root; + let state_root = state_root_resp_res.unwrap().state_root; assert_eq!( state_root, vec![ @@ -228,23 +218,32 @@ mod tests { false => vec![0; 32], }; - let state_root_message = Message { - rollup_id: 1, - block_height: 2, - timestamp: 3, - near_da_transaction_id: vec![4], - near_da_commitment: vec![5], - state_root: expected_state_root, - }; - - let state_root_resp = ResponseWrapper { - message: state_root_message, - }; - Mock::given(method("GET")) - .and(path("/state-root")) + .and(path("/aggregation/state-root-update")) .and(query_param_contains("blockHeight", "2")) - .respond_with(ResponseTemplate::new(200).set_body_json(state_root_resp)) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!( + { + "Message" : { + "RollupId" : 1, + "BlockHeight" : 2, + "Timestamp" : 3, + "NearDaTransactionId" : [ 4 ], + "NearDaCommitment" : [ 5 ], + "StateRoot" : expected_state_root, + }, + "Aggregation" : { + "EthBlockNumber" : 0, + "MessageDigest" : [ 141 ], + "NonSignersPubkeysG1" : null, + "QuorumApksG1" : null, + "SignersApkG2" : null, + "SignersAggSigG1" : null, + "NonSignerQuorumBitmapIndices" : null, + "QuorumApkIndices" : null, + "TotalStakeIndices" : null, + "NonSignerStakeIndices" : null + } + }))) .mount(mock_server) .await; From 8a8538a8b9682dde30f3690cd7d34324385cdd51 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Mon, 28 Oct 2024 12:24:37 +0200 Subject: [PATCH 61/62] Format --- workers/src/verifier.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 973b0a47..9fb767b0 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -96,7 +96,7 @@ impl NFFLVerifier { let url = Url::parse_with_params(&self.aggregator_http_address, ¶ms)?; let response = self.http_client.get(url).send().await?; let mut result: serde_json::Value = response.json().await?; - + serde_json::from_value(result["Message"].take()).map_err(Into::into) } From 0e9752a67f87686683dcd540e5e2e7e275d67ee9 Mon Sep 17 00:00:00 2001 From: Sasha Syrotenko Date: Mon, 28 Oct 2024 13:39:01 +0200 Subject: [PATCH 62/62] Renamed the method according to the actual object --- workers/src/verifier.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/workers/src/verifier.rs b/workers/src/verifier.rs index 9fb767b0..79982f24 100644 --- a/workers/src/verifier.rs +++ b/workers/src/verifier.rs @@ -27,7 +27,7 @@ pub(crate) struct Message { /// 3. Compares the two state roots to determine message validity pub struct NFFLVerifier { http_client: Client, - eth_l2_provider: ReqwestProvider, + l2_provider: ReqwestProvider, aggregator_http_address: String, network_id: String, } @@ -40,7 +40,7 @@ impl NFFLVerifier { let agg_http_addr = format!("{}/aggregation/state-root-update", agg_url); Ok(NFFLVerifier { - eth_l2_provider: provider, + l2_provider: provider, http_client: client, aggregator_http_address: agg_http_addr, network_id: network_id.to_string(), @@ -56,7 +56,7 @@ impl NFFLVerifier { pub async fn verify(&self, block_height: u64) -> eyre::Result { const TIMEOUT: Duration = Duration::from_secs(10); match tokio::try_join!( - tokio::time::timeout(TIMEOUT, self.get_aggregator_root_state(block_height)), + tokio::time::timeout(TIMEOUT, self.get_aggregator_state_root(block_height)), tokio::time::timeout(TIMEOUT, self.get_block_state_root(block_height)), ) { Ok((Ok(agg_response), Ok(block_state_root))) => { @@ -88,7 +88,7 @@ impl NFFLVerifier { } /// Fetches the root state from the NFFL aggregator via HTTP. - pub(crate) async fn get_aggregator_root_state(&self, block_height: u64) -> eyre::Result { + pub(crate) async fn get_aggregator_state_root(&self, block_height: u64) -> eyre::Result { let params = [ ("rollupId", &self.network_id), ("blockHeight", &block_height.to_string()), @@ -104,7 +104,7 @@ impl NFFLVerifier { /// via JSON-RPC API, backed by alloy-rs. pub(crate) async fn get_block_state_root(&self, block_number: u64) -> eyre::Result { let b_number = BlockNumberOrTag::from(block_number); - match self.eth_l2_provider.get_block_by_number(b_number, true).await? { + match self.l2_provider.get_block_by_number(b_number, true).await? { Some(block) => Ok(block.header.state_root), None => Err(eyre::eyre!("Block {block_number} not found")), } @@ -162,7 +162,7 @@ mod tests { } #[tokio::test] - async fn test_aggregator_root_state_mock_ok() { + async fn test_aggregator_state_root_mock_ok() { let mock_server = MockServer::start().await; setup(&mock_server, true).await; @@ -172,7 +172,7 @@ mod tests { let verifier = verifier_result.unwrap(); - let state_root_resp_res = verifier.get_aggregator_root_state(2).await; + let state_root_resp_res = verifier.get_aggregator_state_root(2).await; assert!(state_root_resp_res.is_ok()); let state_root = state_root_resp_res.unwrap().state_root; @@ -186,7 +186,7 @@ mod tests { } #[tokio::test] - async fn test_block_root_state_mock_ok() { + async fn test_block_state_root_mock_ok() { let mock_server = MockServer::start().await; setup(&mock_server, true).await;