From 750567ca85e5d515f3fe824d9bdb280403ad653b Mon Sep 17 00:00:00 2001 From: Ben Hauser Date: Sun, 5 May 2024 00:30:39 +0400 Subject: [PATCH] fix: correct dict keys for nested tuples --- brownie/convert/datatypes.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/brownie/convert/datatypes.py b/brownie/convert/datatypes.py index b07888be9..3209258a2 100644 --- a/brownie/convert/datatypes.py +++ b/brownie/convert/datatypes.py @@ -303,14 +303,23 @@ def __new__(cls, values: Sequence, abi: Optional[List] = None) -> "ReturnValue": values[i] = ReturnValue(values[i], abi[i]["components"]) else: # array of tuples - values[i] = ReturnValue(values[i], [abi[i]] * len(values[i])) + inner_abi = abi[i].copy() + inner_abi["type"] = inner_abi["type"].rsplit("[", maxsplit=1)[0] + final_abi = [deepcopy(inner_abi) for i in range(len(values[i]))] + if inner_abi.get("name"): + name = inner_abi["name"] + for x in range(len(final_abi)): + final_abi[x]["name"] = f"{name}[{x}]" + + values[i] = ReturnValue(values[i], final_abi) else: # array values[i] = ReturnValue(values[i]) self = super().__new__(cls, values) # type: ignore self._abi = abi or [] - self._dict = {i["name"]: values[c] for c, i in enumerate(self._abi) if i["name"]} + self._dict = {i.get("name", "") or f"arg[{c}]": values[c] for c, i in enumerate(self._abi)} + return self def __hash__(self) -> int: @@ -349,7 +358,13 @@ def count(self, value: Any) -> int: def dict(self) -> Dict: """ReturnValue.dict() -> a dictionary of ReturnValue's named items""" - return self._dict # type: ignore + response = {} + for k, v in self._dict.items(): + if isinstance(v, ReturnValue) and v._abi: + response[k] = v.dict() + else: + response[k] = v + return response def index(self, value: Any, start: int = 0, stop: Any = None) -> int: """ReturnValue.index(value, [start, [stop]]) -> integer -- return first index of value.