@@ -758,3 +758,168 @@ func TestOpCLZ(t *testing.T) {
758758 }
759759 }
760760}
761+
762+ func TestEIP8024_Execution (t * testing.T ) {
763+ evm := NewCVM (BlockContext {}, nil , params .TestChainConfig , Config {})
764+
765+ tests := []struct {
766+ name string
767+ codeHex string
768+ wantErr bool
769+ wantVals []uint64
770+ }{
771+ {
772+ name : "DUPN" ,
773+ codeHex : "60016000808080808080808080808080808080e600" ,
774+ wantVals : []uint64 {
775+ 1 ,
776+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
777+ 1 ,
778+ },
779+ },
780+ {
781+ name : "SWAPN" ,
782+ codeHex : "600160008080808080808080808080808080806002e700" ,
783+ wantVals : []uint64 {
784+ 1 ,
785+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
786+ 2 ,
787+ },
788+ },
789+ {
790+ name : "EXCHANGE" ,
791+ codeHex : "600060016002e801" ,
792+ wantVals : []uint64 {2 , 0 , 1 },
793+ },
794+ {
795+ name : "INVALID_SWAPN_LOW" ,
796+ codeHex : "e75b" ,
797+ wantErr : true ,
798+ },
799+ {
800+ name : "JUMP over INVALID_DUPN" ,
801+ codeHex : "600456e65b" ,
802+ wantErr : false ,
803+ },
804+ // Additional test cases
805+ {
806+ name : "INVALID_DUPN_LOW" ,
807+ codeHex : "e65b" ,
808+ wantErr : true ,
809+ },
810+ {
811+ name : "INVALID_EXCHANGE_LOW" ,
812+ codeHex : "e850" ,
813+ wantErr : true ,
814+ },
815+ {
816+ name : "INVALID_DUPN_HIGH" ,
817+ codeHex : "e67f" ,
818+ wantErr : true ,
819+ },
820+ {
821+ name : "INVALID_SWAPN_HIGH" ,
822+ codeHex : "e77f" ,
823+ wantErr : true ,
824+ },
825+ {
826+ name : "INVALID_EXCHANGE_HIGH" ,
827+ codeHex : "e87f" ,
828+ wantErr : true ,
829+ },
830+ {
831+ name : "UNDERFLOW_DUPN" ,
832+ codeHex : "5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5fe600" , // (n=17, need 17 items, have 16)
833+ wantErr : true ,
834+ },
835+ {
836+ name : "UNDERFLOW_SWAPN" ,
837+ codeHex : "5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5fe700" , // (n=17, need 18 items, have 17)
838+ wantErr : true ,
839+ },
840+ {
841+ name : "UNDERFLOW_EXCHANGE" ,
842+ codeHex : "60016002e801" , // (n,m)=(1,2), need 3 items, have 2
843+ wantErr : true ,
844+ },
845+ {
846+ name : "MISSING_IMMEDIATE_DUPN" ,
847+ codeHex : "e6" , // no operand
848+ wantErr : true ,
849+ },
850+ {
851+ name : "MISSING_IMMEDIATE_SWAPN" ,
852+ codeHex : "e7" , // no operand
853+ wantErr : true ,
854+ },
855+ {
856+ name : "MISSING_IMMEDIATE_EXCHANGE" ,
857+ codeHex : "e8" , // no operand
858+ wantErr : true ,
859+ },
860+ {
861+ name : "PC_INCREMENT" ,
862+ codeHex : "600060006000e80115" ,
863+ wantVals : []uint64 {1 , 0 , 0 },
864+ },
865+ }
866+
867+ for _ , tc := range tests {
868+ t .Run (tc .name , func (t * testing.T ) {
869+ code := common .FromHex (tc .codeHex )
870+ stack := newstack ()
871+ pc := uint64 (0 )
872+ scope := & ScopeContext {Stack : stack , Contract : & Contract {Code : code }}
873+ var err error
874+ for pc < uint64 (len (code )) && err == nil {
875+ op := code [pc ]
876+ switch op {
877+ case 0x00 :
878+ return
879+ case 0x60 :
880+ _ , err = opPush1 (& pc , evm , scope )
881+ case 0x80 :
882+ dup1 := makeDup (1 )
883+ _ , err = dup1 (& pc , evm , scope )
884+ case 0x56 :
885+ _ , err = opJump (& pc , evm , scope )
886+ case 0x5b :
887+ _ , err = opJumpdest (& pc , evm , scope )
888+ case 0x15 :
889+ _ , err = opIszero (& pc , evm , scope )
890+ case 0xe6 :
891+ _ , err = opDupN (& pc , evm , scope )
892+ case 0xe7 :
893+ _ , err = opSwapN (& pc , evm , scope )
894+ case 0xe8 :
895+ _ , err = opExchange (& pc , evm , scope )
896+ default :
897+ err = & ErrInvalidOpCode {opcode : OpCode (op )}
898+ }
899+ pc ++
900+ }
901+ if tc .wantErr {
902+ if err == nil {
903+ t .Fatalf ("expected error, got nil" )
904+ }
905+ return
906+ }
907+ if err != nil {
908+ t .Fatalf ("unexpected error: %v" , err )
909+ }
910+ got := make ([]uint64 , 0 , stack .len ())
911+ for i := stack .len () - 1 ; i >= 0 ; i -- {
912+ got = append (got , stack .data [i ].Uint64 ())
913+ }
914+ if len (got ) != len (tc .wantVals ) {
915+ t .Fatalf ("stack len=%d; want %d" , len (got ), len (tc .wantVals ))
916+ }
917+ for i := range got {
918+ if got [i ] != tc .wantVals [i ] {
919+ t .Fatalf ("[%s] stack[%d]=%d; want %d\n stack=%v" ,
920+ tc .name , i , got [i ], tc .wantVals [i ], got )
921+ }
922+ }
923+ })
924+ }
925+ }
0 commit comments