@@ -69,7 +69,18 @@ def get_wallet_account(
6969 :param sender: Optional sender address to use this signer for (aka a rekeyed account)
7070 :return: The signing account or None if no matching wallet or account was found
7171 """
72+ return self ._find_wallet_account (
73+ wallet_name ,
74+ predicate ,
75+ sender ,
76+ )
7277
78+ def _find_wallet_account (
79+ self ,
80+ wallet_name : str ,
81+ predicate_or_address : Callable [[dict [str , Any ]], bool ] | str | None = None ,
82+ sender : str | None = None ,
83+ ) -> KmdAccount | None :
7384 kmd_client = self .kmd ()
7485 wallets = kmd_client .list_wallets ()
7586 wallet = next ((w for w in wallets if w ["name" ] == wallet_name ), None )
@@ -78,17 +89,21 @@ def get_wallet_account(
7889
7990 wallet_id = wallet ["id" ]
8091 wallet_handle = kmd_client .init_wallet_handle (wallet_id , "" )
81- addresses = kmd_client .list_keys (wallet_handle )
8292
8393 matched_address = None
84- if predicate :
85- for address in addresses :
86- account_info = self ._client_manager .algod .account_info (address )
87- if predicate (cast (dict [str , Any ], account_info )):
88- matched_address = address
89- break
94+ if isinstance (predicate_or_address , str ):
95+ matched_address = predicate_or_address
9096 else :
91- matched_address = next (iter (addresses ), None )
97+ addresses = kmd_client .list_keys (wallet_handle )
98+ if addresses :
99+ if callable (predicate_or_address ):
100+ for address in addresses :
101+ account_info = self ._client_manager .algod .account_info (address )
102+ if predicate_or_address (cast (dict [str , Any ], account_info )):
103+ matched_address = address
104+ break
105+ else :
106+ matched_address = addresses [0 ]
92107
93108 if not matched_address :
94109 return None
@@ -149,11 +164,15 @@ def get_localnet_dispenser_account(self) -> KmdAccount:
149164 if not self ._client_manager .is_localnet ():
150165 raise Exception ("Can't get LocalNet dispenser account from non LocalNet network" )
151166
152- dispenser = self .get_wallet_account (
153- "unencrypted-default-wallet" ,
154- lambda a : a ["status" ] != "Offline" and a ["amount" ] > 1_000_000_000 , # noqa: PLR2004
155- )
156- if not dispenser :
157- raise Exception ("Error retrieving LocalNet dispenser account; couldn't find the default account in KMD" )
167+ genesis_response = cast (dict [str , Any ], self ._client_manager .algod .genesis ())
168+ dispenser_addresses = [cast (str , a ["addr" ]) for a in genesis_response ["alloc" ] if a .get ("comment" ) == "Wallet1" ]
169+
170+ if dispenser_addresses :
171+ dispenser = self ._find_wallet_account (
172+ "unencrypted-default-wallet" ,
173+ dispenser_addresses [0 ],
174+ )
175+ if dispenser :
176+ return dispenser
158177
159- return dispenser
178+ raise Exception ( "Error retrieving LocalNet dispenser account; couldn't find the default account in KMD" )
0 commit comments