11import asyncio
2+ import functools
23import logging
34from typing import (
45 TYPE_CHECKING ,
@@ -139,6 +140,7 @@ async def subscribe(
139140 self , subscriptions : Sequence [EthSubscription [Any ]]
140141 ) -> List [HexStr ]: ...
141142
143+ @functools .singledispatchmethod
142144 async def subscribe (
143145 self , subscriptions : Union [EthSubscription [Any ], Sequence [EthSubscription [Any ]]]
144146 ) -> Union [HexStr , List [HexStr ]]:
@@ -149,28 +151,30 @@ async def subscribe(
149151 :type subscriptions: Union[EthSubscription, Sequence[EthSubscription]]
150152 :return:
151153 """
152- if isinstance (subscriptions , EthSubscription ):
153- subscriptions .manager = self
154- self ._validate_and_normalize_label (subscriptions )
155- sub_id = await self ._w3 .eth ._subscribe (* subscriptions .subscription_params )
156- subscriptions ._id = sub_id
157- self ._add_subscription (subscriptions )
158- self .logger .info (
159- "Successfully subscribed to subscription:\n label: %s\n id: %s" ,
160- subscriptions .label ,
161- sub_id ,
162- )
163- return sub_id
164- elif isinstance (subscriptions , Sequence ):
165- if len (subscriptions ) == 0 :
166- raise Web3ValueError ("No subscriptions provided." )
167-
168- sub_ids : List [HexStr ] = []
169- for sub in subscriptions :
170- sub_ids .append (await self .subscribe (sub ))
171- return sub_ids
172154 raise Web3TypeError ("Expected a Subscription or a sequence of Subscriptions." )
173155
156+ @subscribe .register (EthSubscription )
157+ async def subscribe (self , subscription : EthSubscription [Any ]) -> HexStr :
158+ subscription .manager = self
159+ self ._validate_and_normalize_label (subscription )
160+ sub_id = await self ._w3 .eth ._subscribe (* subscription .subscription_params )
161+ subscription ._id = sub_id
162+ self ._add_subscription (subscription )
163+ self .logger .info (
164+ "Successfully subscribed to subscription:\n label: %s\n id: %s" ,
165+ subscription .label ,
166+ sub_id ,
167+ )
168+ return sub_id
169+
170+ @subscribe .register (Sequence )
171+ async def subscribe (
172+ self , subscriptions : Sequence [EthSubscription [Any ]]
173+ ) -> List [HexStr ]:
174+ if len (subscriptions ) == 0 :
175+ raise Web3ValueError ("No subscriptions provided." )
176+ return [await sub for sub in map (self .subscribe , subscriptions )]
177+
174178 @overload
175179 async def unsubscribe (self , subscriptions : EthSubscription [Any ]) -> bool : ...
176180
0 commit comments