1
+ use core:: marker:: PhantomData ;
2
+
1
3
use pallet_evm:: {
2
- BalanceConverter , ExitError , ExitSucceed , PrecompileHandle , PrecompileOutput , PrecompileResult ,
4
+ BalanceConverter , ExitError , ExitSucceed , PrecompileFailure , PrecompileHandle ,
5
+ PrecompileOutput , PrecompileResult ,
3
6
} ;
7
+ use precompile_utils:: EvmResult ;
8
+ use sp_core:: H256 ;
4
9
use sp_runtime:: traits:: UniqueSaturatedInto ;
5
- use sp_std:: vec;
10
+ use sp_runtime:: AccountId32 ;
11
+ use sp_std:: vec:: Vec ;
6
12
7
13
use crate :: precompiles:: {
8
14
contract_to_origin, get_method_id, get_pubkey, get_slice, try_dispatch_runtime_call,
@@ -19,20 +25,11 @@ const CONTRACT_ADDRESS_SS58: [u8; 32] = [
19
25
20
26
pub struct BalanceTransferPrecompile ;
21
27
28
+ #[ precompile_utils:: precompile]
22
29
impl BalanceTransferPrecompile {
23
- pub fn execute ( handle : & mut impl PrecompileHandle ) -> PrecompileResult {
24
- let txdata = handle. input ( ) ;
25
-
26
- // Match method ID: keccak256("transfer(bytes32)")
27
- let method = get_slice ( txdata, 0 , 4 ) ?;
28
- if get_method_id ( "transfer(bytes32)" ) != method {
29
- return Ok ( PrecompileOutput {
30
- exit_status : ExitSucceed :: Returned ,
31
- output : vec ! [ ] ,
32
- } ) ;
33
- }
34
-
35
- // Forward all received value to the destination address
30
+ #[ precompile:: public( "transfer(bytes32)" ) ]
31
+ #[ precompile:: payable]
32
+ fn transfer ( handle : & mut impl PrecompileHandle , address : H256 ) -> EvmResult < ( ) > {
36
33
let amount = handle. context ( ) . apparent_value ;
37
34
38
35
// Use BalanceConverter to convert EVM amount to Substrate balance
@@ -41,20 +38,18 @@ impl BalanceTransferPrecompile {
41
38
. ok_or ( ExitError :: OutOfFund ) ?;
42
39
43
40
if amount_sub. is_zero ( ) {
44
- return Ok ( PrecompileOutput {
45
- exit_status : ExitSucceed :: Returned ,
46
- output : vec ! [ ] ,
47
- } ) ;
41
+ return Ok ( ( ) ) ;
48
42
}
49
43
50
- let address_bytes_dst = get_slice ( txdata, 4 , 36 ) ?;
51
- let ( account_id_dst, _) = get_pubkey ( address_bytes_dst) ?;
44
+ let dest = get_pubkey ( address. as_bytes ( ) ) ?. 0 . into ( ) ;
52
45
53
46
let call = pallet_balances:: Call :: < Runtime > :: transfer_allow_death {
54
- dest : account_id_dst . into ( ) ,
47
+ dest,
55
48
value : amount_sub. unique_saturated_into ( ) ,
56
49
} ;
57
50
58
- try_dispatch_runtime_call ( handle, call, contract_to_origin ( & CONTRACT_ADDRESS_SS58 ) ?)
51
+ try_dispatch_runtime_call ( handle, call, contract_to_origin ( & CONTRACT_ADDRESS_SS58 ) ?) ?;
52
+
53
+ Ok ( ( ) )
59
54
}
60
55
}
0 commit comments