diff --git a/Cargo.lock b/Cargo.lock index a3f2fd44..bcb66fae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,6 +58,753 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alloy" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2a5d689ccd182f1d138a61f081841b905034e0089f5278f6c200f2bcdab00a" +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", + "alloy-trie", +] + +[[package]] +name = "alloy-chains" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8ff73a143281cb77c32006b04af9c047a6b8fe5860e85a88ad325328965355" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum 0.27.2", +] + +[[package]] +name = "alloy-consensus" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d213580c17d239ae83c0d897ac3315db7cda83d2d4936a9823cc3517552f2e24" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "alloy-tx-macros", + "auto_impl", + "c-kzg", + "derive_more", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "secp256k1", + "serde", + "serde_with 3.14.0", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-consensus-any" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81443e3b8dccfeac7cd511aced15928c97ff253f4177acbb97de97178e543f6c" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de217ab604f1bcfa2e3b0aff86d50812d5931d47522f9f0a949cc263ec2d108e" +dependencies = [ + "alloy-consensus", + "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", + "serde_json", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-core" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe6c56d58fbfa9f0f6299376e8ce33091fc6494239466814c3f54b55743cb09" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f56873f3cac7a2c63d8e98a4314b8311aa96adb1a0f82ae923eb2119809d2c" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2124" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-eip2930" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "k256", + "serde", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-eips" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a15b4b0f6bab47aae017d52bb5a739bda381553c09fb9918b7172721ef5f5de" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "c-kzg", + "derive_more", + "either", + "serde", + "serde_with 3.14.0", + "sha2", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-genesis" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ba1cbc25a07e0142e8875fcbe80e1fdb02be8160ae186b90f4b9a69a72ed2b" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", + "serde_with 3.14.0", +] + +[[package]] +name = "alloy-json-abi" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "125a1c373261b252e53e04d6e92c37d881833afc1315fceab53fd46045695640" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8882ec8e4542cfd02aadc6dccbe90caa73038f60016d936734eb6ced53d2167" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "http 1.3.1", + "serde", + "serde_json", + "thiserror 2.0.16", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d6d87d588bda509881a7a66ae77c86514bd1193ac30fbff0e0f24db95eb5a5" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "derive_more", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-network-primitives" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b14fa9ba5774e0b30ae6a04176d998211d516c8af69c9c530af7c6c42a8c508" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9485c56de23438127a731a6b4c87803d49faf1a7068dcd1d8768aca3a9edb9" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "foldhash", + "hashbrown 0.15.5", + "indexmap 2.11.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.2", + "ruint", + "rustc-hash 2.1.1", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "475a5141313c3665b75d818be97d5fa3eb5e0abb7e832e9767edd94746db28e3" +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-anvil", + "alloy-rpc-types-debug", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-signer", + "alloy-sol-types", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "either", + "futures", + "futures-utils-wasm", + "lru 0.13.0", + "parking_lot", + "pin-project", + "reqwest 0.12.23", + "serde", + "serde_json", + "thiserror 2.0.16", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-pubsub" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f97c18795ce1ce8151c5539ce1e4200940389674173f677c7455f79bfb00e5df" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "auto_impl", + "bimap", + "futures", + "parking_lot", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "wasmtimer", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "alloy-rpc-client" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25289674cd8c58fcca2568b5350423cb0dd7bca8c596c5e2869bfe4c5c57ed14" +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.23", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39676beaa50db545cf15447fc94ec5513b64e85a48357a0625b9a04aef08a910" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-anvil", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-anvil" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c8cad42fa936000be72ab80fcd97386a6a226c35c2989212756da9e76c1521" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01bac57c987c93773787619e20f89167db74d460a2d1d40f591d94fb7c22c379" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-debug" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2fe118e6c152d54cb4549b9835fb87d38b12754bb121375183ee3ec84bd0849" +dependencies = [ + "alloy-primitives", + "derive_more", + "serde", + "serde_with 3.14.0", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a41624eb84bc743e414198bf10eb48b611a5554d6a9fd6205f7384d57dfd7f" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "derive_more", + "rand 0.8.5", + "serde", + "strum 0.27.2", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd1e1b4dcdf13eaa96343e5c0dafc2d2e8ce5d20b90347169d46a1df0dec210" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.14.0", + "serde", + "serde_json", + "serde_with 3.14.0", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-rpc-types-trace" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc33d9d0e0b3cfe9c2e82a1a427c9ed516fcfebe764f0adf7ceb8107f702dd1" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-rpc-types-txpool" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fa9e9b3e613425d2a2ee1a322bdad5f1cedf835406fd4b59538822500b44bc" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-serde" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b3b1078b8775077525bc9fe9f6577e815ceaecd6c412a4f3b4d8aa2836e8f6" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ab1b8d4649bf7d0db8ab04e31658a6cc20364d920795484d886c35bed3bab4" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve 0.13.8", + "k256", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-signer-local" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bdeec36c8d9823102b571b3eab8b323e053dc19c12da14a9687bd474129bf2a" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.16", +] + +[[package]] +name = "alloy-sol-macro" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20d867dcf42019d4779519a1ceb55eba8d7f3d0e4f0a89bcba82b8f9eb01e48" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b74e91b0b553c115d14bd0ed41898309356dc85d0e3d4b9014c4e7715e48c8ad" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.11.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.106", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84194d31220803f5f62d0a00f583fd3a062b36382e2bea446f1af96727754565" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck 0.5.0", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.106", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe8c27b3cf6b2bb8361904732f955bc7c05e00be5f469cec7e2280b6167f3ff0" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5383d34ea00079e6dd89c652bcbdb764db160cef84e6250926961a0b2295d04" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce5129146a76ca6139a19832c75ad408857a56bcd18cd2c684183b8eacd78d8" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "auto_impl", + "base64 0.22.1", + "derive_more", + "futures", + "futures-utils-wasm", + "parking_lot", + "serde", + "serde_json", + "thiserror 2.0.16", + "tokio", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2379d998f46d422ec8ef2b61603bc28cda931e5e267aea1ebe71f62da61d101" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest 0.12.23", + "serde_json", + "tower 0.5.2", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "041aa5db2e907692a9a93a0a908057665c03e59364e1fbbeed613511a0159289" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6d44395e6793566e9c89bd82297cc4b0566655c1e78a1d69362640814784cc6" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http 1.3.1", + "rustls 0.23.31", + "serde_json", + "tokio", + "tokio-tungstenite 0.26.2", + "tracing", + "ws_stream_wasm", +] + +[[package]] +name = "alloy-trie" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3412d52bb97c6c6cc27ccc28d4e6e8cf605469101193b50b0bd5813b1f990b5" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[package]] +name = "alloy-tx-macros" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5becb9c269a7d05a2f28d549f86df5a5dbc923e2667eff84fdecac8cda534c" +dependencies = [ + "alloy-primitives", + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "ambient-authority" version = "0.0.2" @@ -113,87 +860,220 @@ dependencies = [ ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + +[[package]] +name = "anyhow" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "arc-swap" +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", + "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 = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +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 = "android_system_properties" -version = "0.1.5" +name = "ark-ff-asm" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" dependencies = [ - "libc", + "quote", + "syn 1.0.109", ] [[package]] -name = "anstream" -version = "0.6.20" +name = "ark-ff-asm" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", + "quote", + "syn 1.0.109", ] [[package]] -name = "anstyle" -version = "1.0.11" +name = "ark-ff-macros" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] [[package]] -name = "anstyle-parse" -version = "0.2.7" +name = "ark-ff-macros" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "utf8parse", + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "anstyle-query" -version = "1.1.4" +name = "ark-serialize" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" dependencies = [ - "windows-sys 0.60.2", + "ark-std 0.3.0", + "digest 0.9.0", ] [[package]] -name = "anstyle-wincon" -version = "3.0.10" +name = "ark-serialize" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.60.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", ] [[package]] -name = "anyhow" -version = "1.0.99" +name = "ark-std" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] [[package]] -name = "arbitrary" -version = "1.4.2" +name = "ark-std" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] [[package]] -name = "arc-swap" -version = "1.7.1" +name = "arrayvec" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] [[package]] name = "asn1-rs" @@ -434,6 +1314,17 @@ dependencies = [ "syn 2.0.106", ] +[[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 = "atoi" version = "2.0.0" @@ -460,6 +1351,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -605,7 +1507,7 @@ dependencies = [ "http 0.2.12", "http 1.3.1", "http-body 0.4.6", - "lru", + "lru 0.12.5", "percent-encoding", "regex-lite", "sha2", @@ -1024,6 +1926,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base58" version = "0.2.0" @@ -1082,6 +1990,12 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + [[package]] name = "binary-layout" version = "3.3.0" @@ -1121,18 +2035,39 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43d193de1f7487df1914d3a568b772458861d33f9c54249612cc2893d6915054" dependencies = [ - "bitcoin_hashes", + "bitcoin_hashes 0.13.0", "rand_core 0.6.4", "serde", "unicode-normalization", ] +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitcoin-internals" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + [[package]] name = "bitcoin_hashes" version = "0.13.0" @@ -1140,7 +2075,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" dependencies = [ "bitcoin-internals", - "hex-conservative", + "hex-conservative 0.1.2", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative 0.2.1", ] [[package]] @@ -1158,6 +2103,18 @@ dependencies = [ "serde", ] +[[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 = "blake2" version = "0.9.2" @@ -1262,6 +2219,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + [[package]] name = "bytemuck" version = "1.23.2" @@ -1279,6 +2242,9 @@ name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] [[package]] name = "bytes-utils" @@ -1290,6 +2256,21 @@ dependencies = [ "either", ] +[[package]] +name = "c-kzg" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + [[package]] name = "cap-fs-ext" version = "3.4.4" @@ -1637,12 +2618,45 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "const-hex" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dccd746bf9b1038c0507b7cec21eb2b11222db96a2902c96e8c185d6d20fb9c4" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "cookie-factory" version = "0.3.3" @@ -1961,8 +2975,10 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ + "generic-array", "rand_core 0.6.4", "subtle", + "zeroize", ] [[package]] @@ -2038,6 +3054,16 @@ dependencies = [ "darling_macro 0.20.11", ] +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + [[package]] name = "darling_core" version = "0.13.4" @@ -2066,6 +3092,21 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "serde", + "strsim 0.11.1", + "syn 2.0.106", +] + [[package]] name = "darling_macro" version = "0.13.4" @@ -2088,6 +3129,31 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.106", +] + +[[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.9.0" @@ -2141,24 +3207,56 @@ dependencies = [ ] [[package]] -name = "der_derive" -version = "0.7.3" +name = "der_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "derive_more-impl", ] [[package]] -name = "deranged" -version = "0.4.0" +name = "derive_more-impl" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ - "powerfmt", - "serde", + "proc-macro2", + "quote", + "syn 2.0.106", + "unicode-xid", ] [[package]] @@ -2260,6 +3358,12 @@ 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 = "dotenvy" version = "0.15.7" @@ -2285,11 +3389,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ "der 0.6.1", - "elliptic-curve", - "rfc6979", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", "signature 1.6.4", ] +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der 0.7.10", + "digest 0.10.7", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "serdect", + "signature 2.2.0", + "spki 0.7.3", +] + [[package]] name = "ed25519" version = "2.2.3" @@ -2360,16 +3479,36 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ - "base16ct", + "base16ct 0.1.1", "crypto-bigint 0.4.9", "der 0.6.1", "digest 0.10.7", - "ff", + "ff 0.12.1", "generic-array", - "group", + "group 0.12.1", "pkcs8 0.9.0", "rand_core 0.6.4", - "sec1", + "sec1 0.3.0", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.5", + "digest 0.10.7", + "ff 0.13.1", + "generic-array", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.3", + "serdect", "subtle", "zeroize", ] @@ -2587,6 +3726,28 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[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 = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "fd-lock" version = "4.0.4" @@ -2608,6 +3769,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" @@ -2648,6 +3819,18 @@ dependencies = [ "typenum", ] +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fixedbitset" version = "0.5.7" @@ -2735,6 +3918,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.31" @@ -2863,6 +4052,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" @@ -2929,6 +4124,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -3089,7 +4285,18 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ - "ff", + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.1", "rand_core 0.6.4", "subtle", ] @@ -3162,6 +4369,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -3221,6 +4434,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hex-conservative" @@ -3228,6 +4444,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hkdf" version = "0.12.4" @@ -3635,6 +4860,26 @@ dependencies = [ "icu_properties", ] +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -3689,6 +4934,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "interprocess" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + [[package]] name = "inventory" version = "0.3.21" @@ -3775,6 +5035,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[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.12.1" @@ -3873,6 +5142,20 @@ dependencies = [ "rayon", ] +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "once_cell", + "serdect", + "sha2", +] + [[package]] name = "kafka" version = "0.10.0" @@ -3892,6 +5175,25 @@ dependencies = [ "twox-hash", ] +[[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 = "kes-summed-ed25519" version = "0.2.1" @@ -4054,6 +5356,15 @@ dependencies = [ "hashbrown 0.15.5", ] +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "mach2" version = "0.4.3" @@ -4063,6 +5374,17 @@ dependencies = [ "libc", ] +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "manyhow" version = "0.11.4" @@ -4535,12 +5857,47 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "number_prefix" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" +[[package]] +name = "nybbles" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63cb50036b1ad148038105af40aaa70ff24d8a14fbc44ae5c914e1348533d12e" +dependencies = [ + "alloy-rlp", + "cfg-if", + "proptest", + "ruint", + "serde", + "smallvec", +] + [[package]] name = "object" version = "0.36.7" @@ -4638,6 +5995,7 @@ dependencies = [ name = "oura" version = "2.0.0" dependencies = [ + "alloy", "anyhow", "async-trait", "aws-config", @@ -4686,10 +6044,10 @@ dependencies = [ "tempfile", "thiserror 1.0.69", "tokio", - "tokio-tungstenite", + "tokio-tungstenite 0.24.0", "tracing", "tracing-subscriber", - "tungstenite", + "tungstenite 0.24.0", "unicode-truncate", "utxorpc", "zmq", @@ -4741,8 +6099,8 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ - "ecdsa", - "elliptic-curve", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", "sha2", ] @@ -5048,6 +6406,34 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "parking" version = "2.2.1" @@ -5215,6 +6601,16 @@ dependencies = [ "indexmap 2.11.0", ] +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -5428,6 +6824,17 @@ dependencies = [ "syn 2.0.106", ] +[[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.3.0" @@ -5461,6 +6868,28 @@ 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.106", +] + [[package]] name = "proc-macro-utils" version = "0.10.0" @@ -5499,6 +6928,26 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "proptest" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.9.3", + "lazy_static", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax 0.8.6", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.13.5" @@ -5594,6 +7043,12 @@ dependencies = [ "wasmtime-math", ] +[[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.40" @@ -5609,6 +7064,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[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" @@ -5618,6 +7079,7 @@ dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", + "serde", ] [[package]] @@ -5628,6 +7090,7 @@ checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", + "serde", ] [[package]] @@ -5672,6 +7135,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.3", + "serde", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", ] [[package]] @@ -5714,6 +7187,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 = "redis" version = "0.27.6" @@ -5940,6 +7419,16 @@ dependencies = [ "zeroize", ] +[[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" @@ -5969,6 +7458,16 @@ dependencies = [ "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 = "rmp" version = "0.8.14" @@ -6023,6 +7522,39 @@ dependencies = [ "libm", ] +[[package]] +name = "ruint" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecb38f82477f20c5c3d62ef52d7c4e536e38ea9b73fb570a20c5cae0e14bcf6" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.2", + "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.26" @@ -6041,6 +7573,12 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[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.2.3" @@ -6050,6 +7588,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" @@ -6263,6 +7810,18 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[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.20" @@ -6353,7 +7912,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ - "base16ct", + "base16ct 0.1.1", "der 0.6.1", "generic-array", "pkcs8 0.9.0", @@ -6361,6 +7920,42 @@ dependencies = [ "zeroize", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.10", + "generic-array", + "pkcs8 0.10.2", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes 0.14.0", + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -6403,7 +7998,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.3", ] [[package]] @@ -6421,6 +8025,21 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +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.219" @@ -6587,6 +8206,16 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct 0.2.0", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -6615,6 +8244,26 @@ dependencies = [ "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" @@ -7132,6 +8781,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b198d366dbec045acfcd97295eb653a7a2b40e4dc764ef1e79aafcad439d3c" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -7401,6 +9062,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 = "tinystr" version = "0.8.1" @@ -7517,6 +9187,7 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", ] [[package]] @@ -7528,7 +9199,23 @@ dependencies = [ "futures-util", "log", "tokio", - "tungstenite", + "tungstenite 0.24.0", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "rustls 0.23.31", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.2", + "tungstenite 0.26.2", + "webpki-roots 0.26.11", ] [[package]] @@ -7830,6 +9517,25 @@ dependencies = [ "utf-8", ] +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http 1.3.1", + "httparse", + "log", + "rand 0.9.2", + "rustls 0.23.31", + "rustls-pki-types", + "sha1", + "thiserror 2.0.16", + "utf-8", +] + [[package]] name = "twox-hash" version = "1.6.3" @@ -7883,6 +9589,24 @@ 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 = "unicase" version = "2.8.1" @@ -8115,6 +9839,15 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "waker-fn" version = "1.2.0" @@ -8580,6 +10313,20 @@ dependencies = [ "wit-parser", ] +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "wast" version = "35.0.2" @@ -8681,6 +10428,12 @@ dependencies = [ "wasite", ] +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + [[package]] name = "wiggle" version = "30.0.2" @@ -9139,6 +10892,34 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "ws_stream_wasm" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper", + "thiserror 2.0.16", + "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 = "x509-cert" version = "0.2.5" diff --git a/Cargo.toml b/Cargo.toml index 5fbd9972..9b30efe2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ zeromq = ["zmq"] u5c = ["utxorpc", "futures"] mithril = ["mithril-client"] hydra = ["tungstenite", "tokio-tungstenite", "futures-util", "bytes"] +eth = ["futures-util"] # elasticsearch = auto feature flag # kafka = auto feature flag @@ -83,6 +84,9 @@ futures-util = { version = "0.3", optional = true } bytes = { version = "1.7.2", optional = true } zmq = { version = "0.10.0", optional = true } +# TODO(p): add feature +alloy = { version = "1.0.30", features = ["full"] } + [dev-dependencies] goldenfile = "1.7.3" tempfile = "3.4" diff --git a/src/bin/oura/dump.rs b/src/bin/oura/dump.rs index e4633769..38085492 100644 --- a/src/bin/oura/dump.rs +++ b/src/bin/oura/dump.rs @@ -2,7 +2,7 @@ use clap::{Parser, ValueEnum}; use oura::{ daemon::{run_daemon, ConfigRoot}, filters, - framework::{ChainConfig, Error, IntersectConfig}, + framework::{cardano, Chain, Error, IntersectConfig}, sinks, sources, }; use tracing::{info, Level}; @@ -19,7 +19,7 @@ pub fn run(args: &Args) -> Result<(), Error> { .with(env_filter) .init(); - let chain = args.magic.clone().unwrap_or_default().into(); + let chain = Chain::Cardano(args.magic.clone().unwrap_or_default().into()); let intersect = parse_since(args.since.clone())?; let bearer = args.bearer.clone().unwrap_or_default(); let source = match bearer { @@ -95,7 +95,7 @@ pub struct Args { bearer: Option, #[arg(long)] - magic: Option, + magic: Option, /// point in the chain to start reading from, expects format `slot,hex-hash` #[arg(long)] @@ -115,20 +115,21 @@ enum Bearer { } #[derive(ValueEnum, Clone, Default)] -enum Chain { +enum DumpChain { #[default] Mainnet, Testnet, PreProd, Preview, } -impl From for ChainConfig { - fn from(value: Chain) -> Self { +// TODO(p): add support multchain +impl From for cardano::ChainConfig { + fn from(value: DumpChain) -> Self { match value { - Chain::Mainnet => ChainConfig::Mainnet, - Chain::Testnet => ChainConfig::Testnet, - Chain::PreProd => ChainConfig::PreProd, - Chain::Preview => ChainConfig::Preview, + DumpChain::Mainnet => cardano::ChainConfig::Mainnet, + DumpChain::Testnet => cardano::ChainConfig::Testnet, + DumpChain::PreProd => cardano::ChainConfig::PreProd, + DumpChain::Preview => cardano::ChainConfig::Preview, } } } diff --git a/src/bin/oura/watch.rs b/src/bin/oura/watch.rs index ccfccb68..9b9c8c1e 100644 --- a/src/bin/oura/watch.rs +++ b/src/bin/oura/watch.rs @@ -2,7 +2,7 @@ use clap::{Parser, ValueEnum}; use oura::{ daemon::{run_daemon, ConfigRoot}, filters, - framework::{ChainConfig, Error, IntersectConfig}, + framework::{cardano, Chain, Error, IntersectConfig}, sinks, sources, }; use tracing::{info, Level}; @@ -19,7 +19,7 @@ pub fn run(args: &Args) -> Result<(), Error> { .with(env_filter) .init(); - let chain = args.magic.clone().unwrap_or_default().into(); + let chain = Chain::Cardano(args.magic.clone().unwrap_or_default().into()); let intersect = parse_since(args.since.clone())?; let bearer = args.bearer.clone().unwrap_or_default(); let source = match bearer { @@ -92,7 +92,7 @@ pub struct Args { bearer: Option, #[arg(long)] - magic: Option, + magic: Option, /// point in the chain to start reading from, expects format `slot,hex-hash` #[arg(long)] @@ -116,20 +116,20 @@ pub enum Bearer { } #[derive(ValueEnum, Clone, Default)] -pub enum Chain { +pub enum WatchChain { #[default] Mainnet, Testnet, PreProd, Preview, } -impl From for ChainConfig { - fn from(value: Chain) -> Self { +impl From for cardano::ChainConfig { + fn from(value: WatchChain) -> Self { match value { - Chain::Mainnet => ChainConfig::Mainnet, - Chain::Testnet => ChainConfig::Testnet, - Chain::PreProd => ChainConfig::PreProd, - Chain::Preview => ChainConfig::Preview, + WatchChain::Mainnet => cardano::ChainConfig::Mainnet, + WatchChain::Testnet => cardano::ChainConfig::Testnet, + WatchChain::PreProd => cardano::ChainConfig::PreProd, + WatchChain::Preview => cardano::ChainConfig::Preview, } } } diff --git a/src/daemon/mod.rs b/src/daemon/mod.rs index 57616749..9752e4b8 100644 --- a/src/daemon/mod.rs +++ b/src/daemon/mod.rs @@ -16,7 +16,7 @@ pub struct ConfigRoot { pub sink: sinks::Config, pub intersect: IntersectConfig, pub finalize: Option, - pub chain: Option, + pub chain: Option, pub retries: Option, pub cursor: Option, pub metrics: Option, diff --git a/src/filters/into_json.rs b/src/filters/into_json.rs index d688af1a..107395c4 100644 --- a/src/filters/into_json.rs +++ b/src/filters/into_json.rs @@ -26,7 +26,11 @@ impl From<&Stage> for Worker { } gasket::impl_mapper!(|_worker: Worker, stage: Stage, unit: ChainEvent| => { - let out = unit.clone().map_record(|r| Record::GenericJson(JsonValue::from(r))); + let out = unit.clone().map_record(|r| match r { + Record::Cardano(record) => Record::GenericJson(JsonValue::from(record)), + x => x, + }); + stage.ops_count.inc(1); out }); diff --git a/src/filters/legacy_v1/cip15.rs b/src/filters/legacy_v1/cip15.rs index e5ada478..84ed64a0 100644 --- a/src/filters/legacy_v1/cip15.rs +++ b/src/filters/legacy_v1/cip15.rs @@ -4,7 +4,7 @@ use serde_json::Value as JsonValue; use pallas::ledger::primitives::alonzo::Metadatum; use super::EventWriter; -use crate::framework::legacy_v1::*; +use crate::framework::cardano::legacy_v1::*; fn extract_json_property<'a>(json: &'a JsonValue, key: &str) -> Option<&'a JsonValue> { json.as_object().and_then(|x| x.get(key)) diff --git a/src/filters/legacy_v1/cip25.rs b/src/filters/legacy_v1/cip25.rs index 0cb86492..51d4d169 100644 --- a/src/filters/legacy_v1/cip25.rs +++ b/src/filters/legacy_v1/cip25.rs @@ -3,7 +3,7 @@ use pallas::ledger::primitives::alonzo::Metadatum; use serde_json::Value as JsonValue; use tracing::warn; -use crate::framework::legacy_v1::CIP25AssetRecord; +use crate::framework::cardano::legacy_v1::CIP25AssetRecord; use super::EventWriter; diff --git a/src/filters/legacy_v1/crawl.rs b/src/filters/legacy_v1/crawl.rs index 69a6e304..929f8a11 100644 --- a/src/filters/legacy_v1/crawl.rs +++ b/src/filters/legacy_v1/crawl.rs @@ -3,7 +3,7 @@ use pallas::ledger::primitives::babbage::MintedDatumOption; use pallas::ledger::traverse::{MultiEraBlock, MultiEraInput, MultiEraOutput, MultiEraTx}; use pallas::network::miniprotocols::Point; -use crate::framework::legacy_v1::*; +use crate::framework::cardano::legacy_v1::*; use crate::framework::Error as OuraError; use super::EventWriter; diff --git a/src/filters/legacy_v1/map.rs b/src/filters/legacy_v1/map.rs index bfac5371..022f9746 100644 --- a/src/filters/legacy_v1/map.rs +++ b/src/filters/legacy_v1/map.rs @@ -21,7 +21,7 @@ use pallas::ledger::traverse::{ use pallas::network::miniprotocols::Point; use pallas::{codec::utils::KeepRaw, crypto::hash::Hash}; -use crate::framework::legacy_v1::*; +use crate::framework::cardano::legacy_v1::*; use super::EventWriter; diff --git a/src/filters/legacy_v1/mod.rs b/src/filters/legacy_v1/mod.rs index 13843ee2..b933c677 100644 --- a/src/filters/legacy_v1/mod.rs +++ b/src/filters/legacy_v1/mod.rs @@ -39,7 +39,7 @@ gasket::impl_splitter!(|_worker: Worker, stage: Stage, unit: ChainEvent| => { let mut buffer = Vec::new(); match unit { - ChainEvent::Apply(point, Record::CborBlock(cbor)) => { + ChainEvent::Apply(point, Record::Cardano(cardano::Record::CborBlock(cbor))) => { let mut writer = EventWriter::new( point.clone(), &stage.output, @@ -89,9 +89,13 @@ pub struct Config { impl Config { pub fn bootstrapper(self, ctx: &Context) -> Result { + let chain_config = match &ctx.chain { + Chain::Cardano(chain_config) => chain_config.clone(), + }; + let stage = Stage { config: self, - genesis: ctx.chain.clone().into(), + genesis: chain_config.into(), ops_count: Default::default(), input: Default::default(), output: Default::default(), diff --git a/src/filters/legacy_v1/prelude.rs b/src/filters/legacy_v1/prelude.rs index bdf2c5d7..11c4771a 100644 --- a/src/filters/legacy_v1/prelude.rs +++ b/src/filters/legacy_v1/prelude.rs @@ -1,4 +1,4 @@ -use crate::framework::legacy_v1::*; +use crate::framework::cardano::legacy_v1::*; use crate::framework::*; use gasket::framework::WorkerError; @@ -42,7 +42,10 @@ impl<'a> EventWriter<'a> { fingerprint: None, }; - let msg = ChainEvent::Apply(self.point.clone(), Record::OuraV1Event(evt)); + let msg = ChainEvent::Apply( + self.point.clone(), + Record::Cardano(cardano::Record::OuraV1Event(evt)), + ); self.buffer.push(msg); Ok(()) diff --git a/src/filters/parse_cbor.rs b/src/filters/parse_cbor.rs index 0908d48f..2d7ecda9 100644 --- a/src/filters/parse_cbor.rs +++ b/src/filters/parse_cbor.rs @@ -40,15 +40,15 @@ impl From<&Stage> for Worker { gasket::impl_mapper!(|_worker: Worker, stage: Stage, unit: ChainEvent| => { let output = unit.clone().try_map_record(|r| match r { - Record::CborBlock(cbor) => { + Record::Cardano(cardano::Record::CborBlock(cbor)) => { let block = trv::MultiEraBlock::decode(&cbor).or_panic()?; let block = stage.mapper.map_block(&block); - Ok(Record::ParsedBlock(block)) + Ok(Record::Cardano(cardano::Record::ParsedBlock(block))) } - Record::CborTx(cbor) => { + Record::Cardano(cardano::Record::CborTx(cbor)) => { let tx = trv::MultiEraTx::decode(&cbor).or_panic()?; let tx = stage.mapper.map_tx(&tx); - Ok(Record::ParsedTx(tx)) + Ok(Record::Cardano(cardano::Record::ParsedTx(tx))) } x => Ok(x), })?; diff --git a/src/filters/select/eval/mod.rs b/src/filters/select/eval/mod.rs index a450a4e9..7de3f053 100644 --- a/src/filters/select/eval/mod.rs +++ b/src/filters/select/eval/mod.rs @@ -605,10 +605,16 @@ fn eval_block(block: &ParsedBlock, predicate: &Predicate) -> MatchOutcome { pub fn eval(record: &Record, predicate: &Predicate) -> MatchOutcome { match record { - Record::ParsedTx(x) => eval_tx(x, predicate), - Record::ParsedBlock(x) => eval_block(x, predicate), + Record::Cardano(record) => match record { + cardano::Record::ParsedTx(x) => eval_tx(x, predicate), + cardano::Record::ParsedBlock(x) => eval_block(x, predicate), + _ => { + warn!("The select filter is valid only for ParsedTx / ParsedBlock records"); + MatchOutcome::Uncertain + } + }, _ => { - warn!("The select filter is valid only with ParsedTx & ParsedBlock records"); + warn!("The select filter is valid only for Cardano ParsedTx / ParsedBlock records"); MatchOutcome::Uncertain } } diff --git a/src/filters/split_block.rs b/src/filters/split_block.rs index f15cb166..6ec51c5f 100644 --- a/src/filters/split_block.rs +++ b/src/filters/split_block.rs @@ -45,10 +45,10 @@ impl From<&Stage> for Worker { gasket::impl_splitter!(|_worker: Worker, stage: Stage, unit: ChainEvent| => { let output = unit.clone().try_map_record_to_many(|r| match r { - Record::CborBlock(cbor) => { + Record::Cardano(cardano::Record::CborBlock(cbor)) => { let out = map_block_to_tx(Cow::Borrowed(&cbor))? .into_iter() - .map(|tx| Record::CborTx(tx.into())) + .map(|tx| Record::Cardano(cardano::Record::CborTx(tx.into()))) .collect(); Ok(out) diff --git a/src/filters/wasm_plugin.rs b/src/filters/wasm_plugin.rs index d18ce1c5..a6b8592a 100644 --- a/src/filters/wasm_plugin.rs +++ b/src/filters/wasm_plugin.rs @@ -5,6 +5,8 @@ use serde::Deserialize; use crate::framework::*; +pub type CardanoRecord = cardano::Record; + #[derive(Stage)] #[stage(name = "filter-wasm", unit = "ChainEvent", worker = "Worker")] pub struct Stage { @@ -18,23 +20,20 @@ pub struct Stage { } impl Stage { - fn map_record(&mut self, r: Record) -> Result, Error> { + fn map_cardano_record(&mut self, r: CardanoRecord) -> Result, Error> { let extism::convert::Json::(output) = match r { - Record::CborBlock(x) => self.plugin.call("map_cbor_block", x).unwrap(), - Record::CborTx(x) => self.plugin.call("map_cbor_tx", x).unwrap(), - Record::ParsedTx(x) => self + CardanoRecord::CborBlock(x) => self.plugin.call("map_cbor_block", x).unwrap(), + CardanoRecord::CborTx(x) => self.plugin.call("map_cbor_tx", x).unwrap(), + CardanoRecord::ParsedTx(x) => self .plugin .call("map_u5c_tx", extism::convert::Json(x)) .unwrap(), - Record::ParsedBlock(x) => self + CardanoRecord::ParsedBlock(x) => self .plugin .call("map_u5c_block", extism::convert::Json(x)) .unwrap(), - Record::GenericJson(x) => self - .plugin - .call("map_json", extism::convert::Json(x)) - .unwrap(), - Record::OuraV1Event(x) => self + + CardanoRecord::OuraV1Event(x) => self .plugin .call("map_json", extism::convert::Json(x)) .unwrap(), @@ -48,6 +47,13 @@ impl Stage { Ok(output) } + + fn map_record(&mut self, r: Record) -> Result, Error> { + match r { + Record::Cardano(x) => self.map_cardano_record(x), + x => Ok(vec![x]), + } + } } #[derive(Default)] diff --git a/src/framework/bitcoin/mod.rs b/src/framework/bitcoin/mod.rs new file mode 100644 index 00000000..538e88b5 --- /dev/null +++ b/src/framework/bitcoin/mod.rs @@ -0,0 +1,17 @@ +use serde_json::{json, Value as JsonValue}; + +#[derive(Debug, Clone)] +pub enum Record { + // Scaffold placeholder for now + ParsedBlock(()), + RawBlock(Vec), +} + +impl From for JsonValue { + fn from(value: Record) -> Self { + match value { + Record::ParsedBlock(x) => json!(x), + Record::RawBlock(x) => json!({ "hex": hex::encode(x) }), + } + } +} diff --git a/src/framework/legacy_v1.rs b/src/framework/cardano/legacy_v1.rs similarity index 100% rename from src/framework/legacy_v1.rs rename to src/framework/cardano/legacy_v1.rs diff --git a/src/framework/cardano/mod.rs b/src/framework/cardano/mod.rs new file mode 100644 index 00000000..efcdac6f --- /dev/null +++ b/src/framework/cardano/mod.rs @@ -0,0 +1,60 @@ +use serde::Deserialize; +use serde_json::{json, Value as JsonValue}; + +// we use UtxoRpc as our canonical representation of a parsed Tx +pub use pallas::interop::utxorpc::spec::cardano::Block as ParsedBlock; +pub use pallas::interop::utxorpc::spec::cardano::Tx as ParsedTx; + +// we use GenesisValues from Pallas as our ChainConfig +pub use pallas::ledger::traverse::wellknown::GenesisValues; + +pub mod legacy_v1; + +#[derive(Deserialize, Clone)] +#[serde(tag = "type", rename_all = "lowercase")] +pub enum ChainConfig { + Mainnet, + Testnet, + PreProd, + Preview, + Custom(GenesisValues), +} + +impl Default for ChainConfig { + fn default() -> Self { + Self::Mainnet + } +} + +impl From for GenesisValues { + fn from(other: ChainConfig) -> Self { + match other { + ChainConfig::Mainnet => GenesisValues::mainnet(), + ChainConfig::Testnet => GenesisValues::testnet(), + ChainConfig::PreProd => GenesisValues::preprod(), + ChainConfig::Preview => GenesisValues::preview(), + ChainConfig::Custom(x) => x, + } + } +} + +#[derive(Debug, Clone)] +pub enum Record { + CborBlock(Vec), + CborTx(Vec), + OuraV1Event(legacy_v1::Event), + ParsedTx(ParsedTx), + ParsedBlock(ParsedBlock), +} + +impl From for JsonValue { + fn from(value: Record) -> Self { + match value { + Record::CborBlock(x) => json!({ "hex": hex::encode(x) }), + Record::CborTx(x) => json!({ "hex": hex::encode(x) }), + Record::ParsedBlock(x) => json!(x), + Record::ParsedTx(x) => json!(x), + Record::OuraV1Event(x) => json!(x), + } + } +} diff --git a/src/framework/ethereum/mod.rs b/src/framework/ethereum/mod.rs new file mode 100644 index 00000000..ce60f288 --- /dev/null +++ b/src/framework/ethereum/mod.rs @@ -0,0 +1,17 @@ +use alloy::rpc::types::Block; +use serde_json::{json, Value as JsonValue}; + +#[derive(Debug, Clone)] +pub enum Record { + ParsedBlock(Box), + RawBlock(Vec), +} + +impl From for JsonValue { + fn from(value: Record) -> Self { + match value { + Record::ParsedBlock(x) => json!(x), + Record::RawBlock(x) => json!({ "hex": hex::encode(x) }), + } + } +} diff --git a/src/framework/mod.rs b/src/framework/mod.rs index 2598e8d8..7f6c686a 100644 --- a/src/framework/mod.rs +++ b/src/framework/mod.rs @@ -16,8 +16,12 @@ pub use pallas::interop::utxorpc::spec::cardano::Tx as ParsedTx; // we use GenesisValues from Pallas as our ChainConfig pub use pallas::ledger::traverse::wellknown::GenesisValues; +pub mod bitcoin; +pub mod cardano; +pub mod ethereum; +pub mod substrate; + pub mod errors; -pub mod legacy_v1; pub use errors::*; @@ -66,64 +70,44 @@ impl Breadcrumbs { } #[derive(Deserialize, Clone)] -#[serde(tag = "type", rename_all = "lowercase")] -pub enum ChainConfig { - Mainnet, - Testnet, - PreProd, - Preview, - Custom(GenesisValues), +pub enum Chain { + Cardano(cardano::ChainConfig), } - -impl Default for ChainConfig { +impl Default for Chain { fn default() -> Self { - Self::Mainnet - } -} - -impl From for GenesisValues { - fn from(other: ChainConfig) -> Self { - match other { - ChainConfig::Mainnet => GenesisValues::mainnet(), - ChainConfig::Testnet => GenesisValues::testnet(), - ChainConfig::PreProd => GenesisValues::preprod(), - ChainConfig::Preview => GenesisValues::preview(), - ChainConfig::Custom(x) => x, - } + Self::Cardano(Default::default()) } } -pub struct Context { - pub chain: ChainConfig, - pub intersect: IntersectConfig, - pub finalize: Option, - pub current_dir: PathBuf, - pub breadcrumbs: Breadcrumbs, -} - +#[allow(clippy::large_enum_variant)] #[derive(Debug, Clone)] pub enum Record { - CborBlock(Vec), - CborTx(Vec), GenericJson(JsonValue), - OuraV1Event(legacy_v1::Event), - ParsedTx(ParsedTx), - ParsedBlock(ParsedBlock), + Cardano(cardano::Record), + Ethereum(ethereum::Record), + Bitcoin(bitcoin::Record), + Substrate(substrate::Record), } - impl From for JsonValue { fn from(value: Record) -> Self { match value { - Record::CborBlock(x) => json!({ "hex": hex::encode(x) }), - Record::CborTx(x) => json!({ "hex": hex::encode(x) }), - Record::ParsedBlock(x) => json!(x), - Record::ParsedTx(x) => json!(x), - Record::OuraV1Event(x) => json!(x), Record::GenericJson(x) => x, + Record::Cardano(record) => record.into(), + Record::Ethereum(record) => record.into(), + Record::Bitcoin(record) => record.into(), + Record::Substrate(record) => record.into(), } } } +pub struct Context { + pub chain: Chain, + pub intersect: IntersectConfig, + pub finalize: Option, + pub current_dir: PathBuf, + pub breadcrumbs: Breadcrumbs, +} + #[derive(Debug, Clone)] pub enum ChainEvent { Apply(Point, Record), diff --git a/src/framework/substrate/mod.rs b/src/framework/substrate/mod.rs new file mode 100644 index 00000000..e9a52c43 --- /dev/null +++ b/src/framework/substrate/mod.rs @@ -0,0 +1,17 @@ +use serde_json::{json, Value as JsonValue}; + +#[derive(Debug, Clone)] +pub enum Record { + /// Scaffold placeholder for now + ParsedBlock(()), + RawBlock(Vec), +} + +impl From for JsonValue { + fn from(value: Record) -> Self { + match value { + Record::ParsedBlock(x) => json!(x), + Record::RawBlock(x) => json!({ "hex": hex::encode(x) }), + } + } +} diff --git a/src/sinks/assert/checks.rs b/src/sinks/assert/checks.rs index f10c4de1..c88b1d4e 100644 --- a/src/sinks/assert/checks.rs +++ b/src/sinks/assert/checks.rs @@ -1,4 +1,4 @@ -use crate::framework::legacy_v1::{Era, EventData}; +use crate::framework::cardano::legacy_v1::{Era, EventData}; use super::prelude::*; diff --git a/src/sinks/assert/mod.rs b/src/sinks/assert/mod.rs index 8a296d99..d04508d6 100644 --- a/src/sinks/assert/mod.rs +++ b/src/sinks/assert/mod.rs @@ -2,6 +2,7 @@ use gasket::framework::*; use serde::Deserialize; use tracing::{debug, error, info, warn}; +use crate::framework::cardano::legacy_v1; use crate::framework::*; use self::checks::*; @@ -89,7 +90,7 @@ impl gasket::framework::Worker for Worker { } let event = match record.unwrap() { - Record::OuraV1Event(event) => Ok(event), + Record::Cardano(cardano::Record::OuraV1Event(event)) => Ok(event), _ => Err(Error::config(String::from("Only legacy_v1 events"))), } .or_panic()?; diff --git a/src/sinks/assert/prelude.rs b/src/sinks/assert/prelude.rs index 7fbae138..ffa24362 100644 --- a/src/sinks/assert/prelude.rs +++ b/src/sinks/assert/prelude.rs @@ -1,4 +1,4 @@ -use crate::framework::legacy_v1::{BlockRecord, Event}; +use crate::framework::cardano::legacy_v1::{BlockRecord, Event}; #[derive(Default, Debug, Clone)] pub(crate) struct State { diff --git a/src/sinks/aws_s3.rs b/src/sinks/aws_s3.rs index 8b5b2690..aa364f61 100644 --- a/src/sinks/aws_s3.rs +++ b/src/sinks/aws_s3.rs @@ -41,7 +41,7 @@ impl gasket::framework::Worker for Worker { } let cbor = match record.unwrap() { - Record::CborBlock(cbor) => Ok(cbor), + Record::Cardano(cardano::Record::CborBlock(cbor)) => Ok(cbor), _ => Err(Error::config(String::from("Invalid configuration daemon"))), } .or_panic()?; diff --git a/src/sinks/elasticsearch.rs b/src/sinks/elasticsearch.rs index d61b8d7c..bc03cf48 100644 --- a/src/sinks/elasticsearch.rs +++ b/src/sinks/elasticsearch.rs @@ -136,9 +136,11 @@ pub struct Config { impl Config { pub fn bootstrapper(self, ctx: &Context) -> Result { + let Chain::Cardano(chain_config) = &ctx.chain; + let stage = Stage { config: self, - genesis: ctx.chain.clone().into(), + genesis: chain_config.clone().into(), ops_count: Default::default(), latest_block: Default::default(), input: Default::default(), diff --git a/src/sinks/terminal/format.rs b/src/sinks/terminal/format.rs index 4aaf5091..9212fc9c 100644 --- a/src/sinks/terminal/format.rs +++ b/src/sinks/terminal/format.rs @@ -6,7 +6,7 @@ use pallas::network::miniprotocols::Point; use tracing::error; use unicode_truncate::UnicodeTruncateStr; -use crate::{framework::legacy_v1::*, framework::*}; +use crate::{framework::cardano::legacy_v1::*, framework::*}; pub struct LogLine { prefix: &'static str, @@ -31,69 +31,74 @@ impl LogLine { } pub fn handle( - source: &Record, + record: &Record, max_width: Option, adahandle_policy: &Option, ) -> LogLine { - match source { - Record::OuraV1Event(evt) => LogLine::handle_legacy_v1( - evt, - max_width, - adahandle_policy.as_deref().unwrap_or_default(), - ), - Record::CborBlock(cbor) => { - let mut log = LogLine::new("BLOCK", Color::Magenta); - log.max_width = max_width; + match record { + Record::Cardano(record) => match record { + cardano::Record::OuraV1Event(evt) => LogLine::handle_legacy_v1( + evt, + max_width, + adahandle_policy.as_deref().unwrap_or_default(), + ), + cardano::Record::CborBlock(cbor) => { + let mut log = LogLine::new("BLOCK", Color::Magenta); + log.max_width = max_width; - match trv::MultiEraBlock::decode(cbor) { - Ok(block) => { - let slot = block.slot(); - let hash = block.hash().to_string(); + match trv::MultiEraBlock::decode(cbor) { + Ok(block) => { + let slot = block.slot(); + let hash = block.hash().to_string(); - log.content = format!("slot: {slot}, hash: {hash}"); - log.block_num = Some(block.number()); + log.content = format!("slot: {slot}, hash: {hash}"); + log.block_num = Some(block.number()); + } + Err(error) => error!(?error), } - Err(error) => error!(?error), - } - log - } - Record::CborTx(cbor) => { - let mut log = LogLine::new("TX", Color::DarkBlue); - log.max_width = max_width; + log + } + cardano::Record::CborTx(cbor) => { + let mut log = LogLine::new("TX", Color::DarkBlue); + log.max_width = max_width; - match trv::MultiEraTx::decode(cbor) { - Ok(tx) => { - let hash = tx.hash().to_string(); - log.content = format!("hash: {hash}"); + match trv::MultiEraTx::decode(cbor) { + Ok(tx) => { + let hash = tx.hash().to_string(); + log.content = format!("hash: {hash}"); + } + Err(error) => error!(?error), } - Err(error) => error!(?error), + + log } + cardano::Record::ParsedBlock(block) => { + let mut log = LogLine::new("BLOCK", Color::Magenta); + log.max_width = max_width; - log - } - Record::ParsedBlock(block) => { - let mut log = LogLine::new("BLOCK", Color::Magenta); - log.max_width = max_width; + if let Some(header) = block.header.as_ref() { + let slot = header.slot; + let hash = hex::encode(header.hash.clone()); + log.content = format!("slot: {slot}, hash: {hash}"); + log.block_num = Some(header.height); + } - if let Some(header) = block.header.as_ref() { - let slot = header.slot; - let hash = hex::encode(header.hash.clone()); - log.content = format!("slot: {slot}, hash: {hash}"); - log.block_num = Some(header.height); + log } + cardano::Record::ParsedTx(tx) => { + let mut log = LogLine::new("TX", Color::DarkBlue); - log - } - Record::ParsedTx(tx) => { - let mut log = LogLine::new("TX", Color::DarkBlue); - - log.max_width = max_width; - let hash = hex::encode(tx.hash.clone()); - log.content = format!("hash: {hash}"); + log.max_width = max_width; + let hash = hex::encode(tx.hash.clone()); + log.content = format!("hash: {hash}"); - log - } + log + } + }, + Record::Ethereum(_record) => todo!(), + Record::Bitcoin(_record) => todo!(), + Record::Substrate(_record) => todo!(), Record::GenericJson(_json) => { todo!("GenericJson not implemented yet") } @@ -117,7 +122,7 @@ impl LogLine { } fn from_legacy_v1( - source: &legacy_v1::Event, + source: &cardano::legacy_v1::Event, prefix: &'static str, color: Color, max_width: Option, @@ -134,7 +139,7 @@ impl LogLine { } fn handle_legacy_v1( - source: &legacy_v1::Event, + source: &cardano::legacy_v1::Event, max_width: Option, adahandle_policy: &str, ) -> LogLine { diff --git a/src/sources/eth.rs b/src/sources/eth.rs new file mode 100644 index 00000000..14db67dd --- /dev/null +++ b/src/sources/eth.rs @@ -0,0 +1,101 @@ +use alloy::eips::BlockId; +use alloy::providers::fillers::{ + BlobGasFiller, ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, +}; +use alloy::providers::{Identity, Provider, ProviderBuilder, RootProvider, WsConnect}; +use alloy::pubsub::SubscriptionStream; +use alloy::rpc::types::Header; +use futures_util::stream::Take; +use futures_util::StreamExt; +use gasket::framework::*; +use serde::Deserialize; +use tracing::debug; + +use crate::framework::*; + +pub struct Worker { + stream: Take>, + provider: FillProvider< + JoinFill< + Identity, + JoinFill>>, + >, + RootProvider, + >, +} + +#[async_trait::async_trait(?Send)] +impl gasket::framework::Worker for Worker { + async fn bootstrap(stage: &Stage) -> Result { + debug!("connecting"); + + let ws = WsConnect::new(&stage.config.url); + let provider = ProviderBuilder::new().connect_ws(ws).await.or_panic()?; + + let subscription = provider.subscribe_blocks().await.or_panic()?; + + let stream = subscription.into_stream().take(2); + + Ok(Self { stream, provider }) + } + + async fn schedule(&mut self, _: &mut Stage) -> Result, WorkerError> { + if let Some(header) = self.stream.next().await { + return Ok(WorkSchedule::Unit(header)); + } + + Ok(WorkSchedule::Idle) + } + + async fn execute(&mut self, header: &Header, stage: &mut Stage) -> Result<(), WorkerError> { + debug!(hash = header.hash.to_string(), "chain sync roll forward"); + + let block_id = BlockId::hash(header.hash); + if let Some(block) = self.provider.get_block(block_id).await.or_retry()? { + let event = ChainEvent::Apply( + // TODO(p): add support multi chain Point + pallas::network::miniprotocols::Point::Origin, + Record::Ethereum(ethereum::Record::ParsedBlock(Box::new(block))), + ); + stage.output.send(event.into()).await.or_panic()?; + } + + Ok(()) + } +} + +#[derive(Stage)] +#[stage(name = "source-utxorpc", unit = "Header", worker = "Worker")] +pub struct Stage { + config: Config, + + pub output: SourceOutputPort, + + #[metric] + ops_count: gasket::metrics::Counter, + + #[metric] + chain_tip: gasket::metrics::Gauge, + + #[metric] + current_slot: gasket::metrics::Gauge, +} + +#[derive(Deserialize)] +pub struct Config { + pub url: String, +} + +impl Config { + pub fn bootstrapper(self, _ctx: &Context) -> Result { + let stage = Stage { + config: self, + output: Default::default(), + ops_count: Default::default(), + chain_tip: Default::default(), + current_slot: Default::default(), + }; + + Ok(stage) + } +} diff --git a/src/sources/hydra.rs b/src/sources/hydra.rs index 7a2a2d44..afe088ca 100644 --- a/src/sources/hydra.rs +++ b/src/sources/hydra.rs @@ -33,8 +33,8 @@ impl HydraMessage { /// As a first implementation, we'll treat the msg seq number /// as a slot number, and the head id as a block hash. /// - /// This means all points on the same chain will share the same block hash, but hopefully - /// this shouldn't matter. + /// This means all points on the same chain will share the same block hash, + /// but hopefully this shouldn't matter. fn pseudo_point(&self) -> Point { Point::Specific(self.seq, self.head_id_or_default()) } @@ -182,7 +182,8 @@ impl Worker { // Apply CborTx events for any txs if let HydraMessagePayload::TxValid { tx } = next.payload { - let evt = ChainEvent::Apply(point.clone(), Record::CborTx(tx)); + let evt = + ChainEvent::Apply(point.clone(), Record::Cardano(cardano::Record::CborTx(tx))); stage.output.send(evt.into()).await.or_panic()?; stage.ops_count.inc(1); diff --git a/src/sources/mithril.rs b/src/sources/mithril.rs index 70b5fac7..e2152502 100644 --- a/src/sources/mithril.rs +++ b/src/sources/mithril.rs @@ -315,7 +315,8 @@ impl gasket::framework::Worker for Worker { .collect(); for (point, block) in blocks { - let event = ChainEvent::Apply(point, Record::CborBlock(block)); + let event = + ChainEvent::Apply(point, Record::Cardano(cardano::Record::CborBlock(block))); stage.output.send(event.into()).await.or_panic()?; } } diff --git a/src/sources/mod.rs b/src/sources/mod.rs index 044590df..d31b448f 100644 --- a/src/sources/mod.rs +++ b/src/sources/mod.rs @@ -9,6 +9,9 @@ use crate::framework::*; pub mod n2c; pub mod n2n; +#[cfg(feature = "eth")] +pub mod eth; + #[cfg(feature = "hydra")] pub mod hydra; @@ -27,6 +30,9 @@ pub enum Bootstrapper { #[cfg(target_family = "unix")] N2C(n2c::Stage), + #[cfg(feature = "eth")] + Ethereum(eth::Stage), + #[cfg(feature = "hydra")] Hydra(hydra::Stage), @@ -48,6 +54,9 @@ impl Bootstrapper { #[cfg(target_family = "unix")] Bootstrapper::N2C(p) => &mut p.output, + #[cfg(feature = "eth")] + Bootstrapper::Ethereum(p) => &mut p.output, + #[cfg(feature = "hydra")] Bootstrapper::Hydra(p) => &mut p.output, @@ -69,6 +78,9 @@ impl Bootstrapper { #[cfg(target_family = "unix")] Bootstrapper::N2C(x) => gasket::runtime::spawn_stage(x, policy), + #[cfg(feature = "eth")] + Bootstrapper::Ethereum(x) => gasket::runtime::spawn_stage(x, policy), + #[cfg(feature = "hydra")] Bootstrapper::Hydra(x) => gasket::runtime::spawn_stage(x, policy), @@ -92,6 +104,9 @@ pub enum Config { #[cfg(target_family = "unix")] N2C(n2c::Config), + #[cfg(feature = "eth")] + Ethereum(eth::Config), + #[cfg(feature = "hydra")] Hydra(hydra::Config), @@ -113,6 +128,9 @@ impl Config { #[cfg(target_family = "unix")] Config::N2C(c) => Ok(Bootstrapper::N2C(c.bootstrapper(ctx)?)), + #[cfg(feature = "eth")] + Config::Ethereum(c) => Ok(Bootstrapper::Ethereum(c.bootstrapper(ctx)?)), + #[cfg(feature = "hydra")] Config::Hydra(c) => Ok(Bootstrapper::Hydra(c.bootstrapper(ctx)?)), diff --git a/src/sources/n2c.rs b/src/sources/n2c.rs index 81a97673..96798b5d 100644 --- a/src/sources/n2c.rs +++ b/src/sources/n2c.rs @@ -103,7 +103,10 @@ impl Worker { debug!(slot, %hash, "chain sync roll forward"); - let evt = ChainEvent::Apply(point.clone(), Record::CborBlock(cbor.to_vec())); + let evt = ChainEvent::Apply( + point.clone(), + Record::Cardano(cardano::Record::CborBlock(cbor.to_vec())), + ); stage.output.send(evt.into()).await.or_panic()?; @@ -200,10 +203,14 @@ pub struct Config { impl Config { pub fn bootstrapper(self, ctx: &Context) -> Result { + let chain_config = match &ctx.chain { + Chain::Cardano(chain_config) => chain_config.clone(), + }; + let stage = Stage { config: self, breadcrumbs: ctx.breadcrumbs.clone(), - chain: ctx.chain.clone().into(), + chain: chain_config.into(), intersect: ctx.intersect.clone(), output: Default::default(), ops_count: Default::default(), diff --git a/src/sources/n2n.rs b/src/sources/n2n.rs index b1ad7c93..ce5655e7 100644 --- a/src/sources/n2n.rs +++ b/src/sources/n2n.rs @@ -119,7 +119,7 @@ impl Worker { let evt = ChainEvent::Apply( pallas::network::miniprotocols::Point::Specific(slot, hash.to_vec()), - Record::CborBlock(block), + Record::Cardano(cardano::Record::CborBlock(block)), ); stage.output.send(evt.into()).await.or_panic()?; @@ -225,10 +225,14 @@ pub struct Config { impl Config { pub fn bootstrapper(self, ctx: &Context) -> Result { + let chain_config = match &ctx.chain { + Chain::Cardano(chain_config) => chain_config.clone(), + }; + let stage = Stage { config: self, breadcrumbs: ctx.breadcrumbs.clone(), - chain: ctx.chain.clone().into(), + chain: chain_config.into(), intersect: ctx.intersect.clone(), output: Default::default(), ops_count: Default::default(), diff --git a/src/sources/s3.rs b/src/sources/s3.rs index 4589c9e6..4ba06e5c 100644 --- a/src/sources/s3.rs +++ b/src/sources/s3.rs @@ -109,7 +109,10 @@ impl gasket::framework::Worker for Worker { let body = object.body.collect().await.or_retry()?; - let event = ChainEvent::Apply(point, Record::CborBlock(body.into_bytes().to_vec())); + let event = ChainEvent::Apply( + point, + Record::Cardano(cardano::Record::CborBlock(body.into_bytes().to_vec())), + ); stage.output.send(event.into()).await.or_panic()?; } diff --git a/src/sources/u5c.rs b/src/sources/u5c.rs index b6a5fa59..d4f0f9c0 100644 --- a/src/sources/u5c.rs +++ b/src/sources/u5c.rs @@ -32,9 +32,9 @@ impl Worker { let parsed = block.parsed.as_ref().ok_or(WorkerError::Panic)?; let record = if stage.config.use_parsed_blocks { - Record::ParsedBlock(parsed.clone()) + Record::Cardano(cardano::Record::ParsedBlock(parsed.clone())) } else { - Record::CborBlock(block.native.to_vec()) + Record::Cardano(cardano::Record::CborBlock(block.native.to_vec())) }; let point = parsed