diff --git a/crates/transcode/src/lib.rs b/crates/transcode/src/lib.rs index 5ff729cdc..d25bfb6e2 100644 --- a/crates/transcode/src/lib.rs +++ b/crates/transcode/src/lib.rs @@ -205,6 +205,15 @@ impl ContractMessageTranscoder { } }; + let args: Vec<_> = args.into_iter().collect(); + if spec_args.len() != args.len() { + anyhow::bail!( + "Invalid number of input arguments: expected {}, {} provided", + spec_args.len(), + args.len() + ) + } + let mut encoded = selector.to_bytes().to_vec(); for (spec, arg) in spec_args.iter().zip(args) { let value = scon::parse_value(arg.as_ref())?; @@ -503,6 +512,26 @@ mod tests { Ok(()) } + #[test] + fn encode_mismatching_args_length() { + let metadata = generate_metadata(); + let transcoder = ContractMessageTranscoder::new(metadata); + + let result: Result> = transcoder.encode("new", Vec::<&str>::new()); + assert!(result.is_err(), "Should return an error"); + assert_eq!( + result.unwrap_err().to_string(), + "Invalid number of input arguments: expected 1, 0 provided" + ); + + let result: Result> = transcoder.encode("new", ["true", "false"]); + assert!(result.is_err(), "Should return an error"); + assert_eq!( + result.unwrap_err().to_string(), + "Invalid number of input arguments: expected 1, 2 provided" + ); + } + #[test] fn encode_account_id_custom_ss58_encoding() -> Result<()> { let metadata = generate_metadata();