@@ -269,8 +269,21 @@ func (st *StateTransition) buyGas() error {
269269}
270270
271271func  (st  * StateTransition ) preCheck () error  {
272+ 	// Only check transactions that are not fake 
273+ 	if  ! st .msg .IsFake () {
274+ 		// Make sure the sender is an EOA 
275+ 		code  :=  st .state .GetCode (st .msg .From ())
276+ 		_ , delegated  :=  types .ParseDelegation (code )
277+ 		if  len (code ) >  0  &&  ! delegated  {
278+ 			// If the sender on L1 is a (delegated) EOA, then it must be a (delegated) EOA on L2, too. 
279+ 			// If the sender on L1 is a contract, then we apply address aliasing. 
280+ 			// The probability that the aliased address happens to be a smart contract on L2 is negligible. 
281+ 			return  fmt .Errorf ("%w: address %v, len(code): %d" , ErrSenderNoEOA , st .msg .From ().Hex (), len (code ))
282+ 		}
283+ 	}
284+ 
272285	if  st .msg .IsL1MessageTx () {
273- 		// No fee fields to check, no nonce to check, and no need to check if EOA (L1 already verified it for us)  
286+ 		// No fee fields to check, no nonce to check 
274287		// Gas is free, but no refunds! 
275288		st .gas  +=  st .msg .Gas ()
276289		st .initialGas  =  st .msg .Gas ()
@@ -291,12 +304,6 @@ func (st *StateTransition) preCheck() error {
291304			return  fmt .Errorf ("%w: address %v, nonce: %d" , ErrNonceMax ,
292305				st .msg .From ().Hex (), stNonce )
293306		}
294- 		// Make sure the sender is an EOA 
295- 		code  :=  st .state .GetCode (st .msg .From ())
296- 		_ , delegated  :=  types .ParseDelegation (code )
297- 		if  len (code ) >  0  &&  ! delegated  {
298- 			return  fmt .Errorf ("%w: address %v, len(code): %d" , ErrSenderNoEOA , st .msg .From ().Hex (), len (code ))
299- 		}
300307	}
301308	// Make sure that transaction gasFeeCap is greater than the baseFee (post london) 
302309	// Note: Logically, this should be `IsCurie`, but we keep `IsLondon` to ensure backward compatibility. 
0 commit comments