From da7af7c95266f2c2bbb39812a9eee054b12ed103 Mon Sep 17 00:00:00 2001 From: theochap Date: Fri, 24 Oct 2025 22:49:43 -0400 Subject: [PATCH 1/6] feat(jovian/timestamps): add jovian timestamps to op-reth --- Cargo.lock | 11 +++ Cargo.toml | 9 +- crates/optimism/chainspec/Cargo.toml | 1 + .../chainspec/res/superchain-configs.tar | Bin 9708032 -> 9879040 bytes .../chainspec/res/superchain_registry_commit | 2 +- crates/optimism/chainspec/src/lib.rs | 81 ++++++++++++------ .../chainspec/src/superchain/chain_specs.rs | 1 + .../chainspec/src/superchain/configs.rs | 30 +++++++ crates/optimism/hardforks/src/lib.rs | 19 ++-- 9 files changed, 116 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7c5012b4b53..a1071330890 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9215,6 +9215,7 @@ dependencies = [ "alloy-eips", "alloy-genesis", "alloy-hardforks", + "alloy-op-hardforks", "alloy-primitives", "derive_more", "miniz_oxide", @@ -14254,3 +14255,13 @@ dependencies = [ "cc", "pkg-config", ] + +[[patch.unused]] +name = "alloy-hardforks" +version = "0.4.0" +source = "git+https://github.com/alloy-rs/hardforks?rev=0fd230f5aa24c4f6a8c593918b7449df0c20f60a#0fd230f5aa24c4f6a8c593918b7449df0c20f60a" + +[[patch.unused]] +name = "alloy-op-hardforks" +version = "0.4.0" +source = "git+https://github.com/alloy-rs/hardforks?rev=0fd230f5aa24c4f6a8c593918b7449df0c20f60a#0fd230f5aa24c4f6a8c593918b7449df0c20f60a" diff --git a/Cargo.toml b/Cargo.toml index 324135b2233..7a1cb20a37a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -493,7 +493,7 @@ alloy-sol-macro = "1.4.1" alloy-sol-types = { version = "1.4.1", default-features = false } alloy-trie = { version = "0.9.1", default-features = false } -alloy-hardforks = "0.4.0" +alloy-hardforks = "0.4.1" alloy-consensus = { version = "1.0.41", default-features = false } alloy-contract = { version = "1.0.41", default-features = false } @@ -525,7 +525,7 @@ alloy-transport-ws = { version = "1.0.41", default-features = false } # op alloy-op-evm = { version = "0.22.4", default-features = false } -alloy-op-hardforks = "0.4.0" +alloy-op-hardforks = "0.4.1" op-alloy-rpc-types = { version = "0.21.0", default-features = false } op-alloy-rpc-types-engine = { version = "0.21.0", default-features = false } op-alloy-network = { version = "0.21.0", default-features = false } @@ -731,7 +731,7 @@ visibility = "0.1.1" walkdir = "2.3.3" vergen-git2 = "1.0.5" -# [patch.crates-io] +[patch.crates-io] # alloy-consensus = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } # alloy-contract = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } # alloy-eips = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } @@ -773,3 +773,6 @@ vergen-git2 = "1.0.5" # jsonrpsee-server = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" } # jsonrpsee-http-client = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" } # jsonrpsee-types = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" } + +alloy-hardforks = { git = "https://github.com/alloy-rs/hardforks", rev = "0fd230f5aa24c4f6a8c593918b7449df0c20f60a" } +alloy-op-hardforks = { git = "https://github.com/alloy-rs/hardforks", rev = "0fd230f5aa24c4f6a8c593918b7449df0c20f60a" } diff --git a/crates/optimism/chainspec/Cargo.toml b/crates/optimism/chainspec/Cargo.toml index 55201164701..fd6906cefae 100644 --- a/crates/optimism/chainspec/Cargo.toml +++ b/crates/optimism/chainspec/Cargo.toml @@ -48,6 +48,7 @@ op-alloy-consensus.workspace = true [dev-dependencies] reth-chainspec = { workspace = true, features = ["test-utils"] } +alloy-op-hardforks.workspace = true [features] default = ["std"] diff --git a/crates/optimism/chainspec/res/superchain-configs.tar b/crates/optimism/chainspec/res/superchain-configs.tar index da035a32da56be379423fff207576fdff0a00b22..30153b5d242f1636fedf6003986d170d3e8eb2ab 100644 GIT binary patch delta 50300 zcmcF}by$??_xH{S3I-TRmngzWO$RA0EhP=YFmyL3w{gQpm;gytA!`jjyvi2}BZs!y-`_JdmyiO)CWmnhbF)`{Vb^`*LBB=szEV zqbp?qW(AonJ$$m}zntQ(?8^{$>St`=^x4%QG5?MW28X04P5`z60ogRV$n@K6BpeB+ zH@g&O_0zUkERr600L*K9Tc`6(To}Zk@IWF^XwXvs7W7h>*S#J80dSIEFhgA6?@%DH za2$O@@&YLd_GjWmBmN{991=&5fl^pl$&UCBi=2#D1RjZrKR1a2S|33?N&{{sy zd@>e6hnaYo6?pQkKcL-KH~JF0^E0$?G(8#oPhy!MLm1@$WeBwYZ5Q;n$O148$V4ey z;hX=WX;+G^8R9C!II({c-8RnjJva5$zl$!tG^W~sA@0df03tE;wgg}q+gkJtWEF?` zzpNrK7#uy^OJOaY|4zxhQlK5Q+HR1`Kkto&W9g$G1RaY%B#tUo?ahaB({~Mk)C0)< z(&&CehPd}XGfP)nN@2qm%v@+B?oW(jF?7ulfC)n<;@QSWfN$22gG~Q(Noe5vaVWl2 zbV3XAA1sM=s`yveHS5cTh5zY-0X^aY5)qv42nNth~iJsjE( zq3nf#n(~(eK#QPjaE{O^Dmx3L@87vdquw|GF=e2zgIr+Ye^EyS{GWiL?&E~a|C=gi zQt$CV6d5RjkUx|WheXly7F5^~$o75t7yHMe={(0BwExTFn9 zr5Z^=q8KRXpQ!l<-$;dFAltTq`0MqJrsu%7uWu^LNl5U2ASaC~q713pCg%Wf;1tA% z3l0B^6@s@t9YIq;&uYHopP8nDOrK?>82mSW<6&YT?M4vr_5@?PKj}0Uhoa{%sbDlg z{1-~L;lD>cVGE%$P#pds2fX!h^p#9wl6u$);<-)EpRODP4n@~PP{AO8^dHDcql)=K zDi|n%+uHx<7+In{@{K=oTrt*OfE$DTb94^+a|Av2y=@}QKQ?@Cn=EZ1D~%b_7K%!U2y_QNgPbkXQ#a2?2Ui0upD7z!M2-fbABf zJpQEiBVg=01SP7fhF4J|su2`X1O!G6u40cz5YVb90-i)fD%-*lSUi>h2elsPXoK)W z5!iVB23`mjIM5C;V#1)%U_5|C#b3H1pnyYxc_YpqjzrlbF?Iwv9OGbzup?rLSkQDy zSUVJnfWs5u_I3n3j!1wb5d?bz$<_gmAQ9|Q4q#C50&;jKl0X3OwfI|8#}$ZZtUbma z2PeYqa7ZK)k3gb{NCXZKe#Ro~9Z&=~4q<1HgkuN}I0W3z-WE=BK;SSKgdNfrjv)d^ zN+5co%C=}C0i%df+}1=D1lryKud0ky#-K1L907}VAP_MqEKV5*KrTU^11I$$#}y3& ze0)jn%AOt$&W?Ki9wcutnG%9uAc4$+_Z-L#4&i_#5YcvOwnUUI+#aE*hP4Ankzlxh zhARt+$9vIu$f_6w(g90Q!P}~m>~R<(4uwMy;A&`lB|I97$EhjV;*>EYJYML3cagfE zt+zdxzWsU_0q%f95|ywhRV*BDuL5ESl8ds#*%RP+IGTV(*`aZGBGLZ0)yht`ZlK~i z{zj|{8H~@dXbcu_3;tKc*xQ1VM<>5RuzrJ63}=!={J(J5z5}4K0Yd*+ulG2-0cU-AY2y$ex(nEKq2hl2o*J? z8iAySRYM~Y2o#(ESG6}I+1g`>1RPi+BBF7qKXz0#P{tt=l(kfK-uqG-lf_98g3QQkA3#Y8XQHh$?7K_BfOh9F8N9;AqgwZNc~h zX-5EWJn$Z{#e!)pNezMdUBmRwft3MgA9o$FUSn(LMgplo!hzy%kV7JH5(*ASs38yt zJ6k+K4GFi!qfl5S&{DCsIJ`aH0f$1X;#A`ylp~_bM0+G2V}~FT9S}r&TO|}$#TFz^ ziQu4&#p7{skX#%Hp(+sD1ra0@QK}9k6j2d_*$%B#2?Q)$8IDv`MJb_Gl~9TVTf7QV z6@mQ?n;&Q>+Pgdd&kpSIBt_71*rNz44scrsC4!Qg3LXP`3(y2`YB*IK3j9F8{=VMO z?;OdS=md)DSNkRZDkBVB4USjEz(KF5NKgSC3CUIoO(4MS;24~PimHPusP48Tld96(8-@Msk<-odFLaY_g^G!CJP1`hdSPW`kEQbol9i^h^{Z9zYRS5#GmgY`MkU_rT)(5eIn z2ZRa%i?g$jkEIBc5h#MP1017-LaV@4mC*zhl#-ef0S8BeUx=!9iXiy}jJ*otHx5pd zyg^y}ID2}K>{Xn7&iVP0)NOy%g+Nz^P$CfQP)N}9F!tN0lCXGXurP;ouvfxiKu4{n zW@oF6Q^fu-sof#FfB7YT?aN8Zlb-_<(2D2=CRSi@_zd!Y%L?@G=$4t{587V76@_J3eHm1?*L8qGl24-MnQ{3UULW9jS00qEubz(gul{V)`aKDnWPCRuhS9%~lkN-Er@j`29%iIS{!9+&Tj?UXolL=hkc0fQUW3U6 zeRK%W|B}6&roNMfGBQ$>w$cAfvW7s=OV)l(FjSzxf0FP?b!a*RMH^Hj@Xg>)86gsI;(}B9vuX6lI$bVEhj!>z3&=XKf^LB<|0R1V$0E1Jy$a-z3sXvfK|0QprUwYX# zXn@5UI`yM$wF}Ivw&?)A9fuOA;x{gfkF!9}n=TEu=-bx7i+4U~S1eNU?Gy_7n zxbfo*>QiQjIFxd8n|{Qf^Z*GKjOi<91l0E5=?AMbF;K8Nlkk(hgDDE=e*X3W4}byC zVStGO{o}b0gV?U;{_SikIQ##+_hINgIR0y80% z#ZdUpnqAbLHB8qFe_sL`6unz99OlXlw%t^i>zVB{tpu$uS zlHC6|0EeWn$YYWONVr|uL9iX7+Lf`1JN&*5hoc+Hg~NCbgN>aE#^KcCZ!58v5KpziFIzW%$Kf}$?+vLif3=?vz|nnarou>}Y>;rdU^TF*Q{{qB>Hn@Spwpmh(A(>_)oiy0*fgp3 zyR}YS|AR8H)>wry{>bR~a^1EgtK*vi@ z1;Sw_r@^LAg_(c_h(Bnf?>hk453rvYgfl-eq%uD-+GTX;*K+ayDP{u#(pW{nK2S}F z<4=Ji5`q2)yW9qh(S2f~a0zfWKnU#!p9uz{4Gy-o3F#41LFn= zOF%h94GDZOL@)rQeRw!zjji-5Cd5Zq+zq>QQ4+R6vU?~6_pyUh1I!x8%>N^8fH zPSlw%(z-R1t!xsn8OK}mjXON#b}V9f!)ucmA~l#kHr2EF-G%R&mC*3*sJbj^!}e`{{k3vc(xvsgZ77W`1^+tI{ohv|?L*0?S4%CB;2>Bu{WgbiDGr zU%?DZ`FdScuJ4HFYKW2Zhv6s(0um5)GTEtvcVbih`}AS0aL`l(&8LJ=_gr)srDfaSxE=LGwe6 zgT zwVT$vTChP zNOtgg=9YPl1>b?2N7R(pL7k>!p$U^+n!cE?glIp* z?-^ND-Pkb7gQ$rMD+Zd+OC)V7BV7s%%bwmxQqr3lSK3^R#f(%vw-S@oCir3A1;NT9 zQ_?an9I)GCA|{Diu8kJwXG1~;6^0#i9{2|i1OA!9d}OJSytsOUMxfnuQbj%4f_>=I_i=%AR6b z2@0-PeboIZ3{B}9JDkJc>#r?oO`ypICPo!-xHCTxa~rj5?K3kYw@wY8TZrAu+iWap zL1B500%YV4EpVo;tOvSTReiF^e_0|qoHE#|Lk*qb={=yNqx_WuO?T zRkldeY{fkH7*=Wgd(VJFG5b`8QPUmwkxu6pVXNUQJr4Z~z=T_qdS2<3o;Gtw>X>ms zslagl1`KvN<4b-wLs;b%OQHF%^Mhq!QUOyVVXw<0-jw!gSfA+;R~M&swHly@KIGM< zBvcRiU?&1aj3LiH`V>y6&s}jxrLlJXY3EeJa43!ox)_zTa|mfq4c(hg_TDx zPCP{>QZLMh^ldGdV?wjnEviSkN``F)r9w(w>NDlvnwX~yOn=LoOS@Eb5wKVMWSpmc#tc_(F^i@w}xJPwn_Slt26tTt&2=>%$M&qTCPJsvT&e1O?iNqn zbhKZ>uHkZ<$qY8J{v5-JM$6;T7q7O~lhkwM%d*GSgItE<;@Fj?tKApVs533o9EKR$ zqB#pKB(YYCGM(U2Q=ygG;ORO)I5^)w#MxvgFF6-sLHjBSe0V6#L)LT`8^=i~=K=$| zjGck)gP)G}McUon?Y{B~LGiO$E8!Y9fKtb*9PVC;UP;I(t1#~$%=OGHgiZ8wcw60h zhl)$>bnxs9)5MDQQT(<#)&YSLX{5 zYV+@MIW-(D%PqJ+XAKypn~3JH)A;nYKO0WO3QL5UH@a{oY&_DBxnEWhx}My}J6rs^ zHEyYDw5LWk5aWX}n>syU6NekmHXy66g(fDVrz+76_h4T=$<~FRt5{3?lXP7V!rxj? zENPm)IOsV#_{qjFekO0Bwu(cN!o8Au-ZyZ5K(H%hU#>xtTJr0o`33%W#ANo&eUp}_ z9MyXd8@_YYlWVmx^c1yXqU+&H*&fdf?&r-HY57?fB(nOrt4vod*8Fpn`+SYLhfFQ+ z=$I}pUSS&TOpqdXXAC^&x0`$$kYmTHGMnK-35D&%1>_umX}wGLouyWL0mbgHz?1&xVPx#bbizW z2~KyaQ?-&gQqcn0zU)riYA-F5d%@v=HJ_{(av%gu$x zL79Q&XkaE0`C!3dfpNjLyhfubj$I`S$?v`}CbzgjV{?@GTrxJv>lWQ$9`u&gyjlYW zOvEfCw_7){c}jScMe%G%e0BYvWJ7i>;*VXRk=vt&SMO3@+pSzO*C5{C{E})Rv#}>D zL%gijO)kdcVbZcho>{EIYzQqTSZn!`Ct+*f=tRF|coP*^NuIj-(O}|!?wj>GCzaJU zN!j7NnNq|Xp#@5)zPz2DLHlQp==F4ISgX*>OzS%(91S!3R?54RZwM7AWOL_rJnTr4 zx3)dfwUpR<^!@E}XSsm{k<|k4$nr(o*+e^IA^F&J-otS^=gZrUe#X{+Zg^bLHZvwy z!5(P|Dcj7=Dq6O!A4yc`b-`{f6|Ec{EVFZT0cbCV zV#y5Eg?-+#O*>vQoZz`~bNa(9W+rRz*m}4@9qbiu9G_R=YEt=NLmnlayyw7%@?vi` zr&CS*(!4imCV$4wCuMh~W$hx_n5eF)+KziW+}~ps58~qia$0QBksUWapQ66PMk*D<;r$@~sb?rnY=vSPcrf zVDe(|&Ne|?!NQcsC%yvt_6S)px+`~eO()Jq%s<)b|7mZw`LZ*&0z6yHbdOO?fq$r+ zOW~b+WG~wDkfAx#2Nj&nS?iljOX0*~N^RSz-TE)fi}HQmNi=kbX91Ct*<*vSURc9G zmYBYag6rVGs)lhrTWFUVyg_J-z4)E;BetgwRo(0wDak%T_gTEQk{Zg98J<;}K+yNG z_YEQ5?Xo%L$HuH5toU{Liz^@aqFLpx=u+bn+vdkbfsg6U0+NyGyFUU+B*ZDH=PuR> zZKd&=`hi+j!TyELn#l)pOEo`<^U6F6jg`+@eYh#xHs0Kd?5*`ovgLXX94LdblOw#{ zg3VSdB_7z_zE&9PA2sH}aUx}A>2{d$eEim;8#cN6a1dOY=gayecQT_rG2SawCw1lU zsLb1~-ExNvNfeBYa$Nzoj=Cs#NwZBxvukE#Q-&NI%q0;}R5 z9UW&Fnigh4!`}$^F06!@f7uD^h$1Hr+V`$G(Jb10&%N0C`Q0;J(658u;*FKwK8M(y_Zyk_ygq2$ z`ZWmFn4#;*mGa59N0YOx5cn41(Z4|K!x-qd6}-1N(|m`|VMW1NbnMtguklf`%OWk` zUqwSg*rY9xvu2a?W>a4XyHw7b@oc{UDyHg4?1)0N-Gh<%`nHBZ-BWcgaxWuDp0qws zoA4>#M()oD=%MDCnDpS`M#hZI50}-O``&*SahwjM&r>;rKe7In`Mc zBR6r^CS^$fcG0+{>{{f&Yu=>0x;$P+G*=(CJfr#th}BQEY4HPlH~S9;dLCJR;1=FX z-U{4E5Brw-Z0vh_jQf5*|M{-jb68!6f*8r+@I_fYAKRl5-tO0@UN~0-oNh2`1HN5i z<{+Og48n|UeInewjD8$7fiF=3vnw#GtWP`8~Mf!d~)^KDU6a4C~9r5E#r4NArlwnJ|M2}=CKZMd=c3u zpczv)nYC2wS-&wPCEWc|imbP?ep$BRjNV;*k;&fgC%A*0+ZwRC)6V_c(sI`k^&<;K z&Y?ut1*Jsurv_aDy-QAvTiuCo_PX+mq4Mqbt~MJz0G^ZxbDW%081Wyl>qTd3TU4*% z=3hkYWAvQ!8@}_9EoT#ExKVmaU_^iG#YQK$x}R#)%a?%W8Z~mwElq=%ft|sSGuiITvZx{cSFAcXK`n_ z$d3X&*UsfEuZ0IhIluUDyYYCD4K*+|V8LmmJFwwa==HQRgsEnHTa-7~iRv8BFJ0lb zyQlD&(7hptEEV)h=kaBzgX2va7KVd(n=!_^FNyqPfv-z8JI)7{MOeNrD7=uU-RjD> zBeJiw@v+jaUJrc=jdxHp{rXf~Nk<~HZvu5iEAkPPJao{Lvi24-F;tqo5IT2t$d{{Z z#W3r{L$RZ$)xD+Mj$96oH(vFDE9rqKQ)O$0O*u zNk``)O>(Sz_@`*9}hbE(?ZCb_tQn{aXE7i(EZ7912o!JWQ-WX)RRICBWkN3BN+j zP|l4}4RUmg=XiFierIn86+K+E7q=5rqZ7|351$+zAep#2%dX&doOpHV@WRc9%6oJ51SJ!>d>~@K!M1y5G_*WylyRdwjr8yPKOarS)r%*yDuY z70(*KqVnW%-?FD>Eu|fU^NYl1pDI_Q*5qrn#eye$8bf;D_Tu|^pbD;9?vp_qJWC;g zP5!l}0fSWi^uihYQ)YWT`?k!D>^PBdhB)8XX z%mvP?a}bJWEc=qo3auwv&j2R|zh!DKdfav!_BDI99E7Ux16Hk5%A5+ag@%@KS06um z=8@w6`Ic{Z@?xpya&X=hwn|bbAh`E-Z@8qJmq_bO9gi>h(!5tfsr%w1Z6|k7oA%gv?4Vv&67{wsE_!* zBDxTG^jo&DtUyyxWb2HPhgSoux-Z0>Y4eHvv}Asv zMtJfK&5wU zORQdADNYfq<`&s?rnz33D$yaR7X;|AjHXS)jk87OaPmS*Ad#2S{WOq=+*4a(s}U65 z(=@OnIa^lHS*|27sf$f;s^x2YFMqse>~IyJSihw4%S6{oMug7ix3?)h%UV?{-#D^* zUc!8PUYoV_IGC05aLrzb+-x758kas}8?oo>XI38JxuMdqB=*_ceQ9o)>3o@hMF@HP zTEYOH<@2#;KIWQ|)ni}S)7laQCf-GF!Y>o|oRw2QH<{==(d)vdZat+8bk_{NM7dW(9-^Lqu-^oP20;8U8*{XlxwaNwYl2sGwxGYnfsSzbbXS@91>{8Xs zpS{iGM52m3M8r)D&rglY=Aho6UyP{ak%FxRrWo*X?4eqGF5AeOBXqT%Y9OAtA2Vl6 z$XA&jAih^mfu|fU3AxkSDMvBD7+s3I99L`*%Q%k zD$Om&PpDFQ-&sSAl&204AA}j>LQ1a{T-z+=#;W!8iRBv07S_$!3>)0=8zJKg*~VX; zpJ=&O!I6v`cYk-^(dT-(>Y+1p#g<7{%Ry>qGB)Ha_`)QT4F_9E7L9Qn51Z5tUJhFL zT0MA+DnFxgy(-RJymwG)Kv;6zOiScE)!n{Db^yuXTsYx^z0uvDWIi}%`Kji^={&=+ zVUFBKs(QJF!4$z-tA}L)H)48$C%2dhyJ^Mk-E-C+gPS{n9kI-!A_?scmy@%KRx1}m zy`P`f9x+<;?h1$Pi<;n87(~vi_Me}!^nGrC1q=-tRmj$xFGB=u7Om9pjb=N3wQlq( zdN~-I-&p&}smP^oqc5PYkth(RqQr389S7t>-!bM+>PXDFX z9v%@|x=Xe$H*v{YR_yF1sixk#(cK<1aWj$rV&WqP6?0u7K?;4tT%%M>#OC{}V=rd+ z=FJ2PaP-Kqh1Mm6E){BA9vW6bDGtwLzb3K-px3PwD(GtX3& zlUg`47sD*zer`?b^?o^g^vJ_o-s2656YO20fN=cJAnrU z;HPsLh+V+^dB$Uap4-`-!12P+qkz;m;a$M-7ivd@)#sPbAA-48fAw;TPXSWAw`46^ zrl*@khx%+b+H>x$5AG9ucn)S#ia zzaG^8MPrJ_0)8i)+8uW}Q!uCgOQax~HIx~sCr2JfJd3=yF{OS+?1cYPCUdR7AEqzl z7I(FOYqu6EOdY)prkdFV2Y@zkR!`cK%%Ks^(2=F=Msi$b~LH z@*QKRfuNJ80r{d((Os#icxt7Q3r45K z0cS<_kefzdB}}uo$HMmfda4&IDBkT;cU+^c15bR<8d1-cA=)9p;UGp)>LVYGASmPm zkiH5&*ghFjgHiGk#?*6T!r%nQ2M8me<0Z2ga4`~G)jqe~$((~Q24cd`o}dc4X&i+D zd3oS>n|Q_(!2V8VV=6fxaTE%TIS71zs|MTd+6@H6MIHg}twNar?G30903Oav6)ys( zQ9EdAx=&ro_K6F}8t z=LbBVfn$#CQa{GL&Vgfk_rbAjHE`_1_E_T;mLFr^&A^^Vt%rAkZx;G-EW+TQBbB-rI9;Oy%DozxFO=aN9<{T|8kcSE`yfT9_v5Wu#r+NQU=)e^X<#OVk54%EIoj-x(n+r12-Y835$D@V=gLf(OsxB7!(gf-4P=uBEo zC+%@Uc@P!(&y`1of%e!fX2WnJLf+yR{HlV4$9EDh+_>ItXXm%Ft%Q%Bi6 z?;7<_C;$N^9%AIEyoCcU!d_|S;Tu~A%X3$zy3I}GfspqpZN_P|@SD^40;^z~)r_?9 zYkRLNE-u+W8K2bOY1z2ipj)uEGFowv{Wac9IrZ(C`POOBb@MUGeBy|ZaQH9WXg zWM3-Zv@+?Dw+H-5SX40HG@%dSIX)Ur$DjRc25jfxT`GmEc!%GsQXA4DUkZ$Gi z8|mncdSbPA>$jZYxhM^W<;~lk+R{P2QgHvNq$2610~>aC;srNuxIXrMKP-8GccQav zgQ4#njcxd7tt9SoxvRj9nU$}rEJGzxe3K;u{{A~I zdz05Zo}3qhW*BE5pMPOk)p_XKbE89z(Vf4*9JpS#*RksD3q7hfc4U8V_Hg)&i!-C? zN~#g(3!BI0Dc_nTn_u|jXUfi)J8i74bDp#CVBFm9adtTC$BBRs zjxQ~Z+9=B(D=!>)wi#P_@)s@M?EBsr?aa=j_PbBNDtFzzujOQvLP(tuse4rP`MWze zcO8F9+tEqny=|SiSehSJZbVM=VC^X5TH6EIZsJlQdw{)E4?N^DV5Y8|NUqZt-gx)$ z)L={d;Riv}9)u^<#FwJfOF7?erqCKMbfuMT6tFvHA=K6wd6s-iQ7bw6UpT%QE)hbx z_d37NFKwa8cjQm$CJk=z$VWL&YL(fgRgo85p9s!I1gUKLOpZLZJE|`2`Q__e-93VO zd0j)}=2IWGt6Z@YHEW+*N|(s_nbogTTWBeKi^nLPHnKst;|oIvLPZrO!!9GnU&rxk z8aUB*`$5N|4v#2@@;`45bBgG0yOW^pZyokaW59xj#xf;N?Ze=Mf+>PSpWz{m@!O~G zwG@1Y(`x0+4=+Brg<0v}%rq!QO7CRji9AwZ)}8N-Ev~-#b;sd{lIe}LWNr%|&#s>1 z_t|xh+`Cgd&B~r-cJyXn?Ics@y#Vn?H@40k+j~N%_EkyJdud?@E3Y znZDqk6<7)9twmlc*L0Ff#@XSl6TO5I4_?@;30)0AzvOI?`d}+Cf2l@XZ1bot(i8$~ zws{1VpO}bMn2I9HP(FqCeU51`xIPTuwuNDf94nEbz{cCuU+UQn6VPO)`kP;qSdNJv z&P5cwbg9u0ny}Z5G~M5HE+9+qg~sdUUHPFUGDk56PNue6o6akyA?t3j5#0t0dTahY zjw_;#FV9|5u})67Gg#ehe!E+Vt?KJQ4NR8}D4FD^Fp4HrSr~T|v#@?~GgNJHOE)0D zl#f;wqXr^pG>tQMPpz{;#()Dy+(aGZPl!B|QM6E8Sti&#rds{7ph&G;&0e^7zIH^Q zNb1XZ%2Xhq!kf1WuO*V6C)KuoX-)B(3wpagjjOMJHI`O3mKLm((rqyO+nMhv%m93SS%rPVYnM0lP%^a8UI>%6mf~{y<%ghXo*^qkN8x zE0Dp*;=G`5m8+i@*-q`Bg1&osM1HC1!hph2vD#?;dm*JuZYKtS`Rh82+{VL^`ln5t z#e%s6eo?OG5%?CCd3gWu2uwrE<5MQ=6t=hqNeP|1bN;RIZ{3y}+$!5pMB4d+NbK_Qmll+To@d}>gpq}+b zZ8nwV{(zx@pf-Q);ZHsrJ3>3EfxLYNT!5W*_#txjE|XJUf}Pgu78{YfWT|Oz*aN9Ou$Y#Ioe3R@Nx%7a?J1ujcjl*+WX2UOSBrMj~Z>}qrB^e{v z8&&&OQV;eDn)Ks`Y)9-9%TJg&4u7bJ6DT{!oi9BXA57I*xYw?hqIpH)Y=XZ)q*Stq z{nF++sM2}hl%@_Jxg;Xa6*)9;`o814oZ4WXyTGwr6! zdc;z}Cdi~laD4sULtDXHWV9nK+<%01!f-q-M`!iDGNza#&+b-k!)HZ>;`^0MCyY4C z6NFq?wqbna05sKaPn+8`|ftN)8cdFs3SgoK;=Oc z53KXRJI=mOX6mfGr)Pr(gP6v~#iaMKuJXm~fWN3KKKf+%#M$G|BT2JE0OUUWIC*{9 zx9y164#B#ZGs&5ejAwe3u8n5snpg9>bsfI#JPBiyz2vt~DLXYolmG2mBkyxNcteEd z!_;E+Rym{W76W7^)@$&R8{;=)S|%4N+TI`JOD|B|wae?;SF&{d=Q%TgtdKWg&R5%0;@dU(+|o)WRoSMhQuWGJH_%a3hnr*{M9A36`aA|-nN$S$4afl6MYmz>Q5_7K9nj3;x|LI zws5#En?Ct=*}eW)$fOh^ckb-`N2$Bd{e>Ie@YczDcZn5#fzN#D$j{&_ecSbt z|FjJS=_s}N%q;kTpp*NOY(!D?(2c;_LoFWcQ|D`l{6TMzjrGn>-`;!{5NzRHo7C8+ z#yWSQmS@6)e<<{YY`l|i|7-gYe+Rx!&DeKe{J&;LcL;kq)IA+8*X^_1B9lJGZXg z&DJQXJCOvGJ%xKm)D70n@*W)@tU&XPq^F9%+?*avn|&&={-Nox!~GDS zusgSP#Uh`Myf7uI)XrEERY^lp0cN|Zs4rh}T=*ETR4;q~Ghc>!g%R-Z2S@pw>C zv88eGIf^|4S1VR)-_XH=F}3@TL?0zpSo`fY5u4ocR1NO+grNmKtfYg!`JYc|vIA>ZfHAcqjMg;2j3eOr%7sn@|*haD|%&vS~+ z4Ssrd?enZ9w8r8X@F-tG;B~TV3&+Zrf!T%-SS7>NORFZ{l}9U8A`su&pWa>Pi_`i# z-g=n5s{Ux@{)J6!6YV&VEQAt+)*k_038BQv$t8AeG-}h$7v-tYVdWJKKA4SBaQtjT zB@V{wO-u19OqeYa_cNj7)?N}{VDs&_5z^}6d~Zp_^vbwKK3rOAGO%ejth%3A?FD&8 zPLQQ74=bihI}%gmv(^j9sq2+pt`0rSy**onZv3-)C2WMV=4o@?_q4@_$R)fhHG9b` zQ>l5`lL`a(7_Vm?-q~|O-CX~&&xnnJ2Ghd{heZ}AqnjoE&k#YQRZP3(JB9iu+#PZP z35ljM-b^F7i&_bpygOH!hm-H6zKSK~-7A2MwB4#s9%V`m3-w4Vy`xZm6uYzXN^jmZ zXUhbOHZ;Nb_LZ0Wsa4rdRl z2-`O zX~3|f6LtLRL-_pQ>oX{=%!3?4%92a(EN+wc4nB>uS-LB+r^Wlj7$iKK+{^L+#h!l8 z*fn^yJ%M=p0Tbl4@68Q4>2$;go_YC&Y_~mmlyF-0^_>*GO~*d2^rX%W>?n$)qh-;~j;d;aSE>zx*DQq<-!SF<|NY_=f& zc%3r-)#}cY%n>f9kdClE-umY>_q2B>b3a=o`@JLlTZll_#I(b0ys3P1m`Q z=Y@OC#rts2yioj03${HOf{>MuLu;gLQ*QH5XI|#~!X5T8ezS66p^by7CFy*~+v7dt z&z8kSsbcbXX9W9G#q1rzt0fd1uj$9M`X|5nO8Gv0p|As%M{tXGq}>5-!%-S!F8+i1 z$JyTOmCr1{Zob-~bB?BUJ3V|bb2+>J!3Q>rvxD}QyR4HOm4<7ufg9aC4r_05+M>SU zU1@1=MRKPWne#8i#R=Uh$mo9d7hDla8U$5JD6LWKau8hEryE%+_d!2LU8T(j$-$rxkoIFpu==$#5KDYQX z8K4US{t$!z@k|M8+R))Ieg*bky8~2C8+{9qm5#a<7N^D3wl7L@p#NZsSWSj(C1}hp zC!W2j{hT>Ki25pzx~uK=75+Il#O*VOZbtF*Th-t5M|R&AdeIQI5Irw-`xyt!Dx!_M zUtLAeOC!Calw0*yp0TT@8%ma8=J_+J&mg2p=fVyabBgJVIdnnImd)-{OMG6au-Jz`k8H|!xj%dTf!mF?sj;+>n<%Pq zFr@1Jcr%atyzjePg_Dzyq7J>1$9}Tu>`uv-Fpg{-rHV6CgR_*PoCcVXf|ioxYDkW3ST48N`QnER22ZSaqKdV=xNJ zdie7oDPBDN!Tqjrzr#T#Yd0xk=%H+XQh6CGx?@7KsrZf&?>JQo$}87VtJNF?nPUh)ANmyAoI|^XAy28jQ?E3g=jBJ-@xKa9AL8% zqhqm7OLGKdLQw7XQ-tAQaBKu^=ieqI%6UfLv&^IZuRp9`sr(Jr?Wsq_gMPJd3EO_6 z82eY&?dK&+oI#}IXHGzlbNF4C>IN#gA@7NPDY=?f+RMPmw6E3mPIY3IFrhLg2ddR@ ziW{oM{5`kC2P&Kbmzg*-7q>#@Zk7T87nkjLL#Y7^x0iWC8vzouFh~KAo0T z=5;mw6}QBCLr?<&pO+PWLn8r)w>f@8ssaH~x8#6B@BswTq^Lia*n&g-P=5jqyg0cv zdM#Rc^q;PV@YiVNJH8sTVGVnrEB=W&0ts+CN8cpzBs6gU2TDB2-a%u2QsPP8ye;u$ za&-JF@qAL^$%ZO)vR#N)0%BGDCYKdFIE(=wmkUQT8h@f4gWQ)mE>|&V=!_WW7*_<@ z&TV-$>F(a#F0yx5AJ)bHQrWv}e>mZL`Ebhqp&mNc`o2f4g+m-`&>m{Zym7kUqZDH6 z1&eCRpVTGMlX#)0EXf#C!-Zb0Uw?vsIjgR8T&!~R?>@WOXBLb61xM@W2j_`W1;l>G zBLMBcJAeMxoNe~|kL-8~c)EbYz`l&yZgPf6lEs12{@HgfXVQbxl(wX|^_RxA`P`_m zEm^yks(f1hZo4({T0Nu{#AR1Qm3H#E#Rp}KFXitKKz@z+&}#ALegGVXJh(}-^M5D1$}Yj~?ig{4`TIVGBw~R*QWN6q zgVv2X*;xnUVJn&#;#Ou}Vnvc1XXo%`w~7t^0*m9)qn;03*@O?v^MA9Y1@p^3Or7== zb=JQld)TJ_!SS-70I&T`;1q7mG+z@Kmb8`{KwxD?PD69%5CxXeWH@m zoPD-czgtOZe!WZ&L&+6XPiZ7813f4?S)o0h(BGYmI0GT9l^0b}D>%?T(&Siq(P?$t z%Sb7Ik5*nB5oP>b6Caisp0mf_vMtTMw12ZLz1&gy`f^9Q7LQQ_a9D6kfa~EHH6VTZ za0TjrqXw9^u@)8kyLD6_~BCA4p7{{#$#RofyQhTk{_qG`tDx9|ja{_c2Q znK0`A8>_lzQD2Xkc#aa%41fq+34ffR`4kw74f?5-`cw@5b9eimF|`3S zWaWYfIUA1r7;-bd;@V0H%@rUGrjlD#J>(j7f@3_E+MKL4#9i%QDNBuOy?J;g1ay#L$h5ag^! z<`6B0OT}!MsiZgahu>l9`Ehf(Jo|Zelpte zHn)AWPYCnHQXxebk7!O#X@AG6ltW^)fA21Wen^k&JLMFct5#&pXUw4CWY`m>`sfrE zF_S7}*l#IeRW{{8QFSKzcGyMTwikAhmSUriKcl7`WH_(;2*1mkNg6CNlI^hNlGAOtha6*DqsNto41!B zKgt6EKbK-8Kka{?|MlPhclw_Vp}58WewBaBFNOer?@L0b-fl#H*^@`p!Vt^+Rd928 zAKYAIdj>ZL7NWW|oY5%UfW)q%!R09Us%eL-1cbU=Ma?EEh89Od9bYvVaw{2-T!y^> zvwbgp-Up0%FhdV% z6~-4E1D1<2Va!YE)d?OWy5x@#;R0(d-hiYQrS6q}M>xj*reU|#1jdk>elBq}Wdf0k1-KbIsWDm((d9E(32Ke=BX+ zP}kS8+##>-c71bq;4N#8sf%J}InW)6QhGEZa3zWvy5^v1TCr6#SJ&%9Jwh+23` zjTmoRjzb>r%pKYE?&|P-E?$dTQ|Z%qLVYKG9V#OY;f0##0Z`4m3h+Sk{A=(wSQCet~_Kn!eha!q#D1@Op zIQJtOYPcOmvD)k*cY=kth&fk+v*myxp(gyy%A56#)_tilpn~^>Ov@?<*?p&U;k9Vk zD=VYe(}E6D%Sy`-6sZk!vogms(OLr`4)WTg>k}&igi7D-mr4Y0D1RMP zfnH0iqGf2Qbfja_BaUA`DQu9>j^brCV_#U+TZpyVsDZ~DU6H4OYOi|L&gayO7a@RB zUwf}A1rV4;at;25xhXZ@K!np*o>4Xd-b7m@KB~(dyhXYTHp(7xadUM(yTe?h&zt)f zb#bU~#96qS4ezUu;4achVm^z!D1RtM{ag0!bDremIM+&)e>HxiILQNWfNUkAS8Eia z=evoqgJT8`q~oGAVOak2k+*c(n4NQNAB%bL&C~t+%Ef#QcpQ(>savLnHMUIbj0E&l zB!?iK#F(Sbv22c1HQIG!#|?>XF%;0Xtfr|z{Q*&;M*UE% zw5C{Tl9%<)d3GaKS`0;>o}hT?@f-KPr>(Ta?Y~b`uKs|MCq>Cq<_twGVSOKsUeDR1 zq-Kwj+V&_+&56$Nz$O5Tv0GwY9cZH7Qa~^97c<^%T{{;4=6IW}N#JA}8S$lV8=p+? z+E-2<*XmpaV`topQr^x+kbn8qVo-?fr71>@-oQ1M57ELH-@a?fh=X;3udZ>=+qO2* ze)Ruj9t_)jS=I!wGD^+ zcrIxadc=^i+v_qG>sfrf5xwU3k$@PDwuuF#o}p%zz8HtwjU&c;^KuMZ*k;G23WI2gHW7v=%6E7sah$fbT|h}0qI%C?lZ`28KxkWlw$I>B6&<8b$=EU zRwddV9Y$mxPJd)s_wpldcglLh9k57*va{nzEsi5zQ-)pkyw^s1X=FI8qgP^{n|eLf zucM8RZZFy!YnBVOrrPNwg6%N)lVq$#I)msF&|9aBvH5(SPZVitwkz{u_S7LVovwKs zB8(@^b_Z(VCgX%N5ce&Ga&h)y*ul&Q+O{>;e;_Hs%74?@2b+EG0hp2koqu?y@EJI) zswAhQ+Y`|$$D1qJ5P;txb|}sJ%q6CCfbQuy`Wrh&sVnEvR%<~-hGqQP%$2ZWdlF}a zyDZIsm4*2{<`FFGPbj%zxH7&hH3_T`9>DGFA`s_(b1}VANF( z6%^yA8b4ErKj8os!q`BqN?YszK^Q|>yxiW zb$r7@QTkkte)(2fZi0ikK^h$IwKc?S#(%xe9NW?o-NVjPZ;`*zQ?pJuUsdUFmBX0r zMG(0v<6f6~tzlf%;=+SG-b+u-@OkJU2I!11_8F$GF#`@p#8=aa9wOR?XfNE`Fh;&y z<&gMs6}OV8wT@8yv1%p;8(+1j-cBqI4r5PaPJz!yXELuqSqJTegOP(;!EMQM@PBAy z@H~H?K2g}DW+0uzPHL;P7Dx8Wm%e380`T7z`1`K+n*z7}7>iPb#HRW_u)K^AQ8*oD zMRcZ!(tV*wVyzsXFVo+uthp6Ry}Wa@VLO#BO%_$ zL3$s@{e86gZ@{ENdm)@D6qal{VQPIxtD_dP<_h*4^vpWYH@2?0^()&W10*aezG-b<%&VXAmv%+$7r zm*N!4${KK&X)CQFtzSrlF3kAE?K@Y_EFl&m=rMCbZ5tP>^8%Pns*Jw-;E#YBq zr1ljK7YQyeVEN0no)K+S1} z6Y&u5;A^|2MvSt;=+D=B`{f+t`K1Wk)KD_mdK#Y3qjA0kP=A6(T0<-!u4`~WL0qV6 z8J`+=5T|yb2@~Vj)S#}R_%(wuYCv5(DRDwUoRknKS;F3tt)_+`JUPPqs_a-tRrJIebBq>b-iL3x^jje?6{uEO zlv_NLEtW}IJPY83E65DLVOylV=eNs>NDKmh2WXce&jGjT>i4u6mq^H2~+$m>VfPgkCkU#y>Dn|?&A)?!+F172x;Pkxy)%T|tgQGWSWT7Mxk(oWV~Pl}?4)lP0P#jX3gnah2xW(MLj_!n%G z{luiIHB>Au{YCC7R z6Q}eO?6y86WtHEAU7IWJy)X21*b&X~LaGe-g3m*8YG7k~TQsHqAu!by6RWA2Pv zA4VNyqEW-o?`$S@f!FJwu_2MYk(~#ZBtnHG0h=1qgLZUs)bJpT8s;uK~o>|7t z#!qa4&1d4G8r3o16rSZgr<>WP7!&fn@T(Wusehu{(+buqb7lDhe&TnA*4@`ATB}3B zIpg^5?sj*N>QJ8qro9cc`gc{od86ixexT-zs^?V7U8)_z7Er=jj;M||PRkRS5z_@H z4s(r_iBBkvzw3hE>lWu+Y(v;7sqEt3H38I~YeI;)I3gZMN0KLK)7R3GW|*Z&VIb3E zmEV(7WLK9(M7PtBNa+H9lXo38xBs8LH(8ck zN47)%<&0~9zR};HeUoRpW|9Unlj+|DcLzv-WW)I}*%s^1yE@fs_xW6Bs!`eQ#qMdsV$IGkqv6{AUqRuddS{4?HO3bt?MnoV@ zbvl8iCYrIDMY2|ZWl`E!B@b!Cb8NZ6&Ay$ADstVqR92LnS~SNOIEKL%u;12S*u(lu zY1)UnDo6P9sk`DbMO$>BMBe|od+Iuev$E^!H#PQ0s&GIyxBj69NBc~whYB3qweh{B z{syoIeHkM_VlD5 zw2RROTr-d8(h;KiAJnCzOTSc?hK=*x6&VTDA(;O-_epI2A3xJ zRcU{!-Q#9|#ZN1;_2ntO?86pX@;57{y|k)QwCk$EfUEs7$3(VY&W`|o;EzZ<`2CQz zKH2&i*OP?7HLyMneT&d$*9fzprQP7+eP=wL@qFE|t*}Od3ncwUo1U_*a#43|t6YDS zk8Fx%^_?PIBt{R{j_(Z_P2*UE^cI-(SF1&DR*U;62nHJKLP*j<_H0MmU+w#fQ=_;~%i)O#)`_o>s`)(8Qj0!0~F6-}nZQl&zye66yS(iGXEd1)qn+nAxf z<6YAvOB>kY6A${ZLt5`cdBK)Ha!%Bg5eLUoopk-03tETx8!;<#E(yMKf+L*mQ-8SM zx9xusKVU%)sqYWk?|LWHIUaBAU0s9fA3ho9dcR&GaGOvSM9=rUFN};q-X$Lu68DwS zroPGM_nC0_l{2!mMPFO(w**gkwlBAz09igO8uWNVy!s5vsYCXmDc>5ZB9Zi(GnbVb z^(6c_Nj`LzygL`%y54G-W7x@%`F{sly_nexxn>Y2ZF|RR*#r#ibeTsMk47{#@Y~Wn zmYzvP7*`nk@lM@py8>{k&4~rn@EbnG9Vsk?KAZ?0FTU&G^QTvQ_Yn{7kO>#|DALpk zE!TVBs9`v8^1`eY^Lmv(tcxQ%NK0?^hyYu&R%|+Aick3L0Oz6KP|PB%6@PJ>0gG1) z=H&?{cMP`Z_37YxT;E^o*GWzJ+;Skbag3+xfo|OC&N!?%DY(*Phi|<1^NcRPy zFT+|X!s0A9rD>UE(^rA(tC!(zGZX|~hp&H^`E4^K7EMUs9WSN*-SKMr!R_(tyGmKC zWz%z)Gj1~^e`r+F>~ej(-(Jn9U3q^OZSvUAy^k5o&)2#flDOv<(kzOt)nHA^!Bqk| zJTNvLsD7h@+f$4}VXIr|=em_t(Q;(@>~$>%ODW|q?@XnMjf$2U*+oOfb$)KMhy8M; z?>|>B+ijyI4x?54Hd=a@U6@O~pTM&BjjCoY{O)%Ff5v}c#>Kxrag%#3c{C*RPVR?( z2Y}5@x&UDFR6~%xlve6M=mg>#JScc|6h$iSQp6IEaMhT@RV>yt$~_gJ07!@Qp)ziPEwpoIJt<0MyWgki~U>MRYb~<0!zNQ)Qn8i zuXYf5f4hyfwh-)ElylLnF-lZKs())_UG$Px>G-V$F3yD-!0-y?9(#E#<_}k?v{dhd zQ7H&n`g2tWksFtFPNDa~x|`2MgTD5HQ%wfelv96#JVDO|m!e7Q-Y(q>bZu7&65rdU zq_?^DcJVk$d?^-m5#zb+_=I-X>`LtSvRkRGf0%VJ{ab(}Jb>F#xkC7Nhbl8D3P53a zNku4oVI%G;In!o{_neJ$3xFPghFJMLe`_tD1)uU;!JY&TGDXxHn{oOKEMC%avIqHx zBB{mkS=f737en|^I5<(z72)yv_57&)keK1|eq`_XFv@R;c7JG7*xFdhmARGPk(!F3 ze*w|UMYhiZ!9Tr!RT!*~$987~6S*@<3p%gljVH+mo-jsS#0@~t0v`pTG#l+;5A|@2 zjo!v)TrtyV&G)+1r#qv#j7hppTytY=#(e5Hm5;MBmymz@k8MS(FGdl1sZRa2;|fH4 z9(_hH)2P23nmR%Vxe^_)7uUiR8~7O_f3Xmvl;~=#oh}no3=WhA6HJLf!0JGhvg~mtmVo z6MvT$rvgp`-d&-6M&Z7q?-~T~qGU2*PiK)#GrQu z5ToJCnYNVypXstX<=7LaD;QuND7;uvkR7O9Z5otynj+5v|8}rU@ t+Nd5Rw9a=p-4=7ZZq{{ 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 VJTZX-A~c(r!07)wCOW>C`yZ9wEOP(= delta 8210 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 mod tests { use alloc::string::{String, ToString}; use alloy_genesis::{ChainConfig, Genesis}; + use alloy_op_hardforks::{ + BASE_MAINNET_JOVIAN_TIMESTAMP, OP_MAINNET_JOVIAN_TIMESTAMP, OP_SEPOLIA_JOVIAN_TIMESTAMP, + }; use alloy_primitives::b256; use reth_chainspec::{test_fork_ids, BaseFeeParams, BaseFeeParamsKind}; use reth_ethereum_forks::{EthereumHardfork, ForkCondition, ForkHash, ForkId, Head}; @@ -611,13 +614,20 @@ mod tests { // Isthmus ( Head { number: 0, timestamp: 1746806401, ..Default::default() }, - ForkId { hash: ForkHash([0x86, 0x72, 0x8b, 0x4e]), next: 0 }, /* TODO: update timestamp when Jovian is planned */ + ForkId { + hash: ForkHash([0x86, 0x72, 0x8b, 0x4e]), + next: BASE_MAINNET_JOVIAN_TIMESTAMP, + }, + ), + // Jovian + ( + Head { + number: 0, + timestamp: BASE_MAINNET_JOVIAN_TIMESTAMP, + ..Default::default() + }, + ForkId { hash: ForkHash([0x36, 0xe5, 0x8a, 0x5f]), next: 0 }, ), - // // Jovian - // ( - // Head { number: 0, timestamp: u64::MAX, ..Default::default() }, /* TODO: - // update timestamp when Jovian is planned */ ForkId { hash: - // ForkHash([0xef, 0x0e, 0x58, 0x33]), next: 0 }, ), ], ); } @@ -670,13 +680,20 @@ mod tests { // Isthmus ( Head { number: 0, timestamp: 1744905600, ..Default::default() }, - ForkId { hash: ForkHash([0x6c, 0x62, 0x5e, 0xe1]), next: 0 }, /* TODO: update timestamp when Jovian is planned */ + ForkId { + hash: ForkHash([0x6c, 0x62, 0x5e, 0xe1]), + next: OP_SEPOLIA_JOVIAN_TIMESTAMP, + }, + ), + // Jovian + ( + Head { + number: 0, + timestamp: OP_SEPOLIA_JOVIAN_TIMESTAMP, + ..Default::default() + }, + ForkId { hash: ForkHash([0xdb, 0xdb, 0x04, 0x4d]), next: 0 }, ), - // // Jovian - // ( - // Head { number: 0, timestamp: u64::MAX, ..Default::default() }, /* TODO: - // update timestamp when Jovian is planned */ ForkId { hash: - // ForkHash([0x04, 0x2a, 0x5c, 0x14]), next: 0 }, ), ], ); } @@ -739,13 +756,20 @@ mod tests { // Isthmus ( Head { number: 105235063, timestamp: 1746806401, ..Default::default() }, - ForkId { hash: ForkHash([0x37, 0xbe, 0x75, 0x8f]), next: 0 }, /* TODO: update timestamp when Jovian is planned */ + ForkId { + hash: ForkHash([0x37, 0xbe, 0x75, 0x8f]), + next: OP_MAINNET_JOVIAN_TIMESTAMP, + }, ), // Jovian - // ( - // Head { number: 105235063, timestamp: u64::MAX, ..Default::default() }, /* - // TODO: update timestamp when Jovian is planned */ ForkId { - // hash: ForkHash([0x26, 0xce, 0xa1, 0x75]), next: 0 }, ), + ( + Head { + number: 105235063, + timestamp: OP_MAINNET_JOVIAN_TIMESTAMP, + ..Default::default() + }, + ForkId { hash: ForkHash([0xff, 0x25, 0x73, 0x19]), next: 0 }, + ), ], ); } @@ -798,13 +822,20 @@ mod tests { // Isthmus ( Head { number: 0, timestamp: 1744905600, ..Default::default() }, - ForkId { hash: ForkHash([0x06, 0x0a, 0x4d, 0x1d]), next: 0 }, /* TODO: update timestamp when Jovian is planned */ + ForkId { + hash: ForkHash([0x06, 0x0a, 0x4d, 0x1d]), + next: OP_SEPOLIA_JOVIAN_TIMESTAMP, + }, /* TODO: update timestamp when Jovian is planned */ + ), + // Jovian + ( + Head { + number: 0, + timestamp: OP_SEPOLIA_JOVIAN_TIMESTAMP, + ..Default::default() + }, + ForkId { hash: ForkHash([0x12, 0x0c, 0x61, 0xc0]), next: 0 }, ), - // // Jovian - // ( - // Head { number: 0, timestamp: u64::MAX, ..Default::default() }, /* TODO: - // update timestamp when Jovian is planned */ ForkId { hash: - // ForkHash([0xcd, 0xfd, 0x39, 0x99]), next: 0 }, ), ], ); } @@ -848,7 +879,7 @@ mod tests { #[test] fn latest_base_mainnet_fork_id() { assert_eq!( - ForkId { hash: ForkHash([0x86, 0x72, 0x8b, 0x4e]), next: 0 }, + ForkId { hash: ForkHash([0x36, 0xe5, 0x8a, 0x5f]), next: 0 }, BASE_MAINNET.latest_fork_id() ) } @@ -857,7 +888,7 @@ mod tests { fn latest_base_mainnet_fork_id_with_builder() { let base_mainnet = OpChainSpecBuilder::base_mainnet().build(); assert_eq!( - ForkId { hash: ForkHash([0x86, 0x72, 0x8b, 0x4e]), next: 0 }, + ForkId { hash: ForkHash([0x36, 0xe5, 0x8a, 0x5f]), next: 0 }, base_mainnet.latest_fork_id() ) } diff --git a/crates/optimism/chainspec/src/superchain/chain_specs.rs b/crates/optimism/chainspec/src/superchain/chain_specs.rs index 1547082eca3..8a794221ea6 100644 --- a/crates/optimism/chainspec/src/superchain/chain_specs.rs +++ b/crates/optimism/chainspec/src/superchain/chain_specs.rs @@ -45,6 +45,7 @@ create_superchain_specs!( ("settlus-sepolia", "sepolia"), ("shape", "mainnet"), ("shape", "sepolia"), + ("silent-data-mainnet", "mainnet"), ("snax", "mainnet"), ("soneium", "mainnet"), ("soneium-minato", "sepolia"), diff --git a/crates/optimism/chainspec/src/superchain/configs.rs b/crates/optimism/chainspec/src/superchain/configs.rs index 53b30a2f5d9..1c70698a1ae 100644 --- a/crates/optimism/chainspec/src/superchain/configs.rs +++ b/crates/optimism/chainspec/src/superchain/configs.rs @@ -88,6 +88,11 @@ fn read_file( mod tests { use super::*; use crate::superchain::Superchain; + use alloy_op_hardforks::{ + OP_MAINNET_CANYON_TIMESTAMP, OP_MAINNET_ECOTONE_TIMESTAMP, OP_MAINNET_ISTHMUS_TIMESTAMP, + OP_MAINNET_JOVIAN_TIMESTAMP, OP_SEPOLIA_CANYON_TIMESTAMP, OP_SEPOLIA_ECOTONE_TIMESTAMP, + OP_SEPOLIA_JOVIAN_TIMESTAMP, + }; use reth_optimism_primitives::ADDRESS_L2_TO_L1_MESSAGE_PASSER; use tar_no_std::TarArchiveRef; @@ -150,4 +155,29 @@ mod tests { ); } } + + #[test] + fn test_hardfork_timestamps() { + let archive = TarArchiveRef::new(SUPER_CHAIN_CONFIGS_TAR_BYTES).unwrap(); + + for &chain in Superchain::ALL { + let metadata = + read_superchain_metadata(chain.name(), chain.environment(), &archive).unwrap(); + let environment = chain.environment(); + + if environment == "mainnet" { + assert_eq!(metadata.hardforks.canyon_time, Some(OP_MAINNET_CANYON_TIMESTAMP)); + assert_eq!(metadata.hardforks.ecotone_time, Some(OP_MAINNET_ECOTONE_TIMESTAMP)); + assert_eq!(metadata.hardforks.isthmus_time, Some(OP_MAINNET_ISTHMUS_TIMESTAMP)); + assert_eq!(metadata.hardforks.jovian_time, Some(OP_MAINNET_JOVIAN_TIMESTAMP)); + } else if environment == "sepolia" { + assert_eq!(metadata.hardforks.canyon_time, Some(OP_SEPOLIA_CANYON_TIMESTAMP)); + assert_eq!(metadata.hardforks.ecotone_time, Some(OP_SEPOLIA_ECOTONE_TIMESTAMP)); + assert_eq!(metadata.hardforks.isthmus_time, Some(OP_SEPOLIA_JOVIAN_TIMESTAMP)); + assert_eq!(metadata.hardforks.jovian_time, Some(OP_SEPOLIA_JOVIAN_TIMESTAMP)); + } else { + assert_eq!(metadata.hardforks.jovian_time, None); + } + } + } } diff --git a/crates/optimism/hardforks/src/lib.rs b/crates/optimism/hardforks/src/lib.rs index 85152c59743..202194c63a4 100644 --- a/crates/optimism/hardforks/src/lib.rs +++ b/crates/optimism/hardforks/src/lib.rs @@ -18,6 +18,10 @@ extern crate alloc; +use alloy_op_hardforks::{ + BASE_MAINNET_JOVIAN_TIMESTAMP, BASE_SEPOLIA_JOVIAN_TIMESTAMP, OP_MAINNET_JOVIAN_TIMESTAMP, + OP_SEPOLIA_JOVIAN_TIMESTAMP, +}; // Re-export alloy-op-hardforks types. pub use alloy_op_hardforks::{OpHardfork, OpHardforks}; @@ -28,6 +32,7 @@ use reth_ethereum_forks::{ChainHardforks, EthereumHardfork, ForkCondition, Hardf /// Dev hardforks pub static DEV_HARDFORKS: LazyLock = LazyLock::new(|| { + const JOVIAN_TIMESTAMP: ForkCondition = ForkCondition::Timestamp(1761840000); ChainHardforks::new(vec![ (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)), (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)), @@ -58,7 +63,7 @@ pub static DEV_HARDFORKS: LazyLock = LazyLock::new(|| { (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(0)), (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0)), (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(0)), - // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(0)), + (OpHardfork::Jovian.boxed(), JOVIAN_TIMESTAMP), ]) }); @@ -97,8 +102,7 @@ pub static OP_MAINNET_HARDFORKS: LazyLock = LazyLock::new(|| { (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1736445601)), (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1746806401)), (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1746806401)), - // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(u64::MAX)), /* TODO: Update - // timestamp when Jovian is planned */ + (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(OP_MAINNET_JOVIAN_TIMESTAMP)), ]) }); /// Optimism Sepolia list of hardforks. @@ -136,8 +140,7 @@ pub static OP_SEPOLIA_HARDFORKS: LazyLock = LazyLock::new(|| { (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1732633200)), (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1744905600)), (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1744905600)), - // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(u64::MAX)), /* TODO: Update - // timestamp when Jovian is planned */ + (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(OP_SEPOLIA_JOVIAN_TIMESTAMP)), ]) }); @@ -176,8 +179,7 @@ pub static BASE_SEPOLIA_HARDFORKS: LazyLock = LazyLock::new(|| { (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1732633200)), (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1744905600)), (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1744905600)), - // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(u64::MAX)), /* TODO: Update - // timestamp when Jovian is planned */ + (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(BASE_SEPOLIA_JOVIAN_TIMESTAMP)), ]) }); @@ -216,7 +218,6 @@ pub static BASE_MAINNET_HARDFORKS: LazyLock = LazyLock::new(|| { (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1736445601)), (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1746806401)), (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1746806401)), - // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(u64::MAX)), /* TODO: Update - // timestamp when Jovian is planned */ + (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(BASE_MAINNET_JOVIAN_TIMESTAMP)), ]) }); From 38afd977abb7537d56936da868978495f913455a Mon Sep 17 00:00:00 2001 From: theochap Date: Mon, 27 Oct 2025 19:31:17 -0400 Subject: [PATCH 2/6] chore(deps): update hardforks deps --- Cargo.lock | 16 ++--------- Cargo.toml | 4 +-- crates/optimism/chainspec/Cargo.toml | 25 +++++++++--------- .../chainspec/res/superchain-configs.tar | Bin 9879040 -> 9879040 bytes .../chainspec/res/superchain_registry_commit | 2 +- 5 files changed, 18 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1071330890..501063f2338 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -291,8 +291,7 @@ dependencies = [ [[package]] name = "alloy-hardforks" version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd78f8e1c274581c663d7949c863b10c8b015e48f2774a4b8e8efc82d43ea95c" +source = "git+https://github.com/alloy-rs/hardforks?rev=b45961a#b45961a17ebf517c65def49f5183dd7fd1030b54" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -389,8 +388,7 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777759314eaa14fb125c1deba5cbc06eee953bbe77bc7cc60b4e8685bd03479e" +source = "git+https://github.com/alloy-rs/hardforks?rev=b45961a#b45961a17ebf517c65def49f5183dd7fd1030b54" dependencies = [ "alloy-chains", "alloy-hardforks", @@ -14255,13 +14253,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[patch.unused]] -name = "alloy-hardforks" -version = "0.4.0" -source = "git+https://github.com/alloy-rs/hardforks?rev=0fd230f5aa24c4f6a8c593918b7449df0c20f60a#0fd230f5aa24c4f6a8c593918b7449df0c20f60a" - -[[patch.unused]] -name = "alloy-op-hardforks" -version = "0.4.0" -source = "git+https://github.com/alloy-rs/hardforks?rev=0fd230f5aa24c4f6a8c593918b7449df0c20f60a#0fd230f5aa24c4f6a8c593918b7449df0c20f60a" diff --git a/Cargo.toml b/Cargo.toml index 7a1cb20a37a..c578bc325d1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -774,5 +774,5 @@ vergen-git2 = "1.0.5" # jsonrpsee-http-client = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" } # jsonrpsee-types = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" } -alloy-hardforks = { git = "https://github.com/alloy-rs/hardforks", rev = "0fd230f5aa24c4f6a8c593918b7449df0c20f60a" } -alloy-op-hardforks = { git = "https://github.com/alloy-rs/hardforks", rev = "0fd230f5aa24c4f6a8c593918b7449df0c20f60a" } +alloy-hardforks = { git = "https://github.com/alloy-rs/hardforks", rev = "b45961a" } +alloy-op-hardforks = { git = "https://github.com/alloy-rs/hardforks", rev = "b45961a" } diff --git a/crates/optimism/chainspec/Cargo.toml b/crates/optimism/chainspec/Cargo.toml index fd6906cefae..133dbf01082 100644 --- a/crates/optimism/chainspec/Cargo.toml +++ b/crates/optimism/chainspec/Cargo.toml @@ -74,16 +74,17 @@ std = [ "op-alloy-consensus/std", ] serde = [ - "alloy-chains/serde", - "alloy-consensus/serde", - "alloy-eips/serde", - "alloy-hardforks/serde", - "alloy-primitives/serde", - "miniz_oxide?/serde", - "op-alloy-rpc-types/serde", - "reth-ethereum-forks/serde", - "reth-optimism-forks/serde", - "reth-optimism-primitives/serde", - "reth-primitives-traits/serde", - "op-alloy-consensus/serde", + "alloy-chains/serde", + "alloy-consensus/serde", + "alloy-eips/serde", + "alloy-hardforks/serde", + "alloy-primitives/serde", + "miniz_oxide?/serde", + "op-alloy-rpc-types/serde", + "reth-ethereum-forks/serde", + "reth-optimism-forks/serde", + "reth-optimism-primitives/serde", + "reth-primitives-traits/serde", + "op-alloy-consensus/serde", + "alloy-op-hardforks/serde" ] diff --git a/crates/optimism/chainspec/res/superchain-configs.tar b/crates/optimism/chainspec/res/superchain-configs.tar index 30153b5d242f1636fedf6003986d170d3e8eb2ab..77bfe0cd472d71cf44d694f563f80c2a778a53f6 100644 GIT binary patch delta 1312 zcmZ9|NlX)A6u|L(BPhiMDy|@kD=wgIrwlD_)heh^K?TGGwK5 z!6h;AVkAxc5=)FEUX31%Q7>}xf{A+afD!*t<4ipKCVlUFTiWvLQ%nnFzgIJdsF;xjw9^(_}V)3 z7`FD^713W^U#sJdY281|jA@-x3Nbrw=vDSw#GDcT3gu&~s5K_bq7>1R6yvnHw2=Lg zP=lUGjjUTF7MgOQ-sd79^SpwKjKX^b0qOAx-BcJH%&ql{a#JqaoL?{AnVO@?SIy%0 z6w|~sZ;h<#5Z+WHCt3Y1%ZP)6HAj93{$t~kG;cuW_lxzWt@7;{Wx!nHi3DWbWTo)` zT=h&P)6^FlIIc{SeVP(6C0ROE_ODZV{%`h|D89JpA)hT`mV95XaA|_!nl97Tb zNX1l4LmH-I24-RwW@8T0F&FbN9}AFyOf1AA*kFePDxAoIhHSXtMh+HZ36^3RmcxS; zSP3syVKs7*hc#G>b;w5nd{~b{6k!84ViSr{f>LZo8Ma_6wqZNUu>(7?3x4cI1$0!R z3VTqEz1WBSIDi@ia1e)3i^DjAI@IGRj^Q{OZ~~1uiBo7oGg@#OXK)th(2DbD!v$Q# zC0xc8wBstS;W}>MCW5$y+cLM~P9!;9byn%wmAYor^-8x|;Zoh%n(o&%UDGNYHr1}_ aS*qrDg{%$YoAfjtcq#sVufJHnSNs9jXz~pJ delta 1271 zcmY+=TTo1K9KiAUA4ThyRj!FhrCi$Gv%77DVhOPoD%aBP))GodluM;3_gl0t(qtMB zX3S`I#(&1Td-CMLFvF84FEPfG2WIlEPVMpVIWxci?>eXD@0YL^JdREmsz3FCuyw{c zs{%4zHE3}l&iTe1%2fy2>rZCtzJ{a>GoYWdJ8YP9M;`7%Zr zqrz3I!)*7zE>wEtu~e}_d+6-{-Xn9IqR22(FdS#OM1?-T(Je~#ac;f%sIPz9EC%Q4 z`hDHP8LNw3LD6c{#dW`gs_)PJBl7k0S4AqfwEWP)y|R9elK0<3WxTR1)M4=tHYf|^ zfL#fO9t-53T;;XaB^mQ0V&nurzbjsTDp4{bwVR9s4(X~=Tp~=hst$i|p%SCJw&aL% zD0Hnwvg?^H9@8b+noR!MZ{nUTzN$1vjN_p*C3%yK=~6nzhtfSAIo%4z zAq?Rdj|qr?0TVF^lQ9KT5s7IqVmhJ_jTxAUS(uGEn2Q+9LoDWF0phR_ix7{+NI)Wz zums6S!BQ;4a;!iqOfbU&6;{|_M;aVRM+P#n605KpS;)p3tc4TnupT+sfQ{IMTx`Y` zxR8f@6ksd1VLJ*@gktQ#PVB;N?7?1?pcMO11~)wLq8t_QVLuL_5(jYzhf#%U96=3g zaTIkphI$;w2{fP)Cvgg=aRyCjMhniO6>T_&^Jqs0F5n_A;WDn^Dz4!=Zr~+Rbi@&+YMfJQaRpqxdPan-0Gc L+V{qbtV;0@67cHn diff --git a/crates/optimism/chainspec/res/superchain_registry_commit b/crates/optimism/chainspec/res/superchain_registry_commit index 1374ebb1b1f..f84f14d1894 100644 --- a/crates/optimism/chainspec/res/superchain_registry_commit +++ b/crates/optimism/chainspec/res/superchain_registry_commit @@ -1 +1 @@ -d157064ab37c5217fc45d52d01fcc61a2fabfbbe +d34fd7ed60dde93c83976dad6d66c20316d536a8 From c180494561e319826374c10fe8c9e7522bc0fcb5 Mon Sep 17 00:00:00 2001 From: theochap Date: Mon, 27 Oct 2025 20:05:37 -0400 Subject: [PATCH 3/6] chore: fix tests --- crates/optimism/chainspec/src/lib.rs | 12 +- .../chainspec/src/superchain/configs.rs | 155 +++++++++++++++--- .../optimism/consensus/src/validation/mod.rs | 19 ++- 3 files changed, 150 insertions(+), 36 deletions(-) diff --git a/crates/optimism/chainspec/src/lib.rs b/crates/optimism/chainspec/src/lib.rs index e26149175cf..03e7ff70a86 100644 --- a/crates/optimism/chainspec/src/lib.rs +++ b/crates/optimism/chainspec/src/lib.rs @@ -626,7 +626,7 @@ mod tests { timestamp: BASE_MAINNET_JOVIAN_TIMESTAMP, ..Default::default() }, - ForkId { hash: ForkHash([0x36, 0xe5, 0x8a, 0x5f]), next: 0 }, + BASE_MAINNET.hardfork_fork_id(OpHardfork::Jovian).unwrap(), ), ], ); @@ -692,7 +692,7 @@ mod tests { timestamp: OP_SEPOLIA_JOVIAN_TIMESTAMP, ..Default::default() }, - ForkId { hash: ForkHash([0xdb, 0xdb, 0x04, 0x4d]), next: 0 }, + OP_SEPOLIA.hardfork_fork_id(OpHardfork::Jovian).unwrap(), ), ], ); @@ -768,7 +768,7 @@ mod tests { timestamp: OP_MAINNET_JOVIAN_TIMESTAMP, ..Default::default() }, - ForkId { hash: ForkHash([0xff, 0x25, 0x73, 0x19]), next: 0 }, + OP_MAINNET.hardfork_fork_id(OpHardfork::Jovian).unwrap(), ), ], ); @@ -834,7 +834,7 @@ mod tests { timestamp: OP_SEPOLIA_JOVIAN_TIMESTAMP, ..Default::default() }, - ForkId { hash: ForkHash([0x12, 0x0c, 0x61, 0xc0]), next: 0 }, + BASE_SEPOLIA.hardfork_fork_id(OpHardfork::Jovian).unwrap(), ), ], ); @@ -879,7 +879,7 @@ mod tests { #[test] fn latest_base_mainnet_fork_id() { assert_eq!( - ForkId { hash: ForkHash([0x36, 0xe5, 0x8a, 0x5f]), next: 0 }, + ForkId { hash: ForkHash([0xfa, 0x71, 0x70, 0xef]), next: 0 }, BASE_MAINNET.latest_fork_id() ) } @@ -888,7 +888,7 @@ mod tests { fn latest_base_mainnet_fork_id_with_builder() { let base_mainnet = OpChainSpecBuilder::base_mainnet().build(); assert_eq!( - ForkId { hash: ForkHash([0x36, 0xe5, 0x8a, 0x5f]), next: 0 }, + ForkId { hash: ForkHash([0xfa, 0x71, 0x70, 0xef]), next: 0 }, base_mainnet.latest_fork_id() ) } diff --git a/crates/optimism/chainspec/src/superchain/configs.rs b/crates/optimism/chainspec/src/superchain/configs.rs index 1c70698a1ae..3d3cc7318a4 100644 --- a/crates/optimism/chainspec/src/superchain/configs.rs +++ b/crates/optimism/chainspec/src/superchain/configs.rs @@ -87,11 +87,12 @@ fn read_file( #[cfg(test)] mod tests { use super::*; - use crate::superchain::Superchain; + use crate::{generated_chain_value_parser, superchain::Superchain, SUPPORTED_CHAINS}; + use alloy_chains::NamedChain; use alloy_op_hardforks::{ - OP_MAINNET_CANYON_TIMESTAMP, OP_MAINNET_ECOTONE_TIMESTAMP, OP_MAINNET_ISTHMUS_TIMESTAMP, - OP_MAINNET_JOVIAN_TIMESTAMP, OP_SEPOLIA_CANYON_TIMESTAMP, OP_SEPOLIA_ECOTONE_TIMESTAMP, - OP_SEPOLIA_JOVIAN_TIMESTAMP, + OpHardfork, OP_MAINNET_CANYON_TIMESTAMP, OP_MAINNET_ECOTONE_TIMESTAMP, + OP_MAINNET_ISTHMUS_TIMESTAMP, OP_MAINNET_JOVIAN_TIMESTAMP, OP_SEPOLIA_CANYON_TIMESTAMP, + OP_SEPOLIA_ECOTONE_TIMESTAMP, OP_SEPOLIA_ISTHMUS_TIMESTAMP, OP_SEPOLIA_JOVIAN_TIMESTAMP, }; use reth_optimism_primitives::ADDRESS_L2_TO_L1_MESSAGE_PASSER; use tar_no_std::TarArchiveRef; @@ -158,25 +159,135 @@ mod tests { #[test] fn test_hardfork_timestamps() { - let archive = TarArchiveRef::new(SUPER_CHAIN_CONFIGS_TAR_BYTES).unwrap(); + for &chain in SUPPORTED_CHAINS { + let metadata = generated_chain_value_parser(chain).unwrap(); - for &chain in Superchain::ALL { - let metadata = - read_superchain_metadata(chain.name(), chain.environment(), &archive).unwrap(); - let environment = chain.environment(); - - if environment == "mainnet" { - assert_eq!(metadata.hardforks.canyon_time, Some(OP_MAINNET_CANYON_TIMESTAMP)); - assert_eq!(metadata.hardforks.ecotone_time, Some(OP_MAINNET_ECOTONE_TIMESTAMP)); - assert_eq!(metadata.hardforks.isthmus_time, Some(OP_MAINNET_ISTHMUS_TIMESTAMP)); - assert_eq!(metadata.hardforks.jovian_time, Some(OP_MAINNET_JOVIAN_TIMESTAMP)); - } else if environment == "sepolia" { - assert_eq!(metadata.hardforks.canyon_time, Some(OP_SEPOLIA_CANYON_TIMESTAMP)); - assert_eq!(metadata.hardforks.ecotone_time, Some(OP_SEPOLIA_ECOTONE_TIMESTAMP)); - assert_eq!(metadata.hardforks.isthmus_time, Some(OP_SEPOLIA_JOVIAN_TIMESTAMP)); - assert_eq!(metadata.hardforks.jovian_time, Some(OP_SEPOLIA_JOVIAN_TIMESTAMP)); - } else { - assert_eq!(metadata.hardforks.jovian_time, None); + match metadata.chain().named() { + Some(NamedChain::Optimism) => { + assert_eq!( + metadata.hardforks.get(OpHardfork::Jovian).unwrap().as_timestamp().unwrap(), + OP_MAINNET_JOVIAN_TIMESTAMP + ); + + assert_eq!( + metadata + .hardforks + .get(OpHardfork::Isthmus) + .unwrap() + .as_timestamp() + .unwrap(), + OP_MAINNET_ISTHMUS_TIMESTAMP + ); + + assert_eq!( + metadata.hardforks.get(OpHardfork::Canyon).unwrap().as_timestamp().unwrap(), + OP_MAINNET_CANYON_TIMESTAMP + ); + + assert_eq!( + metadata + .hardforks + .get(OpHardfork::Ecotone) + .unwrap() + .as_timestamp() + .unwrap(), + OP_MAINNET_ECOTONE_TIMESTAMP + ); + } + Some(NamedChain::OptimismSepolia) => { + assert_eq!( + metadata.hardforks.get(OpHardfork::Jovian).unwrap().as_timestamp().unwrap(), + OP_SEPOLIA_JOVIAN_TIMESTAMP + ); + + assert_eq!( + metadata + .hardforks + .get(OpHardfork::Isthmus) + .unwrap() + .as_timestamp() + .unwrap(), + OP_SEPOLIA_ISTHMUS_TIMESTAMP + ); + + assert_eq!( + metadata.hardforks.get(OpHardfork::Canyon).unwrap().as_timestamp().unwrap(), + OP_SEPOLIA_CANYON_TIMESTAMP + ); + + assert_eq!( + metadata + .hardforks + .get(OpHardfork::Ecotone) + .unwrap() + .as_timestamp() + .unwrap(), + OP_SEPOLIA_ECOTONE_TIMESTAMP + ); + } + Some(NamedChain::Base) => { + assert_eq!( + metadata.hardforks.get(OpHardfork::Jovian).unwrap().as_timestamp().unwrap(), + OP_MAINNET_JOVIAN_TIMESTAMP + ); + + assert_eq!( + metadata + .hardforks + .get(OpHardfork::Isthmus) + .unwrap() + .as_timestamp() + .unwrap(), + OP_MAINNET_ISTHMUS_TIMESTAMP + ); + + assert_eq!( + metadata.hardforks.get(OpHardfork::Canyon).unwrap().as_timestamp().unwrap(), + OP_MAINNET_CANYON_TIMESTAMP + ); + + assert_eq!( + metadata + .hardforks + .get(OpHardfork::Ecotone) + .unwrap() + .as_timestamp() + .unwrap(), + OP_MAINNET_ECOTONE_TIMESTAMP + ); + } + Some(NamedChain::BaseSepolia) => { + assert_eq!( + metadata.hardforks.get(OpHardfork::Jovian).unwrap().as_timestamp().unwrap(), + OP_SEPOLIA_JOVIAN_TIMESTAMP + ); + + assert_eq!( + metadata + .hardforks + .get(OpHardfork::Isthmus) + .unwrap() + .as_timestamp() + .unwrap(), + OP_SEPOLIA_ISTHMUS_TIMESTAMP + ); + + assert_eq!( + metadata.hardforks.get(OpHardfork::Canyon).unwrap().as_timestamp().unwrap(), + OP_SEPOLIA_CANYON_TIMESTAMP + ); + + assert_eq!( + metadata + .hardforks + .get(OpHardfork::Ecotone) + .unwrap() + .as_timestamp() + .unwrap(), + OP_SEPOLIA_ECOTONE_TIMESTAMP + ); + } + _ => {} } } } diff --git a/crates/optimism/consensus/src/validation/mod.rs b/crates/optimism/consensus/src/validation/mod.rs index 8509a97e7a4..c17e8429c81 100644 --- a/crates/optimism/consensus/src/validation/mod.rs +++ b/crates/optimism/consensus/src/validation/mod.rs @@ -202,12 +202,15 @@ mod tests { use reth_optimism_primitives::OpReceipt; use std::sync::Arc; - const JOVIAN_TIMESTAMP: u64 = 1900000000; + const HOLOCENE_TIMESTAMP: u64 = 1700000000; + const ISTHMUS_TIMESTAMP: u64 = 1750000000; + const JOVIAN_TIMESTAMP: u64 = 1800000000; const BLOCK_TIME_SECONDS: u64 = 2; fn holocene_chainspec() -> Arc { let mut hardforks = BASE_SEPOLIA_HARDFORKS.clone(); - hardforks.insert(OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1800000000)); + hardforks + .insert(OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(HOLOCENE_TIMESTAMP)); Arc::new(OpChainSpec { inner: ChainSpec { chain: BASE_SEPOLIA.inner.chain, @@ -227,7 +230,7 @@ mod tests { chainspec .inner .hardforks - .insert(OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1800000000)); + .insert(OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(ISTHMUS_TIMESTAMP)); chainspec } @@ -236,7 +239,7 @@ mod tests { chainspec .inner .hardforks - .insert(OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(1900000000)); + .insert(OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(JOVIAN_TIMESTAMP)); chainspec } @@ -264,14 +267,14 @@ mod tests { base_fee_per_gas: Some(1), gas_used: 15763614, gas_limit: 144000000, - timestamp: 1800000003, + timestamp: HOLOCENE_TIMESTAMP + 3, extra_data: Bytes::from_static(&[0, 0, 0, 0, 0, 0, 0, 0, 0]), ..Default::default() }; let base_fee = reth_optimism_chainspec::OpChainSpec::next_block_base_fee( &op_chain_spec, &parent, - 1800000005, + HOLOCENE_TIMESTAMP + 5, ); assert_eq!( base_fee.unwrap(), @@ -286,14 +289,14 @@ mod tests { gas_used: 15763614, gas_limit: 144000000, extra_data: Bytes::from_static(&[0, 0, 0, 0, 8, 0, 0, 0, 8]), - timestamp: 1800000003, + timestamp: HOLOCENE_TIMESTAMP + 3, ..Default::default() }; let base_fee = reth_optimism_chainspec::OpChainSpec::next_block_base_fee( &holocene_chainspec(), &parent, - 1800000005, + HOLOCENE_TIMESTAMP + 5, ); assert_eq!( base_fee.unwrap(), From d6f6024439cdc9d841c1793c04def4cc0625f180 Mon Sep 17 00:00:00 2001 From: theochap Date: Mon, 27 Oct 2025 20:07:57 -0400 Subject: [PATCH 4/6] chore: tab vs spaces for cargo.toml --- crates/optimism/chainspec/Cargo.toml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/optimism/chainspec/Cargo.toml b/crates/optimism/chainspec/Cargo.toml index 133dbf01082..a4ef9263b1c 100644 --- a/crates/optimism/chainspec/Cargo.toml +++ b/crates/optimism/chainspec/Cargo.toml @@ -74,17 +74,17 @@ std = [ "op-alloy-consensus/std", ] serde = [ - "alloy-chains/serde", - "alloy-consensus/serde", - "alloy-eips/serde", - "alloy-hardforks/serde", - "alloy-primitives/serde", - "miniz_oxide?/serde", - "op-alloy-rpc-types/serde", - "reth-ethereum-forks/serde", - "reth-optimism-forks/serde", - "reth-optimism-primitives/serde", - "reth-primitives-traits/serde", - "op-alloy-consensus/serde", - "alloy-op-hardforks/serde" + "alloy-chains/serde", + "alloy-consensus/serde", + "alloy-eips/serde", + "alloy-hardforks/serde", + "alloy-primitives/serde", + "miniz_oxide?/serde", + "op-alloy-rpc-types/serde", + "reth-ethereum-forks/serde", + "reth-optimism-forks/serde", + "reth-optimism-primitives/serde", + "reth-primitives-traits/serde", + "op-alloy-consensus/serde", + "alloy-op-hardforks/serde", ] From 421057b81673eab46e45f183c2ff3fe11d537f96 Mon Sep 17 00:00:00 2001 From: theochap Date: Mon, 27 Oct 2025 20:28:58 -0400 Subject: [PATCH 5/6] chore: clippy --- .../chainspec/src/superchain/configs.rs | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/crates/optimism/chainspec/src/superchain/configs.rs b/crates/optimism/chainspec/src/superchain/configs.rs index 3d3cc7318a4..bb1929646a0 100644 --- a/crates/optimism/chainspec/src/superchain/configs.rs +++ b/crates/optimism/chainspec/src/superchain/configs.rs @@ -90,9 +90,13 @@ mod tests { use crate::{generated_chain_value_parser, superchain::Superchain, SUPPORTED_CHAINS}; use alloy_chains::NamedChain; use alloy_op_hardforks::{ - OpHardfork, OP_MAINNET_CANYON_TIMESTAMP, OP_MAINNET_ECOTONE_TIMESTAMP, - OP_MAINNET_ISTHMUS_TIMESTAMP, OP_MAINNET_JOVIAN_TIMESTAMP, OP_SEPOLIA_CANYON_TIMESTAMP, - OP_SEPOLIA_ECOTONE_TIMESTAMP, OP_SEPOLIA_ISTHMUS_TIMESTAMP, OP_SEPOLIA_JOVIAN_TIMESTAMP, + OpHardfork, BASE_MAINNET_CANYON_TIMESTAMP, BASE_MAINNET_ECOTONE_TIMESTAMP, + BASE_MAINNET_ISTHMUS_TIMESTAMP, BASE_MAINNET_JOVIAN_TIMESTAMP, + BASE_SEPOLIA_CANYON_TIMESTAMP, BASE_SEPOLIA_ECOTONE_TIMESTAMP, + BASE_SEPOLIA_ISTHMUS_TIMESTAMP, BASE_SEPOLIA_JOVIAN_TIMESTAMP, OP_MAINNET_CANYON_TIMESTAMP, + OP_MAINNET_ECOTONE_TIMESTAMP, OP_MAINNET_ISTHMUS_TIMESTAMP, OP_MAINNET_JOVIAN_TIMESTAMP, + OP_SEPOLIA_CANYON_TIMESTAMP, OP_SEPOLIA_ECOTONE_TIMESTAMP, OP_SEPOLIA_ISTHMUS_TIMESTAMP, + OP_SEPOLIA_JOVIAN_TIMESTAMP, }; use reth_optimism_primitives::ADDRESS_L2_TO_L1_MESSAGE_PASSER; use tar_no_std::TarArchiveRef; @@ -228,7 +232,7 @@ mod tests { Some(NamedChain::Base) => { assert_eq!( metadata.hardforks.get(OpHardfork::Jovian).unwrap().as_timestamp().unwrap(), - OP_MAINNET_JOVIAN_TIMESTAMP + BASE_MAINNET_JOVIAN_TIMESTAMP ); assert_eq!( @@ -238,12 +242,12 @@ mod tests { .unwrap() .as_timestamp() .unwrap(), - OP_MAINNET_ISTHMUS_TIMESTAMP + BASE_MAINNET_ISTHMUS_TIMESTAMP ); assert_eq!( metadata.hardforks.get(OpHardfork::Canyon).unwrap().as_timestamp().unwrap(), - OP_MAINNET_CANYON_TIMESTAMP + BASE_MAINNET_CANYON_TIMESTAMP ); assert_eq!( @@ -253,13 +257,13 @@ mod tests { .unwrap() .as_timestamp() .unwrap(), - OP_MAINNET_ECOTONE_TIMESTAMP + BASE_MAINNET_ECOTONE_TIMESTAMP ); } Some(NamedChain::BaseSepolia) => { assert_eq!( metadata.hardforks.get(OpHardfork::Jovian).unwrap().as_timestamp().unwrap(), - OP_SEPOLIA_JOVIAN_TIMESTAMP + BASE_SEPOLIA_JOVIAN_TIMESTAMP ); assert_eq!( @@ -269,12 +273,12 @@ mod tests { .unwrap() .as_timestamp() .unwrap(), - OP_SEPOLIA_ISTHMUS_TIMESTAMP + BASE_SEPOLIA_ISTHMUS_TIMESTAMP ); assert_eq!( metadata.hardforks.get(OpHardfork::Canyon).unwrap().as_timestamp().unwrap(), - OP_SEPOLIA_CANYON_TIMESTAMP + BASE_SEPOLIA_CANYON_TIMESTAMP ); assert_eq!( @@ -284,7 +288,7 @@ mod tests { .unwrap() .as_timestamp() .unwrap(), - OP_SEPOLIA_ECOTONE_TIMESTAMP + BASE_SEPOLIA_ECOTONE_TIMESTAMP ); } _ => {} From 7645a1793586397ad59dd504bb537a882fa22558 Mon Sep 17 00:00:00 2001 From: theochap Date: Tue, 28 Oct 2025 23:20:23 -0400 Subject: [PATCH 6/6] chore(deps): update alloy-hardforks deps --- Cargo.lock | 10 ++++++---- Cargo.toml | 9 +++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 501063f2338..6c228f94f07 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -290,8 +290,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.4.1" -source = "git+https://github.com/alloy-rs/hardforks?rev=b45961a#b45961a17ebf517c65def49f5183dd7fd1030b54" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ffa71f397f89c72a27d9c7e3340eed7981a18df9a257dd16b835ef7f53aef6" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -387,8 +388,9 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" -version = "0.4.1" -source = "git+https://github.com/alloy-rs/hardforks?rev=b45961a#b45961a17ebf517c65def49f5183dd7fd1030b54" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b43e1c305c2f0e4b8878b943fa2f75234803bfca5cd4a4dc0a0a772842a278ea" dependencies = [ "alloy-chains", "alloy-hardforks", diff --git a/Cargo.toml b/Cargo.toml index c578bc325d1..e666ea88dcc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -493,7 +493,7 @@ alloy-sol-macro = "1.4.1" alloy-sol-types = { version = "1.4.1", default-features = false } alloy-trie = { version = "0.9.1", default-features = false } -alloy-hardforks = "0.4.1" +alloy-hardforks = "0.4.2" alloy-consensus = { version = "1.0.41", default-features = false } alloy-contract = { version = "1.0.41", default-features = false } @@ -525,7 +525,7 @@ alloy-transport-ws = { version = "1.0.41", default-features = false } # op alloy-op-evm = { version = "0.22.4", default-features = false } -alloy-op-hardforks = "0.4.1" +alloy-op-hardforks = "0.4.2" op-alloy-rpc-types = { version = "0.21.0", default-features = false } op-alloy-rpc-types-engine = { version = "0.21.0", default-features = false } op-alloy-network = { version = "0.21.0", default-features = false } @@ -731,7 +731,7 @@ visibility = "0.1.1" walkdir = "2.3.3" vergen-git2 = "1.0.5" -[patch.crates-io] +# [patch.crates-io] # alloy-consensus = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } # alloy-contract = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } # alloy-eips = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" } @@ -773,6 +773,3 @@ vergen-git2 = "1.0.5" # jsonrpsee-server = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" } # jsonrpsee-http-client = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" } # jsonrpsee-types = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" } - -alloy-hardforks = { git = "https://github.com/alloy-rs/hardforks", rev = "b45961a" } -alloy-op-hardforks = { git = "https://github.com/alloy-rs/hardforks", rev = "b45961a" }