88//! Have a look at evmc-declare to declare an EVMC compatible VM.
99//! This crate documents how to use certain data types.
1010
11- #![ feature( type_alias_enum_variants) ]
11+ // #![feature(type_alias_enum_variants)]
1212
1313mod container;
1414mod types;
@@ -24,7 +24,7 @@ pub trait EvmcVm {
2424 /// This is called for every incoming message.
2525 fn execute < ' a > (
2626 & self ,
27- revision : ffi :: evmc_revision ,
27+ revision : Revision ,
2828 code : & ' a [ u8 ] ,
2929 message : & ' a ExecutionMessage ,
3030 context : Option < & ' a mut ExecutionContext < ' a > > ,
@@ -34,7 +34,7 @@ pub trait EvmcVm {
3434/// EVMC result structure.
3535#[ derive( Debug ) ]
3636pub struct ExecutionResult {
37- status_code : ffi :: evmc_status_code ,
37+ status_code : StatusCode ,
3838 gas_left : i64 ,
3939 output : Option < Vec < u8 > > ,
4040 create_address : Option < Address > ,
@@ -43,7 +43,7 @@ pub struct ExecutionResult {
4343/// EVMC execution message structure.
4444#[ derive( Debug ) ]
4545pub struct ExecutionMessage {
46- kind : ffi :: evmc_call_kind ,
46+ kind : MessageKind ,
4747 flags : u32 ,
4848 depth : i32 ,
4949 gas : i64 ,
@@ -68,7 +68,7 @@ pub struct ExecutionContext<'a> {
6868impl ExecutionResult {
6969 /// Manually create a result.
7070 pub fn new (
71- _status_code : ffi :: evmc_status_code ,
71+ _status_code : StatusCode ,
7272 _gas_left : i64 ,
7373 _output : Option < & [ u8 ] > ,
7474 ) -> Self {
@@ -86,21 +86,21 @@ impl ExecutionResult {
8686
8787 /// Create failure result.
8888 pub fn failure ( ) -> Self {
89- ExecutionResult :: new ( ffi :: evmc_status_code :: EVMC_FAILURE , 0 , None )
89+ ExecutionResult :: new ( StatusCode :: EVMC_FAILURE , 0 , None )
9090 }
9191
9292 /// Create a revert result.
9393 pub fn revert ( _gas_left : i64 , _output : Option < & [ u8 ] > ) -> Self {
94- ExecutionResult :: new ( ffi :: evmc_status_code :: EVMC_REVERT , _gas_left, _output)
94+ ExecutionResult :: new ( StatusCode :: EVMC_REVERT , _gas_left, _output)
9595 }
9696
9797 /// Create a successful result.
9898 pub fn success ( _gas_left : i64 , _output : Option < & [ u8 ] > ) -> Self {
99- ExecutionResult :: new ( ffi :: evmc_status_code :: EVMC_SUCCESS , _gas_left, _output)
99+ ExecutionResult :: new ( StatusCode :: EVMC_SUCCESS , _gas_left, _output)
100100 }
101101
102102 /// Read the status code.
103- pub fn status_code ( & self ) -> ffi :: evmc_status_code {
103+ pub fn status_code ( & self ) -> StatusCode {
104104 self . status_code
105105 }
106106
@@ -123,7 +123,7 @@ impl ExecutionResult {
123123
124124impl ExecutionMessage {
125125 pub fn new (
126- kind : ffi :: evmc_call_kind ,
126+ kind : MessageKind ,
127127 flags : u32 ,
128128 depth : i32 ,
129129 gas : i64 ,
@@ -151,7 +151,7 @@ impl ExecutionMessage {
151151 }
152152
153153 /// Read the message kind.
154- pub fn kind ( & self ) -> ffi :: evmc_call_kind {
154+ pub fn kind ( & self ) -> MessageKind {
155155 self . kind
156156 }
157157
@@ -241,7 +241,7 @@ impl<'a> ExecutionContext<'a> {
241241 address : & Address ,
242242 key : & Bytes32 ,
243243 value : & Bytes32 ,
244- ) -> ffi :: evmc_storage_status {
244+ ) -> StorageStatus {
245245 unsafe {
246246 assert ! ( ( * self . host) . set_storage. is_some( ) ) ;
247247 ( * self . host ) . set_storage . unwrap ( ) (
@@ -503,9 +503,9 @@ mod tests {
503503
504504 #[ test]
505505 fn result_new ( ) {
506- let r = ExecutionResult :: new ( ffi :: evmc_status_code :: EVMC_FAILURE , 420 , None ) ;
506+ let r = ExecutionResult :: new ( StatusCode :: EVMC_FAILURE , 420 , None ) ;
507507
508- assert ! ( r. status_code( ) == ffi :: evmc_status_code :: EVMC_FAILURE ) ;
508+ assert ! ( r. status_code( ) == StatusCode :: EVMC_FAILURE ) ;
509509 assert ! ( r. gas_left( ) == 420 ) ;
510510 assert ! ( r. output( ) . is_none( ) ) ;
511511 assert ! ( r. create_address( ) . is_none( ) ) ;
@@ -528,7 +528,7 @@ mod tests {
528528 #[ test]
529529 fn result_from_ffi ( ) {
530530 let f = ffi:: evmc_result {
531- status_code : ffi :: evmc_status_code :: EVMC_SUCCESS ,
531+ status_code : StatusCode :: EVMC_SUCCESS ,
532532 gas_left : 1337 ,
533533 output_data : Box :: into_raw ( Box :: new ( [ 0xde , 0xad , 0xbe , 0xef ] ) ) as * const u8 ,
534534 output_size : 4 ,
@@ -539,7 +539,7 @@ mod tests {
539539
540540 let r: ExecutionResult = f. into ( ) ;
541541
542- assert ! ( r. status_code( ) == ffi :: evmc_status_code :: EVMC_SUCCESS ) ;
542+ assert ! ( r. status_code( ) == StatusCode :: EVMC_SUCCESS ) ;
543543 assert ! ( r. gas_left( ) == 1337 ) ;
544544 assert ! ( r. output( ) . is_some( ) ) ;
545545 assert ! ( r. output( ) . unwrap( ) . len( ) == 4 ) ;
@@ -549,15 +549,15 @@ mod tests {
549549 #[ test]
550550 fn result_into_heap_ffi ( ) {
551551 let r = ExecutionResult :: new (
552- ffi :: evmc_status_code :: EVMC_FAILURE ,
552+ StatusCode :: EVMC_FAILURE ,
553553 420 ,
554554 Some ( & [ 0xc0 , 0xff , 0xee , 0x71 , 0x75 ] ) ,
555555 ) ;
556556
557557 let f: * const ffi:: evmc_result = r. into ( ) ;
558558 assert ! ( !f. is_null( ) ) ;
559559 unsafe {
560- assert ! ( ( * f) . status_code == ffi :: evmc_status_code :: EVMC_FAILURE ) ;
560+ assert ! ( ( * f) . status_code == StatusCode :: EVMC_FAILURE ) ;
561561 assert ! ( ( * f) . gas_left == 420 ) ;
562562 assert ! ( !( * f) . output_data. is_null( ) ) ;
563563 assert ! ( ( * f) . output_size == 5 ) ;
@@ -574,12 +574,12 @@ mod tests {
574574
575575 #[ test]
576576 fn result_into_heap_ffi_empty_data ( ) {
577- let r = ExecutionResult :: new ( ffi :: evmc_status_code :: EVMC_FAILURE , 420 , None ) ;
577+ let r = ExecutionResult :: new ( StatusCode :: EVMC_FAILURE , 420 , None ) ;
578578
579579 let f: * const ffi:: evmc_result = r. into ( ) ;
580580 assert ! ( !f. is_null( ) ) ;
581581 unsafe {
582- assert ! ( ( * f) . status_code == ffi :: evmc_status_code :: EVMC_FAILURE ) ;
582+ assert ! ( ( * f) . status_code == StatusCode :: EVMC_FAILURE ) ;
583583 assert ! ( ( * f) . gas_left == 420 ) ;
584584 assert ! ( ( * f) . output_data. is_null( ) ) ;
585585 assert ! ( ( * f) . output_size == 0 ) ;
@@ -593,14 +593,14 @@ mod tests {
593593 #[ test]
594594 fn result_into_stack_ffi ( ) {
595595 let r = ExecutionResult :: new (
596- ffi :: evmc_status_code :: EVMC_FAILURE ,
596+ StatusCode :: EVMC_FAILURE ,
597597 420 ,
598598 Some ( & [ 0xc0 , 0xff , 0xee , 0x71 , 0x75 ] ) ,
599599 ) ;
600600
601601 let f: ffi:: evmc_result = r. into ( ) ;
602602 unsafe {
603- assert ! ( f. status_code == ffi :: evmc_status_code :: EVMC_FAILURE ) ;
603+ assert ! ( f. status_code == StatusCode :: EVMC_FAILURE ) ;
604604 assert ! ( f. gas_left == 420 ) ;
605605 assert ! ( !f. output_data. is_null( ) ) ;
606606 assert ! ( f. output_size == 5 ) ;
@@ -617,11 +617,11 @@ mod tests {
617617
618618 #[ test]
619619 fn result_into_stack_ffi_empty_data ( ) {
620- let r = ExecutionResult :: new ( ffi :: evmc_status_code :: EVMC_FAILURE , 420 , None ) ;
620+ let r = ExecutionResult :: new ( StatusCode :: EVMC_FAILURE , 420 , None ) ;
621621
622622 let f: ffi:: evmc_result = r. into ( ) ;
623623 unsafe {
624- assert ! ( f. status_code == ffi :: evmc_status_code :: EVMC_FAILURE ) ;
624+ assert ! ( f. status_code == StatusCode :: EVMC_FAILURE ) ;
625625 assert ! ( f. gas_left == 420 ) ;
626626 assert ! ( f. output_data. is_null( ) ) ;
627627 assert ! ( f. output_size == 0 ) ;
@@ -641,7 +641,7 @@ mod tests {
641641 let create2_salt = Bytes32 { bytes : [ 255u8 ; 32 ] } ;
642642
643643 let ret = ExecutionMessage :: new (
644- ffi :: evmc_call_kind :: EVMC_CALL ,
644+ MessageKind :: EVMC_CALL ,
645645 44 ,
646646 66 ,
647647 4466 ,
@@ -652,7 +652,7 @@ mod tests {
652652 create2_salt,
653653 ) ;
654654
655- assert_eq ! ( ret. kind( ) , ffi :: evmc_call_kind :: EVMC_CALL ) ;
655+ assert_eq ! ( ret. kind( ) , MessageKind :: EVMC_CALL ) ;
656656 assert_eq ! ( ret. flags( ) , 44 ) ;
657657 assert_eq ! ( ret. depth( ) , 66 ) ;
658658 assert_eq ! ( ret. gas( ) , 4466 ) ;
@@ -672,7 +672,7 @@ mod tests {
672672 let create2_salt = Bytes32 { bytes : [ 255u8 ; 32 ] } ;
673673
674674 let msg = ffi:: evmc_message {
675- kind : ffi :: evmc_call_kind :: EVMC_CALL ,
675+ kind : MessageKind :: EVMC_CALL ,
676676 flags : 44 ,
677677 depth : 66 ,
678678 gas : 4466 ,
@@ -706,7 +706,7 @@ mod tests {
706706 let create2_salt = Bytes32 { bytes : [ 255u8 ; 32 ] } ;
707707
708708 let msg = ffi:: evmc_message {
709- kind : ffi :: evmc_call_kind :: EVMC_CALL ,
709+ kind : MessageKind :: EVMC_CALL ,
710710 flags : 44 ,
711711 depth : 66 ,
712712 gas : 4466 ,
@@ -770,16 +770,16 @@ mod tests {
770770
771771 ffi:: evmc_result {
772772 status_code : if success {
773- ffi :: evmc_status_code :: EVMC_SUCCESS
773+ StatusCode :: EVMC_SUCCESS
774774 } else {
775- ffi :: evmc_status_code :: EVMC_INTERNAL_ERROR
775+ StatusCode :: EVMC_INTERNAL_ERROR
776776 } ,
777777 gas_left : 2 ,
778778 // NOTE: we are passing the input pointer here, but for testing the lifetime is ok
779779 output_data : msg. input_data ,
780780 output_size : msg. input_size ,
781781 release : None ,
782- create_address : ffi :: evmc_address :: default ( ) ,
782+ create_address : Address :: default ( ) ,
783783 padding : [ 0u8 ; 4 ] ,
784784 }
785785 }
@@ -834,61 +834,62 @@ mod tests {
834834 #[ test]
835835 fn test_call_empty_data ( ) {
836836 // This address is useless. Just a dummy parameter for the interface function.
837- let test_addr = ffi :: evmc_address { bytes : [ 0u8 ; 20 ] } ;
837+ let test_addr = Address :: default ( ) ;
838838 let host = get_dummy_host_interface ( ) ;
839839 let host_context = std:: ptr:: null_mut ( ) ;
840840 let mut exe_context = ExecutionContext :: new ( & host, host_context) ;
841841
842842 let message = ExecutionMessage :: new (
843- ffi :: evmc_call_kind :: EVMC_CALL ,
843+ MessageKind :: EVMC_CALL ,
844844 0 ,
845845 0 ,
846846 6566 ,
847847 test_addr,
848848 test_addr,
849849 None ,
850- ffi :: evmc_uint256be :: default ( ) ,
851- ffi :: evmc_bytes32 :: default ( ) ,
850+ Uint256 :: default ( ) ,
851+ Bytes32 :: default ( ) ,
852852 ) ;
853853
854854 let b = exe_context. call ( & message) ;
855855
856- assert_eq ! ( b. status_code( ) , ffi :: evmc_status_code :: EVMC_SUCCESS ) ;
856+ assert_eq ! ( b. status_code( ) , StatusCode :: EVMC_SUCCESS ) ;
857857 assert_eq ! ( b. gas_left( ) , 2 ) ;
858858 assert ! ( b. output( ) . is_none( ) ) ;
859859 assert ! ( b. create_address( ) . is_some( ) ) ;
860- assert_eq ! ( b. create_address( ) . unwrap( ) , & ffi:: evmc_address:: default ( ) ) ;
860+ assert_eq ! ( b. create_address( ) . unwrap( ) , & Address :: default ( ) ) ;
861+
861862 }
862863
863864 #[ test]
864865 fn test_call_with_data ( ) {
865866 // This address is useless. Just a dummy parameter for the interface function.
866- let test_addr = ffi :: evmc_address { bytes : [ 0u8 ; 20 ] } ;
867+ let test_addr = Address :: default ( ) ;
867868 let host = get_dummy_host_interface ( ) ;
868869 let host_context = std:: ptr:: null_mut ( ) ;
869870 let mut exe_context = ExecutionContext :: new ( & host, host_context) ;
870871
871872 let data = vec ! [ 0xc0 , 0xff , 0xfe ] ;
872873
873874 let message = ExecutionMessage :: new (
874- ffi :: evmc_call_kind :: EVMC_CALL ,
875+ MessageKind :: EVMC_CALL ,
875876 0 ,
876877 0 ,
877878 6566 ,
878879 test_addr,
879880 test_addr,
880881 Some ( & data) ,
881- ffi :: evmc_uint256be :: default ( ) ,
882- ffi :: evmc_bytes32 :: default ( ) ,
882+ Uint256 :: default ( ) ,
883+ Bytes32 :: default ( ) ,
883884 ) ;
884885
885886 let b = exe_context. call ( & message) ;
886887
887- assert_eq ! ( b. status_code( ) , ffi :: evmc_status_code :: EVMC_SUCCESS ) ;
888+ assert_eq ! ( b. status_code( ) , StatusCode :: EVMC_SUCCESS ) ;
888889 assert_eq ! ( b. gas_left( ) , 2 ) ;
889890 assert ! ( b. output( ) . is_some( ) ) ;
890891 assert_eq ! ( b. output( ) . unwrap( ) , & data) ;
891892 assert ! ( b. create_address( ) . is_some( ) ) ;
892- assert_eq ! ( b. create_address( ) . unwrap( ) , & ffi :: evmc_address :: default ( ) ) ;
893+ assert_eq ! ( b. create_address( ) . unwrap( ) , & Address :: default ( ) ) ;
893894 }
894895}
0 commit comments