@@ -2,8 +2,8 @@ use alloy_primitives::Address;
22use reth_chainspec:: ChainSpec ;
33use serde:: { Deserialize , Serialize } ;
44
5- /// Default contract size limit in bytes (128KB ).
6- pub const DEFAULT_CONTRACT_SIZE_LIMIT : usize = 128 * 1024 ;
5+ /// Default contract size limit in bytes (24KB per EIP-170 ).
6+ pub const DEFAULT_CONTRACT_SIZE_LIMIT : usize = 24 * 1024 ;
77
88#[ derive( Debug , Clone , Serialize , Deserialize , Default ) ]
99struct ChainspecEvolveConfig {
@@ -15,9 +15,12 @@ struct ChainspecEvolveConfig {
1515 pub mint_admin : Option < Address > ,
1616 #[ serde( default , rename = "mintPrecompileActivationHeight" ) ]
1717 pub mint_precompile_activation_height : Option < u64 > ,
18- /// Maximum contract code size in bytes. Defaults to 128KB if not specified.
18+ /// Maximum contract code size in bytes. Defaults to 24KB (EIP-170) if not specified.
1919 #[ serde( default , rename = "contractSizeLimit" ) ]
2020 pub contract_size_limit : Option < usize > ,
21+ /// Block height at which the custom contract size limit activates.
22+ #[ serde( default , rename = "contractSizeLimitActivationHeight" ) ]
23+ pub contract_size_limit_activation_height : Option < u64 > ,
2124}
2225
2326/// Configuration for the Evolve payload builder
@@ -35,9 +38,12 @@ pub struct EvolvePayloadBuilderConfig {
3538 /// Optional activation height for mint precompile; defaults to 0 when admin set.
3639 #[ serde( default ) ]
3740 pub mint_precompile_activation_height : Option < u64 > ,
38- /// Maximum contract code size in bytes. Defaults to 128KB .
41+ /// Maximum contract code size in bytes. Defaults to 24KB (EIP-170) .
3942 #[ serde( default ) ]
4043 pub contract_size_limit : Option < usize > ,
44+ /// Block height at which the custom contract size limit activates.
45+ #[ serde( default ) ]
46+ pub contract_size_limit_activation_height : Option < u64 > ,
4147}
4248
4349impl EvolvePayloadBuilderConfig {
@@ -49,6 +55,7 @@ impl EvolvePayloadBuilderConfig {
4955 base_fee_redirect_activation_height : None ,
5056 mint_precompile_activation_height : None ,
5157 contract_size_limit : None ,
58+ contract_size_limit_activation_height : None ,
5259 }
5360 }
5461
@@ -81,13 +88,32 @@ impl EvolvePayloadBuilderConfig {
8188 }
8289
8390 config. contract_size_limit = extras. contract_size_limit ;
91+ config. contract_size_limit_activation_height =
92+ extras. contract_size_limit_activation_height ;
8493 }
8594 Ok ( config)
8695 }
8796
88- /// Returns the contract size limit, defaulting to 128KB.
89- pub fn contract_size_limit ( & self ) -> usize {
90- self . contract_size_limit
97+ /// Returns the contract size limit settings (limit, `activation_height`) if configured.
98+ /// Returns None if no custom limit is set (uses EIP-170 default).
99+ pub fn contract_size_limit_settings ( & self ) -> Option < ( usize , u64 ) > {
100+ self . contract_size_limit . map ( |limit| {
101+ let activation = self . contract_size_limit_activation_height . unwrap_or ( 0 ) ;
102+ ( limit, activation)
103+ } )
104+ }
105+
106+ /// Returns the contract size limit for a given block number.
107+ /// Uses the custom limit if configured and active, otherwise returns EIP-170 default.
108+ pub fn contract_size_limit_for_block ( & self , block_number : u64 ) -> usize {
109+ self . contract_size_limit_settings ( )
110+ . and_then ( |( limit, activation) | {
111+ if block_number >= activation {
112+ Some ( limit)
113+ } else {
114+ None
115+ }
116+ } )
91117 . unwrap_or ( DEFAULT_CONTRACT_SIZE_LIMIT )
92118 }
93119
@@ -305,6 +331,7 @@ mod tests {
305331 base_fee_redirect_activation_height : Some ( 0 ) ,
306332 mint_precompile_activation_height : Some ( 0 ) ,
307333 contract_size_limit : None ,
334+ contract_size_limit_activation_height : None ,
308335 } ;
309336 assert ! ( config_with_sink. validate( ) . is_ok( ) ) ;
310337 }
@@ -318,6 +345,7 @@ mod tests {
318345 base_fee_redirect_activation_height : Some ( 5 ) ,
319346 mint_precompile_activation_height : None ,
320347 contract_size_limit : None ,
348+ contract_size_limit_activation_height : None ,
321349 } ;
322350
323351 assert_eq ! ( config. base_fee_sink_for_block( 4 ) , None ) ;
@@ -354,30 +382,72 @@ mod tests {
354382
355383 #[ test]
356384 fn test_contract_size_limit_default ( ) {
357- // Test default contract size limit (128KB )
385+ // Test default contract size limit (24KB per EIP-170 )
358386 let config = EvolvePayloadBuilderConfig :: new ( ) ;
359387 assert_eq ! ( config. contract_size_limit, None ) ;
360- assert_eq ! ( config. contract_size_limit( ) , DEFAULT_CONTRACT_SIZE_LIMIT ) ;
361- assert_eq ! ( config. contract_size_limit( ) , 128 * 1024 ) ;
388+ assert_eq ! ( config. contract_size_limit_settings( ) , None ) ;
389+ // When no custom limit is set, use EIP-170 default for any block
390+ assert_eq ! ( config. contract_size_limit_for_block( 0 ) , DEFAULT_CONTRACT_SIZE_LIMIT ) ;
391+ assert_eq ! ( config. contract_size_limit_for_block( 0 ) , 24 * 1024 ) ;
362392 }
363393
364394 #[ test]
365395 fn test_contract_size_limit_from_chainspec ( ) {
366- // Test contract size limit from chainspec
396+ // Test contract size limit from chainspec with activation height
397+ let extras = json ! ( {
398+ "contractSizeLimit" : 131072 ,
399+ "contractSizeLimitActivationHeight" : 100
400+ } ) ;
401+
402+ let chainspec = create_test_chainspec_with_extras ( Some ( extras) ) ;
403+ let config = EvolvePayloadBuilderConfig :: from_chain_spec ( & chainspec) . unwrap ( ) ;
404+
405+ assert_eq ! ( config. contract_size_limit, Some ( 131072 ) ) ;
406+ assert_eq ! ( config. contract_size_limit_activation_height, Some ( 100 ) ) ;
407+ assert_eq ! ( config. contract_size_limit_settings( ) , Some ( ( 131072 , 100 ) ) ) ;
408+ }
409+
410+ #[ test]
411+ fn test_contract_size_limit_respects_activation_height ( ) {
412+ // Test that contract size limit respects activation height
413+ let extras = json ! ( {
414+ "contractSizeLimit" : 131072 ,
415+ "contractSizeLimitActivationHeight" : 100
416+ } ) ;
417+
418+ let chainspec = create_test_chainspec_with_extras ( Some ( extras) ) ;
419+ let config = EvolvePayloadBuilderConfig :: from_chain_spec ( & chainspec) . unwrap ( ) ;
420+
421+ // Before activation: use EIP-170 default
422+ assert_eq ! ( config. contract_size_limit_for_block( 0 ) , DEFAULT_CONTRACT_SIZE_LIMIT ) ;
423+ assert_eq ! ( config. contract_size_limit_for_block( 99 ) , DEFAULT_CONTRACT_SIZE_LIMIT ) ;
424+
425+ // At and after activation: use custom limit
426+ assert_eq ! ( config. contract_size_limit_for_block( 100 ) , 131072 ) ;
427+ assert_eq ! ( config. contract_size_limit_for_block( 1000 ) , 131072 ) ;
428+ }
429+
430+ #[ test]
431+ fn test_contract_size_limit_defaults_activation_to_zero ( ) {
432+ // Test that activation height defaults to 0 when limit is set but height is not
367433 let extras = json ! ( {
368- "contractSizeLimit" : 256000
434+ "contractSizeLimit" : 131072
369435 } ) ;
370436
371437 let chainspec = create_test_chainspec_with_extras ( Some ( extras) ) ;
372438 let config = EvolvePayloadBuilderConfig :: from_chain_spec ( & chainspec) . unwrap ( ) ;
373439
374- assert_eq ! ( config. contract_size_limit, Some ( 256000 ) ) ;
375- assert_eq ! ( config. contract_size_limit( ) , 256000 ) ;
440+ assert_eq ! ( config. contract_size_limit, Some ( 131072 ) ) ;
441+ assert_eq ! ( config. contract_size_limit_activation_height, None ) ;
442+ // Settings method defaults activation to 0
443+ assert_eq ! ( config. contract_size_limit_settings( ) , Some ( ( 131072 , 0 ) ) ) ;
444+ // Limit is active from block 0
445+ assert_eq ! ( config. contract_size_limit_for_block( 0 ) , 131072 ) ;
376446 }
377447
378448 #[ test]
379449 fn test_contract_size_limit_not_set_uses_default ( ) {
380- // Test that missing contractSizeLimit uses default
450+ // Test that missing contractSizeLimit uses EIP-170 default
381451 let extras = json ! ( {
382452 "baseFeeSink" : "0x0000000000000000000000000000000000000001"
383453 } ) ;
@@ -386,6 +456,8 @@ mod tests {
386456 let config = EvolvePayloadBuilderConfig :: from_chain_spec ( & chainspec) . unwrap ( ) ;
387457
388458 assert_eq ! ( config. contract_size_limit, None ) ;
389- assert_eq ! ( config. contract_size_limit( ) , DEFAULT_CONTRACT_SIZE_LIMIT ) ;
459+ assert_eq ! ( config. contract_size_limit_settings( ) , None ) ;
460+ assert_eq ! ( config. contract_size_limit_for_block( 0 ) , DEFAULT_CONTRACT_SIZE_LIMIT ) ;
461+ assert_eq ! ( config. contract_size_limit_for_block( 1000000 ) , DEFAULT_CONTRACT_SIZE_LIMIT ) ;
390462 }
391463}
0 commit comments