@@ -725,6 +725,109 @@ pub fn evm_staticcall_delegatecall_test(v: &dyn VM) {
725725 }
726726}
727727
728+ #[ allow( non_snake_case) ]
729+ #[ vm_test]
730+ pub fn evm_mint_test ( v : & dyn VM ) {
731+ const IMP_INITCODE : & str = include_str ! ( "./mint_contract/imp.hex" ) ;
732+ const PROXY_INITCODE : & str = include_str ! ( "./mint_contract/proxy.hex" ) ;
733+
734+ // Create accounts for deployment
735+ let accounts = create_accounts ( v, 2 , & TokenAmount :: from_whole ( 10_000 ) ) ;
736+ let deployer = & accounts[ 0 ] ;
737+
738+ eprintln ! ( ">> deploying impl" ) ;
739+
740+ // 1. Deploy the implementation contract
741+ let imp_bytecode = hex:: decode ( IMP_INITCODE ) . unwrap ( ) ;
742+ let imp_deploy_result = v
743+ . execute_message (
744+ deployer,
745+ & EAM_ACTOR_ADDR ,
746+ & TokenAmount :: zero ( ) ,
747+ fil_actor_eam:: Method :: CreateExternal as u64 ,
748+ Some ( serialize_ok ( & fil_actor_eam:: CreateExternalParams ( imp_bytecode) ) ) ,
749+ )
750+ . unwrap ( ) ;
751+
752+ assert ! (
753+ imp_deploy_result. code. is_success( ) ,
754+ "Failed to deploy implementation contract: {}" ,
755+ imp_deploy_result. message
756+ ) ;
757+
758+ let imp_return: fil_actor_eam:: CreateExternalReturn = imp_deploy_result
759+ . ret
760+ . unwrap ( )
761+ . deserialize ( )
762+ . expect ( "Failed to decode implementation deployment results" ) ;
763+
764+ // Make sure we deployed an EVM actor
765+ assert_eq ! ( & v. actor( & Address :: new_id( imp_return. actor_id) ) . unwrap( ) . code, & * EVM_ACTOR_CODE_ID ) ;
766+
767+ let implementation_eth_addr = imp_return. eth_address ;
768+
769+ // 2. Deploy the proxy contract with implementation address in constructor
770+ let proxy_initcode_fixed = PROXY_INITCODE . replace (
771+ "606fa930c2f5eae4116ac5c1c93e1dbbe9957113" ,
772+ & hex:: encode ( implementation_eth_addr. 0 ) ,
773+ ) ;
774+ let proxy_initcode = hex:: decode ( proxy_initcode_fixed) . unwrap ( ) ;
775+
776+ eprintln ! ( ">> deploying proxy" ) ;
777+
778+ let proxy_deploy_result = v
779+ . execute_message (
780+ deployer,
781+ & EAM_ACTOR_ADDR ,
782+ & TokenAmount :: zero ( ) ,
783+ fil_actor_eam:: Method :: CreateExternal as u64 ,
784+ Some ( serialize_ok ( & fil_actor_eam:: CreateExternalParams ( proxy_initcode) ) ) ,
785+ )
786+ . unwrap ( ) ;
787+
788+ assert ! (
789+ proxy_deploy_result. code. is_success( ) ,
790+ "Failed to deploy proxy contract: {}" ,
791+ proxy_deploy_result. message
792+ ) ;
793+
794+ let proxy_return: fil_actor_eam:: CreateExternalReturn = proxy_deploy_result
795+ . ret
796+ . unwrap ( )
797+ . deserialize ( )
798+ . expect ( "Failed to decode proxy deployment results" ) ;
799+
800+ let proxy_robust_addr = proxy_return. robust_address . unwrap ( ) ;
801+
802+ eprintln ! ( ">> checking role" ) ;
803+
804+ // Check if deployer has the admin role, it should!
805+ // I can confirm that the admin role hash below is correct because it shows up in 3 storage slots, see:
806+ // https://github.com/recallnet/contracts/blob/06ec52342ffe6cd29cb9c06ebf5a785f4a057c0e/src/token/Recall.sol#L54-L56
807+ const PARAMS_PREFIX : & str = "91d14854a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775000000000000000000000000" ;
808+ let mut has_role_params = hex:: decode ( PARAMS_PREFIX ) . unwrap ( ) ;
809+ has_role_params. extend_from_slice ( & id_to_eth ( deployer. id ( ) . unwrap ( ) ) . 0 [ ..] ) ;
810+
811+ let has_role_result = v
812+ . execute_message (
813+ & deployer,
814+ & proxy_robust_addr,
815+ & TokenAmount :: zero ( ) ,
816+ fil_actor_evm:: Method :: InvokeContract as u64 ,
817+ Some ( serialize_ok ( & ContractParams ( has_role_params) ) ) ,
818+ )
819+ . unwrap ( ) ;
820+
821+ assert ! ( has_role_result. code. is_success( ) , "Failed to check role: {}" , has_role_result. message) ;
822+ let BytesDe ( return_value) =
823+ has_role_result. ret . unwrap ( ) . deserialize ( ) . expect ( "failed to deserialize results" ) ;
824+ assert_eq ! (
825+ hex:: encode( return_value) ,
826+ "0000000000000000000000000000000000000000000000000000000000000001"
827+ ) ;
828+ }
829+
830+ #[ allow( non_snake_case) ]
728831#[ vm_test]
729832pub fn evm_init_revert_data_test ( v : & dyn VM ) {
730833 let account = create_accounts ( v, 1 , & TokenAmount :: from_whole ( 10_000 ) ) [ 0 ] ;
0 commit comments