@@ -5,13 +5,14 @@ use frame_support::{
5
5
traits:: fungibles:: { approvals:: Inspect as _, metadata:: Inspect as _} ,
6
6
} ;
7
7
use pallet_assets:: precompiles:: { AssetIdExtractor , InlineAssetIdExtractor } ;
8
- use pallet_revive:: AddressMapper as _;
8
+ use pallet_revive:: { precompiles :: RuntimeCosts , AddressMapper as _} ;
9
9
use AddressMatcher :: Prefix ;
10
10
use IERC20 :: * ;
11
11
12
12
use super :: {
13
- deposit_event, prefixed_address, sol, to_runtime_origin, AddressMapper , AddressMatcher , Assets ,
14
- Config , Error , Ext , NonZero , PhantomData , Precompile , SolCall , UintTryFrom , UintTryTo , U256 ,
13
+ deposit_event, prefixed_address, sol, to_runtime_origin, weights:: WeightInfo , AddressMapper ,
14
+ AddressMatcher , Assets , Config , Error , Ext , NonZero , PhantomData , Precompile , SolCall ,
15
+ UintTryFrom , UintTryTo , U256 ,
15
16
} ;
16
17
17
18
sol ! ( "src/fungibles/precompiles/interfaces/IERC20.sol" ) ;
@@ -48,18 +49,22 @@ where
48
49
match input {
49
50
// IERC20
50
51
totalSupply( _) => {
51
- // TODO: charge based on benchmarked weight
52
+ env. charge ( <T as Config < I > >:: WeightInfo :: total_supply ( ) ) ?;
53
+
52
54
let total_supply = U256 :: saturating_from ( <Assets < T , I > >:: total_supply ( token) ) ;
55
+
53
56
Ok ( totalSupplyCall:: abi_encode_returns ( & total_supply) )
54
57
} ,
55
58
balanceOf( balanceOfCall { account } ) => {
56
- // TODO: charge based on benchmarked weight
59
+ env. charge ( <T as Config < I > >:: WeightInfo :: balance_of ( ) ) ?;
60
+
57
61
let account = env. to_account_id ( & ( * account. 0 ) . into ( ) ) ;
58
62
let balance = U256 :: saturating_from ( <Assets < T , I > >:: balance ( token, account) ) ;
63
+
59
64
Ok ( balanceOfCall:: abi_encode_returns ( & balance) )
60
65
} ,
61
66
transfer( transferCall { to, value } ) => {
62
- // TODO: charge based on benchmarked weight
67
+ env . charge ( < T as Config < I > > :: WeightInfo :: transfer ( ) ) ? ;
63
68
let from = <AddressMapper < T > >:: to_address ( env. caller ( ) . account_id ( ) ?) . 0 . into ( ) ;
64
69
65
70
super :: transfer :: < T , I > (
@@ -73,31 +78,40 @@ where
73
78
Ok ( transferCall:: abi_encode_returns ( & true ) )
74
79
} ,
75
80
allowance( allowanceCall { owner, spender } ) => {
76
- // TODO: charge based on benchmarked weight
81
+ env. charge ( <T as Config < I > >:: WeightInfo :: allowance ( ) ) ?;
82
+
77
83
let owner = env. to_account_id ( & ( * owner. 0 ) . into ( ) ) ;
78
84
let spender = env. to_account_id ( & ( * spender. 0 ) . into ( ) ) ;
79
85
let remaining =
80
86
U256 :: saturating_from ( <Assets < T , I > >:: allowance ( token, & owner, & spender) ) ;
87
+
81
88
Ok ( allowanceCall:: abi_encode_returns ( & remaining) )
82
89
} ,
83
90
approve( approveCall { spender, value } ) => {
84
- // TODO: charge based on benchmarked weight
91
+ let charged = env . charge ( < T as Config < I > > :: WeightInfo :: approve ( 1 , 1 ) ) ? ;
85
92
let owner = <AddressMapper < T > >:: to_address ( env. caller ( ) . account_id ( ) ?) . 0 . into ( ) ;
86
93
87
- super :: approve :: < T , I > (
94
+ let result = super :: approve :: < T , I > (
88
95
to_runtime_origin ( env. caller ( ) ) ,
89
96
token,
90
97
env. to_account_id ( & ( * spender. 0 ) . into ( ) ) ,
91
98
value. saturating_to ( ) ,
92
99
) // TODO: adjust weight
93
100
. map_err ( |e| e. error ) ?;
94
101
102
+ // Adjust weight
103
+ if let Some ( actual_weight) = result. actual_weight {
104
+ // TODO: replace with `env.adjust_gas(charged, result.weight);` once #8693 lands
105
+ env. gas_meter_mut ( )
106
+ . adjust_gas ( charged, RuntimeCosts :: Precompile ( actual_weight) ) ;
107
+ }
108
+
95
109
let event = Approval { owner, spender : * spender, value : * value } ;
96
110
deposit_event ( env, address, event) ;
97
111
Ok ( approveCall:: abi_encode_returns ( & true ) )
98
112
} ,
99
113
transferFrom( transferFromCall { from, to, value } ) => {
100
- // TODO: charge based on benchmarked weight
114
+ env . charge ( < T as Config < I > > :: WeightInfo :: transfer_from ( ) ) ? ;
101
115
102
116
super :: transfer_from :: < T , I > (
103
117
to_runtime_origin ( env. caller ( ) ) ,
@@ -112,20 +126,26 @@ where
112
126
} ,
113
127
// IERC20Metadata
114
128
name( _) => {
115
- // TODO: charge based on benchmarked weight
129
+ env. charge ( <T as Config < I > >:: WeightInfo :: metadata_name ( ) ) ?;
130
+
116
131
let result = <Assets < T , I > >:: name ( token) ;
117
132
let result = String :: from_utf8_lossy ( result. as_slice ( ) ) . into ( ) ;
133
+
118
134
Ok ( nameCall:: abi_encode_returns ( & result) )
119
135
} ,
120
136
symbol( _) => {
121
- // TODO: charge based on benchmarked weight
137
+ env. charge ( <T as Config < I > >:: WeightInfo :: metadata_symbol ( ) ) ?;
138
+
122
139
let result = <Assets < T , I > >:: symbol ( token) ;
123
140
let result = String :: from_utf8_lossy ( result. as_slice ( ) ) . into ( ) ;
141
+
124
142
Ok ( symbolCall:: abi_encode_returns ( & result) )
125
143
} ,
126
144
decimals( _) => {
127
- // TODO: charge based on benchmarked weight
145
+ env. charge ( <T as Config < I > >:: WeightInfo :: metadata_decimals ( ) ) ?;
146
+
128
147
let result = <Assets < T , I > >:: decimals ( token) ;
148
+
129
149
Ok ( decimalsCall:: abi_encode_returns ( & result) )
130
150
} ,
131
151
}
0 commit comments