@@ -583,27 +583,28 @@ def from_json(cls, error_entry: ABI_JSON) -> "Error":
583583
584584 name = error_entry_typed ["name" ]
585585 fields = dispatch_types (error_entry_typed ["inputs" ])
586- if isinstance (fields , list ):
587- raise TypeError ("Error fields must be named" )
588586
589587 return cls (name = name , fields = fields )
590588
591589 def __init__ (
592590 self ,
593591 name : str ,
594- fields : Mapping [str , Type ],
592+ fields : Mapping [str , Type ] | Sequence [ Type ] ,
595593 ):
596594 self .name = name
595+ self ._named_fields = isinstance (fields , Mapping )
597596 self .fields = Signature (fields )
598597
599598 @cached_property
600599 def selector (self ) -> bytes :
601600 """Error's selector."""
602601 return keccak (self .name .encode () + self .fields .canonical_form .encode ())[:SELECTOR_LENGTH ]
603602
604- def decode_fields (self , data_bytes : bytes ) -> dict [str , Any ]:
603+ def decode_fields (self , data_bytes : bytes ) -> dict [str , Any ] | tuple [ Any , ...] :
605604 """Decodes the error fields from the given packed data."""
606- return self .fields .decode_into_dict (data_bytes )
605+ if self ._named_fields :
606+ return self .fields .decode_into_dict (data_bytes )
607+ return self .fields .decode_into_tuple (data_bytes )
607608
608609 def __str__ (self ) -> str :
609610 return f"error { self .name } { self .fields } "
@@ -843,7 +844,7 @@ def __init__(
843844 error .selector : error for error in chain ([PANIC_ERROR , LEGACY_ERROR ], self .error )
844845 }
845846
846- def resolve_error (self , error_data : bytes ) -> tuple [Error , dict [str , Any ]]:
847+ def resolve_error (self , error_data : bytes ) -> tuple [Error , dict [str , Any ] | tuple [ Any , ...] ]:
847848 """
848849 Given the packed error data, attempts to find the error in the ABI
849850 and decode the data into its fields.
0 commit comments