diff --git a/Cargo.lock b/Cargo.lock index 97d7f8c..372d869 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,9 +70,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "1.0.7" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa190bfa5340aee544ac831114876fa73bc8da487095b49a5ea153a6a4656ea" +checksum = "33d134f3ac4926124eaf521a1031d11ea98816df3d39fc446fcfd6b36884603f" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -85,14 +85,14 @@ dependencies = [ "derive_more", "either", "serde", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] name = "alloy-primitives" -version = "1.1.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18c35fc4b03ace65001676358ffbbaefe2a2b27ee50fe777c345082c7c888be8" +checksum = "6177ed26655d4e84e00b65cb494d4e0b8830e7cae7ef5d63087d445a2600fb55" dependencies = [ "alloy-rlp", "bytes", @@ -452,9 +452,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "aurora-engine-modexp" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aef7712851e524f35fbbb74fa6599c5cd8692056a1c36f9ca0d2001b670e7e5" +checksum = "518bc5745a6264b5fd7b09dffb9667e400ee9e2bbe18555fac75e1fe9afa0df9" dependencies = [ "hex", "num", @@ -477,6 +477,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + [[package]] name = "base16ct" version = "0.2.0" @@ -537,9 +543,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -557,6 +563,19 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -577,9 +596,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" dependencies = [ "cc", "glob", @@ -657,6 +676,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "cpufeatures" version = "0.2.14" @@ -732,9 +757,9 @@ dependencies = [ [[package]] name = "derive-where" -version = "1.2.7" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" dependencies = [ "proc-macro2", "quote", @@ -1016,6 +1041,16 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "gmp-mpfr-sys" +version = "1.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66d61197a68f6323b9afa616cf83d55d69191e1bf364d4eb7d35ae18defe776" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "group" version = "0.13.0" @@ -1145,7 +1180,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] @@ -1169,13 +1204,14 @@ dependencies = [ [[package]] name = "kzg-rs" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6efe7b9aea4a6b9454dc95a67f2de13505f6b4fbea885bc7a5c09bda48a85b18" +checksum = "9201effeea3fcc93b587904ae2df9ce97e433184b9d6d299e9ebc9830a546636" dependencies = [ "ff", "hex", - "sha2 0.10.8", + "serde_arrays", + "sha2 0.10.9", "sp1_bls12_381", "spin", ] @@ -1393,14 +1429,14 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] name = "p3-baby-bear" -version = "0.2.0-succinct" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080896e9d09e9761982febafe3b3da5cbf320e32f0c89b6e2e01e875129f4c2d" +checksum = "7521838ecab2ddf4f7bc4ceebad06ec02414729598485c1ada516c39900820e8" dependencies = [ "num-bigint 0.4.6", "p3-field", @@ -1413,9 +1449,9 @@ dependencies = [ [[package]] name = "p3-dft" -version = "0.2.0-succinct" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "292e97d02d4c38d8b306c2b8c0428bf15f4d32a11a40bcf80018f675bf33267e" +checksum = "46414daedd796f1eefcdc1811c0484e4bced5729486b6eaba9521c572c76761a" dependencies = [ "p3-field", "p3-matrix", @@ -1426,9 +1462,9 @@ dependencies = [ [[package]] name = "p3-field" -version = "0.2.0-succinct" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91d8e5f9ede1171adafdb0b6a0df1827fbd4eb6a6217bfa36374e5d86248757" +checksum = "48948a0516b349e9d1cdb95e7236a6ee010c44e68c5cc78b4b92bf1c4022a0d9" dependencies = [ "itertools 0.12.1", "num-bigint 0.4.6", @@ -1440,9 +1476,9 @@ dependencies = [ [[package]] name = "p3-matrix" -version = "0.2.0-succinct" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98bf2c7680b8e906a5e147fe4ceb05a11cc9fa35678aa724333bcb35c72483c1" +checksum = "3e4de3f373589477cb735ea58e125898ed20935e03664b4614c7fac258b3c42f" dependencies = [ "itertools 0.12.1", "p3-field", @@ -1455,15 +1491,15 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" -version = "0.2.0" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3925562a4c03183eafc92fd07b19f65ac6cb4b48d68c3920ce58d9bee6efe362" +checksum = "c3968ad1160310296eb04f91a5f4edfa38fe1d6b2b8cd6b5c64e6f9b7370979e" [[package]] name = "p3-mds" -version = "0.2.0-succinct" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "706cea48976f54702dc68dffa512684c1304d1a3606cadea423cfe0b1ee25134" +checksum = "2356b1ed0add6d5dfbf7a338ce534a6fde827374394a52cec16a0840af6e97c9" dependencies = [ "itertools 0.12.1", "p3-dft", @@ -1476,9 +1512,9 @@ dependencies = [ [[package]] name = "p3-poseidon2" -version = "0.2.0-succinct" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ce5f5ec7f1ba3a233a671621029def7bd416e7c51218c9d1167d21602cf312" +checksum = "7da1eec7e1b6900581bedd95e76e1ef4975608dd55be9872c9d257a8a9651c3a" dependencies = [ "gcd", "p3-field", @@ -1490,9 +1526,9 @@ dependencies = [ [[package]] name = "p3-symmetric" -version = "0.2.0-succinct" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f29dc5bb6c99d3de75869d5c086874b64890280eeb7d3e068955f939e219253" +checksum = "edb439bea1d822623b41ff4b51e3309e80d13cadf8b86d16ffd5e6efb9fdc360" dependencies = [ "itertools 0.12.1", "p3-field", @@ -1501,9 +1537,9 @@ dependencies = [ [[package]] name = "p3-util" -version = "0.2.0" +version = "0.2.3-succinct" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88dd5ca3eb6ff33cb20084778c32a6d68064a1913b4632437408c5a1098408b3" +checksum = "b6c2c2010678b9332b563eaa38364915b585c1a94b5ca61e2c7541c087ddda5c" dependencies = [ "serde", ] @@ -1792,8 +1828,8 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "revm" -version = "24.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "26.0.1" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "revm-bytecode", "revm-context", @@ -1810,8 +1846,8 @@ dependencies = [ [[package]] name = "revm-bytecode" -version = "4.0.1" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "5.0.0" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "bitvec", "once_cell", @@ -1822,8 +1858,8 @@ dependencies = [ [[package]] name = "revm-context" -version = "5.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "7.0.1" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "cfg-if", "derive-where", @@ -1837,8 +1873,8 @@ dependencies = [ [[package]] name = "revm-context-interface" -version = "5.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "7.0.1" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -1852,8 +1888,8 @@ dependencies = [ [[package]] name = "revm-database" -version = "4.0.1" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "6.0.0" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "alloy-eips", "revm-bytecode", @@ -1865,8 +1901,8 @@ dependencies = [ [[package]] name = "revm-database-interface" -version = "4.0.1" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "6.0.0" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "auto_impl", "revm-primitives", @@ -1876,10 +1912,11 @@ dependencies = [ [[package]] name = "revm-handler" -version = "5.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "7.0.1" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "auto_impl", + "derive-where", "revm-bytecode", "revm-context", "revm-context-interface", @@ -1893,10 +1930,11 @@ dependencies = [ [[package]] name = "revm-inspector" -version = "5.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "7.0.1" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "auto_impl", + "either", "revm-context", "revm-database-interface", "revm-handler", @@ -1909,8 +1947,8 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "20.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "22.0.1" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "revm-bytecode", "revm-context-interface", @@ -1920,8 +1958,8 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "21.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "23.0.0" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -1939,14 +1977,15 @@ dependencies = [ "p256", "revm-primitives", "ripemd", + "rug", "secp256k1", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] name = "revm-primitives" -version = "19.1.0" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "20.0.0" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "alloy-primitives", "num_enum", @@ -1968,8 +2007,8 @@ dependencies = [ [[package]] name = "revm-state" -version = "4.0.1" -source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v74#774616019e9562b12cbe1c3f1cdd110793f8084c" +version = "6.0.0" +source = "git+https://github.com/scroll-tech/revm?branch=feat%2Freth-v78#64e018f80e65d79505591aacec4f35ec46bca5ff" dependencies = [ "bitflags", "revm-bytecode", @@ -2006,6 +2045,18 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "rug" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4207e8d668e5b8eb574bda8322088ccd0d7782d3d03c7e8d562e82ed82bdcbc3" +dependencies = [ + "az", + "gmp-mpfr-sys", + "libc", + "libm", +] + [[package]] name = "ruint" version = "1.14.0" @@ -2116,20 +2167,20 @@ dependencies = [ [[package]] name = "secp256k1" -version = "0.30.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.9.0", "secp256k1-sys", ] [[package]] name = "secp256k1-sys" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +checksum = "dcb913707158fadaf0d8702c2db0e857de66eb003ccfdda5924b5f5ac98efb38" dependencies = [ "cc", ] @@ -2167,6 +2218,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_arrays" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a16b99c5ea4fe3daccd14853ad260ec00ea043b2708d1fd1da3106dcd8d9df" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.210" @@ -2206,9 +2266,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -2259,9 +2319,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "sp1-lib" -version = "4.1.1" +version = "5.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fab1b5989a446f294724cebab0e759ffd7034ba93d2aa7b97045303f7c50bf74" +checksum = "d0fd8bc101e5603ccf2dc1836ea06410f25ce2298755b2dac626add9be2424b4" dependencies = [ "bincode", "serde", @@ -2270,11 +2330,13 @@ dependencies = [ [[package]] name = "sp1-primitives" -version = "4.1.1" +version = "5.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cf66c2781c36037c94a5905b6e05e7396fd4d12df09cd7f05cf96e3f0889f49" +checksum = "699935774a5131c1a8b371108d0666c0c80c43611045fb77fae43f2f242676d5" dependencies = [ "bincode", + "blake3", + "cfg-if", "hex", "lazy_static", "num-bigint 0.4.6", @@ -2283,14 +2345,14 @@ dependencies = [ "p3-poseidon2", "p3-symmetric", "serde", - "sha2 0.10.8", + "sha2 0.10.9", ] [[package]] name = "sp1_bls12_381" -version = "0.8.0-sp1-4.0.0-v2" +version = "0.8.0-sp1-5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0800e0491c38cc686233518fce535d01ba0a0707781766fec38aee9c1b33890" +checksum = "ac255e1704ebcdeec5e02f6a0ebc4d2e9e6b802161938330b6810c13a610c583" dependencies = [ "cfg-if", "ff", diff --git a/Cargo.toml b/Cargo.toml index 7685e86..5243604 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,9 +6,9 @@ license = "MIT OR Apache-2.0" [dependencies] # revm -revm = { git = "https://github.com/scroll-tech/revm", branch = "feat/reth-v74", default-features = false, features = ["secp256r1", "enable_eip7702", "enable_eip7623"] } -revm-primitives = { git = "https://github.com/scroll-tech/revm", branch = "feat/reth-v74", default-features = false } -revm-inspector = { git = "https://github.com/scroll-tech/revm", branch = "feat/reth-v74", default-features = false } +revm = { git = "https://github.com/scroll-tech/revm", branch = "feat/reth-v78", default-features = false, features = ["enable_eip7702", "enable_eip7623"] } +revm-primitives = { git = "https://github.com/scroll-tech/revm", branch = "feat/reth-v78", default-features = false } +revm-inspector = { git = "https://github.com/scroll-tech/revm", branch = "feat/reth-v78", default-features = false } # misc auto_impl = "1.2.0" diff --git a/src/builder.rs b/src/builder.rs index f1d26fd..bff0a29 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -4,10 +4,11 @@ use crate::{ }; use revm::{ - context::{BlockEnv, Cfg, CfgEnv, JournalOutput, JournalTr, TxEnv}, + context::{BlockEnv, Cfg, CfgEnv, JournalTr, TxEnv}, context_interface::Block, database::EmptyDB, interpreter::interpreter::EthInterpreter, + state::EvmState, Context, Database, Journal, MainContext, }; @@ -31,7 +32,7 @@ where TX: ScrollTxTr, CFG: Cfg, DB: Database, - JOURNAL: JournalTr, + JOURNAL: JournalTr, { type Context = Self; diff --git a/src/evm.rs b/src/evm.rs index 2783ad6..faa1f9c 100644 --- a/src/evm.rs +++ b/src/evm.rs @@ -1,10 +1,15 @@ -use crate::{instructions::ScrollInstructions, precompile::ScrollPrecompileProvider}; +use crate::{ + exec::ScrollContextTr, instructions::ScrollInstructions, precompile::ScrollPrecompileProvider, +}; -use crate::exec::ScrollContextTr; use revm::{ - context::{Cfg, ContextSetters, ContextTr, Evm}, - handler::{instructions::InstructionProvider, EvmTr, PrecompileProvider}, - interpreter::{interpreter::EthInterpreter, Interpreter, InterpreterAction, InterpreterTypes}, + context::{Cfg, ContextError, ContextSetters, ContextTr, Evm, FrameStack}, + handler::{ + instructions::InstructionProvider, EthFrame, EvmTr, FrameInitOrResult, FrameTr, + ItemOrResult, PrecompileProvider, + }, + interpreter::{interpreter::EthInterpreter, InterpreterResult}, + Database, }; use revm_inspector::{Inspector, InspectorEvmTr, JournalExt}; @@ -14,7 +19,8 @@ pub struct ScrollEvm< INSP, I = ScrollInstructions, P = ScrollPrecompileProvider, ->(pub Evm); + F = EthFrame, +>(pub Evm); impl ScrollEvm, ScrollPrecompileProvider> @@ -26,6 +32,7 @@ impl inspector, instruction: ScrollInstructions::new_mainnet(), precompiles: ScrollPrecompileProvider::new_with_spec(spec), + frame_stack: FrameStack::new(), }) } } @@ -50,27 +57,13 @@ impl ScrollEvm { impl EvmTr for ScrollEvm where CTX: ContextTr, - I: InstructionProvider< - Context = CTX, - InterpreterTypes: InterpreterTypes, - >, - P: PrecompileProvider, + I: InstructionProvider, + P: PrecompileProvider, { type Context = CTX; type Instructions = I; type Precompiles = P; - - fn run_interpreter( - &mut self, - interpreter: &mut Interpreter< - ::InterpreterTypes, - >, - ) -> <::InterpreterTypes as InterpreterTypes>::Output - { - let context = &mut self.0.ctx; - let instructions = &mut self.0.instruction; - interpreter.run_plain(instructions.instruction_table(), context) - } + type Frame = EthFrame; fn ctx(&mut self) -> &mut Self::Context { &mut self.0.ctx @@ -87,17 +80,49 @@ where fn ctx_precompiles(&mut self) -> (&mut Self::Context, &mut Self::Precompiles) { (&mut self.0.ctx, &mut self.0.precompiles) } + + fn frame_stack(&mut self) -> &mut FrameStack { + &mut self.0.frame_stack + } + + fn frame_init( + &mut self, + frame_input: ::FrameInit, + ) -> Result< + ItemOrResult<&mut Self::Frame, ::FrameResult>, + ContextError<<::Db as Database>::Error>, + > { + self.0.frame_init(frame_input) + } + + fn frame_run( + &mut self, + ) -> Result< + FrameInitOrResult, + ContextError<<::Db as Database>::Error>, + > { + self.0.frame_run() + } + + #[doc = " Returns the result of the frame to the caller. Frame is popped from the frame stack."] + #[doc = " Consumes the frame result or returns it if there is more frames to run."] + fn frame_return_result( + &mut self, + result: ::FrameResult, + ) -> Result< + Option<::FrameResult>, + ContextError<<::Db as Database>::Error>, + > { + self.0.frame_return_result(result) + } } impl InspectorEvmTr for ScrollEvm where CTX: ContextTr + ContextSetters, - I: InstructionProvider< - Context = CTX, - InterpreterTypes: InterpreterTypes, - >, + I: InstructionProvider, + P: PrecompileProvider, INSP: Inspector, - P: PrecompileProvider, { type Inspector = INSP; @@ -109,13 +134,15 @@ where (&mut self.0.ctx, &mut self.0.inspector) } - fn run_inspect_interpreter( + fn ctx_inspector_frame( + &mut self, + ) -> (&mut Self::Context, &mut Self::Inspector, &mut Self::Frame) { + (&mut self.0.ctx, &mut self.0.inspector, self.0.frame_stack.get()) + } + + fn ctx_inspector_frame_instructions( &mut self, - interpreter: &mut Interpreter< - ::InterpreterTypes, - >, - ) -> <::InterpreterTypes as InterpreterTypes>::Output - { - self.0.run_inspect_interpreter(interpreter) + ) -> (&mut Self::Context, &mut Self::Inspector, &mut Self::Frame, &mut Self::Instructions) { + (&mut self.0.ctx, &mut self.0.inspector, self.0.frame_stack.get(), &mut self.0.instruction) } } diff --git a/src/exec.rs b/src/exec.rs index 43507dc..1675589 100644 --- a/src/exec.rs +++ b/src/exec.rs @@ -4,20 +4,24 @@ use crate::{ }; use revm::{ - context::{result::HaltReason, ContextSetters, JournalOutput, JournalTr}, + context::{ + result::{ExecResultAndState, HaltReason}, + ContextSetters, JournalTr, + }, context_interface::{ - result::{EVMError, ExecutionResult, ResultAndState}, + result::{EVMError, ExecutionResult}, Cfg, ContextTr, Database, }, - handler::{EthFrame, EvmTr, Handler, PrecompileProvider}, + handler::{EthFrame, Handler, PrecompileProvider}, interpreter::{interpreter::EthInterpreter, InterpreterResult}, + state::EvmState, DatabaseCommit, ExecuteCommitEvm, ExecuteEvm, }; use revm_inspector::{InspectCommitEvm, InspectEvm, Inspector, InspectorHandler, JournalExt}; pub trait ScrollContextTr: ContextTr< - Journal: JournalTr, + Journal: JournalTr, Tx: ScrollTxTr, Cfg: Cfg, Chain = L1BlockInfo, @@ -27,7 +31,7 @@ pub trait ScrollContextTr: impl ScrollContextTr for T where T: ContextTr< - Journal: JournalTr, + Journal: JournalTr, Tx: ScrollTxTr, Cfg: Cfg, Chain = L1BlockInfo, @@ -35,31 +39,44 @@ impl ScrollContextTr for T where { } +/// Type alias for the error type of the ScrollEvm. +pub type ScrollError = EVMError<<::Db as Database>::Error>; + impl ExecuteEvm for ScrollEvm, PRECOMPILE> where CTX: ScrollContextTr + ContextSetters, PRECOMPILE: PrecompileProvider, { - type Output = - Result, EVMError<<::Db as Database>::Error>>; - type Tx = ::Tx; - type Block = ::Block; - - fn set_tx(&mut self, tx: Self::Tx) { - self.0.ctx.set_tx(tx); - } + type State = EvmState; + type Error = ScrollError; + type ExecutionResult = ExecutionResult; fn set_block(&mut self, block: Self::Block) { self.0.ctx.set_block(block); } - fn replay(&mut self) -> Self::Output { - let mut h = ScrollHandler::<_, _, EthFrame<_, _, _>>::new(); + fn transact_one(&mut self, tx: Self::Tx) -> Result { + self.0.ctx.set_tx(tx); + let mut h = ScrollHandler::<_, _, EthFrame>::new(); h.run(self) } + + fn finalize(&mut self) -> Self::State { + self.0.ctx.journal_mut().finalize() + } + + fn replay( + &mut self, + ) -> Result, Self::Error> { + let mut h = ScrollHandler::<_, _, EthFrame>::new(); + h.run(self).map(|result| { + let state = self.finalize(); + ExecResultAndState::new(result, state) + }) + } } impl ExecuteCommitEvm @@ -68,14 +85,8 @@ where CTX: ScrollContextTr + ContextSetters, PRECOMPILE: PrecompileProvider, { - type CommitOutput = - Result, EVMError<<::Db as Database>::Error>>; - - fn replay_commit(&mut self) -> Self::CommitOutput { - self.replay().map(|r| { - self.ctx().db().commit(r.state); - r.result - }) + fn commit(&mut self, state: Self::State) { + self.0.ctx.db_mut().commit(state) } } @@ -92,8 +103,9 @@ where self.0.inspector = inspector; } - fn inspect_replay(&mut self) -> Self::Output { - let mut h = ScrollHandler::<_, _, EthFrame<_, _, _>>::new(); + fn inspect_one_tx(&mut self, tx: Self::Tx) -> Result { + self.0.ctx.set_tx(tx); + let mut h = ScrollHandler::<_, _, EthFrame<_>>::new(); h.inspect_run(self) } } @@ -105,10 +117,4 @@ where INSP: Inspector, PRECOMPILE: PrecompileProvider, { - fn inspect_replay_commit(&mut self) -> Self::CommitOutput { - self.inspect_replay().map(|r| { - self.ctx().db().commit(r.state); - r.result - }) - } } diff --git a/src/handler.rs b/src/handler.rs index d6f5768..90f3da5 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -9,13 +9,13 @@ use revm::{ Block, Cfg, ContextTr, JournalTr, Transaction, }, handler::{ - post_execution, pre_execution, pre_execution::validate_account_nonce_and_code, EvmTr, - EvmTrError, Frame, FrameResult, Handler, MainnetHandler, + post_execution, pre_execution, pre_execution::validate_account_nonce_and_code, EthFrame, + EvmTr, EvmTrError, FrameResult, FrameTr, Handler, MainnetHandler, }, - interpreter::{interpreter::EthInterpreter, FrameInput, Gas}, + interpreter::{interpreter::EthInterpreter, interpreter_action::FrameInit, Gas}, primitives::U256, }; -use revm_inspector::{Inspector, InspectorEvmTr, InspectorFrame, InspectorHandler}; +use revm_inspector::{Inspector, InspectorEvmTr, InspectorHandler}; /// The Scroll handler. pub struct ScrollHandler { @@ -48,13 +48,12 @@ impl Default for ScrollHandler { /// gas fee and skip rewarding in case the transaction is a L1 message. impl Handler for ScrollHandler where - EVM: EvmTr, + EVM: EvmTr, ERROR: EvmTrError + From, - FRAME: Frame, + FRAME: FrameTr, { type Evm = EVM; type Error = ERROR; - type Frame = FRAME; type HaltReason = HaltReason; #[inline] @@ -62,15 +61,12 @@ where // only load the L1BlockInfo for txs that are not l1 messages. if !evm.ctx().tx().is_l1_msg() && !evm.ctx().tx().is_system_tx() { let spec = evm.ctx().cfg().spec(); - let l1_block_info = L1BlockInfo::try_fetch(&mut evm.ctx().db(), spec)?; - *evm.ctx().chain() = l1_block_info; + let l1_block_info = L1BlockInfo::try_fetch(evm.ctx().db_mut(), spec)?; + *evm.ctx().chain_mut() = l1_block_info; } self.validate_against_state_and_deduct_caller(evm)?; self.load_accounts(evm)?; - // Cache EIP-7873 EOF initcodes and calculate its hash. Does nothing if not Initcode - // Transaction. - self.apply_eip7873_eof_initcodes(evm)?; let gas = self.apply_eip7702_auth_list(evm)?; Ok(gas) } @@ -85,7 +81,6 @@ where let caller = ctx.tx().caller(); let is_l1_msg = ctx.tx().is_l1_msg(); let is_system_tx = ctx.tx().is_system_tx(); - let kind = ctx.tx().kind(); let spec = ctx.cfg().spec(); let is_eip3607_disabled = ctx.cfg().is_eip3607_disabled(); let is_nonce_check_disabled = ctx.cfg().is_nonce_check_disabled(); @@ -109,7 +104,7 @@ where // Deduct l1 fee from caller. let tx_l1_cost = l1_block_info.calculate_tx_l1_cost(rlp_bytes, spec, ctx.tx().compression_ratio()); - let caller_account = ctx.journal().load_account(caller)?; + let caller_account = ctx.journal_mut().load_account(caller)?; if tx_l1_cost.gt(&caller_account.info.balance) { return Err(InvalidTransaction::LackOfFundForMaxFee { fee: tx_l1_cost.into(), @@ -124,13 +119,12 @@ where // execute l1 msg checks if is_l1_msg { // Load caller's account. - let (tx, journal) = ctx.tx_journal(); + let (tx, journal) = ctx.tx_journal_mut(); let mut caller_account = journal.load_account(caller)?; validate_account_nonce_and_code( &mut caller_account.info, tx.nonce(), - kind.is_call(), is_eip3607_disabled, is_nonce_check_disabled, )?; @@ -151,6 +145,11 @@ where } } + // Bump the nonce for calls. Nonce for CREATE will be bumped in `make_create_frame`. + if tx.kind().is_call() { + // Nonce is already checked + caller_account.info.nonce = caller_account.info.nonce.saturating_add(1); + } // touch account so we know it is changed. caller_account.data.mark_touch(); } @@ -161,7 +160,7 @@ where fn last_frame_result( &mut self, evm: &mut Self::Evm, - frame_result: &mut ::FrameResult, + frame_result: &mut <::Frame as FrameTr>::FrameResult, ) -> Result<(), Self::Error> { let instruction_result = frame_result.interpreter_result().result; let gas = frame_result.gas_mut(); @@ -187,7 +186,7 @@ where fn refund( &self, evm: &mut Self::Evm, - exec_result: &mut ::FrameResult, + exec_result: &mut <::Frame as FrameTr>::FrameResult, eip7702_refund: i64, ) { // skip refund for l1 messages @@ -201,7 +200,7 @@ where fn reward_beneficiary( &self, evm: &mut Self::Evm, - exec_result: &mut ::FrameResult, + exec_result: &mut <::Frame as FrameTr>::FrameResult, ) -> Result<(), Self::Error> { let ctx = evm.ctx(); @@ -238,33 +237,24 @@ where // reward the beneficiary with the gas fee including the L1 cost of the transaction and mark // the account as touched. let gas = exec_result.gas(); - let coinbase_account = ctx.journal().load_account(beneficiary)?; - coinbase_account.data.info.balance = coinbase_account - .data - .info - .balance - .saturating_add(effective_gas_price * U256::from(gas.spent() - gas.refunded() as u64)) + + let reward = effective_gas_price + .saturating_mul(U256::from(gas.spent() - gas.refunded() as u64)) .saturating_add(l1_cost); - coinbase_account.data.mark_touch(); + ctx.journal_mut().balance_incr(beneficiary, reward)?; Ok(()) } } -impl InspectorHandler for ScrollHandler +impl InspectorHandler for ScrollHandler> where EVM: InspectorEvmTr< Context: ScrollContextTr, + Frame = EthFrame, Inspector: Inspector<<::Evm as EvmTr>::Context, EthInterpreter>, >, ERROR: EvmTrError, - FRAME: InspectorFrame< - Evm = EVM, - Error = ERROR, - FrameResult = FrameResult, - FrameInit = FrameInput, - IT = EthInterpreter, - >, { type IT = EthInterpreter; } @@ -291,7 +281,7 @@ mod tests { fn test_validate_lacking_funds() -> Result<(), Box> { let ctx = context(); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let err = handler.validate_against_state_and_deduct_caller(&mut evm).unwrap_err(); assert_eq!( err, @@ -308,7 +298,7 @@ mod tests { fn test_load_account() -> Result<(), Box> { let ctx = context().with_funds(MIN_TRANSACTION_COST + L1_DATA_COST); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.pre_execution(&mut evm)?; let l1_block_info = evm.ctx().chain.clone(); @@ -322,10 +312,11 @@ mod tests { let ctx = context().with_funds(MIN_TRANSACTION_COST + L1_DATA_COST); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.pre_execution(&mut evm)?; - let caller_account = evm.ctx().journal().load_account(CALLER)?; + let ctx = evm.ctx_mut(); + let caller_account = ctx.journal_mut().load_account(CALLER)?; assert_eq!(caller_account.info.balance, U256::ZERO); assert_eq!(caller_account.info.nonce, 1); @@ -337,7 +328,7 @@ mod tests { let ctx = context(); let mut evm = ctx.build_scroll(); - let mut handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let mut handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let mut gas = Gas::new(21000); gas.set_refund(10); gas.set_spent(10); @@ -361,7 +352,7 @@ mod tests { let ctx = context(); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let mut gas = Gas::new(21000); gas.set_refund(10); gas.set_spent(10); @@ -386,7 +377,7 @@ mod tests { let ctx = context().with_funds(MIN_TRANSACTION_COST + L1_DATA_COST); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let gas = Gas::new_spent(21000); let mut result = FrameResult::Call(CallOutcome::new( InterpreterResult { @@ -399,7 +390,8 @@ mod tests { handler.pre_execution(&mut evm)?; handler.reward_beneficiary(&mut evm, &mut result)?; - let beneficiary = evm.ctx().journal().load_account(BENEFICIARY)?; + let ctx = evm.ctx_mut(); + let beneficiary = ctx.journal_mut().load_account(BENEFICIARY)?; assert_eq!(beneficiary.info.balance, MIN_TRANSACTION_COST + L1_DATA_COST); Ok(()) @@ -410,7 +402,7 @@ mod tests { let ctx = context().with_funds(MIN_TRANSACTION_COST + L1_DATA_COST); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.pre_execution(&mut evm)?; Ok(()) diff --git a/src/instructions.rs b/src/instructions.rs index c85e0a6..59f2b8a 100644 --- a/src/instructions.rs +++ b/src/instructions.rs @@ -6,9 +6,9 @@ use revm::{ handler::instructions::InstructionProvider, interpreter::{ as_u64_saturated, as_usize_or_fail, gas, gas_or_fail, instruction_table, - interpreter_types::{InputsTr, LoopControl, MemoryTr, RuntimeFlag, StackTr}, - popn, popn_top, push, require_non_staticcall, resize_memory, Host, InstructionResult, - InstructionTable, Interpreter, InterpreterTypes, + interpreter_types::{InputsTr, MemoryTr, RuntimeFlag, StackTr}, + popn, popn_top, push, require_non_staticcall, resize_memory, Host, InstructionContext, + InstructionResult, InstructionTable, InterpreterTypes, }, primitives::{address, keccak256, Address, BLOCK_HASH_HISTORY, U256}, }; @@ -89,19 +89,24 @@ pub fn make_scroll_instruction_table( - interpreter: &mut Interpreter, - host: &mut H, -) { +fn blockhash(context: InstructionContext<'_, H, WIRE>) { + let host = context.host; + let interpreter = context.interpreter; + gas!(interpreter, gas::BLOCKHASH); - popn_top!([], requested_block_number, interpreter); + popn_top!([], number, interpreter); + + let requested_number = *number; + let block_number = host.block_number(); // compute the diff between the current block number and the requested block number - let requested_block_number_u64 = as_u64_saturated!(requested_block_number); - let current_block_number = host.block_number(); - let diff = current_block_number.saturating_sub(requested_block_number_u64); + let Some(diff) = block_number.checked_sub(requested_number) else { + *number = U256::ZERO; + return; + }; - *requested_block_number = match diff { + let diff = as_u64_saturated!(diff); + *number = match diff { // blockhash requested for current or future block - return 0 0 => U256::ZERO, // blockhash requested for block older than BLOCK_HASH_HISTORY - return 0 @@ -110,22 +115,23 @@ fn blockhash( // blockhash is computed as the keccak256 hash of the chain id and the block number _ if !host.cfg().spec().is_enabled_in(ScrollSpecId::FEYNMAN) => { let chain_id = as_u64_saturated!(host.chain_id()); - compute_block_hash(chain_id, as_u64_saturated!(requested_block_number)) + compute_block_hash(chain_id, as_u64_saturated!(requested_number)) } // blockhash requested for block in the history (post-Feynman) // blockhash is loaded from the EIP-2935 history storage system contract storage. _ => { // sload assumes that the account is present in the journal if host.load_account_delegated(HISTORY_STORAGE_ADDRESS).is_none() { - interpreter.control.set_instruction_result(InstructionResult::FatalExternalError); + interpreter.halt(InstructionResult::FatalExternalError); return; }; // index in system contract ring buffer storage is block_number % HISTORY_SERVE_WINDOW + let requested_block_number_u64 = as_u64_saturated!(requested_number); let index = requested_block_number_u64.wrapping_rem(HISTORY_SERVE_WINDOW); let Some(value) = host.sload(HISTORY_STORAGE_ADDRESS, U256::from(index)) else { - interpreter.control.set_instruction_result(InstructionResult::FatalExternalError); + interpreter.halt(InstructionResult::FatalExternalError); return; }; @@ -134,22 +140,18 @@ fn blockhash( }; } -fn selfdestruct( - interpreter: &mut Interpreter, - _host: &mut H, -) { - interpreter.control.set_instruction_result(InstructionResult::NotActivated); +fn selfdestruct(context: InstructionContext<'_, H, WIRE>) { + context.interpreter.halt(InstructionResult::NotActivated); } // CURIE OPCODE IMPLEMENTATIONS // ================================================================================================ -fn basefee( - interpreter: &mut Interpreter, - host: &mut H, -) { +fn basefee(context: InstructionContext<'_, H, WIRE>) { + let host = context.host; + let interpreter = context.interpreter; if !host.cfg().spec().is_enabled_in(ScrollSpecId::CURIE) { - interpreter.control.set_instruction_result(InstructionResult::NotActivated); + interpreter.halt(InstructionResult::NotActivated); return; } @@ -157,12 +159,11 @@ fn basefee( push!(interpreter, U256::from(host.basefee())); } -fn tstore( - interpreter: &mut Interpreter, - host: &mut H, -) { +fn tstore(context: InstructionContext<'_, H, WIRE>) { + let host = context.host; + let interpreter = context.interpreter; if !host.cfg().spec().is_enabled_in(ScrollSpecId::CURIE) { - interpreter.control.set_instruction_result(InstructionResult::NotActivated); + interpreter.halt(InstructionResult::NotActivated); return; } @@ -174,12 +175,11 @@ fn tstore( host.tstore(interpreter.input.target_address(), index, value); } -fn tload( - interpreter: &mut Interpreter, - host: &mut H, -) { +fn tload(context: InstructionContext<'_, H, WIRE>) { + let host = context.host; + let interpreter = context.interpreter; if !host.cfg().spec().is_enabled_in(ScrollSpecId::CURIE) { - interpreter.control.set_instruction_result(InstructionResult::NotActivated); + interpreter.halt(InstructionResult::NotActivated); return; } @@ -190,12 +190,11 @@ fn tload( *index = host.tload(interpreter.input.target_address(), *index); } -fn mcopy( - interpreter: &mut Interpreter, - host: &mut H, -) { +fn mcopy(context: InstructionContext<'_, H, WIRE>) { + let host = context.host; + let interpreter = context.interpreter; if !host.cfg().spec().is_enabled_in(ScrollSpecId::CURIE) { - interpreter.control.set_instruction_result(InstructionResult::NotActivated); + interpreter.halt(InstructionResult::NotActivated); return; } @@ -250,7 +249,7 @@ mod tests { #[test] fn test_blockhash_before_feynman() { - let (chain_id, current_block, target_block, spec) = (123, 1024, 1000, EUCLID); + let (chain_id, current_block, target_block, spec) = (123, U256::from(1024), 1000, EUCLID); let db = EmptyDB::new(); let mut context = ScrollContext::scroll().with_db(InMemoryDB::new(db)); @@ -272,7 +271,7 @@ mod tests { #[test] fn test_blockhash_after_feynman() { - let (chain_id, current_block, target_block, spec) = (123, 1024, 1000, FEYNMAN); + let (chain_id, current_block, target_block, spec) = (123, U256::from(1024), 1000, FEYNMAN); let db = EmptyDB::new(); let mut context = ScrollContext::scroll().with_db(InMemoryDB::new(db)); diff --git a/src/tests/eip7623.rs b/src/tests/eip7623.rs index d8a1679..b041d9e 100644 --- a/src/tests/eip7623.rs +++ b/src/tests/eip7623.rs @@ -21,7 +21,7 @@ fn test_should_not_apply_eip7623_calldata_gas_for_euclid() { .modify_tx_chained(|tx| tx.base.gas_limit = GAS_LIMIT) .maybe_with_eip_7623(); let evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); // check call passes. let _ = handler.validate_initial_tx_gas(&evm).unwrap(); @@ -41,7 +41,7 @@ fn test_should_apply_eip7623_calldata_gas_for_feynman() { }) .maybe_with_eip_7623(); let evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); // check call errors on gas floor more than gas limit. let err = handler.validate_initial_tx_gas(&evm).unwrap_err(); diff --git a/src/tests/eip7702.rs b/src/tests/eip7702.rs index c84a5af..76771f1 100644 --- a/src/tests/eip7702.rs +++ b/src/tests/eip7702.rs @@ -16,7 +16,7 @@ use revm_primitives::{eip7702, U256}; fn test_validate_initial_gas_eip7702() -> Result<(), Box> { let ctx = context(); let evm = ctx.clone().build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let gas_empty_authorization_list = handler.validate_initial_tx_gas(&evm)?; let evm = ctx @@ -34,7 +34,7 @@ fn test_validate_initial_gas_eip7702() -> Result<(), Box ))] }) .build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let gas_with_authorization_list = handler.validate_initial_tx_gas(&evm)?; // initial gas should include eip7702 cost of authorized accounts. @@ -58,7 +58,7 @@ fn test_validate_env_eip7702() -> Result<(), Box> { ))] }); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); // eip 7702 env checks should pass. handler.validate_env(&mut evm)?; diff --git a/src/tests/fees.rs b/src/tests/fees.rs index da1c6d3..58cb264 100644 --- a/src/tests/fees.rs +++ b/src/tests/fees.rs @@ -20,11 +20,12 @@ fn test_should_deduct_correct_fees_bernoulli() -> Result<(), Box, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.pre_execution(&mut evm).unwrap(); - let caller_account = evm.ctx().journal().load_account(CALLER)?; + let ctx = evm.ctx_mut(); + let caller_account = ctx.journal_mut().load_account(CALLER)?; // cost is 21k + 1012 (shanghai l1 cost). assert_eq!(caller_account.data.info.balance, U256::from(7988)); @@ -38,11 +39,12 @@ fn test_should_deduct_correct_fees_curie() -> Result<(), Box, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.pre_execution(&mut evm).unwrap(); - let caller_account = evm.ctx().journal().load_account(CALLER)?; + let ctx = evm.ctx_mut(); + let caller_account = ctx.journal_mut().load_account(CALLER)?; // cost is 21k + 40k (curie l1 cost). assert_eq!(caller_account.data.info.balance, U256::from(9000)); @@ -61,11 +63,12 @@ fn test_no_rollup_fee_for_system_tx() -> Result<(), Box> }); let mut evm = ctx.clone().build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.pre_execution(&mut evm).unwrap(); - let caller_account = evm.ctx().journal().load_account(CALLER)?; + let ctx = evm.ctx_mut(); + let caller_account = ctx.journal_mut().load_account(CALLER)?; // gas price is 0, no data fee => balance is unchanged. assert_eq!(caller_account.data.info.balance, U256::from(70_000)); @@ -80,7 +83,7 @@ fn test_reward_beneficiary_system_tx() -> Result<(), Box .modify_tx_chained(|tx| tx.base.caller = SYSTEM_ADDRESS); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let gas = Gas::new_spent(21000); let mut result = FrameResult::Call(CallOutcome::new( InterpreterResult { result: InstructionResult::Return, output: Default::default(), gas }, @@ -90,7 +93,8 @@ fn test_reward_beneficiary_system_tx() -> Result<(), Box handler.reward_beneficiary(&mut evm, &mut result)?; // beneficiary receives gas (if any), but not rollup fee - let beneficiary = evm.ctx().journal().load_account(BENEFICIARY)?; + let ctx = evm.ctx_mut(); + let beneficiary = ctx.journal_mut().load_account(BENEFICIARY)?; assert_eq!(beneficiary.info.balance, U256::from(21000)); Ok(()) @@ -119,11 +123,12 @@ fn test_should_deduct_correct_fees_feynman() -> Result<(), Box, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.pre_execution(&mut evm).unwrap(); - let caller_account = evm.ctx().journal().load_account(CALLER)?; + let ctx = evm.ctx_mut(); + let caller_account = ctx.journal_mut().load_account(CALLER)?; // cost is 21k + 6k (applying 2x penalty). let balance_diff = initial_funds.saturating_sub(caller_account.data.info.balance); diff --git a/src/tests/l1_message.rs b/src/tests/l1_message.rs index 392759c..f5da24c 100644 --- a/src/tests/l1_message.rs +++ b/src/tests/l1_message.rs @@ -23,7 +23,7 @@ use revm_primitives::U256; fn test_validate_lacking_funds_l1_message() -> Result<(), Box> { let ctx = context().modify_tx_chained(|tx| tx.base.tx_type = L1_MESSAGE_TYPE); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); // pre execution includes fees deduction, which should be skipped for l1 messages. handler.pre_execution(&mut evm)?; @@ -35,7 +35,7 @@ fn test_validate_lacking_funds_l1_message() -> Result<(), Box Result<(), Box> { let ctx = context().modify_tx_chained(|tx| tx.base.tx_type = L1_MESSAGE_TYPE); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.load_accounts(&mut evm)?; // l1 block info should not be loaded for l1 messages. @@ -50,12 +50,13 @@ fn test_deduct_caller_l1_message() -> Result<(), Box> { let ctx = context().modify_tx_chained(|tx| tx.base.tx_type = L1_MESSAGE_TYPE); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); handler.load_accounts(&mut evm)?; handler.validate_against_state_and_deduct_caller(&mut evm)?; // nonce should be increase and caller should have same balance as the start (0). - let caller_account = evm.ctx().journal().load_account(CALLER)?; + let ctx = evm.ctx_mut(); + let caller_account = ctx.journal_mut().load_account(CALLER)?; assert_eq!(caller_account.info.balance, U256::ZERO); assert_eq!(caller_account.info.nonce, 1); @@ -67,7 +68,7 @@ fn test_last_frame_result_l1_message() -> Result<(), Box let ctx = context().modify_tx_chained(|tx| tx.base.tx_type = L1_MESSAGE_TYPE); let mut evm = ctx.build_scroll(); - let mut handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let mut handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let mut gas = Gas::new(21000); gas.set_refund(10); gas.set_spent(10); @@ -89,7 +90,7 @@ fn test_refund_l1_message() -> Result<(), Box> { let ctx = context().modify_tx_chained(|tx| tx.base.tx_type = L1_MESSAGE_TYPE); let mut evm = ctx.build_scroll(); - let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let mut gas = Gas::new(21000); gas.set_refund(10); gas.set_spent(10); @@ -110,7 +111,7 @@ fn test_reward_beneficiary_l1_message() -> Result<(), Box, EthFrame<_, _, _>>::new(); + let handler = ScrollHandler::<_, EVMError<_>, EthFrame<_>>::new(); let gas = Gas::new_spent(21000); let mut result = FrameResult::Call(CallOutcome::new( InterpreterResult { result: InstructionResult::Return, output: Default::default(), gas }, @@ -120,7 +121,8 @@ fn test_reward_beneficiary_l1_message() -> Result<(), Box