diff --git a/Cargo.lock b/Cargo.lock index b1a9e74a..0829474a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -48,21 +48,21 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85805c194576017df6c11057504e1d60b36f3913f8e365945486931f6ee81e40" +checksum = "5e1e915a830ea2ee123c9d3886bfec3302a7ddcd73a973ab165ed45aca2e42c3" dependencies = [ "alloy-consensus", "alloy-contract", "alloy-core", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-genesis", "alloy-network", "alloy-provider", "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-signer", "alloy-signer-local", "alloy-transport", @@ -79,22 +79,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84e0378e959aa6a885897522080a990e80eb317f1e9a222a604492ea50e13096" dependencies = [ "alloy-primitives", - "alloy-rlp", "num_enum", - "serde", "strum 0.27.2", ] [[package]] name = "alloy-consensus" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dbe4e5e9107bf6854e7550b666ca654ff2027eabf8153913e2e31ac4b089779" +checksum = "83447eeb17816e172f1dfc0db1f9dc0b7c5d069bd1f7cecbecceb382bf931015" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-trie", "alloy-tx-macros", "auto_impl", @@ -105,7 +103,7 @@ dependencies = [ "k256", "once_cell", "rand 0.8.5", - "secp256k1", + "secp256k1 0.30.0", "serde", "serde_json", "serde_with", @@ -114,23 +112,23 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88fc7bbfb98cf5605a35aadf0ba43a7d9f1608d6f220d05e4fbd5144d3b0b625" +checksum = "5406343e306856dc2be762700e98a16904de45dee14a07f233e742ce68daff2f" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "serde", ] [[package]] name = "alloy-contract" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c16fa30b623e40a5b216da00f3b61870f5cbe863b59816ac1ecc2489515a40" +checksum = "3ae8b60d71b92824e095b4003ff01fd2bc923017b7568997c5f459240e83499c" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -152,9 +150,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d4087016b0896051dd3d03e0bedda2f4d4d1689af8addc8450288c63a9e5f68" +checksum = "62ddde5968de6044d67af107ad835bc0069a7ca245870b94c5958a7d8712b184" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -165,9 +163,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "369f5707b958927176265e8a58627fc6195e5dfa5c55689396e68b241b3a72e6" +checksum = "a475bb02d9cef2dbb99065c1664ab3fe1f9352e21d6d5ed3f02cdbfc06ed1abc" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -176,7 +174,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow", + "winnow 1.0.3", ] [[package]] @@ -231,39 +229,31 @@ dependencies = [ ] [[package]] -name = "alloy-eips" -version = "1.4.3" +name = "alloy-eip7928" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09535cbc646b0e0c6fcc12b7597eaed12cf86dff4c4fba9507a61e71b94f30eb" +checksum = "4d93ce7e41bcd2b9ee2c1d92c223c1be4a274d387538d6d3f956b768986ce451" dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", "alloy-primitives", "alloy-rlp", - "alloy-serde 1.4.3", - "auto_impl", - "c-kzg", - "derive_more", - "either", + "once_cell", "serde", - "serde_with", "thiserror 2.0.18", ] [[package]] name = "alloy-eips" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb4919fa34b268842f434bfafa9c09136ab7b1a87ce0dd40a61befa35b5408c" +checksum = "0dca4c89ace90684b4b77366d00631ed498c9af962079af2a5dbc593a0618a77" dependencies = [ "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", - "alloy-eip7928", + "alloy-eip7928 0.3.0", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "auto_impl", "borsh", "c-kzg", @@ -276,32 +266,31 @@ dependencies = [ [[package]] name = "alloy-evm" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f107d0e588e5d25fcf2db216390445d5804b875a22a419407ad0389b925bb4d" +checksum = "c1ceeea6dcbbcd4e546b27700763a6f6c3b3fee30054209884f521078b6fda4f" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-hardforks", "alloy-primitives", - "alloy-rpc-types-eth", "alloy-sol-types", "auto_impl", "derive_more", - "revm", + "revm 38.0.0", "thiserror 2.0.18", "tracing", ] [[package]] name = "alloy-genesis" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e111e22c1a2133e9ebfd9051ea0eaf63559594d2f50d43cbc6762fbb95fc3c2" +checksum = "ab0e0fe9e6d1120ad7bb9254c3fc2b9bc80a8df42a033fb626be6559c13d5153" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-trie", "borsh", "serde", @@ -323,9 +312,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dbe713da0c737d9e5e387b0ba790eb98b14dd207fe53eef50e19a5a8ec3dac" +checksum = "7c36c9d7f9021601b04bfef14a4b64849f6d73116a4e91e071d7fbfe10247901" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -335,9 +324,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b6af6f374c1eeef8ab8dc26232cd440db167322a4207a3debd3d1ee565ca47" +checksum = "ec0a82e56b1843bce483942d54fcadea92e676f1bde162e93c7d3b621fabc4e1" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -350,19 +339,19 @@ dependencies = [ [[package]] name = "alloy-network" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a3f5a7f3678b71d33fcc45b714fab8928dbc647d5aff2145e72032d5c849bb" +checksum = "a7db7b095b0b1db1d18ce7e91dcd2e82007f2d52bfb8125e6b64633a74a06bc3" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-any", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-signer", "alloy-sol-types", "async-trait", @@ -376,22 +365,22 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb50dc1fb0e0b2c8748d5bee1aa7acdd18f9e036311bc93a71d97be624030317" +checksum = "cd28d9bfd11729037d194f2b1d43db8642eb3f342032691f4ca96bb745479c3c" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", - "alloy-serde 2.0.0", + "alloy-serde", "serde", ] [[package]] name = "alloy-primitives" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3b431b4e72cd8bd0ec7a50b4be18e73dab74de0dba180eef171055e5d5926e" +checksum = "4885c1409b6936c4898e646ef58baf6ec54edaf6d8179f79df805a7b85b7cf3e" dependencies = [ "alloy-rlp", "bytes", @@ -400,7 +389,7 @@ dependencies = [ "derive_more", "foldhash 0.2.0", "getrandom 0.4.2", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "indexmap 2.13.0", "itoa", "k256", @@ -411,19 +400,20 @@ dependencies = [ "rapidhash", "ruint", "rustc-hash 2.1.1", + "secp256k1 0.31.1", "serde", - "sha3", + "sha3 0.11.0", ] [[package]] name = "alloy-provider" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ba5468f78c8893be2d68a7f2fda61753336e5653f006af19781001b5f99e6c" +checksum = "8955ab30418343de57b356de2ea60200f9fb8016a7ea3bc7f5c6176f01a8b1cf" dependencies = [ "alloy-chains", "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-json-rpc", "alloy-network", "alloy-network-primitives", @@ -463,9 +453,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffcefb5d3391a320eadb95d398e4135f8cc35c7bf29a6bdb357eadcfc5ee5638" +checksum = "7cd85cfea1fa8ebd20d3475e961fe3a3624c0eb4659ea137715c0c83c8aeaff0" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -507,9 +497,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222fd4efff0fb9a25184684742c44fe9fa9a16c4ab5bf97583e71c86598ef8f0" +checksum = "24f461f091dc8f657e73b5dea18fd63d5c7049720cd252f1eade4a7ebed6a7e1" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -533,9 +523,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "974df1e56405c27cb8242381f45d8b212ba9df5006046ccf704764a2a4634366" +checksum = "052c031d1f7c5611997056bbcb8814e5cbf20f7efeee8c3de690555172038cf2" dependencies = [ "alloy-primitives", "alloy-rpc-types-anvil", @@ -544,42 +534,42 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-rpc-types-trace", "alloy-rpc-types-txpool", - "alloy-serde 2.0.0", + "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-anvil" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06bc10b0dca4f5bfc3cd30ed46eab5d651b5bb2cd300d683bdcdf5d2bfe6e82c" +checksum = "2ff111a54268dc0bbd3b17f98571a7e27cc661dc081ad2999d91888647eb2e11" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-any" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949c0f16a94ae33cdb1139b8dbf9e34d7f26ebfe97962e2a4d620b5f65f48fe4" +checksum = "0a6561ed4759c974d9c144500a59e3fb8c1d87327a12900d5ce455c0cae6dcb6" dependencies = [ "alloy-consensus-any", "alloy-network-primitives", "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "serde", "serde_json", ] [[package]] name = "alloy-rpc-types-debug" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301249e3c9e43661cfd7ebbb4746a00af6ce1ef58b5c968451882cd60438417d" +checksum = "48b9ad6eee93dd35a9ec0a6c1c6b180892a900ee17a6ed6500921552dd71e846" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -590,15 +580,15 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e59bc947935732cae5b072753e5e034c0b70a8b031c2839f45e2659ba07df9ae" +checksum = "7eba59e1c069f168a01982f42a57797736923b76aa854194df4930be17867e1c" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "derive_more", "rand 0.8.5", "serde", @@ -607,17 +597,17 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc280a41931bd419af86e9e859dd9726b73313aaa2e479b33c0e344f4b892ddb" +checksum = "175a2a5b6017d7f61b5e4b800d21215fe8e94fe729d00828e13bb6d93dcf3492" dependencies = [ "alloy-consensus", "alloy-consensus-any", - "alloy-eips 2.0.0", + "alloy-eips", "alloy-network-primitives", "alloy-primitives", "alloy-rlp", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-sol-types", "itertools 0.14.0", "serde", @@ -628,13 +618,13 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede0458c51bef23620aa6bd01a0b4f608be7bcb61d98e91b8530208ae545f3c2" +checksum = "514b4b1ce3354f65067b4fc7eb75358e0f2ec8be3340c96dea65d6894f9ca435" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "serde", "serde_json", "thiserror 2.0.18", @@ -642,32 +632,21 @@ dependencies = [ [[package]] name = "alloy-rpc-types-txpool" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3f4df183248b57f3e0b99054b1b6786769d3fdff6d01a702234068140c8ba76" +checksum = "76e34a42ebb4a71ab0bfdebc6d2f3c7bf809f01edf154d08fed159d10d1ef1d4" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", - "serde", -] - -[[package]] -name = "alloy-serde" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed8531cae8d21ee1c6571d0995f8c9f0652a6ef6452fde369283edea6ab7138" -dependencies = [ - "alloy-primitives", + "alloy-serde", "serde", - "serde_json", ] [[package]] name = "alloy-serde" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4848831ff994c88b1c32b7df9c4c1c3eedea4b535bde5eb3c421ef0bdc5ac052" +checksum = "cc21a8772af7d78bba286726aa245bd2ff81cd9abe230afea2e91578996831c9" dependencies = [ "alloy-primitives", "serde", @@ -676,9 +655,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b8ad9890b212e224291024b1aecfeef72127d27a2f6eebc5e347c40275c4bf" +checksum = "8ffbce94c50dd9d4d1f83e044c5595bbd3ada981bd3057ce28b3a5470e77385d" dependencies = [ "alloy-primitives", "async-trait", @@ -691,9 +670,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c67d2372aada343130d41e249b59a3cef29b1678dcd3fd80f1c2c4d6b5318f2" +checksum = "e48366d2c42b8d95ef951101bafa28486590f21b7a1e68b6b2d069746557bbe3" dependencies = [ "alloy-consensus", "alloy-network", @@ -707,9 +686,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab81bab693da9bb79f7a95b64b394718259fdd7e41dceeced4cad57cb71c4f6a" +checksum = "840128ed2b2971d6d4668a553fe403a82683d3acc646c73e75887e7157408033" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -721,9 +700,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489f1620bb7e2483fb5819ed01ab6edc1d2f93939dce35a5695085a1afd1d699" +checksum = "63ec265e5d65d725175f6ca7711c970824c90ef9c0d1f1973711d4150ee612dd" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -733,16 +712,16 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "sha3", + "sha3 0.11.0", "syn 2.0.114", "syn-solidity", ] [[package]] name = "alloy-sol-macro-input" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56cef806ad22d4392c5fc83cf8f2089f988eb99c7067b4e0c6f1971fc1cca318" +checksum = "89bf01077f18650876cfa682eb1f949967b5cde03f1a51c955c469d2c9b4aa67" dependencies = [ "alloy-json-abi", "const-hex", @@ -758,19 +737,19 @@ dependencies = [ [[package]] name = "alloy-sol-type-parser" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" +checksum = "857b470ecdd2ed38beaf82ad1a38c516a8ff75266750f38b9eeed001d575241b" dependencies = [ "serde", - "winnow", + "winnow 1.0.3", ] [[package]] name = "alloy-sol-types" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64612d29379782a5dde6f4b6570d9c756d734d760c0c94c254d361e678a6591f" +checksum = "384cf252de0db2dec52821eac037a7f57e2aa33fe5b900ce6fe39973402341f1" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -780,9 +759,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b7b755e64ae6b5de0d762ed2c780e072167ea5e542076a559e00314352a0bf" +checksum = "86052fdcec72d37ca4aa4b66254601e7453c45a6e1c70aa4561033d002fb80cc" dependencies = [ "alloy-json-rpc", "auto_impl", @@ -803,9 +782,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a29980e69119444ed26b75e7ee5bed2043870f904a64318297e55800db686564" +checksum = "b273587487921274f4f5d0ef2c7ef36944dcbb75a4e2318e69eae822bd263f91" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -819,9 +798,9 @@ dependencies = [ [[package]] name = "alloy-transport-ipc" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b27802653330740c88c28394cdaf1d55190b15b48ef9b99a946f37c9cdb19fa" +checksum = "bfb89df168b24773ef603af14f2449c05a7d3f27d05d3eceaea6bf96cccae168" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -839,9 +818,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b71dc951db66795cfb52eef835f64cf15163bc93b656e061b457ce5ebff370" +checksum = "33e32e0b47d3b3bf5770b7c132090c614b008d307c5e1544f1925f5b7e9e9af6" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -874,9 +853,9 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "2.0.0" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8228b9236479ff16b03041b64b86c2bd4e53da1caa45d59b5868cd1571131e" +checksum = "01a0035943b75fe1e249f52e688492d7a1b1826bc2d19b8e1d5d3c24a2ad8f50" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -980,7 +959,7 @@ dependencies = [ "objc2-foundation", "parking_lot", "percent-encoding", - "windows-sys 0.60.2", + "windows-sys 0.59.0", "x11rb", ] @@ -1544,6 +1523,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + [[package]] name = "blst" version = "0.3.16" @@ -1956,7 +1944,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "proptest", "serde_core", ] @@ -2021,6 +2009,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc" version = "3.4.0" @@ -2083,12 +2080,6 @@ dependencies = [ "itertools 0.10.5", ] -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -2181,6 +2172,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + [[package]] name = "curve25519-dalek-ng" version = "4.1.1" @@ -2276,7 +2276,6 @@ dependencies = [ "lock_api", "once_cell", "parking_lot_core", - "serde", ] [[package]] @@ -2415,10 +2414,20 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid", - "crypto-common", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.0", + "crypto-common 0.2.2", +] + [[package]] name = "dispatch2" version = "0.3.1" @@ -2575,7 +2584,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2686,26 +2695,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "fixed-map" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ed19add84e8cb9e8cc5f7074de0324247149ffef0b851e215fb0edc50c229b" -dependencies = [ - "fixed-map-derive", -] - -[[package]] -name = "fixed-map-derive" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dc7a9cb3326bafb80642c5ce99b39a2c0702d4bfa8ee8a3e773791a6cbe2407" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "flate2" version = "1.1.8" @@ -3002,6 +2991,15 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash 0.2.0", "serde", "serde_core", ] @@ -3104,6 +3102,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "1.8.1" @@ -3456,7 +3463,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -3562,18 +3569,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonrpsee-types" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" -dependencies = [ - "http", - "serde", - "serde_json", - "thiserror 2.0.18", -] - [[package]] name = "k256" version = "0.13.4" @@ -3594,7 +3589,17 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", +] + +[[package]] +name = "keccak" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", ] [[package]] @@ -3738,9 +3743,9 @@ checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" [[package]] name = "macro-string" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +checksum = "59a9dbbfc75d2688ed057456ce8a3ee3f48d12eec09229f560f3643b9f275653" dependencies = [ "proc-macro2", "quote", @@ -3868,27 +3873,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "modular-bitfield" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2956e537fc68236d2aa048f55704f231cc93f1c4de42fe1ecb5bd7938061fc4a" -dependencies = [ - "modular-bitfield-impl", - "static_assertions", -] - -[[package]] -name = "modular-bitfield-impl" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b43b4fd69e3437618106f7754f34021b831a514f9e1a98ae863cabcd8d8dad" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "moxcms" version = "0.8.1" @@ -3905,6 +3889,15 @@ version = "6.6.666" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf5a574dadd7941adeaa71823ecba5e28331b8313fb2e1c6a5c7e5981ea53ad6" +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" +dependencies = [ + "serde", +] + [[package]] name = "notify" version = "8.2.0" @@ -3935,7 +3928,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -4150,10 +4143,6 @@ name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -dependencies = [ - "critical-section", - "portable-atomic", -] [[package]] name = "once_cell_polyfill" @@ -4742,7 +4731,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -5087,458 +5076,305 @@ dependencies = [ ] [[package]] -name = "reth-chainspec" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +name = "revm" +version = "38.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91202d39dbe8e8d10e9e8f2b76c30da68ecd1d25be69ba6d853ad0d03a3a398a" dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips 2.0.0", - "alloy-evm", - "alloy-genesis", - "alloy-primitives", - "alloy-trie", - "auto_impl", - "derive_more", - "reth-ethereum-forks", - "reth-network-peers", - "reth-primitives-traits", - "serde_json", + "revm-bytecode 10.0.0", + "revm-context 16.0.1", + "revm-context-interface 17.0.1", + "revm-database 13.0.1", + "revm-database-interface 11.0.1", + "revm-handler 18.1.0", + "revm-inspector 19.0.0", + "revm-interpreter 35.0.1", + "revm-precompile 34.0.0", + "revm-primitives 23.0.0", + "revm-state 11.0.1", ] [[package]] -name = "reth-codecs" -version = "0.3.0" +name = "revm" +version = "40.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a79b3247ae4fbb1d4d35ce83a11fc596428a4c6ea836c98a75a55340192578a4" +checksum = "823da6e5509bb8e5dcd91295870e494917a030ad506fc83301f3f08ad8b15b17" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.0", - "alloy-genesis", - "alloy-primitives", - "alloy-trie", - "bytes", - "modular-bitfield", - "reth-codecs-derive", - "reth-zstd-compressors", - "serde", + "revm-bytecode 11.0.1", + "revm-context 18.0.3", + "revm-context-interface 19.0.3", + "revm-database 15.0.2", + "revm-database-interface 12.1.1", + "revm-handler 20.0.3", + "revm-inspector 21.0.3", + "revm-interpreter 37.0.3", + "revm-precompile 36.0.3", + "revm-primitives 24.0.1", + "revm-state 12.0.1", ] [[package]] -name = "reth-codecs-derive" -version = "0.3.0" +name = "revm-bytecode" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5dbae40c272b8a1b4fcc08ee2d4e77d3b0ccdb187c1313f412a73ff54ff2a2" +checksum = "bdbb3a3d735efa94c91f2ef6bf20a35f99a77bc78f3e25bd758336901bdf9661" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", + "bitvec", + "revm-primitives 23.0.0", ] [[package]] -name = "reth-db-models" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +name = "revm-bytecode" +version = "11.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b378c2653331fe60969d9745e802cd773d82a20d8aaced914dfcf26ab8f0d9" dependencies = [ - "alloy-eips 2.0.0", - "alloy-primitives", - "reth-primitives-traits", + "bitvec", + "phf", + "revm-primitives 24.0.1", + "serde", ] [[package]] -name = "reth-ethereum-forks" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +name = "revm-context" +version = "16.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f68d928d8b228e0faeb1c6ed75c4fde7d124f1ddf9119b67e7a0ad4041237d" dependencies = [ - "alloy-eip2124", - "alloy-hardforks", - "alloy-primitives", - "auto_impl", - "once_cell", + "bitvec", + "cfg-if", + "derive-where", + "revm-bytecode 10.0.0", + "revm-context-interface 17.0.1", + "revm-database-interface 11.0.1", + "revm-primitives 23.0.0", + "revm-state 11.0.1", ] [[package]] -name = "reth-ethereum-primitives" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +name = "revm-context" +version = "18.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafa298114f3cab706945de14c04e73e6e6d7896302e4183dae273f968e52f80" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.0", - "alloy-primitives", - "alloy-rpc-types-eth", - "reth-codecs", - "reth-primitives-traits", + "bitvec", + "cfg-if", + "derive-where", + "revm-bytecode 11.0.1", + "revm-context-interface 19.0.3", + "revm-database-interface 12.1.1", + "revm-primitives 24.0.1", + "revm-state 12.0.1", "serde", ] [[package]] -name = "reth-evm" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +name = "revm-context-interface" +version = "17.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3758e6167c4ba7a59a689c519a047edaefcd4c37d74f279b93ed87bc8aece4" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.0", - "alloy-evm", - "alloy-primitives", + "alloy-eip2930", + "alloy-eip7702", "auto_impl", - "derive_more", - "futures-util", - "reth-execution-errors", - "reth-execution-types", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", - "revm", + "either", + "revm-database-interface 11.0.1", + "revm-primitives 23.0.0", + "revm-state 11.0.1", ] [[package]] -name = "reth-execution-errors" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +name = "revm-context-interface" +version = "19.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db9c13f1dfc79425931fd184b6bd373dfac7baba50859b01107d5c0e20549cbb" dependencies = [ - "alloy-evm", - "alloy-primitives", - "alloy-rlp", - "nybbles", - "reth-storage-errors", - "thiserror 2.0.18", -] - -[[package]] -name = "reth-execution-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" -dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.0", - "alloy-evm", - "alloy-primitives", - "derive_more", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-trie-common", - "revm", + "alloy-eip2930", + "alloy-eip7702", + "auto_impl", + "either", + "revm-database-interface 12.1.1", + "revm-primitives 24.0.1", + "revm-state 12.0.1", + "serde", ] [[package]] -name = "reth-network-peers" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +name = "revm-database" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c281a1f11d3bcb8c0bba1199ed6bcb001d1aeb3d4fb366819e14f88723989a4e" dependencies = [ - "alloy-primitives", - "alloy-rlp", - "serde_with", - "thiserror 2.0.18", - "url", + "revm-bytecode 10.0.0", + "revm-database-interface 11.0.1", + "revm-primitives 23.0.0", + "revm-state 11.0.1", ] [[package]] -name = "reth-primitives-traits" -version = "0.3.0" +name = "revm-database" +version = "15.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc759fd87c3f65440e5d3bfa3107fe8a13a61a6807cd485c62c49d63c7bf6717" +checksum = "a69c3ce73454a09ef89a66177239d7c4f5f697227ae27254c99451866603b19d" dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.0", - "alloy-genesis", - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-trie", - "bytes", - "dashmap", + "alloy-eips", "derive_more", - "once_cell", - "reth-codecs", - "revm-bytecode", - "revm-primitives", - "revm-state", - "secp256k1", + "revm-bytecode 11.0.1", + "revm-database-interface 12.1.1", + "revm-primitives 24.0.1", + "revm-state 12.0.1", "serde", - "thiserror 2.0.18", -] - -[[package]] -name = "reth-prune-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" -dependencies = [ - "alloy-primitives", - "derive_more", - "strum 0.27.2", - "thiserror 2.0.18", - "tracing", ] [[package]] -name = "reth-rpc-convert" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +name = "revm-database-interface" +version = "11.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89efb9832a4e3742bb4ded5f7fe5bf905e8860e69427d4dfec153484fc6d304" dependencies = [ - "alloy-consensus", - "alloy-evm", - "alloy-json-rpc", - "alloy-network", - "alloy-primitives", - "alloy-rpc-types-eth", "auto_impl", - "dyn-clone", - "jsonrpsee-types", - "reth-evm", - "reth-primitives-traits", - "reth-rpc-traits", + "either", + "revm-primitives 23.0.0", + "revm-state 11.0.1", "thiserror 2.0.18", ] [[package]] -name = "reth-rpc-traits" -version = "0.3.0" +name = "revm-database-interface" +version = "12.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b766da61ec7c46596386b4bc88d9b57d1939d3da2bc9e927567a8a23650e5ce9" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-signer", - "reth-primitives-traits", - "thiserror 2.0.18", -] - -[[package]] -name = "reth-stages-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" -dependencies = [ - "alloy-primitives", - "reth-trie-common", -] - -[[package]] -name = "reth-static-file-types" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" +checksum = "4a2656187f9f9c22ef9dd9300ed71aeaeca3506a6a0a229a07f264649b960d68" dependencies = [ - "alloy-primitives", - "derive_more", - "fixed-map", - "reth-stages-types", - "serde", - "strum 0.27.2", -] - -[[package]] -name = "reth-storage-api" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" -dependencies = [ - "alloy-consensus", - "alloy-eips 2.0.0", - "alloy-primitives", - "alloy-rpc-types-engine", "auto_impl", - "reth-chainspec", - "reth-db-models", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", - "revm-database", -] - -[[package]] -name = "reth-storage-errors" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" -dependencies = [ - "alloy-eips 2.0.0", - "alloy-primitives", - "alloy-rlp", - "derive_more", - "reth-codecs", - "reth-primitives-traits", - "reth-prune-types", - "reth-static-file-types", - "revm-database-interface", - "revm-state", + "either", + "revm-primitives 24.0.1", + "revm-state 12.0.1", + "serde", "thiserror 2.0.18", ] [[package]] -name = "reth-trie-common" -version = "2.0.0" -source = "git+https://github.com/paradigmxyz/reth?rev=0b33057#0b33057414c8815ed499e0aa837ae52d4d366150" -dependencies = [ - "alloy-consensus", - "alloy-primitives", - "alloy-rlp", - "alloy-trie", - "derive_more", - "itertools 0.14.0", - "nybbles", - "reth-primitives-traits", - "revm-database", -] - -[[package]] -name = "reth-zstd-compressors" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fa54c341d926ec9b0f7fc0c87f831aa4959de699e69caab1a0bfd914326c09" -dependencies = [ - "zstd", -] - -[[package]] -name = "revm" -version = "37.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11353f234577a63048066df974d8a56e8c090d4de8b5f7d5f2a0d0c3a1ffaa2d" -dependencies = [ - "revm-bytecode", - "revm-context", - "revm-context-interface", - "revm-database", - "revm-database-interface", - "revm-handler", - "revm-inspector", - "revm-interpreter", - "revm-precompile", - "revm-primitives", - "revm-state", -] - -[[package]] -name = "revm-bytecode" -version = "10.0.0" +name = "revm-handler" +version = "18.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbb3a3d735efa94c91f2ef6bf20a35f99a77bc78f3e25bd758336901bdf9661" +checksum = "783e903d6922b7f5f9a940d1bb229530502d2924b1aed9d5ca5a94ebf065d460" dependencies = [ - "bitvec", - "phf", - "revm-primitives", - "serde", + "auto_impl", + "derive-where", + "revm-bytecode 10.0.0", + "revm-context 16.0.1", + "revm-context-interface 17.0.1", + "revm-database-interface 11.0.1", + "revm-interpreter 35.0.1", + "revm-precompile 34.0.0", + "revm-primitives 23.0.0", + "revm-state 11.0.1", ] [[package]] -name = "revm-context" -version = "16.0.1" +name = "revm-handler" +version = "20.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f68d928d8b228e0faeb1c6ed75c4fde7d124f1ddf9119b67e7a0ad4041237d" +checksum = "3ce1d66037ca1394128313bb995fa9f50d834927a389386bb34f8f0ef914648f" dependencies = [ - "bitvec", - "cfg-if", + "auto_impl", "derive-where", - "revm-bytecode", - "revm-context-interface", - "revm-database-interface", - "revm-primitives", - "revm-state", + "revm-bytecode 11.0.1", + "revm-context 18.0.3", + "revm-context-interface 19.0.3", + "revm-database-interface 12.1.1", + "revm-interpreter 37.0.3", + "revm-precompile 36.0.3", + "revm-primitives 24.0.1", + "revm-state 12.0.1", "serde", ] [[package]] -name = "revm-context-interface" -version = "17.0.1" +name = "revm-inspector" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3758e6167c4ba7a59a689c519a047edaefcd4c37d74f279b93ed87bc8aece4" +checksum = "8216ad58422090d0daa9eb430e0a081f7ad07e7fd30681dee71f8420c99624e0" dependencies = [ - "alloy-eip2930", - "alloy-eip7702", "auto_impl", "either", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", + "revm-context 16.0.1", + "revm-database-interface 11.0.1", + "revm-handler 18.1.0", + "revm-interpreter 35.0.1", + "revm-primitives 23.0.0", + "revm-state 11.0.1", ] [[package]] -name = "revm-database" -version = "13.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c281a1f11d3bcb8c0bba1199ed6bcb001d1aeb3d4fb366819e14f88723989a4e" -dependencies = [ - "alloy-eips 1.4.3", - "revm-bytecode", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-database-interface" -version = "11.0.1" +name = "revm-inspector" +version = "21.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89efb9832a4e3742bb4ded5f7fe5bf905e8860e69427d4dfec153484fc6d304" +checksum = "9fe3635d3411e8318849546570ca0220e783443319e28f5397c9f80b05bf4344" dependencies = [ "auto_impl", "either", - "revm-primitives", - "revm-state", + "revm-context 18.0.3", + "revm-database-interface 12.1.1", + "revm-handler 20.0.3", + "revm-interpreter 37.0.3", + "revm-primitives 24.0.1", + "revm-state 12.0.1", "serde", - "thiserror 2.0.18", ] [[package]] -name = "revm-handler" -version = "18.0.0" +name = "revm-interpreter" +version = "35.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f18b03319aee860ecc4631c9180abb0828480f5a4c39507fc735a417bd906984" +checksum = "1ece9f41b69658c15d748288a4dbdfc06a63f3ce93d983af440de3f1631dce6a" dependencies = [ - "auto_impl", - "derive-where", - "revm-bytecode", - "revm-context", - "revm-context-interface", - "revm-database-interface", - "revm-interpreter", - "revm-precompile", - "revm-primitives", - "revm-state", - "serde", + "revm-bytecode 10.0.0", + "revm-context-interface 17.0.1", + "revm-primitives 23.0.0", + "revm-state 11.0.1", ] [[package]] -name = "revm-inspector" -version = "18.0.0" +name = "revm-interpreter" +version = "37.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33e8327376dff859eb18dea3623aa55ef5d580fe38fa0fd4bb92bd95ace60ad" +checksum = "bae56c57ddca1f5c4abd443f826f1b3e49a86a528e7e1ea0fc207cdc4671a37e" dependencies = [ - "auto_impl", - "either", - "revm-context", - "revm-database-interface", - "revm-handler", - "revm-interpreter", - "revm-primitives", - "revm-state", + "revm-bytecode 11.0.1", + "revm-context-interface 19.0.3", + "revm-primitives 24.0.1", + "revm-state 12.0.1", "serde", ] [[package]] -name = "revm-interpreter" -version = "35.0.0" +name = "revm-precompile" +version = "34.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5f438f47d40d9830c0498fa3ca16a447b3148ab7b78742cbb1b27a51a50963" +checksum = "a346a8cc6c8c39bd65306641c692191299c0a7b63d38810e39e8fe9b92378660" dependencies = [ - "revm-bytecode", - "revm-context-interface", - "revm-primitives", - "revm-state", - "serde", + "ark-bls12-381", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "arrayref", + "aurora-engine-modexp", + "cfg-if", + "k256", + "p256", + "revm-context-interface 17.0.1", + "revm-primitives 23.0.0", + "ripemd", + "sha2 0.10.9", ] [[package]] name = "revm-precompile" -version = "33.0.0" +version = "36.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c07bfcc9361f7b23970a68cbd17bfe255e70182cfb1a8896d06832217fc5439" +checksum = "191db865091e07ecb80b12ce3048192c76071ca3d2b0a315b111b271cd4ced37" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -5550,8 +5386,8 @@ dependencies = [ "cfg-if", "k256", "p256", - "revm-context-interface", - "revm-primitives", + "revm-context-interface 19.0.3", + "revm-primitives 24.0.1", "ripemd", "sha2 0.10.9", ] @@ -5565,6 +5401,16 @@ dependencies = [ "alloy-primitives", "num_enum", "once_cell", +] + +[[package]] +name = "revm-primitives" +version = "24.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5102d804892908d4ebf68da29b8562895922dffa26c230ff2c4dadcf93916f" +dependencies = [ + "alloy-primitives", + "once_cell", "serde", ] @@ -5574,10 +5420,23 @@ version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c32490ed687dba31c3c882beb8c20408bdd30ef96690d8f145b0ee9a87040bfe" dependencies = [ - "alloy-eip7928", + "alloy-eip7928 0.3.0", "bitflags 2.10.0", - "revm-bytecode", - "revm-primitives", + "revm-bytecode 10.0.0", + "revm-primitives 23.0.0", +] + +[[package]] +name = "revm-state" +version = "12.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40eff6067185cf80932e06f6a9c8045b012ecb6f99a8d6edc618ec2792373e14" +dependencies = [ + "alloy-eip7928 0.4.1", + "bitflags 2.10.0", + "nonmax", + "revm-bytecode 11.0.1", + "revm-primitives 24.0.1", "serde", ] @@ -5766,7 +5625,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5824,7 +5683,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -5961,10 +5820,21 @@ checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", "rand 0.8.5", - "secp256k1-sys", + "secp256k1-sys 0.10.1", "serde", ] +[[package]] +name = "secp256k1" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" +dependencies = [ + "bitcoin_hashes", + "rand 0.9.2", + "secp256k1-sys 0.11.0", +] + [[package]] name = "secp256k1-sys" version = "0.10.1" @@ -5974,6 +5844,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb913707158fadaf0d8702c2db0e857de66eb003ccfdda5924b5f5ac98efb38" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "3.6.0" @@ -6188,7 +6067,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -6200,7 +6079,7 @@ checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.9.0", "opaque-debug", ] @@ -6212,7 +6091,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -6223,7 +6102,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ "digest 0.10.7", - "keccak", + "keccak 0.1.5", +] + +[[package]] +name = "sha3" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1" +dependencies = [ + "digest 0.11.3", + "keccak 0.2.0", ] [[package]] @@ -6506,9 +6395,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53f425ae0b12e2f5ae65542e00898d500d4d318b4baf09f40fd0d410454e9947" +checksum = "ec005042c7d952febc1a3ef5b0f6674e9054aa836877a31c90b20e25b3d31744" dependencies = [ "paste", "proc-macro2", @@ -6573,22 +6462,25 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.3", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] name = "tempo-alloy" -version = "1.6.0" -source = "git+https://github.com/tempoxyz/tempo#d58cf2e087511e5a9e329bbd2088ecddda0b3df8" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626a6c06f10c984050d9b434e9254eaeeb5211df9f17e3fb22ac2cc7e6f3e1a1" dependencies = [ "alloy-consensus", "alloy-contract", - "alloy-eips 2.0.0", + "alloy-eips", + "alloy-json-rpc", "alloy-network", "alloy-primitives", "alloy-provider", + "alloy-rpc-client", "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "alloy-signer-local", "alloy-sol-types", "alloy-transport", @@ -6596,19 +6488,24 @@ dependencies = [ "dashmap", "derive_more", "futures", + "http", + "reqwest 0.13.2", "serde", + "serde_json", "tempo-chainspec", "tempo-contracts", "tempo-primitives", + "tower", "tracing", ] [[package]] name = "tempo-chainspec" -version = "1.5.3" -source = "git+https://github.com/tempoxyz/tempo#d58cf2e087511e5a9e329bbd2088ecddda0b3df8" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b2528d06c6d0f5222589960ff6cde43c0d7028d78756574c7f256d0443cb1de" dependencies = [ - "alloy-eips 2.0.0", + "alloy-eips", "alloy-evm", "alloy-genesis", "alloy-hardforks", @@ -6622,8 +6519,9 @@ dependencies = [ [[package]] name = "tempo-contracts" -version = "1.6.0" -source = "git+https://github.com/tempoxyz/tempo#d58cf2e087511e5a9e329bbd2088ecddda0b3df8" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40fe2453626530970243c4161d31cc1431abe4551ad4ffdc8aa86b7c197b1c13" dependencies = [ "alloy-contract", "alloy-primitives", @@ -6633,26 +6531,21 @@ dependencies = [ [[package]] name = "tempo-primitives" -version = "1.6.0" -source = "git+https://github.com/tempoxyz/tempo#d58cf2e087511e5a9e329bbd2088ecddda0b3df8" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "632bc140391f38f10aa6c0aeb8adf36798db3c5f5f5241a4b950779d0b72ef2e" dependencies = [ "alloy-consensus", - "alloy-eips 2.0.0", - "alloy-network", + "alloy-eips", "alloy-primitives", "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde 2.0.0", + "alloy-serde", "base64", "derive_more", "ed25519-consensus", "once_cell", "p256", - "reth-codecs", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-rpc-convert", - "revm", + "revm 40.0.3", "serde", "serde_json", "sha2 0.10.9", @@ -6749,10 +6642,11 @@ dependencies = [ "serde", "serde_json", "serial_test", - "sha3", + "sha3 0.10.8", "sqlparser", "tempfile", "tempo-alloy", + "tempo-contracts", "tempo-primitives", "thiserror 2.0.18", "tokio", @@ -7008,7 +6902,7 @@ dependencies = [ "serde_spanned", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.14", ] [[package]] @@ -7020,7 +6914,7 @@ dependencies = [ "indexmap 2.13.0", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", - "winnow", + "winnow 0.7.14", ] [[package]] @@ -7029,7 +6923,7 @@ version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" dependencies = [ - "winnow", + "winnow 0.7.14", ] [[package]] @@ -7227,9 +7121,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -7645,7 +7539,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -7953,6 +7847,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen" version = "0.51.0" @@ -8224,34 +8127,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94f63c051f4fe3c1509da62131a678643c5b6fbdc9273b2b79d4378ebda003d2" -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "zune-core" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 5cccf60b..4d7a88cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,8 +34,9 @@ postgres-types = { version = "0.2", features = ["derive"] } # Ethereum/Tempo primitives alloy = { version = "2", features = ["full"] } -tempo-alloy = { git = "https://github.com/tempoxyz/tempo", default-features = false } -tempo-primitives = { git = "https://github.com/tempoxyz/tempo", package = "tempo-primitives", default-features = false, features = ["serde"] } +tempo-alloy = { version = "1.8.0", default-features = false } +tempo-contracts = { version = "1.8.0", default-features = false } +tempo-primitives = { version = "1.8.0", default-features = false, features = ["serde"] } # URL parsing form_urlencoded = "1" diff --git a/db/logs.sql b/db/logs.sql index 2f0072b3..bb52a79a 100644 --- a/db/logs.sql +++ b/db/logs.sql @@ -24,3 +24,14 @@ CREATE INDEX IF NOT EXISTS idx_logs_address_topic1 ON logs (topic1, address, blo DROP INDEX IF EXISTS idx_logs_topic1; CREATE INDEX IF NOT EXISTS idx_logs_topic2 ON logs (topic2); CREATE INDEX IF NOT EXISTS idx_logs_topic3 ON logs (topic3); + +CREATE INDEX IF NOT EXISTS idx_logs_tip403_policy_event_latest +ON logs (topic1, selector, block_num DESC, tx_idx DESC, log_idx DESC) +INCLUDE (topic2, topic3, data, block_timestamp) +WHERE address = '\x403c000000000000000000000000000000000000'::bytea; + +CREATE INDEX IF NOT EXISTS idx_logs_tip403_policy_member_latest +ON logs (topic1, selector, topic3, block_num DESC, tx_idx DESC, log_idx DESC) +INCLUDE (topic2, data) +WHERE address = '\x403c000000000000000000000000000000000000'::bytea + AND topic3 IS NOT NULL; diff --git a/src/api/mod.rs b/src/api/mod.rs index 6c50e16b..57e2a6bc 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -1,3 +1,4 @@ +mod tip403_registry; mod views; use std::collections::HashMap; @@ -211,6 +212,7 @@ fn build_router(state: AppState) -> Router<()> { "/query", get(handle_query).layer(ConcurrencyLimitLayer::new(MAX_CONCURRENT_API_QUERIES)), ) + .route("/policy-data", get(tip403_registry::get_policy_data)) .route("/views", get(views::list_views).post(views::create_view)) .route( "/views/{name}", diff --git a/src/api/tip403_registry.rs b/src/api/tip403_registry.rs new file mode 100644 index 00000000..ac55d9a5 --- /dev/null +++ b/src/api/tip403_registry.rs @@ -0,0 +1,458 @@ +use anyhow::{Result as AnyhowResult, anyhow}; +use axum::{Json, extract::Query, extract::State}; +use chrono::Utc; +use serde::{Deserialize, Serialize}; + +use alloy::{primitives::B256, sol_types::SolEvent}; +use tempo_contracts::precompiles::{ITIP403Registry, TIP403_REGISTRY_ADDRESS}; + +use super::{ApiError, AppState}; + +const DEFAULT_MEMBER_LIMIT: i64 = 100; +const MAX_MEMBER_LIMIT: i64 = 500; + +#[derive(Deserialize)] +pub struct PolicyDataParams { + #[serde(alias = "chain_id")] + #[serde(rename = "chainId")] + chain_id: u64, + #[serde(alias = "policy_id")] + #[serde(rename = "policyId")] + policy_id: u64, + cursor: Option, + limit: Option, +} + +type PolicyType = ITIP403Registry::PolicyType; + +#[derive(Serialize)] +struct PolicyMetadata { + chain_id: u64, + policy_id: u64, + registry: String, + policy_type: PolicyType, + admin: Option, + created_by: Option, + created_at: Option>, + last_updated_at: Option>, +} + +#[derive(Serialize)] +struct CompoundPolicyRefs { + sender_policy_id: u64, + recipient_policy_id: u64, + mint_recipient_policy_id: u64, +} + +#[derive(Serialize)] +struct ChildPolicyData { + metadata: PolicyMetadata, + members: Vec, + next_member_cursor: Option, +} + +#[derive(Serialize)] +struct CompoundPolicyData { + sender_policy: ChildPolicyData, + recipient_policy: ChildPolicyData, + mint_recipient_policy: ChildPolicyData, +} + +struct LoadedPolicyData { + metadata: PolicyMetadata, + compound_policy_refs: Option, +} + +impl PolicyMetadata { + fn has_direct_members(&self) -> bool { + matches!( + self.policy_type, + PolicyType::WHITELIST | PolicyType::BLACKLIST + ) + } +} + +#[derive(Serialize)] +pub struct PolicyDataResponse { + ok: bool, + metadata: PolicyMetadata, + compound_policy: Option, + members: Vec, + member_limit: i64, + next_member_cursor: Option, +} + +pub async fn get_policy_data( + State(state): State, + Query(params): Query, +) -> Result, ApiError> { + let pool = state + .get_pool(Some(params.chain_id)) + .await + .ok_or_else(|| ApiError::BadRequest(format!("Unknown chain_id: {}", params.chain_id)))?; + + let conn = pool + .get() + .await + .map_err(|e| ApiError::QueryError(e.to_string()))?; + + let policy_data = load_tip403_policy_metadata(&conn, params.chain_id, params.policy_id) + .await + .map_err(|e| ApiError::QueryError(e.to_string()))? + .ok_or_else(|| { + ApiError::NotFound(format!("TIP-403 policy not found: {}", params.policy_id)) + })?; + + let member_limit = params + .limit + .unwrap_or(DEFAULT_MEMBER_LIMIT) + .clamp(1, MAX_MEMBER_LIMIT); + let member_cursor = params + .cursor + .as_deref() + .map(tip403_member_cursor_topic) + .transpose() + .map_err(|e| ApiError::BadRequest(e.to_string()))?; + + let (members, next_member_cursor) = if policy_data.metadata.has_direct_members() { + load_tip403_policy_members( + &conn, + params.policy_id, + &policy_data.metadata.policy_type, + member_limit, + member_cursor.as_deref(), + ) + .await + .map_err(|e| ApiError::QueryError(e.to_string()))? + } else { + (Vec::new(), None) + }; + + let compound_policy = if let Some(refs) = policy_data.compound_policy_refs { + Some( + resolve_tip403_compound_policy(&conn, params.chain_id, refs, member_limit) + .await + .map_err(|e| ApiError::QueryError(e.to_string()))?, + ) + } else { + None + }; + + Ok(Json(PolicyDataResponse { + ok: true, + metadata: policy_data.metadata, + compound_policy, + members, + member_limit, + next_member_cursor, + })) +} + +fn decode_event(topics: &[&[u8]], data: &[u8]) -> AnyhowResult { + let topics = topics + .iter() + .map(|topic| B256::try_from(*topic)) + .collect::, _>>()?; + Ok(E::decode_raw_log_validate(topics, data)?) +} + +fn tip403_policy_topic(policy_id: u64) -> Vec { + let mut topic = vec![0u8; 32]; + topic[24..32].copy_from_slice(&policy_id.to_be_bytes()); + topic +} + +fn tip403_registry_address() -> Vec { + TIP403_REGISTRY_ADDRESS.as_slice().to_vec() +} + +fn tip403_member_cursor_topic(cursor: &str) -> AnyhowResult> { + let cursor = cursor.strip_prefix("0x").unwrap_or(cursor); + if cursor.len() != 40 { + return Err(anyhow!("cursor must be a 20-byte hex address")); + } + + let mut topic = vec![0u8; 32]; + hex::decode_to_slice(cursor, &mut topic[12..32])?; + Ok(topic) +} + +async fn load_tip403_policy_metadata( + conn: &deadpool_postgres::Object, + chain_id: u64, + policy_id: u64, +) -> AnyhowResult> { + let policy_created_selector = ITIP403Registry::PolicyCreated::SIGNATURE_HASH.as_slice(); + let compound_created_selector = + ITIP403Registry::CompoundPolicyCreated::SIGNATURE_HASH.as_slice(); + let selectors: [&[u8]; 2] = [policy_created_selector, compound_created_selector]; + let registry_address = tip403_registry_address(); + let policy_topic = tip403_policy_topic(policy_id); + + let row = conn + .query_opt( + r#" + SELECT selector, topic2, data, block_timestamp + FROM logs + WHERE address = $1 + AND selector = ANY($2) AND topic1 = $3 + ORDER BY block_num DESC, tx_idx DESC, log_idx DESC + LIMIT 1 + "#, + &[®istry_address, &&selectors[..], &policy_topic], + ) + .await?; + + let Some(row) = row else { return Ok(None) }; + let selector: Vec = row.get(0); + let updater_topic: Vec = row + .get::<_, Option>>(1) + .ok_or_else(|| anyhow!("TIP-403 creation log missing updater topic"))?; + let data: Vec = row.get(2); + let (policy_type, created_by, default_admin, compound_policy_refs) = + if selector == policy_created_selector { + let event = decode_event::( + &[policy_created_selector, &policy_topic, &updater_topic], + &data, + )?; + let created_by = event.updater.to_string(); + (event.policyType, created_by.clone(), Some(created_by), None) + } else if selector == compound_created_selector { + let event = decode_event::( + &[compound_created_selector, &policy_topic, &updater_topic], + &data, + )?; + ( + PolicyType::COMPOUND, + event.creator.to_string(), + None, + Some(CompoundPolicyRefs { + sender_policy_id: event.senderPolicyId, + recipient_policy_id: event.recipientPolicyId, + mint_recipient_policy_id: event.mintRecipientPolicyId, + }), + ) + } else { + return Err(anyhow!("unknown TIP-403 creation selector")); + }; + + Ok(Some(LoadedPolicyData { + metadata: PolicyMetadata { + chain_id, + policy_id, + registry: TIP403_REGISTRY_ADDRESS.to_string(), + policy_type, + admin: current_tip403_policy_admin(conn, policy_id) + .await? + .or(default_admin), + created_by: Some(created_by), + created_at: Some(row.get(3)), + last_updated_at: latest_tip403_policy_update_at(conn, policy_id).await?, + }, + compound_policy_refs, + })) +} + +async fn resolve_tip403_compound_policy( + conn: &deadpool_postgres::Object, + chain_id: u64, + refs: CompoundPolicyRefs, + member_limit: i64, +) -> AnyhowResult { + Ok(CompoundPolicyData { + sender_policy: load_tip403_child_policy( + conn, + chain_id, + refs.sender_policy_id, + member_limit, + ) + .await?, + recipient_policy: load_tip403_child_policy( + conn, + chain_id, + refs.recipient_policy_id, + member_limit, + ) + .await?, + mint_recipient_policy: load_tip403_child_policy( + conn, + chain_id, + refs.mint_recipient_policy_id, + member_limit, + ) + .await?, + }) +} + +async fn load_tip403_child_policy( + conn: &deadpool_postgres::Object, + chain_id: u64, + policy_id: u64, + member_limit: i64, +) -> AnyhowResult { + let policy_data = load_tip403_policy_metadata(conn, chain_id, policy_id) + .await? + .ok_or_else(|| anyhow!("compound child policy not found: {policy_id}"))?; + + let (members, next_member_cursor) = if policy_data.metadata.has_direct_members() { + load_tip403_policy_members( + conn, + policy_id, + &policy_data.metadata.policy_type, + member_limit, + None, + ) + .await? + } else { + (Vec::new(), None) + }; + + Ok(ChildPolicyData { + metadata: policy_data.metadata, + members, + next_member_cursor, + }) +} + +async fn current_tip403_policy_admin( + conn: &deadpool_postgres::Object, + policy_id: u64, +) -> AnyhowResult> { + let selector = ITIP403Registry::PolicyAdminUpdated::SIGNATURE_HASH.as_slice(); + let registry_address = tip403_registry_address(); + let policy_topic = tip403_policy_topic(policy_id); + + let row = conn + .query_opt( + r#" + SELECT topic2, topic3 + FROM logs + WHERE address = $1 + AND selector = $2 AND topic1 = $3 AND topic3 IS NOT NULL + ORDER BY block_num DESC, tx_idx DESC, log_idx DESC + LIMIT 1 + "#, + &[®istry_address, &selector, &policy_topic], + ) + .await?; + + let Some(row) = row else { return Ok(None) }; + let updater_topic: Vec = row.get(0); + let admin_topic: Vec = row.get(1); + let event = decode_event::( + &[selector, &policy_topic, &updater_topic, &admin_topic], + &[], + )?; + Ok(Some(event.admin.to_string())) +} + +async fn latest_tip403_policy_update_at( + conn: &deadpool_postgres::Object, + policy_id: u64, +) -> AnyhowResult>> { + let selectors: [&[u8]; 5] = [ + ITIP403Registry::PolicyCreated::SIGNATURE_HASH.as_slice(), + ITIP403Registry::CompoundPolicyCreated::SIGNATURE_HASH.as_slice(), + ITIP403Registry::PolicyAdminUpdated::SIGNATURE_HASH.as_slice(), + ITIP403Registry::WhitelistUpdated::SIGNATURE_HASH.as_slice(), + ITIP403Registry::BlacklistUpdated::SIGNATURE_HASH.as_slice(), + ]; + let registry_address = tip403_registry_address(); + let policy_topic = tip403_policy_topic(policy_id); + + let row = conn + .query_opt( + r#" + SELECT block_timestamp + FROM logs + WHERE address = $1 + AND selector = ANY($2) AND topic1 = $3 + ORDER BY block_num DESC, tx_idx DESC, log_idx DESC + LIMIT 1 + "#, + &[®istry_address, &&selectors[..], &policy_topic], + ) + .await?; + + Ok(row.map(|row| row.get(0))) +} + +async fn load_tip403_policy_members( + conn: &deadpool_postgres::Object, + policy_id: u64, + policy_type: &PolicyType, + limit: i64, + cursor: Option<&[u8]>, +) -> AnyhowResult<(Vec, Option)> { + let selector = match policy_type { + PolicyType::WHITELIST => ITIP403Registry::WhitelistUpdated::SIGNATURE_HASH.as_slice(), + PolicyType::BLACKLIST => ITIP403Registry::BlacklistUpdated::SIGNATURE_HASH.as_slice(), + _ => return Ok((Vec::new(), None)), + }; + let registry_address = tip403_registry_address(); + let policy_topic = tip403_policy_topic(policy_id); + let empty_cursor = vec![0u8; 32]; + let cursor = cursor.unwrap_or(&empty_cursor); + let query_limit = limit + 1; + + let rows = conn + .query( + r#" + SELECT DISTINCT ON (topic3) + topic2, topic3, data + FROM logs + WHERE address = $1 + AND selector = $2 AND topic1 = $3 AND topic3 IS NOT NULL AND topic3 > $4 + ORDER BY topic3, block_num DESC, tx_idx DESC, log_idx DESC + LIMIT $5 + "#, + &[ + ®istry_address, + &selector, + &policy_topic, + &cursor, + &query_limit, + ], + ) + .await?; + + let mut members = Vec::new(); + let mut next_member_cursor = None; + for row in rows.iter().take(limit as usize) { + let updater_topic: Vec = row.get(0); + let account_topic: Vec = row.get(1); + let data: Vec = row.get(2); + next_member_cursor = Some(format!("0x{}", hex::encode(&account_topic[12..32]))); + + let active_member = match policy_type { + PolicyType::WHITELIST => { + let event = decode_event::( + &[selector, &policy_topic, &updater_topic, &account_topic], + &data, + )?; + event.allowed.then(|| event.account.to_string()) + } + PolicyType::BLACKLIST => { + let event = decode_event::( + &[selector, &policy_topic, &updater_topic, &account_topic], + &data, + )?; + event.restricted.then(|| event.account.to_string()) + } + _ => None, + }; + + if let Some(account) = active_member { + members.push(account); + } + } + + Ok(( + members, + if rows.len() as i64 > limit { + next_member_cursor + } else { + None + }, + )) +} diff --git a/tests/api_live_test.rs b/tests/api_live_test.rs index d189fb1a..befd0362 100644 --- a/tests/api_live_test.rs +++ b/tests/api_live_test.rs @@ -5,10 +5,12 @@ use std::net::SocketAddr; use std::sync::Arc; use std::time::Duration; +use alloy::primitives::address; use axum::Router; use axum::body::Body; use axum::extract::connect_info::IntoMakeServiceWithConnectInfo; use axum::http::{Request, StatusCode}; +use tempo_contracts::precompiles::{ITIP403Registry, TIP403_REGISTRY_ADDRESS}; use tower::Service; use common::testdb::TestDb; @@ -98,6 +100,439 @@ async fn test_status_endpoint() { assert!(json["chains"].is_array()); } +#[tokio::test] +#[serial(db)] +async fn test_policy_data_whitelist_members() { + let db = TestDb::empty().await; + db.truncate_all().await; + + let creator = address!("0x1000000000000000000000000000000000000001"); + let admin = address!("0x1000000000000000000000000000000000000002"); + let account_active = address!("0x2000000000000000000000000000000000000001"); + let account_removed = address!("0x2000000000000000000000000000000000000002"); + + let mut events = db.event_inserter(TIP403_REGISTRY_ADDRESS).starting_at(10); + events + .insert(&ITIP403Registry::PolicyCreated { + policyId: 7, + updater: creator, + policyType: ITIP403Registry::PolicyType::WHITELIST, + }) + .await; + events + .insert(&ITIP403Registry::PolicyAdminUpdated { + policyId: 7, + updater: creator, + admin, + }) + .await; + events + .insert(&ITIP403Registry::WhitelistUpdated { + policyId: 7, + updater: admin, + account: account_active, + allowed: true, + }) + .await; + events + .insert(&ITIP403Registry::WhitelistUpdated { + policyId: 7, + updater: admin, + account: account_removed, + allowed: true, + }) + .await; + events + .insert(&ITIP403Registry::WhitelistUpdated { + policyId: 7, + updater: admin, + account: account_removed, + allowed: false, + }) + .await; + + let broadcaster = Arc::new(Broadcaster::new()); + let (pools, chain_id) = make_pools(db.pool.clone()); + let mut app = make_test_service(pools, chain_id, broadcaster).await; + + let response = app + .call( + Request::builder() + .uri("/policy-data?chainId=1&policyId=7") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); + + assert_eq!( + json, + serde_json::json!({ + "ok": true, + "metadata": { + "chain_id": 1, + "policy_id": 7, + "registry": "0x403c000000000000000000000000000000000000", + "policy_type": "WHITELIST", + "admin": admin.to_string(), + "created_by": creator.to_string(), + "created_at": "2023-11-14T22:13:30Z", + "last_updated_at": "2023-11-14T22:13:34Z" + }, + "compound_policy": null, + "members": [account_active.to_string()], + "member_limit": 100, + "next_member_cursor": null + }) + ); +} + +#[tokio::test] +#[serial(db)] +async fn test_policy_data_blacklist_members() { + let db = TestDb::empty().await; + db.truncate_all().await; + + let creator = address!("0x3000000000000000000000000000000000000001"); + let restricted = address!("0x4000000000000000000000000000000000000001"); + let unrestricted = address!("0x4000000000000000000000000000000000000002"); + + let mut events = db.event_inserter(TIP403_REGISTRY_ADDRESS).starting_at(20); + events + .insert(&ITIP403Registry::PolicyCreated { + policyId: 8, + updater: creator, + policyType: ITIP403Registry::PolicyType::BLACKLIST, + }) + .await; + events + .insert(&ITIP403Registry::BlacklistUpdated { + policyId: 8, + updater: creator, + account: restricted, + restricted: true, + }) + .await; + events + .insert(&ITIP403Registry::BlacklistUpdated { + policyId: 8, + updater: creator, + account: unrestricted, + restricted: true, + }) + .await; + events + .insert(&ITIP403Registry::BlacklistUpdated { + policyId: 8, + updater: creator, + account: unrestricted, + restricted: false, + }) + .await; + + let broadcaster = Arc::new(Broadcaster::new()); + let (pools, chain_id) = make_pools(db.pool.clone()); + let mut app = make_test_service(pools, chain_id, broadcaster).await; + + let response = app + .call( + Request::builder() + .uri("/policy-data?chainId=1&policyId=8") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); + + assert_eq!( + json, + serde_json::json!({ + "ok": true, + "metadata": { + "chain_id": 1, + "policy_id": 8, + "registry": "0x403c000000000000000000000000000000000000", + "policy_type": "BLACKLIST", + "admin": creator.to_string(), + "created_by": creator.to_string(), + "created_at": "2023-11-14T22:13:40Z", + "last_updated_at": "2023-11-14T22:13:43Z" + }, + "compound_policy": null, + "members": [restricted.to_string()], + "member_limit": 100, + "next_member_cursor": null + }) + ); +} + +#[tokio::test] +#[serial(db)] +async fn test_policy_data_members_are_paginated() { + let db = TestDb::empty().await; + db.truncate_all().await; + + let creator = address!("0x5000000000000000000000000000000000000001"); + let account_1 = address!("0x6000000000000000000000000000000000000001"); + let account_2 = address!("0x6000000000000000000000000000000000000002"); + + let mut events = db.event_inserter(TIP403_REGISTRY_ADDRESS).starting_at(30); + events + .insert(&ITIP403Registry::PolicyCreated { + policyId: 9, + updater: creator, + policyType: ITIP403Registry::PolicyType::WHITELIST, + }) + .await; + events + .insert(&ITIP403Registry::WhitelistUpdated { + policyId: 9, + updater: creator, + account: account_1, + allowed: true, + }) + .await; + events + .insert(&ITIP403Registry::WhitelistUpdated { + policyId: 9, + updater: creator, + account: account_2, + allowed: true, + }) + .await; + + let broadcaster = Arc::new(Broadcaster::new()); + let (pools, chain_id) = make_pools(db.pool.clone()); + let mut app = make_test_service(pools, chain_id, broadcaster).await; + + let response = app + .call( + Request::builder() + .uri("/policy-data?chainId=1&policyId=9&limit=1") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); + + assert_eq!(json["members"], serde_json::json!([account_1.to_string()])); + assert_eq!(json["member_limit"], 1); + assert_eq!(json["next_member_cursor"], account_1.to_string()); + + let response = app + .call( + Request::builder() + .uri(format!( + "/policy-data?chainId=1&policyId=9&limit=1&cursor={}", + json["next_member_cursor"].as_str().unwrap() + )) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); + + assert_eq!(json["members"], serde_json::json!([account_2.to_string()])); +} + +#[tokio::test] +#[serial(db)] +async fn test_policy_data_compound_policy_metadata() { + let db = TestDb::empty().await; + db.truncate_all().await; + + let creator = address!("0x7000000000000000000000000000000000000001"); + let sender_account = address!("0x8000000000000000000000000000000000000001"); + let recipient_account = address!("0x8000000000000000000000000000000000000002"); + let mint_recipient_account = address!("0x8000000000000000000000000000000000000003"); + + let mut events = db.event_inserter(TIP403_REGISTRY_ADDRESS).starting_at(40); + events + .insert(&ITIP403Registry::PolicyCreated { + policyId: 1, + updater: creator, + policyType: ITIP403Registry::PolicyType::WHITELIST, + }) + .await; + events + .insert(&ITIP403Registry::WhitelistUpdated { + policyId: 1, + updater: creator, + account: sender_account, + allowed: true, + }) + .await; + events + .insert(&ITIP403Registry::PolicyCreated { + policyId: 2, + updater: creator, + policyType: ITIP403Registry::PolicyType::BLACKLIST, + }) + .await; + events + .insert(&ITIP403Registry::BlacklistUpdated { + policyId: 2, + updater: creator, + account: recipient_account, + restricted: true, + }) + .await; + events + .insert(&ITIP403Registry::PolicyCreated { + policyId: 3, + updater: creator, + policyType: ITIP403Registry::PolicyType::WHITELIST, + }) + .await; + events + .insert(&ITIP403Registry::WhitelistUpdated { + policyId: 3, + updater: creator, + account: mint_recipient_account, + allowed: true, + }) + .await; + events + .insert(&ITIP403Registry::CompoundPolicyCreated { + policyId: 10, + creator, + senderPolicyId: 1, + recipientPolicyId: 2, + mintRecipientPolicyId: 3, + }) + .await; + + let broadcaster = Arc::new(Broadcaster::new()); + let (pools, chain_id) = make_pools(db.pool.clone()); + let mut app = make_test_service(pools, chain_id, broadcaster).await; + + let response = app + .call( + Request::builder() + .uri("/policy-data?chainId=1&policyId=10") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let json: serde_json::Value = serde_json::from_slice(&body).unwrap(); + + assert_eq!( + json, + serde_json::json!({ + "ok": true, + "metadata": { + "chain_id": 1, + "policy_id": 10, + "registry": "0x403c000000000000000000000000000000000000", + "policy_type": "COMPOUND", + "admin": null, + "created_by": creator.to_string(), + "created_at": "2023-11-14T22:13:50Z", + "last_updated_at": "2023-11-14T22:13:56Z" + }, + "compound_policy": { + "sender_policy": { + "metadata": { + "chain_id": 1, + "policy_id": 1, + "registry": "0x403c000000000000000000000000000000000000", + "policy_type": "WHITELIST", + "admin": creator.to_string(), + "created_by": creator.to_string(), + "created_at": "2023-11-14T22:13:50Z", + "last_updated_at": "2023-11-14T22:13:51Z" + }, + "members": [sender_account.to_string()], + "next_member_cursor": null + }, + "recipient_policy": { + "metadata": { + "chain_id": 1, + "policy_id": 2, + "registry": "0x403c000000000000000000000000000000000000", + "policy_type": "BLACKLIST", + "admin": creator.to_string(), + "created_by": creator.to_string(), + "created_at": "2023-11-14T22:13:52Z", + "last_updated_at": "2023-11-14T22:13:53Z" + }, + "members": [recipient_account.to_string()], + "next_member_cursor": null + }, + "mint_recipient_policy": { + "metadata": { + "chain_id": 1, + "policy_id": 3, + "registry": "0x403c000000000000000000000000000000000000", + "policy_type": "WHITELIST", + "admin": creator.to_string(), + "created_by": creator.to_string(), + "created_at": "2023-11-14T22:13:54Z", + "last_updated_at": "2023-11-14T22:13:55Z" + }, + "members": [mint_recipient_account.to_string()], + "next_member_cursor": null + } + }, + "members": [], + "member_limit": 100, + "next_member_cursor": null + }) + ); +} + +#[tokio::test] +#[serial(db)] +async fn test_policy_data_not_found() { + let db = TestDb::empty().await; + db.truncate_all().await; + let broadcaster = Arc::new(Broadcaster::new()); + let (pools, chain_id) = make_pools(db.pool.clone()); + let mut app = make_test_service(pools, chain_id, broadcaster).await; + + let response = app + .call( + Request::builder() + .uri("/policy-data?chainId=1&policyId=999") + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::NOT_FOUND); +} + #[tokio::test] #[serial(db)] async fn test_query_select_blocks() { diff --git a/tests/common/testdb.rs b/tests/common/testdb.rs index 8ebd7ea7..ebe3b2d0 100644 --- a/tests/common/testdb.rs +++ b/tests/common/testdb.rs @@ -1,3 +1,5 @@ +use alloy::primitives::Address; +use alloy::sol_types::SolEvent; use tidx::db::{Pool, ThrottledPool, create_pool, run_migrations}; use tidx::sync::engine::SyncEngine; use tidx::sync::sink::SinkSet; @@ -16,6 +18,37 @@ pub struct TestDb { _guard: MutexGuard<'static, ()>, } +/// Convenience inserter for synthetic event logs in tests. +/// +/// By default each inserted event advances to the next block with `tx_idx = 0` +/// and `log_idx = 0`, so tests can express event histories without manually +/// threading block/log positions through every call. +pub struct EventInserter<'a> { + db: &'a TestDb, + address: Address, + next_block_num: i64, + tx_idx: i32, +} + +impl EventInserter<'_> { + pub fn starting_at(mut self, block_num: i64) -> Self { + self.next_block_num = block_num; + self + } + + pub fn tx_idx(mut self, tx_idx: i32) -> Self { + self.tx_idx = tx_idx; + self + } + + pub async fn insert(&mut self, event: &E) { + self.db + .insert_event_at(self.address, event, self.next_block_num, self.tx_idx, 0) + .await; + self.next_block_num += 1; + } +} + impl TestDb { /// Create a TestDb without seeding (for tests that need empty/controlled DB) pub async fn empty() -> Self { @@ -104,6 +137,64 @@ and ensure DATABASE_URL points at the Postgres container (for example \ .expect("Failed to truncate tables"); } + pub fn event_inserter(&self, address: Address) -> EventInserter<'_> { + EventInserter { + db: self, + address, + next_block_num: 1, + tx_idx: 0, + } + } + + pub async fn insert_event_at( + &self, + address: Address, + event: &E, + block_num: i64, + tx_idx: i32, + log_idx: i32, + ) { + let conn = self.pool.get().await.expect("Failed to get connection"); + let topics = event.encode_topics(); + let topic_bytes: Vec> = topics + .iter() + .map(|topic| topic.0.as_slice().to_vec()) + .collect(); + let topic = |idx: usize| topic_bytes.get(idx).cloned(); + let data = event.encode_data(); + let mut tx_hash = [0u8; 32]; + tx_hash[16..24].copy_from_slice(&(block_num as u64).to_be_bytes()); + tx_hash[24..28].copy_from_slice(&(tx_idx as u32).to_be_bytes()); + tx_hash[28..32].copy_from_slice(&(log_idx as u32).to_be_bytes()); + let tx_hash = tx_hash.to_vec(); + let block_timestamp = chrono::DateTime::from_timestamp(1_700_000_000 + block_num, 0) + .expect("valid timestamp"); + + conn.execute( + r#" + INSERT INTO logs ( + block_num, block_timestamp, log_idx, tx_idx, tx_hash, address, + selector, topic0, topic1, topic2, topic3, data, is_virtual_forward + ) VALUES ($1, $2, $3, $4, $5, $6, $7, $7, $8, $9, $10, $11, false) + "#, + &[ + &block_num, + &block_timestamp, + &log_idx, + &tx_idx, + &tx_hash, + &address.as_slice(), + &topic(0), + &topic(1), + &topic(2), + &topic(3), + &data, + ], + ) + .await + .expect("Failed to insert event log"); + } + pub async fn block_count(&self) -> i64 { let conn = self.pool.get().await.expect("Failed to get connection"); conn.query_one("SELECT COUNT(*) FROM blocks", &[])