@@ -33,7 +33,7 @@ use sp_runtime::{
33
33
traits:: { Block as BlockT , Header as HeaderT } ,
34
34
DispatchError ,
35
35
} ;
36
- use std:: convert:: TryInto ;
36
+ use std:: convert:: { TryFrom , TryInto } ;
37
37
use pallet_contracts_primitives:: ContractExecResult ;
38
38
39
39
pub use pallet_contracts_rpc_runtime_api:: ContractsApi as ContractsRuntimeApi ;
@@ -76,10 +76,10 @@ impl From<ContractAccessError> for Error {
76
76
#[ derive( Serialize , Deserialize ) ]
77
77
#[ serde( rename_all = "camelCase" ) ]
78
78
#[ serde( deny_unknown_fields) ]
79
- pub struct CallRequest < AccountId , Balance > {
79
+ pub struct CallRequest < AccountId > {
80
80
origin : AccountId ,
81
81
dest : AccountId ,
82
- value : Balance ,
82
+ value : number :: NumberOrHex ,
83
83
gas_limit : number:: NumberOrHex ,
84
84
input_data : Bytes ,
85
85
}
@@ -141,7 +141,7 @@ pub trait ContractsApi<BlockHash, BlockNumber, AccountId, Balance> {
141
141
#[ rpc( name = "contracts_call" ) ]
142
142
fn call (
143
143
& self ,
144
- call_request : CallRequest < AccountId , Balance > ,
144
+ call_request : CallRequest < AccountId > ,
145
145
at : Option < BlockHash > ,
146
146
) -> Result < RpcContractExecResult > ;
147
147
@@ -201,11 +201,11 @@ where
201
201
<<Block as BlockT >:: Header as HeaderT >:: Number ,
202
202
> ,
203
203
AccountId : Codec ,
204
- Balance : Codec ,
204
+ Balance : Codec + TryFrom < number :: NumberOrHex > ,
205
205
{
206
206
fn call (
207
207
& self ,
208
- call_request : CallRequest < AccountId , Balance > ,
208
+ call_request : CallRequest < AccountId > ,
209
209
at : Option < <Block as BlockT >:: Hash > ,
210
210
) -> Result < RpcContractExecResult > {
211
211
let api = self . client . runtime_api ( ) ;
@@ -221,6 +221,13 @@ where
221
221
input_data,
222
222
} = call_request;
223
223
224
+ // Make sure that value fits into the balance type.
225
+ let value: Balance = value. try_into ( ) . map_err ( |_| Error {
226
+ code : ErrorCode :: InvalidParams ,
227
+ message : format ! ( "{:?} doesn't fit into the balance type" , value) ,
228
+ data : None ,
229
+ } ) ?;
230
+
224
231
// Make sure that gas_limit fits into 64 bits.
225
232
let gas_limit: u64 = gas_limit. try_into ( ) . map_err ( |_| Error {
226
233
code : ErrorCode :: InvalidParams ,
@@ -305,17 +312,18 @@ mod tests {
305
312
306
313
#[ test]
307
314
fn call_request_should_serialize_deserialize_properly ( ) {
308
- type Req = CallRequest < String , u128 > ;
315
+ type Req = CallRequest < String > ;
309
316
let req: Req = serde_json:: from_str ( r#"
310
317
{
311
318
"origin": "5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL",
312
319
"dest": "5DRakbLVnjVrW6niwLfHGW24EeCEvDAFGEXrtaYS5M4ynoom",
313
- "value": 0 ,
320
+ "value": "0x112210f4B16c1cb1" ,
314
321
"gasLimit": 1000000000000,
315
322
"inputData": "0x8c97db39"
316
323
}
317
324
"# ) . unwrap ( ) ;
318
325
assert_eq ! ( req. gas_limit. into_u256( ) , U256 :: from( 0xe8d4a51000u64 ) ) ;
326
+ assert_eq ! ( req. value. into_u256( ) , U256 :: from( 1234567890987654321u128 ) ) ;
319
327
}
320
328
321
329
#[ test]
0 commit comments