@@ -31,7 +31,7 @@ use bus_mapping::state_db::CodeDB;
31
31
use eth_types:: {
32
32
evm_types:: GasCost , Field , OpsIdentity , ToAddress , ToLittleEndian , ToScalar , ToWord , U256 ,
33
33
} ;
34
- use gadgets:: util:: { select, sum} ;
34
+ use gadgets:: util:: { or , select, sum} ;
35
35
use halo2_proofs:: {
36
36
circuit:: Value ,
37
37
plonk:: { Error , Expression } ,
@@ -370,6 +370,7 @@ impl<F: Field, const N_ADDENDS: usize, const INCREASE: bool>
370
370
pub ( crate ) struct TransferToGadget < F > {
371
371
receiver : UpdateBalanceGadget < F , 2 , true > ,
372
372
receiver_exists : Expression < F > ,
373
+ opcode_is_create : Expression < F > ,
373
374
value_is_zero : IsZeroWordGadget < F , Word32Cell < F > > ,
374
375
}
375
376
@@ -379,6 +380,7 @@ impl<F: Field> TransferToGadget<F> {
379
380
cb : & mut EVMConstraintBuilder < F > ,
380
381
receiver_address : WordLoHi < Expression < F > > ,
381
382
receiver_exists : Expression < F > ,
383
+ opcode_is_create : Expression < F > ,
382
384
value : Word32Cell < F > ,
383
385
mut reversion_info : Option < & mut ReversionInfo < F > > ,
384
386
) -> Self {
@@ -388,7 +390,7 @@ impl<F: Field> TransferToGadget<F> {
388
390
cb. condition (
389
391
and:: expr ( [
390
392
not:: expr ( receiver_exists. expr ( ) ) ,
391
- not:: expr ( value_is_zero. expr ( ) ) ,
393
+ or :: expr ( [ not:: expr ( value_is_zero. expr ( ) ) , opcode_is_create . expr ( ) ] ) ,
392
394
] ) ,
393
395
|cb| {
394
396
cb. account_write (
@@ -408,6 +410,7 @@ impl<F: Field> TransferToGadget<F> {
408
410
Self {
409
411
receiver,
410
412
receiver_exists,
413
+ opcode_is_create,
411
414
value_is_zero,
412
415
}
413
416
}
@@ -434,8 +437,9 @@ impl<F: Field> TransferToGadget<F> {
434
437
pub ( crate ) fn rw_delta ( & self ) -> Expression < F > {
435
438
// +1 Write Account (receiver) CodeHash (account creation via code_hash update)
436
439
and:: expr ( [
437
- not:: expr ( self . receiver_exists . expr ( ) ) , not:: expr ( self . value_is_zero . expr ( ) )
438
- ] ) +
440
+ not:: expr ( self . receiver_exists . expr ( ) ) ,
441
+ or:: expr ( [ not:: expr ( self . value_is_zero . expr ( ) ) , self . opcode_is_create . expr ( ) ] )
442
+ ] ) +
439
443
// +1 Write Account (receiver) Balance
440
444
not:: expr ( self . value_is_zero . expr ( ) )
441
445
}
@@ -463,6 +467,7 @@ impl<F: Field, const WITH_FEE: bool> TransferGadget<F, WITH_FEE> {
463
467
sender_address : WordLoHi < Expression < F > > ,
464
468
receiver_address : WordLoHi < Expression < F > > ,
465
469
receiver_exists : Expression < F > ,
470
+ opcode_is_create : Expression < F > ,
466
471
value : Word32Cell < F > ,
467
472
reversion_info : & mut ReversionInfo < F > ,
468
473
gas_fee : Option < Word32Cell < F > > ,
@@ -481,6 +486,7 @@ impl<F: Field, const WITH_FEE: bool> TransferGadget<F, WITH_FEE> {
481
486
cb,
482
487
receiver_address,
483
488
receiver_exists,
489
+ opcode_is_create,
484
490
value,
485
491
Some ( reversion_info) ,
486
492
) ;
@@ -496,20 +502,18 @@ impl<F: Field, const WITH_FEE: bool> TransferGadget<F, WITH_FEE> {
496
502
pub ( crate ) fn rw_delta ( & self ) -> Expression < F > {
497
503
// +1 Write Account (sender) Balance (Not Reversible tx fee)
498
504
WITH_FEE . expr ( ) +
499
- // +1 Write Account (receiver) CodeHash (account creation via code_hash update)
500
- self . receiver . rw_delta ( ) +
501
505
// +1 Write Account (sender) Balance
502
- // +1 Write Account (receiver) Balance
503
- not:: expr ( self . value_is_zero . expr ( ) ) * 2 . expr ( )
506
+ not:: expr ( self . value_is_zero . expr ( ) ) +
507
+ // +1 Write Account (receiver) CodeHash (account creation via code_hash update)
508
+ self . receiver . rw_delta ( )
504
509
}
505
510
506
511
pub ( crate ) fn reversible_w_delta ( & self ) -> Expression < F > {
507
512
// NOTE: Write Account (sender) Balance (Not Reversible tx fee)
508
- // +1 Write Account (receiver) CodeHash (account creation via code_hash update)
509
- self . receiver . rw_delta ( ) +
510
513
// +1 Write Account (sender) Balance
511
- // +1 Write Account (receiver) Balance
512
- not:: expr ( self . value_is_zero . expr ( ) ) * 2 . expr ( )
514
+ not:: expr ( self . value_is_zero . expr ( ) ) +
515
+ // +1 Write Account (receiver) CodeHash (account creation via code_hash update)
516
+ self . receiver . rw_delta ( )
513
517
}
514
518
515
519
#[ allow( clippy:: too_many_arguments) ]
0 commit comments