|
15 | 15 | I: IntoIterator<Item = S>,
|
16 | 16 | S: AsRef<str>,
|
17 | 17 | {
|
| 18 | + let args: Vec<S> = args.into_iter().collect(); |
| 19 | + |
| 20 | + if inputs.len() != args.len() { |
| 21 | + eyre::bail!("encode length mismatch: expected {} types, got {}", inputs.len(), args.len()) |
| 22 | + } |
| 23 | + |
18 | 24 | std::iter::zip(inputs, args)
|
19 | 25 | .map(|(input, arg)| coerce_value(&input.selector_type(), arg.as_ref()))
|
20 | 26 | .collect()
|
|
47 | 53 | I: IntoIterator<Item = S>,
|
48 | 54 | S: AsRef<str>,
|
49 | 55 | {
|
| 56 | + let args: Vec<S> = args.into_iter().collect(); |
| 57 | + |
| 58 | + if func.inputs.len() != args.len() { |
| 59 | + eyre::bail!( |
| 60 | + "encode length mismatch: expected {} types, got {}", |
| 61 | + func.inputs.len(), |
| 62 | + args.len(), |
| 63 | + ); |
| 64 | + } |
| 65 | + |
50 | 66 | let params: Vec<Vec<u8>> = std::iter::zip(&func.inputs, args)
|
51 | 67 | .map(|(input, arg)| coerce_value(&input.selector_type(), arg.as_ref()))
|
52 | 68 | .collect::<Result<Vec<_>>>()?
|
@@ -257,4 +273,43 @@ mod tests {
|
257 | 273 | assert_eq!(parsed.indexed[1], DynSolValue::Uint(U256::from_be_bytes([3; 32]), 256));
|
258 | 274 | assert_eq!(parsed.indexed[2], DynSolValue::Address(Address::from_word(param2)));
|
259 | 275 | }
|
| 276 | + |
| 277 | + #[test] |
| 278 | + fn test_encode_args_length_validation() { |
| 279 | + use alloy_json_abi::Param; |
| 280 | + |
| 281 | + let params = vec![ |
| 282 | + Param { |
| 283 | + name: "a".to_string(), |
| 284 | + ty: "uint256".to_string(), |
| 285 | + internal_type: None, |
| 286 | + components: vec![], |
| 287 | + }, |
| 288 | + Param { |
| 289 | + name: "b".to_string(), |
| 290 | + ty: "address".to_string(), |
| 291 | + internal_type: None, |
| 292 | + components: vec![], |
| 293 | + }, |
| 294 | + ]; |
| 295 | + |
| 296 | + // Less arguments than parameters |
| 297 | + let args = vec!["1"]; |
| 298 | + let res = encode_args(¶ms, &args); |
| 299 | + assert!(res.is_err()); |
| 300 | + assert!(format!("{}", res.unwrap_err()).contains("encode length mismatch")); |
| 301 | + |
| 302 | + // Exact number of arguments and parameters |
| 303 | + let args = vec!["1", "0x0000000000000000000000000000000000000001"]; |
| 304 | + let res = encode_args(¶ms, &args); |
| 305 | + assert!(res.is_ok()); |
| 306 | + let values = res.unwrap(); |
| 307 | + assert_eq!(values.len(), 2); |
| 308 | + |
| 309 | + // More arguments than parameters |
| 310 | + let args = vec!["1", "0x0000000000000000000000000000000000000001", "extra"]; |
| 311 | + let res = encode_args(¶ms, &args); |
| 312 | + assert!(res.is_err()); |
| 313 | + assert!(format!("{}", res.unwrap_err()).contains("encode length mismatch")); |
| 314 | + } |
260 | 315 | }
|
0 commit comments