1
1
mod asm;
2
2
3
3
use std:: fmt:: Debug ;
4
- use std:: sync:: Arc ;
5
4
6
- use ethers:: abi:: Detokenize ;
7
- use ethers:: prelude:: builders:: ContractCall ;
8
- use ethers:: prelude:: * ;
9
- use ethers:: providers:: { MockProvider , Provider } ;
10
- use ethers:: types:: Bytes ;
5
+ use alloy_core:: primitives:: { Bytes , Uint } ;
6
+ use alloy_core:: sol;
7
+ use alloy_core:: sol_types:: SolCall ;
11
8
use evm:: { Method , EVM_CONTRACT_REVERTED } ;
12
9
use fil_actor_evm as evm;
13
10
use fil_actors_evm_shared:: address:: EthAddress ;
@@ -21,8 +18,7 @@ use fvm_shared::bigint::Zero;
21
18
use fvm_shared:: econ:: TokenAmount ;
22
19
use fvm_shared:: error:: { ErrorNumber , ExitCode } ;
23
20
use fvm_shared:: sys:: SendFlags ;
24
- use fvm_shared:: { ActorID , MethodNum } ;
25
- use once_cell:: sync:: Lazy ;
21
+ use fvm_shared:: MethodNum ;
26
22
27
23
mod util;
28
24
@@ -432,21 +428,7 @@ fn test_callactor_revert() {
432
428
}
433
429
434
430
// Much taken from tests/env.rs
435
- abigen ! ( CallActorPrecompile , "./tests/contracts/CallActorPrecompile.abi" ) ;
436
-
437
- const OWNER_ID : ActorID = 1001 ;
438
- const _OWNER: Address = Address :: new_id ( OWNER_ID ) ;
439
- static CONTRACT : Lazy < CallActorPrecompile < Provider < MockProvider > > > = Lazy :: new ( || {
440
- // The owner of the contract is expected to be the 160 bit hash used on Ethereum.
441
- // We're not going to use it during the tests.
442
- let address = EthAddress :: from_id ( OWNER_ID ) ;
443
- let address = ethers:: core:: types:: Address :: from_slice ( address. as_ref ( ) ) ;
444
- // A dummy client that we don't intend to use to call the contract or send transactions.
445
- let ( client, _mock) = Provider :: mocked ( ) ;
446
- CallActorPrecompile :: new ( address, Arc :: new ( client) )
447
- } ) ;
448
-
449
- pub type TestContractCall < R > = ContractCall < Provider < MockProvider > , R > ;
431
+ sol ! ( "./tests/contracts/CallActorPrecompile.sol" ) ;
450
432
451
433
#[ test]
452
434
fn test_callactor_restrict ( ) {
@@ -1031,18 +1013,24 @@ fn make_raw_params(bytes: Vec<u8>) -> Option<IpldBlock> {
1031
1013
Some ( IpldBlock { codec : IPLD_RAW , data : bytes } )
1032
1014
}
1033
1015
1016
+ const CALL_ACTOR_PRECOMPILE_HEX : & str = include_str ! ( "contracts/CallActorPrecompile.hex" ) ;
1017
+
1034
1018
#[ test]
1035
1019
fn call_actor_solidity ( ) {
1036
- // solidity
1037
- let contract_hex = include_str ! ( "contracts/CallActorPrecompile.hex" ) ;
1038
1020
// let mut contract_rt = new_call_actor_contract();
1039
1021
let contract_address = EthAddress ( util:: CONTRACT_ADDRESS ) ;
1040
- let mut tester = ContractTester :: new ( contract_address, 111 , contract_hex ) ;
1022
+ let mut tester = ContractTester :: new ( contract_address, 111 , CALL_ACTOR_PRECOMPILE_HEX ) ;
1041
1023
1042
1024
// call_actor_id
1043
1025
{
1044
- let params =
1045
- CONTRACT . call_actor_id ( 0 , ethers:: types:: U256 :: zero ( ) , 0 , 0 , Bytes :: default ( ) , 101 ) ;
1026
+ let params = CallActorPrecompile :: call_actor_idCall {
1027
+ method : 0 ,
1028
+ value : Uint :: from ( 0 ) ,
1029
+ flags : 0 ,
1030
+ codec : 0 ,
1031
+ params : Bytes :: default ( ) ,
1032
+ id : 101 ,
1033
+ } ;
1046
1034
1047
1035
let expected_return = vec ! [ 0xff , 0xfe ] ;
1048
1036
tester. rt . expect_send (
@@ -1057,35 +1045,26 @@ fn call_actor_solidity() {
1057
1045
None ,
1058
1046
) ;
1059
1047
1060
- let ( success, exit, codec, ret_val) : ( bool , ethers:: types:: I256 , u64 , Bytes ) =
1061
- tester. call ( params) ;
1048
+ let ( success, exit, codec, ret_val) = tester. call ( params) . into ( ) ;
1062
1049
1063
1050
assert ! ( success) ;
1064
- assert_eq ! ( exit, I256 :: from ( 0 ) ) ;
1051
+ assert ! ( exit. is_zero ( ) ) ;
1065
1052
assert_eq ! ( codec, 0 ) ;
1066
1053
assert_eq ! ( & ret_val, & expected_return, "got {}" , hex:: encode( & ret_val) ) ;
1067
- }
1068
- tester. rt . reset ( ) ;
1069
- // call_actor
1070
- {
1071
- log:: warn!( "new test" ) ;
1072
- // EVM actor
1073
- let evm_target = 10101 ;
1074
- let evm_del = EthAddress ( util:: CONTRACT_ADDRESS ) . into ( ) ;
1075
- tester. rt . set_delegated_address ( evm_target, evm_del) ;
1076
1054
1077
1055
let to_address = {
1078
1056
let subaddr = hex_literal:: hex!( "b0ba000000000000000000000000000000000000" ) ;
1079
1057
Address :: new_delegated ( EAM_ACTOR_ID , & subaddr) . unwrap ( )
1080
1058
} ;
1081
- let params = CONTRACT . call_actor_address (
1082
- 0 ,
1083
- ethers:: types:: U256 :: zero ( ) ,
1084
- 0 ,
1085
- 0 ,
1086
- Bytes :: default ( ) ,
1087
- to_address. to_bytes ( ) . into ( ) ,
1088
- ) ;
1059
+
1060
+ let params = CallActorPrecompile :: call_actor_addressCall {
1061
+ method : 0 ,
1062
+ value : Uint :: from ( 0 ) ,
1063
+ flags : 0 ,
1064
+ codec : 0 ,
1065
+ params : Bytes :: default ( ) ,
1066
+ filAddress : to_address. to_bytes ( ) . into ( ) ,
1067
+ } ;
1089
1068
1090
1069
let expected_return = vec ! [ 0xff , 0xfe ] ;
1091
1070
tester. rt . expect_send (
@@ -1100,28 +1079,31 @@ fn call_actor_solidity() {
1100
1079
None ,
1101
1080
) ;
1102
1081
1103
- let ( success, exit, codec, ret_val) : ( bool , ethers:: types:: I256 , u64 , Bytes ) =
1104
- tester. call ( params) ;
1082
+ let ( success, exit, codec, ret_val) = tester. call ( params) . into ( ) ;
1105
1083
1106
1084
assert ! ( success) ;
1107
- assert_eq ! ( exit, I256 :: from ( 0 ) ) ;
1085
+ assert ! ( exit. is_zero ( ) ) ;
1108
1086
assert_eq ! ( codec, 0 ) ;
1109
1087
assert_eq ! ( & ret_val, & expected_return, "got {}" , hex:: encode( & ret_val) ) ;
1110
1088
}
1111
1089
}
1112
1090
1113
1091
#[ test]
1114
1092
fn call_actor_send_solidity ( ) {
1115
- // solidity
1116
- let contract_hex = include_str ! ( "contracts/CallActorPrecompile.hex" ) ;
1117
1093
// let mut contract_rt = new_call_actor_contract();
1118
1094
let contract_address = EthAddress ( util:: CONTRACT_ADDRESS ) ;
1119
- let mut tester = ContractTester :: new ( contract_address, 111 , contract_hex ) ;
1095
+ let mut tester = ContractTester :: new ( contract_address, 111 , CALL_ACTOR_PRECOMPILE_HEX ) ;
1120
1096
1121
1097
// send 1 atto Fil (this should be a full integration tests rly)
1122
1098
{
1123
- let params =
1124
- CONTRACT . call_actor_id ( 0 , ethers:: types:: U256 :: from ( 1 ) , 0 , 0 , Bytes :: default ( ) , 101 ) ;
1099
+ let params = CallActorPrecompile :: call_actor_idCall {
1100
+ method : 0 ,
1101
+ value : Uint :: from ( 1 ) ,
1102
+ flags : 0 ,
1103
+ codec : 0 ,
1104
+ params : Bytes :: default ( ) ,
1105
+ id : 101 ,
1106
+ } ;
1125
1107
1126
1108
tester. rt . add_id_address (
1127
1109
Address :: new_delegated ( 12345 , b"foobarboxy" ) . unwrap ( ) ,
@@ -1143,11 +1125,10 @@ fn call_actor_send_solidity() {
1143
1125
None ,
1144
1126
) ;
1145
1127
1146
- let ( success, exit, codec, ret_val) : ( bool , ethers:: types:: I256 , u64 , Bytes ) =
1147
- tester. call ( params) ;
1128
+ let ( success, exit, codec, ret_val) = tester. call ( params) . into ( ) ;
1148
1129
1149
1130
assert ! ( success) ;
1150
- assert_eq ! ( exit, I256 :: from ( 0 ) ) ;
1131
+ assert ! ( exit. is_zero ( ) ) ;
1151
1132
assert_eq ! ( codec, 0 ) ;
1152
1133
assert_eq ! ( & ret_val, & expected_return, "got {}" , hex:: encode( & ret_val) ) ;
1153
1134
assert_eq ! ( tester. rt. get_balance( ) , TokenAmount :: from_atto( 99 ) ) ;
@@ -1191,8 +1172,8 @@ impl ContractTester {
1191
1172
Self { rt, _address : addr }
1192
1173
}
1193
1174
1194
- fn call < Returns : Detokenize > ( & mut self , call : TestContractCall < Returns > ) -> Returns {
1195
- let input = call. calldata ( ) . expect ( "Should have calldata." ) . to_vec ( ) ;
1175
+ pub fn call < C : SolCall > ( & mut self , call : C ) -> C :: Return {
1176
+ let input = call. abi_encode ( ) ;
1196
1177
let input =
1197
1178
IpldBlock :: serialize_cbor ( & BytesSer ( & input) ) . expect ( "failed to serialize input data" ) ;
1198
1179
@@ -1208,6 +1189,6 @@ impl ContractTester {
1208
1189
. deserialize ( )
1209
1190
. unwrap ( ) ;
1210
1191
1211
- decode_function_data ( & call . function , result, false ) . unwrap ( )
1192
+ C :: abi_decode_returns ( & result, true ) . unwrap ( )
1212
1193
}
1213
1194
}
0 commit comments