diff --git a/Cargo.lock b/Cargo.lock index 2c78e2031..c9fed2176 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -52,15 +52,15 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "alloy" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2683873c2744f6cd72d0db51bb74fee9ed310e0476a140bdc19e82b407d8a0a" +checksum = "8367891bf380210abb0d6aa30c5f85a9080cb4a066c4d5c5acadad630823751b" dependencies = [ "alloy-consensus", "alloy-core", @@ -76,10 +76,11 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.31" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b68b94c159bcc2ca5f758b8663d7b00fc7c5e40569984595ddf2221b0f7f7f6e" +checksum = "18c5c520273946ecf715c0010b4e3503d7eba9893cd9ce6b7fff5654c4a3c470" dependencies = [ + "alloy-primitives", "num_enum", "strum", ] @@ -96,9 +97,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28ddd17ffb7e4d66ef3a84e7b179072a9320cdc4b26c7f6f44cbf1081631b36" +checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -110,9 +111,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "0.8.3" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b095eb0533144b4497e84a9cc3e44a5c2e3754a3983c0376a55a2f9183a53e" +checksum = "9c8316d83e590f4163b221b8180008f302bda5cf5451202855cdd323e588849c" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -131,9 +132,9 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a" +checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -142,9 +143,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f6c5c0a383f14519531cf58d8440e74f10b938e289f803af870be6f79223110" +checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -160,9 +161,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7111af869909275cffc5c84d16b6c892d6d512773e40cbe83187d0b9c5235e91" +checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -174,9 +175,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "342028392a2d5050b7b93dd32a0715d3b3b9ce30072ecb69a35dd4895c005495" +checksum = "fb3705ce7d8602132bcf5ac7a1dd293a42adc2f183abf5907c30ac535ceca049" dependencies = [ "alloy-consensus", "alloy-eips", @@ -195,9 +196,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e66d78c049dcadd065a926a9f2d9a9b2b10981a7889449e694fac7bccd2c6f" +checksum = "94ad40869867ed2d9cd3842b1e800889e5b49e6b92da346e93862b4a741bedf3" dependencies = [ "alloy-eips", "alloy-primitives", @@ -207,31 +208,37 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "9fce5dbd6a4f118eecc4719eaa9c7ffc31c315e6c5ccde3642db927802312425" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more", + "foldhash", + "hashbrown 0.15.1", "hex-literal", + "indexmap", "itoa", "k256", "keccak-asm", + "paste", "proptest", "rand", "ruint", + "rustc-hash", "serde", + "sha3", "tiny-keccak", ] [[package]] name = "alloy-provider" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79f14ccc2a3c575cb17b1b4af8c772cf9b5b93b7ce7047d6640e53954abb558d" +checksum = "927f708dd457ed63420400ee5f06945df9632d5d101851952056840426a10dc5" dependencies = [ "alloy-chains", "alloy-consensus", @@ -264,9 +271,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -275,20 +282,20 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "alloy-rpc-client" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc79aeca84abb122a2fffbc1c91fdf958dca5c95be3875977bc99672bde0027" +checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -307,9 +314,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22045187a5ebf5b2af3f8b6831b66735b6556c5750ec5790aeeb45935260c1c2" +checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" dependencies = [ "alloy-rpc-types-eth", "alloy-rpc-types-trace", @@ -319,9 +326,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238f494727ff861a803bd73b1274ef788a615bf8f8c4bfada4e6df42afa275d2" +checksum = "83aa984386deda02482660aa31cb8ca1e63d533f1c31a52d7d181ac5ec68e9b8" dependencies = [ "alloy-consensus", "alloy-eips", @@ -332,7 +339,7 @@ dependencies = [ "alloy-sol-types", "cfg-if", "derive_more", - "hashbrown", + "hashbrown 0.14.5", "itertools 0.13.0", "serde", "serde_json", @@ -340,9 +347,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca08b0ccc0861055ceb83a1db009c4c8a7f52a259e7cda7ca6ca36ec2b5ce8" +checksum = "98db35cd42c90b484377e6bc44d95377a7a38a5ebee996e67754ac0446d542ab" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -354,9 +361,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b95b6f024a558593dd3b8628af03f7df2ca50e4c56839293ad0a7546e471db0" +checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" dependencies = [ "alloy-primitives", "serde", @@ -365,9 +372,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da64740ff0518606c514eb0e03dd0a1daa8ff94d6d491a626fd8e50efd6c4f18" +checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" dependencies = [ "alloy-primitives", "async-trait", @@ -379,23 +386,23 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.8.3" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0458ccb02a564228fcd76efb8eb5a520521a8347becde37b402afec9a1b83859" +checksum = "9343289b4a7461ed8bab8618504c995c049c082b70c7332efd7b32125633dc05" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.3" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc65475025fc1e84bf86fc840f04f63fcccdcf3cf12053c99918e4054dfbc69" +checksum = "4222d70bec485ceccc5d8fd4f2909edd65b5d5e43d4aca0b5dcee65d519ae98f" dependencies = [ "alloy-sol-macro-input", "const-hex", @@ -404,31 +411,31 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.3" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed10f0715a0b69fde3236ff3b9ae5f6f7c97db5a387747100070d3016b9266b" +checksum = "2e17f2677369571b976e51ea1430eb41c3690d344fef567b840bfc0b01b6f83a" dependencies = [ "const-hex", "dunce", "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "syn-solidity", ] [[package]] name = "alloy-sol-types" -version = "0.8.3" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eb88e4da0a1b697ed6a9f811fdba223cf4d5c21410804fd1707836af73a462b" +checksum = "6520d427d4a8eb7aa803d852d7a52ceb0c519e784c292f64bb339e636918cf27" dependencies = [ "alloy-primitives", "alloy-sol-macro", @@ -437,9 +444,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7a669caa427abe8802184c8776f5103302f9337bb30a5b36bdebc332946c14" +checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" dependencies = [ "alloy-json-rpc", "base64", @@ -456,9 +463,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4433ffa97aab6ae643de81c7bde9a2f043496f27368a607405a5c78a610caf74" +checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -471,9 +478,9 @@ dependencies = [ [[package]] name = "amq-protocol" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0234884b3641db74d22ccc20fc2594db5f23d7d41ade5c93d7ee33d200960c" +checksum = "e3a41c091e49edfcc098b4f90d4d7706a8cf9158034e84ebfee7ff346092f67c" dependencies = [ "amq-protocol-tcp", "amq-protocol-types", @@ -485,9 +492,9 @@ dependencies = [ [[package]] name = "amq-protocol-tcp" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265dca43d9dbb3d5bbb0b3ef1b0cd9044ce3aa5d697d5b66cde974d1f6063f09" +checksum = "3ed7a4a662472f88823ed2fc81babb0b00562f2c54284e3e7bffc02b6df649bf" dependencies = [ "amq-protocol-uri", "tcp-stream", @@ -496,9 +503,9 @@ dependencies = [ [[package]] name = "amq-protocol-types" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7412353b58923fa012feb9a64ccc0c811747babee2e5a2fd63eb102dc8054c3" +checksum = "bd6484fdc918c1b6e2ae8eda2914d19a5873e1975f93ad8d33d6a24d1d98df05" dependencies = [ "cookie-factory", "nom", @@ -508,9 +515,9 @@ dependencies = [ [[package]] name = "amq-protocol-uri" -version = "7.2.1" +version = "7.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be91352c805d5704784e079117d5291fd5bf2569add53c914ebce6d1a795d33" +checksum = "7f7f2da69e0e1182765bf33407cd8a843f20791b5af2b57a2645818c4776c56c" dependencies = [ "amq-protocol-types", "percent-encoding", @@ -525,9 +532,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -540,43 +547,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" dependencies = [ "backtrace", ] @@ -735,7 +742,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "synstructure", ] @@ -747,7 +754,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -771,7 +778,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -794,8 +801,8 @@ checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.1", - "futures-lite 2.3.0", + "fastrand 2.2.0", + "futures-lite 2.5.0", "slab", ] @@ -807,18 +814,18 @@ checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ "async-channel", "async-executor", - "async-io 2.3.4", + "async-io 2.4.0", "async-lock 3.4.0", "blocking", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "once_cell", ] [[package]] name = "async-global-executor-trait" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33dd14c5a15affd2abcff50d84efd4009ada28a860f01c14f9d654f3e81b3f75" +checksum = "80f19936c1a84fb48ceb8899b642d2a72572587d1021cc561bfb24de9f33ee89" dependencies = [ "async-global-executor", "async-trait", @@ -847,18 +854,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "parking", - "polling 3.7.3", - "rustix 0.38.37", + "polling 3.7.4", + "rustix 0.38.40", "slab", "tracing", "windows-sys 0.59.0", @@ -898,9 +905,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -909,13 +916,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -926,13 +933,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -958,20 +965,20 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", "axum-core", @@ -995,7 +1002,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tower 0.4.13", + "tower 0.5.1", "tower-layer", "tower-service", "tracing", @@ -1003,9 +1010,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", @@ -1016,7 +1023,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -1135,7 +1142,7 @@ dependencies = [ "async-channel", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] @@ -1171,9 +1178,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ "serde", ] @@ -1216,9 +1223,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.18" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ "jobserver", "libc", @@ -1270,9 +1277,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.17" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -1280,9 +1287,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", @@ -1292,21 +1299,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "cms" @@ -1328,9 +1335,9 @@ checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -1349,9 +1356,9 @@ checksum = "0b396d1f76d455557e1218ec8066ae14bba60b4b36ecd55577ba979f5db7ecaa" [[package]] name = "const-hex" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" dependencies = [ "cfg-if", "cpufeatures", @@ -1416,9 +1423,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" dependencies = [ "libc", ] @@ -1461,9 +1468,9 @@ dependencies = [ [[package]] name = "critical-section" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64009896348fc5af4222e9cf7d7d82a95a256c634ebcf61c53e4ea461422242" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam" @@ -1580,7 +1587,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1591,7 +1598,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1601,7 +1608,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -1615,7 +1622,7 @@ checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", - "hashbrown", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -1662,7 +1669,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1687,33 +1694,33 @@ dependencies = [ [[package]] name = "derive_builder" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd33f37ee6a119146a1781d3356a7c26028f83d779b2e04ecd45fdc75c76877b" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7431fa049613920234f22c47fdc33e6cf3ee83067091ea4277a3f8c4587aae38" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "derive_builder_macro" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1733,7 +1740,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "unicode-xid", ] @@ -1802,7 +1809,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1889,7 +1896,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1957,7 +1964,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3aeb0284b473041df2419a28e3cdf0c64a78d2b9511af4b6e40bad3964b172" dependencies = [ "ethereum-types", - "hashbrown", + "hashbrown 0.14.5", "keccak-hash 0.10.0", "log", "parking_lot", @@ -2024,6 +2031,8 @@ version = "0.4.0" dependencies = [ "alloy", "alloy-compat", + "alloy-primitives", + "alloy-serde", "anyhow", "bitvec", "bytes", @@ -2032,7 +2041,7 @@ dependencies = [ "either", "env_logger 0.11.5", "ethereum-types", - "hashbrown", + "hashbrown 0.14.5", "hex", "hex-literal", "itertools 0.13.0", @@ -2073,9 +2082,9 @@ dependencies = [ [[package]] name = "executor-trait" -version = "2.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a1052dd43212a7777ec6a69b117da52f5e52f07aec47d00c1a2b33b85d06b08" +checksum = "13c39dff9342e4e0e16ce96be751eb21a94e94a87bb2f6e63ad1961c2ce109bf" dependencies = [ "async-trait", ] @@ -2091,9 +2100,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fastrlp" @@ -2145,9 +2154,9 @@ checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", @@ -2160,6 +2169,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2198,9 +2213,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2213,9 +2228,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2223,15 +2238,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2240,9 +2255,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -2261,11 +2276,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-core", "futures-io", "parking", @@ -2274,32 +2289,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2343,23 +2358,11 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "getset" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f636605b743120a8d32ed92fc27b6cde1a769f8f936c065151eb66f88ded513c" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" @@ -2422,6 +2425,18 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + [[package]] name = "heapless" version = "0.7.17" @@ -2514,9 +2529,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2532,9 +2547,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -2568,9 +2583,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -2581,11 +2596,128 @@ dependencies = [ "pin-project-lite", "socket2 0.5.7", "tokio", - "tower 0.4.13", "tower-service", "tracing", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2594,12 +2726,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2653,12 +2796,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.1", + "serde", ] [[package]] @@ -2702,9 +2846,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -2787,18 +2931,18 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -2807,6 +2951,15 @@ dependencies = [ "sha2", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "keccak-asm" version = "0.1.4" @@ -2879,7 +3032,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2890,9 +3043,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libgit2-sys" @@ -2908,9 +3061,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" @@ -2948,9 +3101,9 @@ dependencies = [ [[package]] name = "line-index" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67d61795376ae2683928c218fda7d7d7db136fd38c06b7552904667f0d55580a" +checksum = "3e27e0ed5a392a7f5ba0b3808a2afccff16c64933312c84b57618b49d1209bd2" dependencies = [ "nohash-hasher", "text-size", @@ -2958,22 +3111,22 @@ dependencies = [ [[package]] name = "linkme" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c943daedff228392b791b33bba32e75737756e80a613e32e246c6ce9cbab20a" +checksum = "566336154b9e58a4f055f6dd4cbab62c7dc0826ce3c0a04e63b2d2ecd784cdae" dependencies = [ "linkme-impl", ] [[package]] name = "linkme-impl" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26336e6dc7cc76e7927d2c9e7e3bb376d7af65a6f56a0b16c47d18a9b1abc5" +checksum = "edbe595006d355eaf9ae11db92707d4338cd2384d16866131cc1afdbdd35d8d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2988,6 +3141,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -3007,11 +3166,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown", + "hashbrown 0.15.1", ] [[package]] @@ -3104,7 +3263,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3287,7 +3446,7 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3310,9 +3469,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] @@ -3328,9 +3487,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ea5043e58958ee56f3e15a90aee535795cd7dfd319846288d93c5b57d85cbe" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oorandom" @@ -3340,9 +3499,9 @@ checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -3361,7 +3520,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3372,9 +3531,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -3419,7 +3578,7 @@ dependencies = [ [[package]] name = "paladin-core" version = "0.4.3" -source = "git+https://github.com/0xPolygonZero/paladin.git?branch=main#f1b6e254abb8068f4c2e7c489116a25e2d137a60" +source = "git+https://github.com/0xPolygonZero/paladin.git?branch=main#9d5452b984df7eae418d2540b0bef289d83e33a6" dependencies = [ "anyhow", "async-trait", @@ -3451,10 +3610,10 @@ dependencies = [ [[package]] name = "paladin-opkind-derive" version = "0.4.4" -source = "git+https://github.com/0xPolygonZero/paladin.git?branch=main#f1b6e254abb8068f4c2e7c489116a25e2d137a60" +source = "git+https://github.com/0xPolygonZero/paladin.git?branch=main#9d5452b984df7eae418d2540b0bef289d83e33a6" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3545,9 +3704,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.12" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", "thiserror", @@ -3556,9 +3715,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.12" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664d22978e2815783adbdd2c588b455b1bd625299ce36b2a99881ac9627e6d8d" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" dependencies = [ "pest", "pest_generator", @@ -3566,22 +3725,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.12" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d5487022d5d33f4c30d91c22afa240ce2a644e87fe08caad974d4eab6badbe" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "pest_meta" -version = "2.7.12" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0091754bbd0ea592c4deb3a122ce8ecbb0753b738aa82bc055fcc2eccc8d8174" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" dependencies = [ "once_cell", "pest", @@ -3590,29 +3749,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -3639,7 +3798,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-io", ] @@ -3685,9 +3844,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plonky2" @@ -3697,7 +3856,7 @@ dependencies = [ "ahash", "anyhow", "getrandom", - "hashbrown", + "hashbrown 0.14.5", "itertools 0.11.0", "keccak-hash 0.8.0", "log", @@ -3796,15 +3955,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.37", + "rustix 0.38.40", "tracing", "windows-sys 0.59.0", ] @@ -3924,14 +4083,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -3950,7 +4109,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -3986,6 +4145,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -4058,9 +4218,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -4078,14 +4238,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -4099,13 +4259,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -4116,15 +4276,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64", "bytes", @@ -4250,6 +4410,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -4299,9 +4465,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags 2.6.0", "errno", @@ -4312,9 +4478,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "ring", @@ -4352,19 +4518,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -4379,9 +4544,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "rusty-fork" @@ -4421,9 +4586,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -4474,9 +4639,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -4508,9 +4673,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -4526,20 +4691,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -4565,14 +4730,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -4611,6 +4776,16 @@ 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" @@ -4739,7 +4914,7 @@ source = "git+https://github.com/0xPolygonZero/plonky2.git?rev=2488cdacd49ede157 dependencies = [ "ahash", "anyhow", - "hashbrown", + "hashbrown 0.14.5", "itertools 0.11.0", "log", "num-bigint", @@ -4780,7 +4955,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -4802,9 +4977,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -4813,14 +4988,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.3" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b95156f8b577cb59dc0b1df15c6f29a10afc5f8a7ac9786b0b5c68c19149278" +checksum = "f76fe0a3e1476bdaa0775b9aec5b869ed9520c2b2fedfe9c6df3618f8ea6290b" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -4846,7 +5021,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -4855,6 +5030,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-triple" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a4d50cdb458045afc8131fd91b64904da29548bcb63c7236e0844936c13078" + [[package]] name = "tcp-stream" version = "0.28.0" @@ -4869,14 +5050,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand 2.2.0", "once_cell", - "rustix 0.38.37", + "rustix 0.38.40", "windows-sys 0.59.0", ] @@ -4903,22 +5084,22 @@ checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -4983,35 +5164,30 @@ dependencies = [ ] [[package]] -name = "tinytemplate" -version = "1.2.1" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "serde", - "serde_json", + "displaydoc", + "zerovec", ] [[package]] -name = "tinyvec" -version = "1.8.0" +name = "tinytemplate" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ - "tinyvec_macros", + "serde", + "serde_json", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -5027,9 +5203,9 @@ dependencies = [ [[package]] name = "tokio-executor-trait" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "802ccf58e108fe16561f35348fabe15ff38218968f033d587e399a84937533cc" +checksum = "96a1593beae7759f592e1100c5997fe9e9ebf4b5968062f1fbcd807989cd1b79" dependencies = [ "async-trait", "executor-trait", @@ -5044,7 +5220,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -5119,9 +5295,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", @@ -5156,8 +5332,10 @@ dependencies = [ "futures-util", "pin-project-lite", "sync_wrapper 0.1.2", + "tokio", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -5197,7 +5375,7 @@ checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -5272,7 +5450,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -5322,14 +5500,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.99" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "207aa50d36c4be8d8c6ea829478be44a372c6a77669937bb39c698e52f1491e8" +checksum = "8dcd332a5496c026f1e14b7f3d2b7bd98e509660c04239c58b0ba38a12daded4" dependencies = [ "glob", "serde", "serde_derive", "serde_json", + "target-triple", "termcolor", "toml", ] @@ -5352,9 +5531,9 @@ dependencies = [ [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -5374,32 +5553,17 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unroll" @@ -5419,9 +5583,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -5429,6 +5593,18 @@ dependencies = [ "serde", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -5449,9 +5625,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "9.0.0" +version = "9.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c32e7318e93a9ac53693b6caccfb05ff22e04a44c7cf8a279051f24c09da286f" +checksum = "349ed9e45296a581f455bc18039878f409992999bc1d5da12a6800eb18c8752f" dependencies = [ "anyhow", "derive_builder", @@ -5462,9 +5638,9 @@ dependencies = [ [[package]] name = "vergen-git2" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62c52cd2b2b8b7ec75fc20111b3022ac3ff83e4fc14b9497cfcfd39c54f9c67" +checksum = "e771aff771c0d7c2f42e434e2766d304d917e29b40f0424e8faaaa936bbc3f29" dependencies = [ "anyhow", "derive_builder", @@ -5477,13 +5653,12 @@ dependencies = [ [[package]] name = "vergen-lib" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e06bee42361e43b60f363bad49d63798d0f42fb1768091812270eca00c784720" +checksum = "229eaddb0050920816cf051e619affaf18caa3dd512de8de5839ccbc8e53abb0" dependencies = [ "anyhow", "derive_builder", - "getset", "rustversion", ] @@ -5535,9 +5710,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -5546,24 +5721,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -5573,9 +5748,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5583,28 +5758,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -5831,13 +6006,25 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -5891,12 +6078,37 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zero" version = "0.1.0" dependencies = [ "alloy", "alloy-compat", + "alloy-primitives", "anyhow", "async-stream", "axum", @@ -5906,7 +6118,7 @@ dependencies = [ "dotenvy", "evm_arithmetization", "futures", - "hashbrown", + "hashbrown 0.14.5", "hex", "itertools 0.13.0", "jemallocator", @@ -5954,7 +6166,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -5974,7 +6207,29 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -5993,6 +6248,6 @@ version = "0.1.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "trybuild", ] diff --git a/Cargo.toml b/Cargo.toml index cadf0a13a..6fc80d620 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,8 @@ alloy = { version = '0.3.0', default-features = false, features = [ ] } anyhow = "1.0.86" async-stream = "0.3.5" +alloy-primitives = "0.8.0" +alloy-serde = "0.3.0" axum = "0.7.5" bitflags = "2.5.0" bitvec = "1.0.1" diff --git a/evm_arithmetization/Cargo.toml b/evm_arithmetization/Cargo.toml index 22a40013f..43172e6c1 100644 --- a/evm_arithmetization/Cargo.toml +++ b/evm_arithmetization/Cargo.toml @@ -17,6 +17,8 @@ keywords.workspace = true [dependencies] alloy.workspace = true alloy-compat.workspace = true +alloy-primitives.workspace = true +alloy-serde.workspace = true anyhow.workspace = true bitvec.workspace = true bytes.workspace = true diff --git a/evm_arithmetization/src/cpu/kernel/interpreter.rs b/evm_arithmetization/src/cpu/kernel/interpreter.rs index d9745504e..50099112c 100644 --- a/evm_arithmetization/src/cpu/kernel/interpreter.rs +++ b/evm_arithmetization/src/cpu/kernel/interpreter.rs @@ -17,6 +17,7 @@ use serde::{Deserialize, Serialize}; use crate::byte_packing::byte_packing_stark::BytePackingOp; use crate::cpu::columns::CpuColumnsView; use crate::cpu::kernel::aggregator::KERNEL; +use crate::cpu::kernel::constants::context_metadata::ContextMetadata; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::generation::debug_inputs; use crate::generation::linked_list::LinkedListsPtrs; @@ -30,6 +31,7 @@ use crate::generation::{state::State, GenerationInputs}; use crate::keccak_sponge::columns::KECCAK_WIDTH_BYTES; use crate::keccak_sponge::keccak_sponge_stark::KeccakSpongeOp; use crate::memory::segments::Segment; +use crate::structlog::TxZeroStructLogs; use crate::util::h2u; use crate::witness::errors::ProgramError; use crate::witness::memory::{ @@ -66,6 +68,22 @@ pub(crate) struct Interpreter { #[cfg(test)] // Counts the number of appearances of each opcode. For debugging purposes. pub(crate) opcode_count: HashMap, + /// Optional logs for transactions code. + pub(crate) struct_logs: Option>, + /// Counter within a transaction. + pub(crate) struct_log_debugger_info: StructLogDebuggerInfo, +} + +/// Structure holding necessary information to check the kernel execution +/// against struct logs. +pub(crate) struct StructLogDebuggerInfo { + /// Opcode counter within a transaction. + pub(crate) counter: usize, + /// Gas value in the kernel for a transaction (starting at `GasLimit` and + /// decreasing with each user opcode). + pub(crate) gas: u64, + /// Gas consumed by the previous operation. + pub(crate) prev_op_gas: u64, } /// Simulates the CPU execution from `state` until the program counter reaches @@ -84,6 +102,7 @@ pub(crate) fn simulate_cpu_and_get_user_jumps( halt_pc, initial_context, None, + None, ); log::debug!("Simulating CPU for jumpdest analysis."); @@ -160,10 +179,11 @@ impl Interpreter { initial_stack: Vec, inputs: &GenerationInputs, max_cpu_len_log: Option, + struct_logs: &Option>, ) -> Self { debug_inputs(inputs); - let mut result = Self::new(initial_offset, initial_stack, max_cpu_len_log); + let mut result = Self::new(initial_offset, initial_stack, max_cpu_len_log, struct_logs); result.initialize_interpreter_state(inputs); result } @@ -172,6 +192,7 @@ impl Interpreter { initial_offset: usize, initial_stack: Vec, max_cpu_len_log: Option, + struct_logs: &Option>, ) -> Self { let mut interpreter = Self { generation_state: GenerationState::new(&GenerationInputs::default(), &KERNEL.code) @@ -186,6 +207,12 @@ impl Interpreter { is_jumpdest_analysis: false, clock: 0, max_cpu_len_log, + struct_logs: struct_logs.as_ref().map(|struct_log| struct_log.to_vec()), + struct_log_debugger_info: StructLogDebuggerInfo { + counter: 0, + gas: 0, + prev_op_gas: 0, + }, }; interpreter.generation_state.registers.program_counter = initial_offset; let initial_stack_len = initial_stack.len(); @@ -207,6 +234,7 @@ impl Interpreter { halt_offset: usize, halt_context: usize, max_cpu_len_log: Option, + struct_logs: Option>, ) -> Self { Self { generation_state: state.soft_clone(), @@ -218,6 +246,12 @@ impl Interpreter { is_jumpdest_analysis: true, clock: 0, max_cpu_len_log, + struct_logs, + struct_log_debugger_info: StructLogDebuggerInfo { + counter: 0, + gas: 0, + prev_op_gas: 0, + }, } } @@ -529,6 +563,152 @@ impl State for Interpreter { } } + fn check_against_struct_logs_before_op( + &mut self, + opcode: u8, + to_check: bool, + ) -> Result<(), ProgramError> { + if let Some(struct_logs) = &self.struct_logs + && to_check + { + let txn_idx = self.generation_state.next_txn_index; + + if let Some(txn_struct_logs) = &struct_logs[txn_idx - 1] { + let counter = self.struct_log_debugger_info.counter; + if counter == 0 { + // Initialize txn gas. + let gas_limit_address = MemoryAddress::new( + self.get_registers().context, + Segment::ContextMetadata, + ContextMetadata::GasLimit.unscale(), // context offsets are already scaled + ); + let gas_limit = self.generation_state.get_from_memory(gas_limit_address); + self.struct_log_debugger_info.gas = gas_limit.low_u64(); + // Check against actual initial gas. + if gas_limit.low_u64() != txn_struct_logs[0].gas { + log::warn!( + "Wrong Initial txn gas: expected {:?}, got {:?}.", + txn_struct_logs[0].gas, + gas_limit.as_u64() + ); + return Err(ProgramError::StructLogDebuggerError); + } + } + + // Check opcode. + let cur_txn_struct_logs = &txn_struct_logs[counter]; + let struct_op = cur_txn_struct_logs.op.as_str(); + let op_string_res = get_mnemonic(opcode); + match op_string_res { + Ok(cur_op_str) => { + let cur_op = cur_op_str.to_string(); + if struct_op != cur_op { + log::warn!("Wrong opcode: expected {struct_op}, got {cur_op}."); + return Err(ProgramError::StructLogDebuggerError); + } + } + Err(_) => { + // Update the counter since we will not get to the next + // check. + self.struct_log_debugger_info.counter += 1; + if self.struct_log_debugger_info.counter == txn_struct_logs.len() { + self.struct_log_debugger_info.counter = 0; + self.struct_log_debugger_info.prev_op_gas = 0; + } + if (opcode == 0xfe && !struct_op.contains("INVALID")) + || (opcode != 0xfe + && (struct_op != format!("opcode {:#x} not defined", opcode))) + { + log::warn!( + "Wrong invalid opcode: expected {} got error {}", + opcode, + struct_op + ); + return Err(ProgramError::StructLogDebuggerError); + } + } + } + + // Check pc. + let txn_pc = cur_txn_struct_logs.pc; + if txn_pc != self.get_registers().program_counter as u64 { + log::warn!( + "Wrong pc: expected {} but got {}.", + txn_pc, + self.get_registers().program_counter + ); + return Err(ProgramError::StructLogDebuggerError); + } + + // Check stack. + if let Some(txn_stack) = &cur_txn_struct_logs.stack { + let cur_stack = self.get_full_stack(); + if !cur_stack + .iter() + .copied() + .eq(txn_stack.iter().map(|s| U256(*s.as_limbs()))) + { + log::warn!( + "Wrong stack: expected {:?} but got {:?}.", + txn_stack, + cur_stack + ); + return Err(ProgramError::StructLogDebuggerError); + } + }; + }; + } + Ok(()) + } + + fn check_against_struct_logs_after_op( + &mut self, + res: &Result, + consumed_gas: u64, + to_check: bool, + ) -> Result<(), ProgramError> { + if let Some(struct_logs) = &self.struct_logs + && to_check + { + let txn_idx = self.generation_state.next_txn_index; + // First, update the gas. + self.struct_log_debugger_info.gas -= self.struct_log_debugger_info.prev_op_gas; + self.struct_log_debugger_info.prev_op_gas = consumed_gas; + + if let Some(txn_struct_logs) = &struct_logs[txn_idx - 1] { + // If the transaction errors, we simply log a warning, since struct logs do not + // actually return an error in that case. + let cur_txn_struct_logs = &txn_struct_logs[self.struct_log_debugger_info.counter]; + + if res.is_err() { + log::warn!("Kernel execution errored with: {:?}.", res); + } + + // Check opcode gas. + let txn_op_gas = self.struct_log_debugger_info.gas; + if txn_op_gas != cur_txn_struct_logs.gas { + log::warn!( + "Wrong gas update in the last operation: expected {} but got {}.", + cur_txn_struct_logs.gas, + txn_op_gas + ); + return Err(ProgramError::StructLogDebuggerError); + } + + // Update the user code counter. + self.struct_log_debugger_info.counter += 1; + if self.struct_log_debugger_info.counter == txn_struct_logs.len() { + self.struct_log_debugger_info.counter = 0; + } + } + } + Ok(()) + } + + fn update_struct_logs_gas(&mut self, n: u64) { + self.struct_log_debugger_info.gas = n; + } + fn incr_gas(&mut self, n: u64) { self.generation_state.incr_gas(n); } @@ -614,6 +794,15 @@ impl State for Interpreter { stack } + fn get_full_stack(&self) -> Vec { + let mut stack: Vec = (0..self.get_registers().stack_len) + .map(|i| crate::witness::util::stack_peek(self.get_generation_state(), i).unwrap()) + .collect(); + stack.reverse(); + + stack + } + fn get_halt_offsets(&self) -> Vec { self.halt_offsets.clone() } @@ -672,6 +861,15 @@ impl State for Interpreter { let registers = self.generation_state.registers; let (mut row, opcode) = self.base_row(); + let is_user_mode = !self.is_kernel(); + + // If we are in user and debug mode, and have extracted the struct logs, check + // the kernel run against the struct logs. + let to_check = is_user_mode + && (self.get_registers().program_counter != 0 || opcode != 0x00) + && !self.is_jumpdest_analysis; + self.check_against_struct_logs_before_op(opcode, to_check)?; + let op = decode(registers, opcode)?; #[cfg(test)] @@ -704,7 +902,15 @@ impl State for Interpreter { row.general.stack_mut().stack_inv_aux = F::ONE; } - self.perform_state_op(op, row) + let res_and_gas = self.perform_state_op(op, row); + let (res, consumed_gas) = match res_and_gas { + Ok((res, consumed_gas)) => (Ok(res), consumed_gas), + Err(e) => (Err(e), 0), + }; + + // Final checks against struct logs in debug and user mode. + self.check_against_struct_logs_after_op(&res, consumed_gas, to_check)?; + res } fn log_debug(&self, msg: String) { @@ -762,6 +968,162 @@ impl Transition for Interpreter { } } +fn get_mnemonic(opcode: u8) -> anyhow::Result<&'static str> { + match opcode { + 0x00 => Ok("STOP"), + 0x01 => Ok("ADD"), + 0x02 => Ok("MUL"), + 0x03 => Ok("SUB"), + 0x04 => Ok("DIV"), + 0x05 => Ok("SDIV"), + 0x06 => Ok("MOD"), + 0x07 => Ok("SMOD"), + 0x08 => Ok("ADDMOD"), + 0x09 => Ok("MULMOD"), + 0x0a => Ok("EXP"), + 0x0b => Ok("SIGNEXTEND"), + 0x10 => Ok("LT"), + 0x11 => Ok("GT"), + 0x12 => Ok("SLT"), + 0x13 => Ok("SGT"), + 0x14 => Ok("EQ"), + 0x15 => Ok("ISZERO"), + 0x16 => Ok("AND"), + 0x17 => Ok("OR"), + 0x18 => Ok("XOR"), + 0x19 => Ok("NOT"), + 0x1a => Ok("BYTE"), + 0x1b => Ok("SHL"), + 0x1c => Ok("SHR"), + 0x1d => Ok("SAR"), + 0x20 => Ok("KECCAK256"), + 0x30 => Ok("ADDRESS"), + 0x31 => Ok("BALANCE"), + 0x32 => Ok("ORIGIN"), + 0x33 => Ok("CALLER"), + 0x34 => Ok("CALLVALUE"), + 0x35 => Ok("CALLDATALOAD"), + 0x36 => Ok("CALLDATASIZE"), + 0x37 => Ok("CALLDATACOPY"), + 0x38 => Ok("CODESIZE"), + 0x39 => Ok("CODECOPY"), + 0x3a => Ok("GASPRICE"), + 0x3b => Ok("EXTCODESIZE"), + 0x3c => Ok("EXTCODECOPY"), + 0x3d => Ok("RETURNDATASIZE"), + 0x3e => Ok("RETURNDATACOPY"), + 0x3f => Ok("EXTCODEHASH"), + 0x40 => Ok("BLOCKHASH"), + 0x41 => Ok("COINBASE"), + 0x42 => Ok("TIMESTAMP"), + 0x43 => Ok("NUMBER"), + 0x44 => Ok("DIFFICULTY"), + 0x45 => Ok("GASLIMIT"), + 0x46 => Ok("CHAINID"), + 0x47 => Ok("SELFBALANCE"), + 0x48 => Ok("BASEFEE"), + #[cfg(feature = "eth_mainnet")] + 0x49 => Ok("BLOBHASH"), + #[cfg(feature = "eth_mainnet")] + 0x4a => Ok("BLOBBASEFEE"), + 0x50 => Ok("POP"), + 0x51 => Ok("MLOAD"), + 0x52 => Ok("MSTORE"), + 0x53 => Ok("MSTORE8"), + 0x54 => Ok("SLOAD"), + 0x55 => Ok("SSTORE"), + 0x56 => Ok("JUMP"), + 0x57 => Ok("JUMPI"), + 0x58 => Ok("PC"), + 0x59 => Ok("MSIZE"), + 0x5a => Ok("GAS"), + 0x5b => Ok("JUMPDEST"), + 0x5c => Ok("TLOAD"), + 0x5d => Ok("TSTORE"), + 0x5e => Ok("MCOPY"), + 0x5f => Ok("PUSH0"), + 0x60 => Ok("PUSH1"), + 0x61 => Ok("PUSH2"), + 0x62 => Ok("PUSH3"), + 0x63 => Ok("PUSH4"), + 0x64 => Ok("PUSH5"), + 0x65 => Ok("PUSH6"), + 0x66 => Ok("PUSH7"), + 0x67 => Ok("PUSH8"), + 0x68 => Ok("PUSH9"), + 0x69 => Ok("PUSH10"), + 0x6a => Ok("PUSH11"), + 0x6b => Ok("PUSH12"), + 0x6c => Ok("PUSH13"), + 0x6d => Ok("PUSH14"), + 0x6e => Ok("PUSH15"), + 0x6f => Ok("PUSH16"), + 0x70 => Ok("PUSH17"), + 0x71 => Ok("PUSH18"), + 0x72 => Ok("PUSH19"), + 0x73 => Ok("PUSH20"), + 0x74 => Ok("PUSH21"), + 0x75 => Ok("PUSH22"), + 0x76 => Ok("PUSH23"), + 0x77 => Ok("PUSH24"), + 0x78 => Ok("PUSH25"), + 0x79 => Ok("PUSH26"), + 0x7a => Ok("PUSH27"), + 0x7b => Ok("PUSH28"), + 0x7c => Ok("PUSH29"), + 0x7d => Ok("PUSH30"), + 0x7e => Ok("PUSH31"), + 0x7f => Ok("PUSH32"), + 0x80 => Ok("DUP1"), + 0x81 => Ok("DUP2"), + 0x82 => Ok("DUP3"), + 0x83 => Ok("DUP4"), + 0x84 => Ok("DUP5"), + 0x85 => Ok("DUP6"), + 0x86 => Ok("DUP7"), + 0x87 => Ok("DUP8"), + 0x88 => Ok("DUP9"), + 0x89 => Ok("DUP10"), + 0x8a => Ok("DUP11"), + 0x8b => Ok("DUP12"), + 0x8c => Ok("DUP13"), + 0x8d => Ok("DUP14"), + 0x8e => Ok("DUP15"), + 0x8f => Ok("DUP16"), + 0x90 => Ok("SWAP1"), + 0x91 => Ok("SWAP2"), + 0x92 => Ok("SWAP3"), + 0x93 => Ok("SWAP4"), + 0x94 => Ok("SWAP5"), + 0x95 => Ok("SWAP6"), + 0x96 => Ok("SWAP7"), + 0x97 => Ok("SWAP8"), + 0x98 => Ok("SWAP9"), + 0x99 => Ok("SWAP10"), + 0x9a => Ok("SWAP11"), + 0x9b => Ok("SWAP12"), + 0x9c => Ok("SWAP13"), + 0x9d => Ok("SWAP14"), + 0x9e => Ok("SWAP15"), + 0x9f => Ok("SWAP16"), + 0xa0 => Ok("LOG0"), + 0xa1 => Ok("LOG1"), + 0xa2 => Ok("LOG2"), + 0xa3 => Ok("LOG3"), + 0xa4 => Ok("LOG4"), + 0xf0 => Ok("CREATE"), + 0xf1 => Ok("CALL"), + 0xf2 => Ok("CALLCODE"), + 0xf3 => Ok("RETURN"), + 0xf4 => Ok("DELEGATECALL"), + 0xf5 => Ok("CREATE2"), + 0xfa => Ok("STATICCALL"), + 0xfd => Ok("REVERT"), + 0xff => Ok("SELFDESTRUCT"), + _ => Err(anyhow!("Invalid opcode: {}", opcode)), + } +} + #[cfg(test)] mod tests { use ethereum_types::U256; @@ -792,7 +1154,7 @@ mod tests { 0x60, 0xff, 0x60, 0x0, 0x52, 0x60, 0, 0x51, 0x60, 0x1, 0x51, 0x60, 0x42, 0x60, 0x27, 0x53, ]; - let mut interpreter: Interpreter = Interpreter::new(0, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(0, vec![], None, &None); interpreter.set_code(1, code.to_vec()); diff --git a/evm_arithmetization/src/cpu/kernel/tests/account_code.rs b/evm_arithmetization/src/cpu/kernel/tests/account_code.rs index 8af4ed4a8..ce89d093c 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/account_code.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/account_code.rs @@ -270,7 +270,7 @@ fn test_extcodesize() -> Result<()> { let code = random_code(); let account = test_account(&code); - let mut interpreter: Interpreter = Interpreter::new(0, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(0, vec![], None, &None); let address: Address = thread_rng().gen(); // Prepare the interpreter by inserting the account in the state trie. prepare_interpreter(&mut interpreter, address, &account)?; @@ -305,7 +305,7 @@ fn test_extcodecopy() -> Result<()> { let code = random_code(); let account = test_account(&code); - let mut interpreter: Interpreter = Interpreter::new(0, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(0, vec![], None, &None); let address: Address = thread_rng().gen(); // Prepare the interpreter by inserting the account in the state trie. prepare_interpreter(&mut interpreter, address, &account)?; @@ -489,7 +489,7 @@ fn sstore() -> Result<()> { }; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); // Pre-initialize the accessed addresses list. let init_accessed_addresses = KERNEL.global_labels["init_access_lists"]; @@ -583,7 +583,7 @@ fn sload() -> Result<()> { }; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); // Pre-initialize the accessed addresses list. let init_accessed_addresses = KERNEL.global_labels["init_access_lists"]; diff --git a/evm_arithmetization/src/cpu/kernel/tests/add11.rs b/evm_arithmetization/src/cpu/kernel/tests/add11.rs index 683987244..5323cb8d0 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/add11.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/add11.rs @@ -197,8 +197,13 @@ fn test_add11_yml() { let initial_stack = vec![]; let initial_offset = KERNEL.global_labels["init"]; - let mut interpreter: Interpreter = - Interpreter::new_with_generation_inputs(initial_offset, initial_stack, &inputs, None); + let mut interpreter: Interpreter = Interpreter::new_with_generation_inputs( + initial_offset, + initial_stack, + &inputs, + None, + &None, + ); interpreter.set_is_kernel(true); interpreter.run().expect("Proving add11 failed."); @@ -374,8 +379,13 @@ fn test_add11_yml_with_exception() { let initial_stack = vec![]; let initial_offset = KERNEL.global_labels["init"]; - let mut interpreter: Interpreter = - Interpreter::new_with_generation_inputs(initial_offset, initial_stack, &inputs, None); + let mut interpreter: Interpreter = Interpreter::new_with_generation_inputs( + initial_offset, + initial_stack, + &inputs, + None, + &None, + ); interpreter.set_is_kernel(true); interpreter diff --git a/evm_arithmetization/src/cpu/kernel/tests/balance.rs b/evm_arithmetization/src/cpu/kernel/tests/balance.rs index fc4d63347..db1796d50 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/balance.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/balance.rs @@ -26,7 +26,7 @@ fn test_balance() -> Result<()> { let balance = U256(rng.gen()); let account = test_account(balance); - let mut interpreter: Interpreter = Interpreter::new(0, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(0, vec![], None, &None); let address: Address = rng.gen(); // Prepare the interpreter by inserting the account in the state trie. prepare_interpreter(&mut interpreter, address, &account)?; diff --git a/evm_arithmetization/src/cpu/kernel/tests/bignum/mod.rs b/evm_arithmetization/src/cpu/kernel/tests/bignum/mod.rs index efb37bcd3..806cf5d75 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/bignum/mod.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/bignum/mod.rs @@ -100,7 +100,7 @@ fn run_test(fn_label: &str, memory: Vec, stack: Vec) -> Result<(Vec< initial_stack.push(retdest); initial_stack.reverse(); - let mut interpreter: Interpreter = Interpreter::new(fn_label, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(fn_label, initial_stack, None, &None); interpreter.set_current_general_memory(memory); interpreter.run()?; diff --git a/evm_arithmetization/src/cpu/kernel/tests/blobhash.rs b/evm_arithmetization/src/cpu/kernel/tests/blobhash.rs index 73bb7ee54..afcbca896 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/blobhash.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/blobhash.rs @@ -19,7 +19,7 @@ fn test_valid_blobhash() -> Result<()> { let index = 3; let target_hash = versioned_hashes[index]; - let mut interpreter: Interpreter = Interpreter::new(blobhash_label, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(blobhash_label, vec![], None, &None); interpreter .generation_state .memory @@ -60,7 +60,7 @@ fn test_invalid_blobhash() -> Result<()> { let index = 7; let target_hash = U256::zero(); // out of bound indexing yields 0. - let mut interpreter: Interpreter = Interpreter::new(blobhash_label, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(blobhash_label, vec![], None, &None); interpreter .generation_state .memory diff --git a/evm_arithmetization/src/cpu/kernel/tests/block_hash.rs b/evm_arithmetization/src/cpu/kernel/tests/block_hash.rs index 9aac4d247..3da03bff3 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/block_hash.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/block_hash.rs @@ -20,7 +20,8 @@ fn test_correct_block_hash() -> Result<()> { let hashes: Vec = vec![U256::from_big_endian(&thread_rng().gen::().0); 257]; - let mut interpreter: Interpreter = Interpreter::new(blockhash_label, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(blockhash_label, initial_stack, None, &None); interpreter.set_memory_segment(Segment::BlockHashes, hashes[0..256].to_vec()); interpreter.set_global_metadata_field(GlobalMetadata::BlockCurrentHash, hashes[256]); interpreter.set_global_metadata_field(GlobalMetadata::BlockNumber, 256.into()); @@ -49,7 +50,8 @@ fn test_big_index_block_hash() -> Result<()> { let hashes: Vec = vec![U256::from_big_endian(&thread_rng().gen::().0); 257]; - let mut interpreter: Interpreter = Interpreter::new(blockhash_label, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(blockhash_label, initial_stack, None, &None); interpreter.set_memory_segment(Segment::BlockHashes, hashes[0..256].to_vec()); interpreter.set_global_metadata_field(GlobalMetadata::BlockCurrentHash, hashes[256]); interpreter.set_global_metadata_field(GlobalMetadata::BlockNumber, cur_block_number.into()); @@ -79,7 +81,8 @@ fn test_small_index_block_hash() -> Result<()> { let hashes: Vec = vec![U256::from_big_endian(&thread_rng().gen::().0); 257]; - let mut interpreter: Interpreter = Interpreter::new(blockhash_label, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(blockhash_label, initial_stack, None, &None); interpreter.set_memory_segment(Segment::BlockHashes, hashes[0..256].to_vec()); interpreter.set_global_metadata_field(GlobalMetadata::BlockCurrentHash, hashes[256]); interpreter.set_global_metadata_field(GlobalMetadata::BlockNumber, cur_block_number.into()); @@ -107,7 +110,8 @@ fn test_block_hash_with_overflow() -> Result<()> { let hashes: Vec = vec![U256::from_big_endian(&thread_rng().gen::().0); 257]; - let mut interpreter: Interpreter = Interpreter::new(blockhash_label, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(blockhash_label, initial_stack, None, &None); interpreter.set_memory_segment(Segment::BlockHashes, hashes[0..256].to_vec()); interpreter.set_global_metadata_field(GlobalMetadata::BlockCurrentHash, hashes[256]); interpreter.set_global_metadata_field(GlobalMetadata::BlockNumber, cur_block_number.into()); diff --git a/evm_arithmetization/src/cpu/kernel/tests/bls381.rs b/evm_arithmetization/src/cpu/kernel/tests/bls381.rs index f61229796..11465a500 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/bls381.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/bls381.rs @@ -117,7 +117,8 @@ fn test_kzg_peval_precompile() -> Result<()> { stack.reverse(); let verify_kzg_proof = KERNEL.global_labels["verify_kzg_proof"]; - let mut interpreter: Interpreter = Interpreter::new(verify_kzg_proof, stack, None); + let mut interpreter: Interpreter = + Interpreter::new(verify_kzg_proof, stack, None, &None); interpreter.halt_offsets = vec![ KERNEL.global_labels["store_kzg_verification"], KERNEL.global_labels["fault_exception"], diff --git a/evm_arithmetization/src/cpu/kernel/tests/bn254.rs b/evm_arithmetization/src/cpu/kernel/tests/bn254.rs index b71b37c9a..aa6891e56 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/bn254.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/bn254.rs @@ -325,7 +325,8 @@ fn test_ecpairing_precompile_invalid_input() -> Result<()> { stack.reverse(); for bytes in ECPAIRING_PRECOMPILE_INVALID_INPUTS.iter() { - let mut interpreter: Interpreter = Interpreter::new(pairing_label, stack.clone(), None); + let mut interpreter: Interpreter = + Interpreter::new(pairing_label, stack.clone(), None, &None); let preloaded_memory = vec![ U256::from_big_endian(&bytes[0..32]), // Px U256::from_big_endian(&bytes[32..64]), // Py diff --git a/evm_arithmetization/src/cpu/kernel/tests/core/access_lists.rs b/evm_arithmetization/src/cpu/kernel/tests/core/access_lists.rs index 9a52301e3..2ca46b79a 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/core/access_lists.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/core/access_lists.rs @@ -19,7 +19,7 @@ fn test_init_access_lists() -> Result<()> { // Check the initial state of the access list in the kernel. let initial_stack = vec![0xdeadbeefu32.into()]; - let mut interpreter = Interpreter::::new(init_label, initial_stack, None); + let mut interpreter = Interpreter::::new(init_label, initial_stack, None, &None); interpreter.run()?; assert!(interpreter.stack().is_empty()); @@ -64,7 +64,7 @@ fn test_list_iterator() -> Result<()> { let init_label = KERNEL.global_labels["init_access_lists"]; let initial_stack = vec![0xdeadbeefu32.into()]; - let mut interpreter = Interpreter::::new(init_label, initial_stack, None); + let mut interpreter = Interpreter::::new(init_label, initial_stack, None, &None); interpreter.run()?; // test the list iterator @@ -90,7 +90,7 @@ fn test_insert_address() -> Result<()> { // Test for address already in list. let initial_stack = vec![0xdeadbeefu32.into()]; - let mut interpreter = Interpreter::::new(init_label, initial_stack, None); + let mut interpreter = Interpreter::::new(init_label, initial_stack, None, &None); interpreter.run()?; let insert_accessed_addresses = KERNEL.global_labels["insert_accessed_addresses"]; @@ -127,7 +127,7 @@ fn test_insert_accessed_addresses() -> Result<()> { // Test for address already in list. let initial_stack = vec![0xdeadbeefu32.into()]; - let mut interpreter = Interpreter::::new(init_access_lists, initial_stack, None); + let mut interpreter = Interpreter::::new(init_access_lists, initial_stack, None, &None); interpreter.run()?; let insert_accessed_addresses = KERNEL.global_labels["insert_accessed_addresses"]; @@ -214,7 +214,7 @@ fn test_insert_accessed_storage_keys() -> Result<()> { // Test for address already in list. let initial_stack = vec![0xdeadbeefu32.into()]; - let mut interpreter = Interpreter::::new(init_access_lists, initial_stack, None); + let mut interpreter = Interpreter::::new(init_access_lists, initial_stack, None, &None); interpreter.run()?; let insert_accessed_storage_keys = KERNEL.global_labels["insert_accessed_storage_keys"]; diff --git a/evm_arithmetization/src/cpu/kernel/tests/core/create_addresses.rs b/evm_arithmetization/src/cpu/kernel/tests/core/create_addresses.rs index 951884527..4b3dba182 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/core/create_addresses.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/core/create_addresses.rs @@ -20,7 +20,8 @@ fn test_get_create_address() -> Result<()> { let expected_addr = U256::from_big_endian(&hex!("3f09c73a5ed19289fb9bdc72f1742566df146f56")); let initial_stack = vec![retaddr, nonce, sender]; - let mut interpreter: Interpreter = Interpreter::new(get_create_address, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(get_create_address, initial_stack, None, &None); interpreter.run()?; assert_eq!(interpreter.stack(), &[expected_addr]); @@ -107,7 +108,7 @@ fn test_get_create2_address() -> Result<()> { { let initial_stack = vec![retaddr, salt, U256::from(code_hash.0), sender]; let mut interpreter: Interpreter = - Interpreter::new(get_create2_address, initial_stack, None); + Interpreter::new(get_create2_address, initial_stack, None, &None); interpreter.run()?; assert_eq!(interpreter.stack(), &[expected_addr]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/core/intrinsic_gas.rs b/evm_arithmetization/src/cpu/kernel/tests/core/intrinsic_gas.rs index 0298affee..c7ebc1958 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/core/intrinsic_gas.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/core/intrinsic_gas.rs @@ -17,13 +17,14 @@ fn test_intrinsic_gas() -> Result<()> { // Contract creation transaction. let initial_stack = vec![0xdeadbeefu32.into()]; let mut interpreter: Interpreter = - Interpreter::new(intrinsic_gas, initial_stack.clone(), None); + Interpreter::new(intrinsic_gas, initial_stack.clone(), None, &None); interpreter.set_global_metadata_field(GlobalMetadata::ContractCreation, U256::one()); interpreter.run()?; assert_eq!(interpreter.stack(), vec![(GAS_TX + GAS_TXCREATE).into()]); // Message transaction. - let mut interpreter: Interpreter = Interpreter::new(intrinsic_gas, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(intrinsic_gas, initial_stack, None, &None); interpreter.set_txn_field(NormalizedTxnField::To, 123.into()); interpreter.run()?; assert_eq!(interpreter.stack(), vec![GAS_TX.into()]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/core/jumpdest_analysis.rs b/evm_arithmetization/src/cpu/kernel/tests/core/jumpdest_analysis.rs index f2d00ede5..047a553bf 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/core/jumpdest_analysis.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/core/jumpdest_analysis.rs @@ -86,7 +86,7 @@ fn test_jumpdest_analysis() -> Result<()> { .chain(std::iter::once(true)), ); - let mut interpreter: Interpreter = Interpreter::new(jumpdest_analysis, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(jumpdest_analysis, vec![], None, &None); let code_len = code.len(); interpreter.set_code(CONTEXT, code); @@ -173,7 +173,7 @@ fn test_packed_verification() -> Result<()> { U256::one(), ]; let mut interpreter: Interpreter = - Interpreter::new(write_table_if_jumpdest, initial_stack.clone(), None); + Interpreter::new(write_table_if_jumpdest, initial_stack.clone(), None, &None); interpreter.set_code(CONTEXT, code.clone()); interpreter.generation_state.jumpdest_table = Some(HashMap::from([(3, vec![1, 33])])); @@ -186,7 +186,7 @@ fn test_packed_verification() -> Result<()> { for i in 1..=32 { code[i] += 1; let mut interpreter: Interpreter = - Interpreter::new(write_table_if_jumpdest, initial_stack.clone(), None); + Interpreter::new(write_table_if_jumpdest, initial_stack.clone(), None, &None); interpreter.set_code(CONTEXT, code.clone()); interpreter.generation_state.jumpdest_table = Some(HashMap::from([(3, vec![1, 33])])); @@ -235,7 +235,8 @@ fn test_verify_non_jumpdest() -> Result<()> { // jumpdest for i in 8..code_len - 1 { code[i] += 1; - let mut interpreter: Interpreter = Interpreter::new(verify_non_jumpdest, vec![], None); + let mut interpreter: Interpreter = + Interpreter::new(verify_non_jumpdest, vec![], None, &None); interpreter.generation_state.registers.context = CONTEXT; interpreter.set_code(CONTEXT, code.clone()); diff --git a/evm_arithmetization/src/cpu/kernel/tests/ecc/curve_ops.rs b/evm_arithmetization/src/cpu/kernel/tests/ecc/curve_ops.rs index 56f2c48bc..6fc064560 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/ecc/curve_ops.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/ecc/curve_ops.rs @@ -185,7 +185,7 @@ mod bn { let mut initial_stack = u256ify(["0xdeadbeef"])?; initial_stack.push(k); - let mut int: Interpreter = Interpreter::new(glv, initial_stack, None); + let mut int: Interpreter = Interpreter::new(glv, initial_stack, None, &None); int.run()?; assert_eq!(line, int.stack()); @@ -203,7 +203,7 @@ mod bn { "0x10d7cf0621b6e42c1dbb421f5ef5e1936ca6a87b38198d1935be31e28821d171", "0x11b7d55f16aaac07de9a0ed8ac2e8023570dbaa78571fc95e553c4b3ba627689", ])?; - let mut int: Interpreter = Interpreter::new(precompute, initial_stack, None); + let mut int: Interpreter = Interpreter::new(precompute, initial_stack, None, &None); int.run()?; let mut computed_table = Vec::new(); @@ -356,7 +356,7 @@ mod secp { let mut initial_stack = u256ify(["0xdeadbeef"])?; initial_stack.push(k); - let mut int: Interpreter = Interpreter::new(glv, initial_stack, None); + let mut int: Interpreter = Interpreter::new(glv, initial_stack, None, &None); int.run()?; assert_eq!(line, int.stack()); diff --git a/evm_arithmetization/src/cpu/kernel/tests/exp.rs b/evm_arithmetization/src/cpu/kernel/tests/exp.rs index 746ba98b3..0b7dfae87 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/exp.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/exp.rs @@ -17,7 +17,7 @@ fn test_exp() -> Result<()> { // Random input let initial_stack = vec![0xDEADBEEFu32.into(), b, a]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack.clone(), None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack.clone(), None, &None); let stack_with_kernel = run_interpreter::(exp, initial_stack)?.stack(); diff --git a/evm_arithmetization/src/cpu/kernel/tests/init_exc_stop.rs b/evm_arithmetization/src/cpu/kernel/tests/init_exc_stop.rs index 2dea58b55..9fa6f72c3 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/init_exc_stop.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/init_exc_stop.rs @@ -104,8 +104,13 @@ fn test_init_exc_stop() { }; let initial_stack = vec![]; let initial_offset = KERNEL.global_labels["init"]; - let mut interpreter: Interpreter = - Interpreter::new_with_generation_inputs(initial_offset, initial_stack, &inputs, None); + let mut interpreter: Interpreter = Interpreter::new_with_generation_inputs( + initial_offset, + initial_stack, + &inputs, + None, + &None, + ); interpreter.halt_offsets = vec![KERNEL.global_labels["main"]]; interpreter.set_is_kernel(true); interpreter.run().expect("Running dummy init failed."); diff --git a/evm_arithmetization/src/cpu/kernel/tests/log.rs b/evm_arithmetization/src/cpu/kernel/tests/log.rs index 9a4cad634..9427dde8e 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/log.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/log.rs @@ -26,7 +26,7 @@ fn test_log_0() -> Result<()> { U256::from_big_endian(&address.to_fixed_bytes()), ]; - let mut interpreter: Interpreter = Interpreter::new(logs_entry, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(logs_entry, initial_stack, None, &None); interpreter.set_global_metadata_field(GlobalMetadata::LogsLen, 0.into()); interpreter.set_global_metadata_field(GlobalMetadata::LogsDataLen, 0.into()); @@ -70,7 +70,7 @@ fn test_log_2() -> Result<()> { U256::from_big_endian(&address.to_fixed_bytes()), ]; - let mut interpreter: Interpreter = Interpreter::new(logs_entry, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(logs_entry, initial_stack, None, &None); interpreter.set_global_metadata_field(GlobalMetadata::LogsLen, 2.into()); interpreter.set_global_metadata_field(GlobalMetadata::LogsDataLen, 5.into()); @@ -134,7 +134,7 @@ fn test_log_4() -> Result<()> { U256::from_big_endian(&address.to_fixed_bytes()), ]; - let mut interpreter: Interpreter = Interpreter::new(logs_entry, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(logs_entry, initial_stack, None, &None); interpreter.set_global_metadata_field(GlobalMetadata::LogsLen, 2.into()); interpreter.set_global_metadata_field(GlobalMetadata::LogsDataLen, 5.into()); @@ -197,7 +197,7 @@ fn test_log_5() -> Result<()> { U256::from_big_endian(&address.to_fixed_bytes()), ]; - let mut interpreter: Interpreter = Interpreter::new(logs_entry, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(logs_entry, initial_stack, None, &None); interpreter.set_global_metadata_field(GlobalMetadata::LogsLen, 0.into()); interpreter.set_global_metadata_field(GlobalMetadata::LogsDataLen, 0.into()); diff --git a/evm_arithmetization/src/cpu/kernel/tests/mcopy.rs b/evm_arithmetization/src/cpu/kernel/tests/mcopy.rs index 87f00bada..d10737401 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mcopy.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mcopy.rs @@ -22,7 +22,7 @@ fn test_mcopy( let kexit_info = U256::from(0xdeadbeefu32) + (U256::from(u64::from(true)) << 32); let initial_stack = vec![size.into(), offset.into(), dest_offset.into(), kexit_info]; - let mut interpreter: Interpreter = Interpreter::new(sys_mcopy, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(sys_mcopy, initial_stack, None, &None); interpreter.set_context_metadata_field( 0, ContextMetadata::GasLimit, diff --git a/evm_arithmetization/src/cpu/kernel/tests/mod.rs b/evm_arithmetization/src/cpu/kernel/tests/mod.rs index 2b983d099..be41e0cf9 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mod.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mod.rs @@ -59,7 +59,7 @@ pub(crate) fn run_interpreter( initial_offset: usize, initial_stack: Vec, ) -> anyhow::Result> { - let mut interpreter = Interpreter::new(initial_offset, initial_stack, None); + let mut interpreter = Interpreter::new(initial_offset, initial_stack, None, &None); interpreter.run()?; Ok(interpreter) } @@ -78,7 +78,7 @@ pub(crate) fn run_interpreter_with_memory( let label = KERNEL.global_labels[&memory_init.label]; let mut stack = memory_init.stack; stack.reverse(); - let mut interpreter = Interpreter::new(label, stack, None); + let mut interpreter = Interpreter::new(label, stack, None, &None); for (pointer, data) in memory_init.memory { for (i, term) in data.iter().enumerate() { interpreter.generation_state.memory.set( diff --git a/evm_arithmetization/src/cpu/kernel/tests/mpt/delete.rs b/evm_arithmetization/src/cpu/kernel/tests/mpt/delete.rs index 72edba94f..422dca8ca 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mpt/delete.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mpt/delete.rs @@ -103,7 +103,7 @@ fn test_state_trie( let mpt_hash_state_trie = KERNEL.global_labels["mpt_hash_state_trie"]; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/mpt/hash.rs b/evm_arithmetization/src/cpu/kernel/tests/mpt/hash.rs index fdb342805..fa9803b95 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mpt/hash.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mpt/hash.rs @@ -113,7 +113,7 @@ fn test_state_trie(trie_inputs: TrieInputs) -> Result<()> { let mpt_hash_state_trie = KERNEL.global_labels["mpt_hash_state_trie"]; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/mpt/hex_prefix.rs b/evm_arithmetization/src/cpu/kernel/tests/mpt/hex_prefix.rs index 5f9c4252d..3c997ad51 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mpt/hex_prefix.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mpt/hex_prefix.rs @@ -16,7 +16,7 @@ fn hex_prefix_even_nonterminated() -> Result<()> { let num_nibbles = 6.into(); let rlp_pos = U256::from(Segment::RlpRaw as usize); let initial_stack = vec![retdest, terminated, packed_nibbles, num_nibbles, rlp_pos]; - let mut interpreter: Interpreter = Interpreter::new(hex_prefix, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(hex_prefix, initial_stack, None, &None); interpreter.run()?; assert_eq!(interpreter.stack(), vec![rlp_pos + U256::from(5)]); @@ -44,7 +44,7 @@ fn hex_prefix_odd_terminated() -> Result<()> { let num_nibbles = 5.into(); let rlp_pos = U256::from(Segment::RlpRaw as usize); let initial_stack = vec![retdest, terminated, packed_nibbles, num_nibbles, rlp_pos]; - let mut interpreter: Interpreter = Interpreter::new(hex_prefix, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(hex_prefix, initial_stack, None, &None); interpreter.run()?; assert_eq!(interpreter.stack(), vec![rlp_pos + U256::from(4)]); @@ -71,7 +71,7 @@ fn hex_prefix_odd_terminated_tiny() -> Result<()> { let num_nibbles = 1.into(); let rlp_pos = U256::from(Segment::RlpRaw as usize + 2); let initial_stack = vec![retdest, terminated, packed_nibbles, num_nibbles, rlp_pos]; - let mut interpreter: Interpreter = Interpreter::new(hex_prefix, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(hex_prefix, initial_stack, None, &None); interpreter.run()?; assert_eq!( interpreter.stack(), diff --git a/evm_arithmetization/src/cpu/kernel/tests/mpt/insert.rs b/evm_arithmetization/src/cpu/kernel/tests/mpt/insert.rs index 7428044d1..48c4cfb74 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mpt/insert.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mpt/insert.rs @@ -178,7 +178,7 @@ fn test_state_trie( let check_state_trie = KERNEL.global_labels["check_final_state_trie"]; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/mpt/linked_list.rs b/evm_arithmetization/src/cpu/kernel/tests/mpt/linked_list.rs index b31c05233..89ca4fb8f 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mpt/linked_list.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mpt/linked_list.rs @@ -30,7 +30,7 @@ fn init_logger() { fn test_init_linked_lists() -> Result<()> { init_logger(); - let interpreter = Interpreter::::new(0, vec![], None); + let interpreter = Interpreter::::new(0, vec![], None, &None); // Check the initial accounts linked list let acc_addr_list: Vec = (0..4) @@ -78,7 +78,7 @@ fn test_init_linked_lists() -> Result<()> { fn test_list_iterator() -> Result<()> { init_logger(); - let interpreter = Interpreter::::new(0, vec![], None); + let interpreter = Interpreter::::new(0, vec![], None, &None); // test the list iterator let accounts_mem = interpreter @@ -133,7 +133,7 @@ fn test_list_iterator() -> Result<()> { fn test_insert_account() -> Result<()> { init_logger(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); // Initialize the accounts linked list. let init_accounts_ll = vec![ @@ -215,7 +215,7 @@ fn test_insert_account() -> Result<()> { fn test_insert_storage() -> Result<()> { init_logger(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); // Initialize the storage linked list. let init_storage_ll = vec![ @@ -306,7 +306,7 @@ fn test_insert_storage() -> Result<()> { fn test_insert_and_delete_accounts() -> Result<()> { init_logger(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); // Initialize the accounts linked list. let init_accounts_ll = vec![ @@ -490,7 +490,7 @@ fn test_insert_and_delete_accounts() -> Result<()> { fn test_insert_and_delete_storage() -> Result<()> { init_logger(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); // Initialize the storage linked list. let init_storage_ll = vec![ diff --git a/evm_arithmetization/src/cpu/kernel/tests/mpt/load.rs b/evm_arithmetization/src/cpu/kernel/tests/mpt/load.rs index 9d04700bf..92fc78f78 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mpt/load.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mpt/load.rs @@ -25,7 +25,7 @@ fn load_all_mpts_empty() -> Result<()> { }; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); @@ -62,7 +62,7 @@ fn load_all_mpts_leaf() -> Result<()> { }; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); @@ -114,7 +114,7 @@ fn load_all_mpts_hash() -> Result<()> { }; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); @@ -152,7 +152,7 @@ fn load_all_mpts_empty_branch() -> Result<()> { }; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); @@ -204,7 +204,7 @@ fn load_all_mpts_ext_to_leaf() -> Result<()> { }; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); @@ -256,7 +256,7 @@ fn load_mpt_txn_trie() -> Result<()> { }; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/mpt/read.rs b/evm_arithmetization/src/cpu/kernel/tests/mpt/read.rs index 8390c6a59..9dce2df79 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/mpt/read.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/mpt/read.rs @@ -21,7 +21,7 @@ fn mpt_read() -> Result<()> { let mpt_read = KERNEL.global_labels["mpt_read"]; let initial_stack = vec![]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/packing.rs b/evm_arithmetization/src/cpu/kernel/tests/packing.rs index 79cffaf4d..7a65657fe 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/packing.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/packing.rs @@ -16,7 +16,8 @@ fn test_mstore_unpacking() -> Result<()> { let addr = (Segment::TxnData as u64).into(); let initial_stack = vec![retdest, len, value, addr]; - let mut interpreter: Interpreter = Interpreter::new(mstore_unpacking, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(mstore_unpacking, initial_stack, None, &None); interpreter.run()?; assert_eq!(interpreter.stack(), vec![addr + U256::from(4)]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/receipt.rs b/evm_arithmetization/src/cpu/kernel/tests/receipt.rs index 6482cfd59..dcb33aafe 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/receipt.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/receipt.rs @@ -49,7 +49,8 @@ fn test_process_receipt() -> Result<()> { leftover_gas, success, ]; - let mut interpreter: Interpreter = Interpreter::new(process_receipt, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(process_receipt, initial_stack, None, &None); interpreter.set_memory_segment( Segment::LogsData, vec![ @@ -137,7 +138,8 @@ fn test_receipt_encoding() -> Result<()> { // Address at which the encoding is written. let rlp_addr = U256::from(Segment::RlpRaw as usize); let initial_stack: Vec = vec![retdest, 0.into(), 0.into(), rlp_addr]; - let mut interpreter: Interpreter = Interpreter::new(encode_receipt, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(encode_receipt, initial_stack, None, &None); // Write data to memory. let expected_bloom_bytes = vec![ @@ -257,7 +259,7 @@ fn test_receipt_bloom_filter() -> Result<()> { // Set logs memory and initialize TxnBloom and BlockBloom segments. let initial_stack: Vec = vec![retdest]; - let mut interpreter: Interpreter = Interpreter::new(logs_bloom, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(logs_bloom, initial_stack, None, &None); let mut logs = vec![ 0.into(), // unused addr, @@ -419,7 +421,7 @@ fn test_mpt_insert_receipt() -> Result<()> { receipt.push(num_logs.into()); // num_logs receipt.extend(logs_0.clone()); - let mut interpreter: Interpreter = Interpreter::new(0, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(0, vec![], None, &None); initialize_mpts(&mut interpreter, &trie_inputs); // If TrieData is empty, we need to push 0 because the first value is always 0. @@ -578,7 +580,7 @@ fn test_bloom_two_logs() -> Result<()> { ] .into(), ]; - let mut interpreter: Interpreter = Interpreter::new(logs_bloom, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(logs_bloom, initial_stack, None, &None); interpreter.set_memory_segment(Segment::TxnBloom, vec![0.into(); 256]); // Initialize transaction Bloom filter. interpreter.set_memory_segment(Segment::LogsData, logs); interpreter.set_memory_segment(Segment::Logs, vec![0.into(), 4.into()]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/rlp/decode.rs b/evm_arithmetization/src/cpu/kernel/tests/rlp/decode.rs index 9fa533c71..70c2da076 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/rlp/decode.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/rlp/decode.rs @@ -15,7 +15,7 @@ fn test_decode_rlp_string_len_short() -> Result<()> { U256::from(Segment::RlpRaw as usize + 2), ]; let mut interpreter: Interpreter = - Interpreter::new(decode_rlp_string_len, initial_stack, None); + Interpreter::new(decode_rlp_string_len, initial_stack, None, &None); // A couple dummy bytes, followed by "0x70" which is its own encoding. interpreter.set_rlp_memory(vec![123, 234, 0x70]); @@ -36,7 +36,7 @@ fn test_decode_rlp_string_len_medium() -> Result<()> { U256::from(Segment::RlpRaw as usize + 2), ]; let mut interpreter: Interpreter = - Interpreter::new(decode_rlp_string_len, initial_stack, None); + Interpreter::new(decode_rlp_string_len, initial_stack, None, &None); // A couple dummy bytes, followed by the RLP encoding of "1 2 3 4 5". interpreter.set_rlp_memory(vec![123, 234, 0x85, 1, 2, 3, 4, 5]); @@ -57,7 +57,7 @@ fn test_decode_rlp_string_len_long() -> Result<()> { U256::from(Segment::RlpRaw as usize + 2), ]; let mut interpreter: Interpreter = - Interpreter::new(decode_rlp_string_len, initial_stack, None); + Interpreter::new(decode_rlp_string_len, initial_stack, None, &None); // The RLP encoding of the string "1 2 3 ... 56". interpreter.set_rlp_memory(vec![ @@ -79,7 +79,7 @@ fn test_decode_rlp_list_len_short() -> Result<()> { let initial_stack = vec![0xDEADBEEFu32.into(), U256::from(Segment::RlpRaw as usize)]; let mut interpreter: Interpreter = - Interpreter::new(decode_rlp_list_len, initial_stack, None); + Interpreter::new(decode_rlp_list_len, initial_stack, None, &None); // The RLP encoding of [1, 2, [3, 4]]. interpreter.set_rlp_memory(vec![0xc5, 1, 2, 0xc2, 3, 4]); @@ -97,7 +97,7 @@ fn test_decode_rlp_list_len_long() -> Result<()> { let initial_stack = vec![0xDEADBEEFu32.into(), U256::from(Segment::RlpRaw as usize)]; let mut interpreter: Interpreter = - Interpreter::new(decode_rlp_list_len, initial_stack, None); + Interpreter::new(decode_rlp_list_len, initial_stack, None, &None); // The RLP encoding of [1, ..., 56]. interpreter.set_rlp_memory(vec![ @@ -118,7 +118,8 @@ fn test_decode_rlp_scalar() -> Result<()> { let decode_rlp_scalar = KERNEL.global_labels["decode_rlp_scalar"]; let initial_stack = vec![0xDEADBEEFu32.into(), U256::from(Segment::RlpRaw as usize)]; - let mut interpreter: Interpreter = Interpreter::new(decode_rlp_scalar, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(decode_rlp_scalar, initial_stack, None, &None); // The RLP encoding of "12 34 56". interpreter.set_rlp_memory(vec![0x83, 0x12, 0x34, 0x56]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/rlp/encode.rs b/evm_arithmetization/src/cpu/kernel/tests/rlp/encode.rs index a3cf8699b..80eee2d73 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/rlp/encode.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/rlp/encode.rs @@ -14,7 +14,8 @@ fn test_encode_rlp_scalar_small() -> Result<()> { let scalar = 42.into(); let pos = U256::from(Segment::RlpRaw as usize + 2); let initial_stack = vec![retdest, scalar, pos]; - let mut interpreter: Interpreter = Interpreter::new(encode_rlp_scalar, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(encode_rlp_scalar, initial_stack, None, &None); interpreter.run()?; let expected_stack = vec![pos + U256::from(1)]; // pos' = pos + rlp_len = 2 + 1 @@ -37,7 +38,8 @@ fn test_encode_rlp_scalar_medium() -> Result<()> { let scalar = 0x12345.into(); let pos = U256::from(Segment::RlpRaw as usize + 2); let initial_stack = vec![retdest, scalar, pos]; - let mut interpreter: Interpreter = Interpreter::new(encode_rlp_scalar, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(encode_rlp_scalar, initial_stack, None, &None); interpreter.run()?; let expected_stack = vec![pos + U256::from(4)]; // pos' = pos + rlp_len = 2 + 4 @@ -60,7 +62,8 @@ fn test_encode_rlp_160() -> Result<()> { let string = 0x12345.into(); let pos = U256::from(Segment::RlpRaw as usize); let initial_stack = vec![retdest, string, pos, U256::from(20)]; - let mut interpreter: Interpreter = Interpreter::new(encode_rlp_fixed, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(encode_rlp_fixed, initial_stack, None, &None); interpreter.run()?; let expected_stack = vec![pos + U256::from(1 + 20)]; // pos' @@ -80,7 +83,8 @@ fn test_encode_rlp_256() -> Result<()> { let string = 0x12345.into(); let pos = U256::from(Segment::RlpRaw as usize); let initial_stack = vec![retdest, string, pos, U256::from(32)]; - let mut interpreter: Interpreter = Interpreter::new(encode_rlp_fixed, initial_stack, None); + let mut interpreter: Interpreter = + Interpreter::new(encode_rlp_fixed, initial_stack, None, &None); interpreter.run()?; let expected_stack = vec![pos + U256::from(1 + 32)]; // pos' @@ -101,7 +105,7 @@ fn test_prepend_rlp_list_prefix_small() -> Result<()> { let end_pos = U256::from(Segment::RlpRaw as usize + 9 + 5); let initial_stack = vec![retdest, start_pos, end_pos]; let mut interpreter: Interpreter = - Interpreter::new(prepend_rlp_list_prefix, initial_stack, None); + Interpreter::new(prepend_rlp_list_prefix, initial_stack, None, &None); interpreter.set_rlp_memory(vec![ // Nine 0s to leave room for the longest possible RLP list prefix. 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -131,7 +135,7 @@ fn test_prepend_rlp_list_prefix_large() -> Result<()> { let end_pos = U256::from(Segment::RlpRaw as usize + 9 + 60); let initial_stack = vec![retdest, start_pos, end_pos]; let mut interpreter: Interpreter = - Interpreter::new(prepend_rlp_list_prefix, initial_stack, None); + Interpreter::new(prepend_rlp_list_prefix, initial_stack, None, &None); #[rustfmt::skip] interpreter.set_rlp_memory(vec![ diff --git a/evm_arithmetization/src/cpu/kernel/tests/rlp/num_bytes.rs b/evm_arithmetization/src/cpu/kernel/tests/rlp/num_bytes.rs index 9bcf2cf2b..2384c1aa4 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/rlp/num_bytes.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/rlp/num_bytes.rs @@ -11,7 +11,7 @@ fn test_num_bytes_0() -> Result<()> { let retdest = 0xDEADBEEFu32.into(); let x = 0.into(); let initial_stack = vec![retdest, x]; - let mut interpreter: Interpreter = Interpreter::new(num_bytes, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(num_bytes, initial_stack, None, &None); interpreter.run()?; assert_eq!(interpreter.stack(), vec![1.into()]); @@ -25,7 +25,7 @@ fn test_num_bytes_small() -> Result<()> { let retdest = 0xDEADBEEFu32.into(); let x = 42.into(); let initial_stack = vec![retdest, x]; - let mut interpreter: Interpreter = Interpreter::new(num_bytes, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(num_bytes, initial_stack, None, &None); interpreter.run()?; assert_eq!(interpreter.stack(), vec![1.into()]); @@ -39,7 +39,7 @@ fn test_num_bytes_medium() -> Result<()> { let retdest = 0xDEADBEEFu32.into(); let x = 0xAABBCCDDu32.into(); let initial_stack = vec![retdest, x]; - let mut interpreter: Interpreter = Interpreter::new(num_bytes, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(num_bytes, initial_stack, None, &None); interpreter.run()?; assert_eq!(interpreter.stack(), vec![4.into()]); diff --git a/evm_arithmetization/src/cpu/kernel/tests/signed_syscalls.rs b/evm_arithmetization/src/cpu/kernel/tests/signed_syscalls.rs index ca705d171..de07fc444 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/signed_syscalls.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/signed_syscalls.rs @@ -118,7 +118,7 @@ fn run_test(fn_label: &str, expected_fn: fn(U256, U256) -> U256, opname: &str) { for &x in &inputs { for &y in &inputs { let stack = vec![retdest, y, x]; - let mut interpreter: Interpreter = Interpreter::new(fn_label, stack, None); + let mut interpreter: Interpreter = Interpreter::new(fn_label, stack, None, &None); interpreter.run().unwrap(); assert_eq!(interpreter.stack_len(), 1usize, "unexpected stack size"); let output = interpreter diff --git a/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_0_txn.rs b/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_0_txn.rs index cc17d38de..7d689d920 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_0_txn.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_0_txn.rs @@ -29,7 +29,7 @@ fn process_type_0_txn() -> Result<()> { // rlp.encode(signed_txn).hex() let txn = hex!("f861050a8255f0940000000000000000000000000000000000000000648242421ca07c5c61ed975ebd286f6b027b8c504842e50a47d318e1e801719dd744fe93e6c6a01e7b5119b57dd54e175ff2f055c91f3ab1b53eba0b2c184f347cdff0e745aca2").to_vec(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); prepare_interpreter_for_txn_parsing( &mut interpreter, KERNEL.global_labels["process_type_0_txn"], @@ -77,7 +77,7 @@ fn process_type_0_txn_invalid_sig() -> Result<()> { // It should fail according to EIP-2 (`s` must be no greater than `N/2`). let txn = hex!("f861050a8255f0940000000000000000000000000000000000000000648242421ca07c5c61ed975ebd286f6b027b8c504842e50a47d318e1e801719dd744fe93e6c6a0e184aee64a822ab1e8a00d0faa36e0c408f99e2ca41c87ec8b557e9be8f0949f").to_vec(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); prepare_interpreter_for_txn_parsing( &mut interpreter, KERNEL.global_labels["process_type_1_txn"], diff --git a/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_1_txn.rs b/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_1_txn.rs index 006b0b05a..f06d2e5fd 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_1_txn.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_1_txn.rs @@ -47,7 +47,7 @@ fn process_type_1_txn() -> Result<()> { // encode(signed_tx).hex()[4::] # We don't need the initial RLP prefix. let txn = hex!("01f867820539018203e882520894000000000000000000000000000000000000000201824242c080a0e0c03d1aae7278dffd6c864231a5bb571d7ee3ececd3718b26d3d8554b4987f5a02dfb1aeea35ba8c5191abb6efdae6f73c052209fc6a598025b7292db470d9450").to_vec(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); prepare_interpreter_for_txn_parsing( &mut interpreter, KERNEL.global_labels["process_type_1_txn"], @@ -95,7 +95,7 @@ fn process_type_1_txn_invalid_sig() -> Result<()> { // It should fail according to EIP-2 (`s` must be no greater than `N/2`). let txn = hex!("01f867820539018203e882520894000000000000000000000000000000000000000201824242c080a0e0c03d1aae7278dffd6c864231a5bb571d7ee3ececd3718b26d3d8554b4987f5a0d204e5115ca4573ae6e544910251908afa5cbc46e8a30839645fcbb18928acf1").to_vec(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); prepare_interpreter_for_txn_parsing( &mut interpreter, KERNEL.global_labels["process_type_1_txn"], diff --git a/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_2_txn.rs b/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_2_txn.rs index 792572ffc..ee8237bfe 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_2_txn.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_2_txn.rs @@ -48,7 +48,7 @@ fn process_type_2_txn() -> Result<()> { // encode(signed_tx).hex()[4::] # We don't need the initial RLP prefix. let txn = hex!("02f86a820539018203e88201f482520894000000000000000000000000000000000000000201824242c080a06312f059f931a9cf9e9ef4648b14fff1d6f88fbc1aed5ebcb1138f50e295a6b3a0252349ddb42d28b1b2b7c749370867047c8c33d4a0ada8ff7f0d5b71bea862ab").to_vec(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); prepare_interpreter_for_txn_parsing( &mut interpreter, KERNEL.global_labels["process_type_2_txn"], @@ -96,7 +96,7 @@ fn process_type_2_txn_invalid_sig() -> Result<()> { // It should fail according to EIP-2 (`s` must be no greater than `N/2`). let txn = hex!("f86a820539018203e88201f482520894000000000000000000000000000000000000000201824242c080a06312f059f931a9cf9e9ef4648b14fff1d6f88fbc1aed5ebcb1138f50e295a6b3a0dadcb6224bd2d74e4d4838b6c8f798fa3e22a9120e9af73c40c5031b118dde96").to_vec(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); prepare_interpreter_for_txn_parsing( &mut interpreter, KERNEL.global_labels["process_type_2_txn"], diff --git a/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_3_txn.rs b/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_3_txn.rs index b80a3772a..d32fa46b9 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_3_txn.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/transaction_parsing/parse_type_3_txn.rs @@ -23,7 +23,7 @@ fn process_type_3_txn() -> Result<()> { code_hash: H256::default(), }; - let mut interpreter: Interpreter = Interpreter::new(0, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(0, vec![], None, &None); // Prepare the interpreter by inserting the sender account in the state trie. prepare_interpreter(&mut interpreter, sender_address, &sender_account)?; @@ -114,7 +114,7 @@ fn process_type_3_txn_invalid_sig() -> Result<()> { code_hash: H256::default(), }; - let mut interpreter: Interpreter = Interpreter::new(0, vec![], None); + let mut interpreter: Interpreter = Interpreter::new(0, vec![], None, &None); // Prepare the interpreter by inserting the sender account in the state trie. prepare_interpreter(&mut interpreter, sender_address, &sender_account)?; @@ -124,7 +124,7 @@ fn process_type_3_txn_invalid_sig() -> Result<()> { // It should fail according to EIP-2 (`s` must be no greater than `N/2`). let txn = hex!("03f8b1820539018203e88201f482520894000000000000000000000000000000000000000201824242c08203e8f842a00101010101010101010101010101010101010101010101010101010101010101a0010101010101010101010101010101010101010101010101010101010101010180a076e2a81a28e69fb1e96f5e9470b454b80663197b416c3783be98a6b5bd162b21a0e5e7d285c7907e4342338eb4d4b7e4866633b5fc0893c1fa4105226ffafb8908").to_vec(); - let mut interpreter = Interpreter::::new(0, vec![], None); + let mut interpreter = Interpreter::::new(0, vec![], None, &None); prepare_interpreter_for_txn_parsing( &mut interpreter, KERNEL.global_labels["process_type_3_txn"], diff --git a/evm_arithmetization/src/cpu/kernel/tests/transient_storage.rs b/evm_arithmetization/src/cpu/kernel/tests/transient_storage.rs index e874b9ca6..b0ddcd26f 100644 --- a/evm_arithmetization/src/cpu/kernel/tests/transient_storage.rs +++ b/evm_arithmetization/src/cpu/kernel/tests/transient_storage.rs @@ -58,7 +58,7 @@ fn test_tstore() -> Result<()> { kexit_info, ]; - let mut interpreter: Interpreter = Interpreter::new(sys_tstore, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(sys_tstore, initial_stack, None, &None); initialize_interpreter(&mut interpreter, 100.into()); interpreter.run()?; @@ -104,7 +104,7 @@ fn test_tstore_tload() -> Result<()> { kexit_info, ]; - let mut interpreter: Interpreter = Interpreter::new(sys_tstore, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(sys_tstore, initial_stack, None, &None); initialize_interpreter(&mut interpreter, 200.into()); interpreter.run()?; @@ -162,7 +162,7 @@ fn test_many_tstore_many_tload() -> Result<()> { kexit_info, ]; - let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None); + let mut interpreter: Interpreter = Interpreter::new(0, initial_stack, None, &None); initialize_interpreter(&mut interpreter, (10 * 200).into()); for i in 0..10 { @@ -235,7 +235,7 @@ fn test_revert() -> Result<()> { }); let sys_tstore = TEST_KERNEL.global_labels["sys_tstore"]; - let mut interpreter = Interpreter::::new(sys_tstore, vec![], None); + let mut interpreter = Interpreter::::new(sys_tstore, vec![], None, &None); interpreter.generation_state = GenerationState::::new(&GenerationInputs::default(), &TEST_KERNEL.code).unwrap(); initialize_interpreter(&mut interpreter, (20 * 100).into()); diff --git a/evm_arithmetization/src/fixed_recursive_verifier.rs b/evm_arithmetization/src/fixed_recursive_verifier.rs index 54b47a8f2..0bef80415 100644 --- a/evm_arithmetization/src/fixed_recursive_verifier.rs +++ b/evm_arithmetization/src/fixed_recursive_verifier.rs @@ -57,6 +57,7 @@ use crate::recursive_verifier::{ recursive_stark_circuit, set_final_public_value_targets, set_public_value_targets, PlonkWrapperCircuit, PublicInputs, StarkWrapperCircuit, }; +use crate::structlog::TxZeroStructLogs; use crate::testing_utils::{ TEST_RECURSION_CONFIG, TEST_STARK_CONFIG, TEST_THRESHOLD_DEGREE_BITS, TWO_TO_ONE_BLOCK_CIRCUIT_TEST_THRESHOLD_DEGREE_BITS, @@ -3265,13 +3266,17 @@ pub mod testing { config: &StarkConfig, generation_inputs: GenerationInputs, max_cpu_len_log: usize, + struct_logs: Option>, timing: &mut TimingTree, abort_signal: Option>, ) -> anyhow::Result>> { features_check(&generation_inputs.clone().trim()); - let segment_iterator = - SegmentDataIterator::::new(&generation_inputs, Some(max_cpu_len_log)); + let segment_iterator = SegmentDataIterator::::new( + &generation_inputs, + Some(max_cpu_len_log), + &struct_logs, + ); let mut proofs = vec![]; diff --git a/evm_arithmetization/src/generation/segments.rs b/evm_arithmetization/src/generation/segments.rs index 1df63af29..8dccd8dff 100644 --- a/evm_arithmetization/src/generation/segments.rs +++ b/evm_arithmetization/src/generation/segments.rs @@ -13,6 +13,7 @@ use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::interpreter::{set_registers_and_run, ExtraSegmentData, Interpreter}; use crate::generation::state::State; use crate::generation::{collect_debug_tries, debug_inputs, ErrorWithTries, GenerationInputs}; +use crate::structlog::TxZeroStructLogs; use crate::witness::memory::MemoryState; #[cfg(test)] use crate::witness::operation::Operation; @@ -105,7 +106,11 @@ pub struct SegmentError { } impl SegmentDataIterator { - pub fn new(inputs: &GenerationInputs, max_cpu_len_log: Option) -> Self { + pub fn new( + inputs: &GenerationInputs, + max_cpu_len_log: Option, + struct_logs: &Option>, + ) -> Self { debug_inputs(inputs); let interpreter = Interpreter::::new_with_generation_inputs( @@ -113,6 +118,7 @@ impl SegmentDataIterator { vec![], inputs, max_cpu_len_log, + struct_logs, ); Self { diff --git a/evm_arithmetization/src/generation/state.rs b/evm_arithmetization/src/generation/state.rs index abe4b4f1a..278687375 100644 --- a/evm_arithmetization/src/generation/state.rs +++ b/evm_arithmetization/src/generation/state.rs @@ -77,6 +77,12 @@ pub(crate) trait State { /// Returns a `State`'s stack. fn get_stack(&self) -> Vec; + /// Returns the entire stack. Only used in the interpreter, for checking + /// against struct logs. + fn get_full_stack(&self) -> Vec { + vec![] + } + /// Indicates whether we are in kernel mode. fn is_kernel(&self) -> bool; @@ -170,6 +176,32 @@ pub(crate) trait State { fn update_interpreter_final_registers(&mut self, _final_registers: RegistersState) {} + /// Only used in debug mode and in the interpreter. If in user mode, check + /// some elements from the kernel execution against the transaction logs, + /// before the operation execution. + fn check_against_struct_logs_before_op( + &mut self, + _opcode: u8, + _to_check: bool, + ) -> Result<(), ProgramError> { + Ok(()) + } + + /// Only used in debug mode and in the interpreter. If in user mode, check + /// some elements from the kernel execution against the transaction logs, + /// after the operation execution. + fn check_against_struct_logs_after_op( + &mut self, + _res: &Result, + _consumed_gas: u64, + _to_check: bool, + ) -> Result<(), ProgramError> { + Ok(()) + } + + /// Updates the gas field in `struct_logs_debugger_info`. + fn update_struct_logs_gas(&mut self, _n: u64) {} + /// Returns all the memory from non-stale contexts. /// This is only necessary during segment data generation, hence the blanket /// impl returns a dummy value. @@ -306,6 +338,23 @@ pub(crate) trait State { .collect_vec(), ); } + // The current `is_kernel` is the updated value (post operation execution). A + // `StructLogDebuggerError` might have arisen on a user + // operation before or after it was executed. + if let ProgramError::StructLogDebuggerError = e { + let offset_name = KERNEL.offset_name(self.get_registers().program_counter); + bail!( + "{:?} at struct log debugger at pc={}, stack={:?}, memory={:?}", + e, + offset_name, + self.get_stack(), + self.mem_get_kernel_content() + .iter() + .map(|c| c.unwrap_or_default()) + .collect_vec(), + ); + } + self.rollback(checkpoint); self.handle_error(e) } @@ -712,7 +761,11 @@ impl State for GenerationState { row.general.stack_mut().stack_inv_aux = F::ONE; } - self.perform_state_op(op, row) + let res_and_gas = self.perform_state_op(op, row); + match res_and_gas { + Ok((res, _)) => Ok(res), + Err(e) => Err(e), + } } } diff --git a/evm_arithmetization/src/lib.rs b/evm_arithmetization/src/lib.rs index 9bc6021e2..64a36e68c 100644 --- a/evm_arithmetization/src/lib.rs +++ b/evm_arithmetization/src/lib.rs @@ -295,3 +295,4 @@ pub use starky::config::StarkConfig; pub use crate::all_stark::{AllStark, NUM_TABLES}; pub use crate::generation::segments::{GenerationSegmentData, SegmentDataIterator}; +pub mod structlog; diff --git a/evm_arithmetization/src/prover.rs b/evm_arithmetization/src/prover.rs index 698c23934..d8b62fb7d 100644 --- a/evm_arithmetization/src/prover.rs +++ b/evm_arithmetization/src/prover.rs @@ -367,8 +367,10 @@ pub(crate) fn features_check(inputs: &TrimmedGenerationInputs) /// A utility module designed to test witness generation externally. pub mod testing { + use super::*; use crate::generation::ErrorWithTries; + use crate::structlog::TxZeroStructLogs; use crate::{ cpu::kernel::interpreter::Interpreter, generation::segments::{SegmentDataIterator, SegmentError}, @@ -381,8 +383,13 @@ pub mod testing { let initial_stack = vec![]; let initial_offset = KERNEL.global_labels["init"]; - let mut interpreter: Interpreter = - Interpreter::new_with_generation_inputs(initial_offset, initial_stack, &inputs, None); + let mut interpreter: Interpreter = Interpreter::new_with_generation_inputs( + initial_offset, + initial_stack, + &inputs, + None, + &None, + ); interpreter.run()?; Ok(()) } @@ -392,6 +399,7 @@ pub mod testing { config: &StarkConfig, inputs: GenerationInputs, max_cpu_len_log: usize, + struct_logs: Option>, timing: &mut TimingTree, abort_signal: Option>, ) -> Result>> @@ -399,7 +407,8 @@ pub mod testing { F: RichField + Extendable, C: GenericConfig, { - let segment_data_iterator = SegmentDataIterator::::new(&inputs, Some(max_cpu_len_log)); + let segment_data_iterator = + SegmentDataIterator::::new(&inputs, Some(max_cpu_len_log), &struct_logs); let inputs = inputs.trim(); let mut proofs = vec![]; @@ -422,13 +431,14 @@ pub mod testing { pub fn simulate_execution_all_segments( inputs: GenerationInputs, max_cpu_len_log: usize, + struct_logs: &Option>, ) -> Result<(), ErrorWithTries> where F: RichField, { features_check(&inputs.clone().trim()); - for segment in SegmentDataIterator::::new(&inputs, Some(max_cpu_len_log)) { + for segment in SegmentDataIterator::::new(&inputs, Some(max_cpu_len_log), struct_logs) { segment?; } diff --git a/evm_arithmetization/src/structlog.rs b/evm_arithmetization/src/structlog.rs new file mode 100644 index 000000000..02bb3185e --- /dev/null +++ b/evm_arithmetization/src/structlog.rs @@ -0,0 +1,162 @@ +use alloy::primitives::B256; +use alloy::providers::ext::DebugApi; +use alloy::providers::Provider; +use alloy::rpc::types::trace::geth::{GethDebugTracingOptions, GethDefaultTracingOptions}; +use alloy::transports::RpcError; +use alloy::transports::Transport; +use alloy::transports::TransportErrorKind; +use zerostructlog::{normalize_structlog, ZeroStructLog}; + +/// Contains a transaction's `StructLogs` if they are fetched. +pub type TxZeroStructLogs = Option>; + +/// Pass `true` for the components needed. +fn structlog_tracing_options(stack: bool, memory: bool, storage: bool) -> GethDebugTracingOptions { + GethDebugTracingOptions { + config: GethDefaultTracingOptions { + disable_stack: Some(!stack), + // needed for CREATE2 + disable_memory: Some(!memory), + disable_storage: Some(!storage), + ..GethDefaultTracingOptions::default() + }, + tracer: None, + ..GethDebugTracingOptions::default() + } +} + +// Gets the struct logs with the necessary logs for debugging. +pub async fn get_structlog_for_debug( + provider: &ProviderT, + tx_hash: &B256, +) -> Result> +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let structlog_trace = provider + .debug_trace_transaction(*tx_hash, structlog_tracing_options(true, false, false)) + .await?; + + let structlogs: TxZeroStructLogs = normalize_structlog(structlog_trace); + + Ok(structlogs) +} + +pub mod zerostructlog { + use std::collections::BTreeMap; + + use alloy::rpc::types::trace::geth::{DefaultFrame, GethTrace, StructLog}; + use alloy_primitives::{Bytes, B256, U256}; + use serde::{Deserialize, Serialize}; + use serde_json::Value; + + use super::TxZeroStructLogs; + + /// Geth Default struct log trace frame + /// + /// + #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] + #[serde(rename_all = "camelCase")] + pub(crate) struct ZeroDefaultFrame { + /// Whether the transaction failed + pub failed: bool, + /// How much gas was used. + pub gas: u64, + /// Output of the transaction + #[serde(serialize_with = "alloy_serde::serialize_hex_string_no_prefix")] + pub return_value: Bytes, + /// Recorded traces of the transaction + pub struct_logs: Vec, + } + + /// Represents a struct log entry in a trace + /// + /// + #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] + pub struct ZeroStructLog { + /// program counter + pub pc: u64, + /// opcode to be executed + pub op: String, + /// remaining gas + pub gas: u64, + /// cost for executing op + #[serde(rename = "gasCost")] + pub gas_cost: u64, + /// Current call depth + pub depth: u64, + /// Error message if any + #[serde(default)] + pub error: Option, + /// EVM stack + #[serde(default)] + pub stack: Option>, + /// Last call's return data. Enabled via enableReturnData + #[serde(default, rename = "returnData")] + pub return_data: Option, + /// ref + #[serde(default)] + pub memory: Option>, + /// Size of memory. + #[serde(default, rename = "memSize")] + pub memory_size: Option, + /// Storage slots of current contract read from and written to. Only + /// emitted for SLOAD and SSTORE. Disabled via disableStorage + #[serde(default)] + pub storage: Option>, + /// Refund counter + #[serde(default, rename = "refund")] + pub refund_counter: Option, + } + + impl From for ZeroStructLog { + fn from(struct_log: StructLog) -> Self { + ZeroStructLog { + pc: struct_log.pc, + op: struct_log.op, + gas: struct_log.gas, + gas_cost: struct_log.gas_cost, + depth: struct_log.depth, + error: struct_log.error, + stack: struct_log.stack, + return_data: struct_log.return_data, + memory: struct_log.memory, + memory_size: struct_log.memory_size, + storage: struct_log.storage, + refund_counter: struct_log.refund_counter, + } + } + } + + pub fn try_reserialize(structlog_object: &Value) -> anyhow::Result { + let mut a = serde_json::to_string(structlog_object)?; + a = a.replace("\"error\":{},", ""); + + let b = serde_json::from_str::(&a)?; + + Ok(b) + } + + pub(crate) fn normalize_structlog(unnormalized_structlog: GethTrace) -> TxZeroStructLogs { + match unnormalized_structlog { + GethTrace::Default(structlog_frame) => { + let all_struct_logs = structlog_frame + .struct_logs + .into_iter() + .map(ZeroStructLog::from) + .collect::>(); + Some(all_struct_logs) + } + GethTrace::JS(structlog_js_object) => { + try_reserialize(&structlog_js_object).ok().map(|s| { + s.struct_logs + .into_iter() + .map(ZeroStructLog::from) + .collect::>() + }) + } + _ => None, + } + } +} diff --git a/evm_arithmetization/src/testing_utils.rs b/evm_arithmetization/src/testing_utils.rs index ac3cdcf0f..d3f598ff6 100644 --- a/evm_arithmetization/src/testing_utils.rs +++ b/evm_arithmetization/src/testing_utils.rs @@ -269,7 +269,7 @@ pub fn segment_with_empty_tables() -> Result<( let payload = empty_payload()?; let max_cpu_len_log = Some(7); let mut segment_iterator = - SegmentDataIterator::::new(&payload, max_cpu_len_log); + SegmentDataIterator::::new(&payload, max_cpu_len_log, &None); let (trimmed_inputs, segment_data) = segment_iterator.next().unwrap()?; Ok((trimmed_inputs, segment_data)) diff --git a/evm_arithmetization/src/witness/errors.rs b/evm_arithmetization/src/witness/errors.rs index adb9dd94d..4ff47a937 100644 --- a/evm_arithmetization/src/witness/errors.rs +++ b/evm_arithmetization/src/witness/errors.rs @@ -16,6 +16,7 @@ pub enum ProgramError { IntegerTooLarge, ProverInputError(ProverInputError), UnknownContractCode, + StructLogDebuggerError, Other(String), } diff --git a/evm_arithmetization/src/witness/operation.rs b/evm_arithmetization/src/witness/operation.rs index 7f674cdbf..b852d7c5e 100644 --- a/evm_arithmetization/src/witness/operation.rs +++ b/evm_arithmetization/src/witness/operation.rs @@ -18,6 +18,7 @@ use crate::cpu::kernel::constants::context_metadata::ContextMetadata; use crate::cpu::simple_logic::eq_iszero::generate_pinv_diff; use crate::cpu::stack::MAX_USER_STACK_SIZE; use crate::extension_tower::BN_BASE; +use crate::generation::state::State; use crate::memory::segments::Segment; use crate::util::u256_to_usize; use crate::witness::errors::MemoryError::VirtTooLarge; @@ -846,6 +847,24 @@ pub(crate) fn generate_exit_kernel>( generation_state.registers.program_counter = program_counter; generation_state.registers.is_kernel = is_kernel_mode; generation_state.registers.gas_used = gas_used_val; + + // If we are in debug mode and the next operation is in user mode, update the + // `gas` field so we can check against struct logs. + if !is_kernel_mode { + let gas_limit_address = MemoryAddress::new( + state.get_registers().context, + Segment::ContextMetadata, + ContextMetadata::GasLimit.unscale(), // context offsets are already scaled + ); + let init_gas_limit = state + .get_mut_generation_state() + .get_from_memory(gas_limit_address) + .low_u64(); + let txn_gas = init_gas_limit - gas_used_val; + + state.update_struct_logs_gas(txn_gas); + } + state.log_debug(format!( "Exiting to {}, is_kernel={}", program_counter, is_kernel_mode diff --git a/evm_arithmetization/src/witness/transition.rs b/evm_arithmetization/src/witness/transition.rs index fdcf9af65..591f73cad 100644 --- a/evm_arithmetization/src/witness/transition.rs +++ b/evm_arithmetization/src/witness/transition.rs @@ -341,11 +341,12 @@ where &mut self, op: Operation, row: CpuColumnsView, - ) -> Result + ) -> Result<(Operation, u64), ProgramError> where Self: Sized, { self.perform_op(op, row)?; + self.incr_pc(match op { Operation::Syscall(_, _, _) | Operation::ExitKernel => 0, Operation::Push(n) => n as usize + 1, @@ -353,7 +354,9 @@ where _ => 1, }); + let gas_consumed_by_op = gas_to_charge(op); self.incr_gas(gas_to_charge(op)); + let registers = self.get_registers(); let gas_limit_address = MemoryAddress::new( registers.context, @@ -373,7 +376,7 @@ where } } - Ok(op) + Ok((op, gas_consumed_by_op)) } fn generate_jump(&mut self, mut row: CpuColumnsView) -> Result<(), ProgramError> { @@ -442,6 +445,7 @@ where self.push_cpu(row); } + self.get_mut_generation_state().jump_to(dst as usize)?; Ok(()) } diff --git a/evm_arithmetization/tests/add11_yml.rs b/evm_arithmetization/tests/add11_yml.rs index 5406ebe6a..c05d1131b 100644 --- a/evm_arithmetization/tests/add11_yml.rs +++ b/evm_arithmetization/tests/add11_yml.rs @@ -218,6 +218,7 @@ fn add11_yml() -> anyhow::Result<()> { &config, inputs, max_cpu_len_log, + None, &mut timing, None, )?; diff --git a/evm_arithmetization/tests/erc20.rs b/evm_arithmetization/tests/erc20.rs index f594c7bd3..5fb744709 100644 --- a/evm_arithmetization/tests/erc20.rs +++ b/evm_arithmetization/tests/erc20.rs @@ -206,6 +206,7 @@ fn test_erc20() -> anyhow::Result<()> { &config, inputs, max_cpu_len_log, + None, &mut timing, None, )?; diff --git a/evm_arithmetization/tests/erc721.rs b/evm_arithmetization/tests/erc721.rs index e39915100..307aefa78 100644 --- a/evm_arithmetization/tests/erc721.rs +++ b/evm_arithmetization/tests/erc721.rs @@ -213,6 +213,7 @@ fn test_erc721() -> anyhow::Result<()> { &config, inputs, max_cpu_len_log, + None, &mut timing, None, )?; diff --git a/evm_arithmetization/tests/global_exit_root.rs b/evm_arithmetization/tests/global_exit_root.rs index 5495d4100..1e3ce69cf 100644 --- a/evm_arithmetization/tests/global_exit_root.rs +++ b/evm_arithmetization/tests/global_exit_root.rs @@ -124,6 +124,7 @@ fn test_global_exit_root() -> anyhow::Result<()> { &config, inputs, max_cpu_len_log, + None, &mut timing, None, )?; diff --git a/evm_arithmetization/tests/log_opcode.rs b/evm_arithmetization/tests/log_opcode.rs index 4f274b0b9..5b0ad7ac1 100644 --- a/evm_arithmetization/tests/log_opcode.rs +++ b/evm_arithmetization/tests/log_opcode.rs @@ -276,6 +276,7 @@ fn test_log_opcodes() -> anyhow::Result<()> { &config, inputs, max_cpu_len_log, + None, &mut timing, None, )?; diff --git a/evm_arithmetization/tests/selfdestruct.rs b/evm_arithmetization/tests/selfdestruct.rs index e528ae804..e5f24e32a 100644 --- a/evm_arithmetization/tests/selfdestruct.rs +++ b/evm_arithmetization/tests/selfdestruct.rs @@ -180,6 +180,7 @@ fn test_selfdestruct() -> anyhow::Result<()> { &config, inputs, max_cpu_len_log, + None, &mut timing, None, )?; diff --git a/evm_arithmetization/tests/simple_transfer.rs b/evm_arithmetization/tests/simple_transfer.rs index 6d2cbb6d0..78a258cd4 100644 --- a/evm_arithmetization/tests/simple_transfer.rs +++ b/evm_arithmetization/tests/simple_transfer.rs @@ -172,6 +172,7 @@ fn test_simple_transfer() -> anyhow::Result<()> { &config, inputs, max_cpu_len_log, + None, &mut timing, None, )?; diff --git a/evm_arithmetization/tests/two_to_one_block.rs b/evm_arithmetization/tests/two_to_one_block.rs index 2ae171258..fc3d419db 100644 --- a/evm_arithmetization/tests/two_to_one_block.rs +++ b/evm_arithmetization/tests/two_to_one_block.rs @@ -111,9 +111,9 @@ fn get_test_block_proof( let timing = &mut TimingTree::new(&format!("Blockproof {timestamp}"), log::Level::Info); let dummy0_proof0 = - all_circuits.prove_all_segments(all_stark, config, dummy0, 20, timing, None)?; + all_circuits.prove_all_segments(all_stark, config, dummy0, 20, None, timing, None)?; let dummy1_proof = - all_circuits.prove_all_segments(all_stark, config, dummy1, 20, timing, None)?; + all_circuits.prove_all_segments(all_stark, config, dummy1, 20, None, timing, None)?; let inputs0_proof = all_circuits.prove_segment_aggregation(&dummy0_proof0[0], &dummy0_proof0[1])?; diff --git a/evm_arithmetization/tests/withdrawals.rs b/evm_arithmetization/tests/withdrawals.rs index f179d7b7e..df07937f1 100644 --- a/evm_arithmetization/tests/withdrawals.rs +++ b/evm_arithmetization/tests/withdrawals.rs @@ -115,6 +115,7 @@ fn test_withdrawals() -> anyhow::Result<()> { &config, inputs, max_cpu_len_log, + None, &mut timing, None, )?; diff --git a/trace_decoder/benches/block_processing.rs b/trace_decoder/benches/block_processing.rs index 4e3582e98..0c002c6d3 100644 --- a/trace_decoder/benches/block_processing.rs +++ b/trace_decoder/benches/block_processing.rs @@ -38,6 +38,7 @@ fn criterion_benchmark(c: &mut Criterion) { trace_decoder::entrypoint( block_trace, other_data, + None, batch_size, &mut DummyObserver::new(), WIRE_DISPOSITION, diff --git a/trace_decoder/src/core.rs b/trace_decoder/src/core.rs index cd2bcfa6e..95f92d178 100644 --- a/trace_decoder/src/core.rs +++ b/trace_decoder/src/core.rs @@ -8,6 +8,7 @@ use std::{ use anyhow::{anyhow, bail, ensure, Context as _}; use either::Either; use ethereum_types::{Address, BigEndianHash as _, U256}; +use evm_arithmetization::structlog::TxZeroStructLogs; use evm_arithmetization::{ generation::TrieInputs, proof::{BlockMetadata, TrieRoots}, @@ -39,14 +40,17 @@ pub enum WireDisposition { Type2, } +type GenerationAndStructLogs = (Vec, Option>>); + /// TODO(0xaatif): document this after pub fn entrypoint( trace: BlockTrace, other: OtherBlockData, + all_struct_logs: Option>, batch_size_hint: usize, observer: &mut impl Observer, wire_disposition: WireDisposition, -) -> anyhow::Result> { +) -> anyhow::Result { ensure!(batch_size_hint != 0); let BlockTrace { @@ -115,65 +119,78 @@ pub fn entrypoint( } }; + let batched_struct_logs = all_struct_logs.map(|struct_logs| { + struct_logs + .chunks(batch_size_hint) + .map(|c| c.to_vec()) + .collect_vec() + }); + let mut running_gas_used = 0; - Ok(batches - .into_iter() - .map( - |Batch { - first_txn_ix, - gas_used, - contract_code, - byte_code, - before: - IntraBlockTries { - world, - transaction, - receipt, - }, - after, - withdrawals, - }| { - let (state, storage) = world - .clone() - .expect_left("TODO(0xaatif): evm_arithemetization accepts an SMT") - .into_state_and_storage(); - GenerationInputs { - txn_number_before: first_txn_ix.into(), - gas_used_before: running_gas_used.into(), - gas_used_after: { - running_gas_used += gas_used; - running_gas_used.into() - }, - signed_txns: byte_code.into_iter().map(Into::into).collect(), - withdrawals, - ger_data, - tries: TrieInputs { - state_trie: state.into(), - transactions_trie: transaction.into(), - receipts_trie: receipt.into(), - storage_tries: storage.into_iter().map(|(k, v)| (k, v.into())).collect(), - }, - trie_roots_after: after, - checkpoint_state_trie_root, - checkpoint_consolidated_hash, - contract_code: contract_code - .into_iter() - .map(|it| match &world { - Either::Left(_type1) => { - (::CodeHasher::hash(&it), it) - } - Either::Right(_type2) => { - (::CodeHasher::hash(&it), it) - } - }) - .collect(), - block_metadata: b_meta.clone(), - block_hashes: b_hashes.clone(), - burn_addr, - } - }, - ) - .collect()) + Ok(( + batches + .into_iter() + .map( + |Batch { + first_txn_ix, + gas_used, + contract_code, + byte_code, + before: + IntraBlockTries { + world, + transaction, + receipt, + }, + after, + withdrawals, + }| { + let (state, storage) = world + .clone() + .expect_left("TODO(0xaatif): evm_arithemetization accepts an SMT") + .into_state_and_storage(); + GenerationInputs { + txn_number_before: first_txn_ix.into(), + gas_used_before: running_gas_used.into(), + gas_used_after: { + running_gas_used += gas_used; + running_gas_used.into() + }, + signed_txns: byte_code.into_iter().map(Into::into).collect(), + withdrawals, + ger_data, + tries: TrieInputs { + state_trie: state.into(), + transactions_trie: transaction.into(), + receipts_trie: receipt.into(), + storage_tries: storage + .into_iter() + .map(|(k, v)| (k, v.into())) + .collect(), + }, + trie_roots_after: after, + checkpoint_state_trie_root, + checkpoint_consolidated_hash, + contract_code: contract_code + .into_iter() + .map(|it| match &world { + Either::Left(_type1) => { + (::CodeHasher::hash(&it), it) + } + Either::Right(_type2) => { + (::CodeHasher::hash(&it), it) + } + }) + .collect(), + block_metadata: b_meta.clone(), + block_hashes: b_hashes.clone(), + burn_addr, + } + }, + ) + .collect(), + batched_struct_logs, + )) } /// The user has either provided us with a [`serde`]-ed @@ -456,6 +473,7 @@ where byte_code, new_receipt_trie_node_byte, gas_used: txn_gas_used, + struct_log: _, }, } = txn.unwrap_or_default(); diff --git a/trace_decoder/src/interface.rs b/trace_decoder/src/interface.rs index abe3b0af0..91384c817 100644 --- a/trace_decoder/src/interface.rs +++ b/trace_decoder/src/interface.rs @@ -6,6 +6,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap}; use ethereum_types::{Address, U256}; use evm_arithmetization::proof::{BlockHashes, BlockMetadata}; +use evm_arithmetization::structlog::TxZeroStructLogs; use evm_arithmetization::ConsolidatedHash; use keccak_hash::H256; use mpt_trie::partial_trie::HashedPartialTrie; @@ -111,6 +112,10 @@ pub struct TxnMeta { /// Gas used by this txn (Note: not cumulative gas used). pub gas_used: u64, + + /// Optional logs for a transaction's user code. Used for debugging purposes + /// only. + pub struct_log: TxZeroStructLogs, } /// A "trace" specific to an account for a txn. diff --git a/trace_decoder/tests/common/mod.rs b/trace_decoder/tests/common/mod.rs index 0183c785a..935838a0c 100644 --- a/trace_decoder/tests/common/mod.rs +++ b/trace_decoder/tests/common/mod.rs @@ -61,6 +61,7 @@ impl Case { let BlockProverInput { block_trace, other_data, + struct_logs: _, } = bpis.remove(0); anyhow::Ok(Case { name: base.file_name().context("inconsistent base name")?.into(), diff --git a/trace_decoder/tests/consistent-with-header.rs b/trace_decoder/tests/consistent-with-header.rs index 63df41b4f..46a330b07 100644 --- a/trace_decoder/tests/consistent-with-header.rs +++ b/trace_decoder/tests/consistent-with-header.rs @@ -25,9 +25,10 @@ fn main() -> anyhow::Result<()> { } in cases()? { trials.push(Trial::test(format!("{name}@{batch_size}"), move || { - let gen_inputs = trace_decoder::entrypoint( + let (gen_inputs, _) = trace_decoder::entrypoint( trace, other.clone(), + None, batch_size, &mut DummyObserver::new(), WIRE_DISPOSITION, diff --git a/trace_decoder/tests/simulate-execution.rs b/trace_decoder/tests/simulate-execution.rs index fc7136c34..e0e54bdca 100644 --- a/trace_decoder/tests/simulate-execution.rs +++ b/trace_decoder/tests/simulate-execution.rs @@ -21,9 +21,10 @@ fn main() -> anyhow::Result<()> { other, } in cases()? { - let gen_inputs = trace_decoder::entrypoint( + let (gen_inputs, _) = trace_decoder::entrypoint( trace, other, + None, batch_size, &mut DummyObserver::new(), WIRE_DISPOSITION, @@ -37,7 +38,7 @@ fn main() -> anyhow::Result<()> { move || { evm_arithmetization::prover::testing::simulate_execution_all_segments::< GoldilocksField, - >(gi, 19) + >(gi, 19, &None) .map_err(|e| format!("{e:?}"))?; // get the full error chain Ok(()) }, diff --git a/zero/Cargo.toml b/zero/Cargo.toml index 27fd5bdb5..567750a56 100644 --- a/zero/Cargo.toml +++ b/zero/Cargo.toml @@ -11,6 +11,7 @@ categories.workspace = true [dependencies] alloy.workspace = true alloy-compat = "0.1.1" +alloy-primitives.workspace = true anyhow.workspace = true async-stream.workspace = true axum.workspace = true diff --git a/zero/src/bin/leader/client.rs b/zero/src/bin/leader/client.rs index 6f2015833..8abaf1565 100644 --- a/zero/src/bin/leader/client.rs +++ b/zero/src/bin/leader/client.rs @@ -5,7 +5,7 @@ use alloy::rpc::types::{BlockId, BlockNumberOrTag}; use alloy::transports::Transport; use anyhow::{anyhow, Result}; use tokio::sync::mpsc; -use tracing::info; +use tracing::{info, warn}; use zero::block_interval::{BlockInterval, BlockIntervalStream}; use zero::pre_checks::check_previous_proof_and_checkpoint; use zero::proof_types::GeneratedBlockProof; @@ -37,6 +37,10 @@ where use futures::StreamExt; let test_only = leader_config.prover_config.test_only; + let get_struct_logs = leader_config.prover_config.get_struct_logs && test_only; + if !test_only && get_struct_logs { + warn!("The struct logs are only used for checks in test_only mode."); + } if !test_only { // For actual proof runs, perform a sanity check on the provided inputs. @@ -81,6 +85,7 @@ where cached_provider.clone(), block_id, leader_config.checkpoint_block_number, + get_struct_logs, ) .await?; block_tx diff --git a/zero/src/bin/rpc.rs b/zero/src/bin/rpc.rs index 331f3ec91..5ae4022ec 100644 --- a/zero/src/bin/rpc.rs +++ b/zero/src/bin/rpc.rs @@ -46,6 +46,9 @@ struct RpcToolConfig { /// The maximum number of retries. #[arg(long, env = "ZERO_BIN_MAX_RETRIES", default_value_t = 0)] max_retries: u32, + /// If true, get struct logs for debug purposes. + #[arg(long, default_value_t = false)] + get_struct_logs: bool, } #[derive(Subcommand)] @@ -86,6 +89,7 @@ struct Cli { pub(crate) async fn fetch_block_prover_inputs( cached_provider: Arc>, params: FetchParams, + get_struct_logs: bool, ) -> Result, anyhow::Error> where ProviderT: Provider, @@ -102,9 +106,13 @@ where let (block_num, _is_last_block) = block_interval_elem?; let block_id = BlockId::Number(BlockNumberOrTag::Number(block_num)); // Get the prover input for particular block. - let result = - rpc::block_prover_input(cached_provider.clone(), block_id, checkpoint_block_number) - .await?; + let result = rpc::block_prover_input( + cached_provider.clone(), + block_id, + checkpoint_block_number, + get_struct_logs, + ) + .await?; block_prover_inputs.push(result); } @@ -134,7 +142,8 @@ impl Cli { }; let block_prover_inputs = - fetch_block_prover_inputs(cached_provider, params).await?; + fetch_block_prover_inputs(cached_provider, params, self.config.get_struct_logs) + .await?; serde_json::to_writer_pretty(std::io::stdout(), &block_prover_inputs)?; } Command::Extract { tx, batch_size } => { @@ -158,8 +167,12 @@ impl Cli { checkpoint_block_number: None, }; - let block_prover_inputs = - fetch_block_prover_inputs(cached_provider, params).await?; + let block_prover_inputs = fetch_block_prover_inputs( + cached_provider, + params, + self.config.get_struct_logs, + ) + .await?; let block_prover_input = block_prover_inputs.into_iter().next().ok_or(anyhow!( @@ -167,9 +180,10 @@ impl Cli { block_number ))?; - let generation_inputs = trace_decoder::entrypoint( + let (generation_inputs, _struct_logs) = trace_decoder::entrypoint( block_prover_input.block_trace, block_prover_input.other_data, + block_prover_input.struct_logs, batch_size, &mut DummyObserver::new(), WIRE_DISPOSITION, diff --git a/zero/src/bin/trie_diff.rs b/zero/src/bin/trie_diff.rs index a2f47133d..99eddaf63 100644 --- a/zero/src/bin/trie_diff.rs +++ b/zero/src/bin/trie_diff.rs @@ -93,9 +93,10 @@ async fn main() -> Result<()> { .b_meta .block_number .low_u64(); - let block_generation_inputs = trace_decoder::entrypoint( + let (block_generation_inputs, opt_struct_logs) = trace_decoder::entrypoint( block_prover_input.block_trace.clone(), block_prover_input.other_data.clone(), + block_prover_input.struct_logs.clone(), prover_config.batch_size, &mut observer, WIRE_DISPOSITION, @@ -107,6 +108,7 @@ async fn main() -> Result<()> { ); info!("Running trie diff simulation for block {block_number} ..."); + let nb_gen_inps = block_generation_inputs.len(); let simulation = Directive::map( IndexedStream::from( block_generation_inputs @@ -114,8 +116,11 @@ async fn main() -> Result<()> { .into_iter() .enumerate() .zip(repeat(prover_config.max_cpu_len_log)) - .map(|((batch_index, inputs), max_cpu_len_log)| { - (inputs, max_cpu_len_log, batch_index) + .zip(opt_struct_logs.map_or(vec![None; nb_gen_inps], |x| { + x.into_iter().map(Some).collect() + })) + .map(|(((batch_index, inputs), max_cpu_len_log), struct_log)| { + (inputs, max_cpu_len_log, batch_index, struct_log) }), ), &seg_ops, diff --git a/zero/src/ops.rs b/zero/src/ops.rs index 6d6dd8403..661ad0bb6 100644 --- a/zero/src/ops.rs +++ b/zero/src/ops.rs @@ -4,6 +4,7 @@ use std::time::Instant; use anyhow::anyhow; use evm_arithmetization::fixed_recursive_verifier::ProverOutputData; +use evm_arithmetization::structlog::TxZeroStructLogs; use evm_arithmetization::{prover::testing::simulate_execution_all_segments, GenerationInputs}; use evm_arithmetization::{Field, ProofWithPublicValues, PublicValues, TrimmedGenerationInputs}; use paladin::{ @@ -73,14 +74,23 @@ pub struct SegmentProofTestOnly { } impl Operation for SegmentProofTestOnly { - // The input is a tuple of the batch generation inputs, max_cpu_len_log and - // batch index. - type Input = (GenerationInputs, usize, usize); + // The input is a tuple of the batch generation inputs, max_cpu_len_log, + // batch index and optional struct logs. + type Input = ( + GenerationInputs, + usize, + usize, + Option>, + ); type Output = (); fn execute(&self, inputs: Self::Input, _abort: AbortSignal) -> Result { if self.save_inputs_on_error || self.save_tries_on_error { - simulate_execution_all_segments::(inputs.0.clone(), inputs.1).map_err(|err| { + let opt_struct_logs = inputs.3; + let nb_signed_txns = inputs.0.signed_txns.len(); + let txn_before = inputs.0.txn_number_before; + simulate_execution_all_segments::(inputs.0.clone(), inputs.1, &opt_struct_logs) + .map_err(|err| { let block_number = inputs.0.block_metadata.block_number.low_u64(); let batch_index = inputs.2; @@ -107,19 +117,37 @@ impl Operation for SegmentProofTestOnly { format!( "b{}_txns_{}..{}_input.json", block_number, - inputs.0.txn_number_before, - inputs.0.txn_number_before + inputs.0.signed_txns.len(), + txn_before, + txn_before + nb_signed_txns, ), inputs.0, ) { error!("Failed to save txn proof input to disk: {:?}", write_err); } + + if let Some(struct_logs) = opt_struct_logs { + if let Err(write_err) = save_inputs_to_disk( + format!( + "structlogs_b{}_txns_{}..{}_input.json", + block_number, + txn_before, + txn_before + nb_signed_txns, + ), + struct_logs.to_owned(), + ) { + error!( + "Failed to save txn proof input to + disk: {:?}", + write_err + ); + } + } } FatalError::from_anyhow(err, FatalStrategy::Terminate) })? } else { - simulate_execution_all_segments::(inputs.0, inputs.1) + simulate_execution_all_segments::(inputs.0, inputs.1, &inputs.3) .map_err(|err| FatalError::from_anyhow(err.into(), FatalStrategy::Terminate))?; } diff --git a/zero/src/prover.rs b/zero/src/prover.rs index 7cc840f02..ae38cde24 100644 --- a/zero/src/prover.rs +++ b/zero/src/prover.rs @@ -6,8 +6,9 @@ use std::future::Future; use std::path::{Path, PathBuf}; use std::sync::Arc; -use alloy::primitives::U256; +use alloy_primitives::U256; use anyhow::{Context, Result}; +use evm_arithmetization::structlog::TxZeroStructLogs; use evm_arithmetization::Field; use evm_arithmetization::SegmentDataIterator; use futures::{ @@ -73,6 +74,7 @@ pub struct ProverConfig { pub max_cpu_len_log: usize, pub save_inputs_on_error: bool, pub test_only: bool, + pub get_struct_logs: bool, pub proof_output_dir: PathBuf, pub keep_intermediate_proofs: bool, pub block_batch_size: usize, @@ -84,6 +86,7 @@ pub struct ProverConfig { pub struct BlockProverInput { pub block_trace: BlockTrace, pub other_data: OtherBlockData, + pub struct_logs: Option>, } impl BlockProverInput { @@ -108,9 +111,10 @@ impl BlockProverInput { let block_number = self.get_block_number(); - let block_generation_inputs = trace_decoder::entrypoint( + let (block_generation_inputs, opt_all_struct_logs) = trace_decoder::entrypoint( self.block_trace, self.other_data, + self.struct_logs, batch_size, &mut DummyObserver::new(), WIRE_DISPOSITION, @@ -137,8 +141,15 @@ impl BlockProverInput { .iter() .enumerate() .map(|(idx, txn_batch)| { - let segment_data_iterator = - SegmentDataIterator::::new(txn_batch, Some(max_cpu_len_log)); + let segment_data_iterator = if let Some(all_struct_logs) = &opt_all_struct_logs { + SegmentDataIterator::::new( + txn_batch, + Some(max_cpu_len_log), + &Some(all_struct_logs[idx].clone()), + ) + } else { + SegmentDataIterator::::new(txn_batch, Some(max_cpu_len_log), &None) + }; Directive::map(IndexedStream::from(segment_data_iterator), &seg_prove_ops) .fold(&seg_agg_ops) @@ -200,33 +211,37 @@ impl BlockProverInput { let block_number = self.get_block_number(); info!("Testing witness generation for block {block_number}."); - - let block_generation_inputs = trace_decoder::entrypoint( + let (block_generation_inputs, opt_struct_logs) = trace_decoder::entrypoint( self.block_trace, self.other_data, + self.struct_logs, batch_size, &mut DummyObserver::new(), WIRE_DISPOSITION, )?; - let seg_ops = ops::SegmentProofTestOnly { save_inputs_on_error, save_tries_on_error, }; + let nb_gen_inps = block_generation_inputs.len(); let simulation = Directive::map( IndexedStream::from( block_generation_inputs .into_iter() .enumerate() .zip(repeat(max_cpu_len_log)) - .map(|((batch_index, txn_batch), max_cpu_len_log)| { - (txn_batch, max_cpu_len_log, batch_index) - }), + .zip(opt_struct_logs.map_or(vec![None; nb_gen_inps], |x| { + x.into_iter().map(Some).collect() + })) + .map( + |(((batch_index, txn_batch), max_cpu_len_log), struct_log)| { + (txn_batch, max_cpu_len_log, batch_index, struct_log) + }, + ), ), &seg_ops, ); - simulation .run(&proof_runtime.light_proof) .await? diff --git a/zero/src/prover/cli.rs b/zero/src/prover/cli.rs index ef9c7ad13..f0cc9a900 100644 --- a/zero/src/prover/cli.rs +++ b/zero/src/prover/cli.rs @@ -47,6 +47,9 @@ pub struct CliProverConfig { /// be greater than zero. #[arg(long, env = "ZERO_BIN_BLOCK_POOL_SIZE", default_value_t = 16)] block_pool_size: usize, + /// If true, returns the struct_logs along with the generation data. + #[arg(long, help_heading = HELP_HEADING, default_value_t = false)] + get_struct_logs: bool, } impl From for super::ProverConfig { @@ -60,6 +63,7 @@ impl From for super::ProverConfig { keep_intermediate_proofs: cli.keep_intermediate_proofs, block_batch_size: cli.block_batch_size, block_pool_size: cli.block_pool_size, + get_struct_logs: cli.get_struct_logs, save_tries_on_error: false, } } diff --git a/zero/src/rpc/jerigon.rs b/zero/src/rpc/jerigon.rs index 915176852..723903781 100644 --- a/zero/src/rpc/jerigon.rs +++ b/zero/src/rpc/jerigon.rs @@ -1,5 +1,9 @@ +use std::ops::Deref; + +use alloy::rpc::types::{Block, BlockTransactionsKind}; use alloy::{providers::Provider, rpc::types::eth::BlockId, transports::Transport}; use anyhow::Context as _; +use evm_arithmetization::structlog::{get_structlog_for_debug, TxZeroStructLogs}; use serde::Deserialize; use serde_json::json; use trace_decoder::{BlockTrace, BlockTraceTriePreImages, CombinedPreImages, TxnInfo}; @@ -26,6 +30,7 @@ pub async fn block_prover_input( cached_provider: std::sync::Arc>, target_block_id: BlockId, checkpoint_block_number: u64, + get_struct_logs: bool, ) -> anyhow::Result where ProviderT: Provider, @@ -39,7 +44,10 @@ where "debug_traceBlockByNumber".into(), (target_block_id, json!({"tracer": "zeroTracer"})), ) - .await?; + .await? + .into_iter() + .map(|ztr| ztr.result) + .collect::>(); // Grab block witness info (packed as combined trie pre-images) @@ -49,9 +57,22 @@ where .raw_request::<_, String>(WITNESS_ENDPOINT.into(), vec![target_block_id]) .await?; + let block = cached_provider + .get_block(target_block_id, BlockTransactionsKind::Full) + .await?; + + let struct_logs = match block { + Some(b) => { + if get_struct_logs { + Some(process_txns(&b, cached_provider.get_provider().await?.deref()).await?) + } else { + None + } + } + None => None, + }; let other_data = fetch_other_block_data(cached_provider, target_block_id, checkpoint_block_number).await?; - // Assemble Ok(BlockProverInput { block_trace: BlockTrace { @@ -61,9 +82,30 @@ where "invalid hex returned from call to {WITNESS_ENDPOINT}" ))?, }), - txn_info: tx_results.into_iter().map(|it| it.result).collect(), + txn_info: tx_results, code_db: Default::default(), }, other_data, + struct_logs, }) } + +async fn process_txns( + block: &Block, + provider: &ProviderT, +) -> anyhow::Result> +where + ProviderT: Provider, + TransportT: Transport + Clone, +{ + let all_txns = block + .transactions + .as_transactions() + .context("No transactions in block")?; + let mut struct_logs = Vec::with_capacity(all_txns.len()); + for tx in all_txns { + struct_logs.push(get_structlog_for_debug(provider, &tx.hash).await?); + } + + Ok(struct_logs) +} diff --git a/zero/src/rpc/mod.rs b/zero/src/rpc/mod.rs index b972bc501..cc95a9de5 100644 --- a/zero/src/rpc/mod.rs +++ b/zero/src/rpc/mod.rs @@ -44,6 +44,7 @@ pub async fn block_prover_input( cached_provider: Arc>, block_id: BlockId, checkpoint_block_number: u64, + get_struct_logs: bool, ) -> Result where ProviderT: Provider, @@ -51,10 +52,22 @@ where { match cached_provider.rpc_type { RpcType::Jerigon => { - jerigon::block_prover_input(cached_provider, block_id, checkpoint_block_number).await + jerigon::block_prover_input( + cached_provider, + block_id, + checkpoint_block_number, + get_struct_logs, + ) + .await } RpcType::Native => { - native::block_prover_input(cached_provider, block_id, checkpoint_block_number).await + native::block_prover_input( + cached_provider, + block_id, + checkpoint_block_number, + get_struct_logs, + ) + .await } } } diff --git a/zero/src/rpc/native/mod.rs b/zero/src/rpc/native/mod.rs index a4dc7e0c6..896287970 100644 --- a/zero/src/rpc/native/mod.rs +++ b/zero/src/rpc/native/mod.rs @@ -23,19 +23,32 @@ pub async fn block_prover_input( provider: Arc>, block_number: BlockId, checkpoint_block_number: u64, + get_struct_logs: bool, ) -> anyhow::Result where ProviderT: Provider, TransportT: Transport + Clone, { let (block_trace, other_data) = try_join!( - process_block_trace(provider.clone(), block_number), + process_block_trace(provider.clone(), block_number, get_struct_logs), crate::rpc::fetch_other_block_data(provider.clone(), block_number, checkpoint_block_number) )?; + let struct_logs = if get_struct_logs { + Some( + block_trace + .txn_info + .iter() + .map(|t_i| t_i.meta.struct_log.clone()) + .collect::>(), + ) + } else { + None + }; Ok(BlockProverInput { block_trace, other_data, + struct_logs, }) } @@ -43,6 +56,7 @@ where async fn process_block_trace( cached_provider: Arc>, block_number: BlockId, + get_struct_logs: bool, ) -> anyhow::Result where ProviderT: Provider, @@ -53,8 +67,13 @@ where .await? .ok_or(anyhow::anyhow!("block not found {}", block_number))?; - let (code_db, txn_info) = - txn::process_transactions(&block, cached_provider.get_provider().await?.deref()).await?; + let (code_db, txn_info) = txn::process_transactions( + &block, + cached_provider.get_provider().await?.deref(), + get_struct_logs, + ) + .await?; + let trie_pre_images = state::process_state_witness(cached_provider, block, &txn_info).await?; Ok(BlockTrace { diff --git a/zero/src/rpc/native/txn.rs b/zero/src/rpc/native/txn.rs index 4989c1ab5..0e7e5dff1 100644 --- a/zero/src/rpc/native/txn.rs +++ b/zero/src/rpc/native/txn.rs @@ -18,6 +18,7 @@ use alloy::{ }; use alloy_compat::Compat; use anyhow::Context as _; +use evm_arithmetization::structlog::{get_structlog_for_debug, TxZeroStructLogs}; use futures::stream::{FuturesOrdered, TryStreamExt}; use trace_decoder::{ContractCodeUsage, TxnInfo, TxnMeta, TxnTrace}; @@ -27,6 +28,7 @@ use super::CodeDb; pub(super) async fn process_transactions( block: &Block, provider: &ProviderT, + get_struct_logs: bool, ) -> anyhow::Result<(CodeDb, Vec)> where ProviderT: Provider, @@ -37,7 +39,7 @@ where .as_transactions() .context("No transactions in block")? .iter() - .map(|tx| process_transaction(provider, tx)) + .map(|tx| process_transaction(provider, tx, get_struct_logs)) .collect::>() .try_fold( (BTreeSet::new(), Vec::new()), @@ -55,12 +57,14 @@ where async fn process_transaction( provider: &ProviderT, tx: &Transaction, + get_struct_logs: bool, ) -> anyhow::Result<(CodeDb, TxnInfo)> where ProviderT: Provider, TransportT: Transport + Clone, { - let (tx_receipt, pre_trace, diff_trace) = fetch_tx_data(provider, &tx.hash).await?; + let (tx_receipt, pre_trace, diff_trace, struct_log) = + fetch_tx_data(provider, &tx.hash, get_struct_logs).await?; let tx_status = tx_receipt.status(); let tx_receipt = tx_receipt.map_inner(rlp::map_receipt_envelope); let access_list = parse_access_list(tx.access_list.as_ref()); @@ -69,6 +73,7 @@ where byte_code: ::TxEnvelope::try_from(tx.clone())?.encoded_2718(), new_receipt_trie_node_byte: alloy::rlp::encode(tx_receipt.inner), gas_used: tx_receipt.gas_used as u64, + struct_log, }; let (code_db, mut tx_traces) = match (pre_trace, diff_trace) { @@ -100,7 +105,16 @@ where async fn fetch_tx_data( provider: &ProviderT, tx_hash: &B256, -) -> anyhow::Result<(::ReceiptResponse, GethTrace, GethTrace), anyhow::Error> + get_struct_logs: bool, +) -> anyhow::Result< + ( + ::ReceiptResponse, + GethTrace, + GethTrace, + TxZeroStructLogs, + ), + anyhow::Error, +> where ProviderT: Provider, TransportT: Transport + Clone, @@ -108,14 +122,20 @@ where let tx_receipt_fut = provider.get_transaction_receipt(*tx_hash); let pre_trace_fut = provider.debug_trace_transaction(*tx_hash, prestate_tracing_options(false)); let diff_trace_fut = provider.debug_trace_transaction(*tx_hash, prestate_tracing_options(true)); + let struct_logs = if get_struct_logs { + get_structlog_for_debug(provider, tx_hash).await? + } else { + None + }; let (tx_receipt, pre_trace, diff_trace) = - futures::try_join!(tx_receipt_fut, pre_trace_fut, diff_trace_fut,)?; + futures::try_join!(tx_receipt_fut, pre_trace_fut, diff_trace_fut)?; Ok(( tx_receipt.context("Transaction receipt not found.")?, pre_trace, diff_trace, + struct_logs, )) }