diff --git a/ethers-core/src/abi/human_readable.rs b/ethers-core/src/abi/human_readable.rs index 02c890a6..e06b20af 100644 --- a/ethers-core/src/abi/human_readable.rs +++ b/ethers-core/src/abi/human_readable.rs @@ -103,6 +103,7 @@ fn parse_function(fn_string: &str) -> Result { // internal args let args: Vec<&str> = split[1].split(')').collect(); let args: Vec<&str> = args[0].split(", ").collect(); + let inputs = args .into_iter() .filter(|x| !x.is_empty()) @@ -146,7 +147,7 @@ fn parse_param(param: &str) -> Result { // e.g. uint256[] memory x let mut name = param.next().unwrap_or_default(); if name == "memory" || name == "calldata" { - name = param.next().ok_or(ParseError::Kind)?; + name = param.next().unwrap_or_default(); } Ok(Param { @@ -271,6 +272,7 @@ mod tests { "function foo(uint256[] memory x) external view returns (address)", "function bar(uint256[] memory x) returns (address)", "function bar(uint256[] memory x, uint32 y) returns (address, uint256)", + "function foo(address[] memory, bytes memory) returns (bytes memory)", "function bar(uint256[] memory x)", "function bar()", ] @@ -280,6 +282,22 @@ mod tests { }); } + #[test] + fn can_parse_params() { + [ + "address x", + "address", + "bytes memory y", + "bytes memory", + "bytes32[] memory", + "bytes32[] memory z", + ] + .iter() + .for_each(|x| { + parse_param(x).unwrap(); + }); + } + #[test] fn can_read_backslashes() { parse(&[