1212
1313import click
1414import nacl .signing
15+ from algokit_algod_client import models as algod
1516from algokit_utils import AlgoAmount , ClientManager
1617from algokit_utils .algo25 import seed_from_mnemonic
1718from algokit_utils .clients import AlgodClient
2425logger = logging .getLogger (__name__ )
2526
2627
27- def _get_account_info_dict (algod_client : AlgodClient , address : str ) -> dict :
28- """Convert AlgodClient account_information response to a dict format."""
29- response = algod_client .account_information (address )
30- return {
31- "amount" : getattr (response , "amount" , 0 ),
32- "assets" : [{"asset-id" : a .asset_id , "amount" : a .amount } for a in getattr (response , "assets" , []) or []],
33- }
34-
35-
36- def _validate_asset_balance (account_info : dict , asset_id : int , decimals : int , amount : int = 0 ) -> None :
37- asset_record = next ((asset for asset in account_info .get ("assets" , []) if asset ["asset-id" ] == asset_id ), None )
38-
39- if not asset_record :
40- raise click .ClickException ("SigningAccount is not opted into the asset" )
28+ def _validate_asset_balance (account_info : algod .Account , asset_id : int , decimals : int , amount : int = 0 ) -> None :
29+ try :
30+ (asset_record ,) = (asset for asset in (account_info .assets or ()) if asset .asset_id == asset_id )
31+ except ValueError :
32+ raise click .ClickException ("SigningAccount is not opted into the asset" ) from None
4133
42- if amount > 0 and asset_record [ " amount" ] < amount :
34+ if amount > 0 and asset_record . amount < amount :
4335 required = amount / 10 ** decimals
44- available = asset_record [ " amount" ] / 10 ** decimals
36+ available = asset_record . amount / 10 ** decimals
4537 raise click .ClickException (
4638 f"Insufficient asset balance in account, required: { required } , available: { available } "
4739 )
4840
4941
50- def _validate_algo_balance (account_info : dict , amount : int ) -> None :
51- if account_info .get ( " amount" , 0 ) < amount :
42+ def _validate_algo_balance (account_info : algod . Account , amount : int ) -> None :
43+ if account_info .amount < amount :
5244 required = AlgoAmount .from_micro_algo (amount )
53- available = AlgoAmount .from_micro_algo (account_info .get ( " amount" , 0 ) )
45+ available = AlgoAmount .from_micro_algo (account_info .amount )
5446 raise click .ClickException (
5547 f"Insufficient Algos balance in account, required: { required .algo } Algos, available: { available .algo } Algos"
5648 )
@@ -144,12 +136,7 @@ def get_asset_decimals(asset_id: int, algod_client: AlgodClient) -> int:
144136 return 6
145137
146138 asset_response = algod_client .asset_by_id (asset_id )
147- decimals = getattr (getattr (asset_response , "params" , None ), "decimals" , None )
148-
149- if decimals is None :
150- raise click .ClickException ("Invalid asset info response" )
151-
152- return int (decimals )
139+ return asset_response .params .decimals
153140
154141
155142def validate_balance (algod_client : AlgodClient , account : SigningAccount | str , asset_id : int , amount : int = 0 ) -> None :
@@ -167,7 +154,7 @@ def validate_balance(algod_client: AlgodClient, account: SigningAccount | str, a
167154 click.ClickException: If any validation check fails.
168155 """
169156 address = account .address if isinstance (account , SigningAccount ) else account
170- account_info = _get_account_info_dict ( algod_client , address )
157+ account_info = algod_client . account_information ( address )
171158
172159 if asset_id == 0 :
173160 _validate_algo_balance (account_info , amount )
@@ -289,10 +276,10 @@ def validate_account_balance_to_opt_in(algod_client: AlgodClient, account: Signi
289276 """
290277
291278 address = account .address if isinstance (account , SigningAccount ) else account
292- account_info = _get_account_info_dict ( algod_client , address )
279+ account_info = algod_client . account_information ( address )
293280
294281 required_microalgos = num_assets * AlgoAmount .from_algo (Decimal ("0.1" )).micro_algo
295- available_microalgos = account_info .get ( " amount" , 0 )
282+ available_microalgos = account_info .amount
296283 if available_microalgos < required_microalgos :
297284 required_algo = AlgoAmount .from_micro_algo (required_microalgos ).algo
298285 available_algos = AlgoAmount .from_micro_algo (available_microalgos ).algo
@@ -302,10 +289,6 @@ def validate_account_balance_to_opt_in(algod_client: AlgodClient, account: Signi
302289 )
303290
304291
305- def get_account_info (algod_client : AlgodClient , account_address : str ) -> dict :
306- return _get_account_info_dict (algod_client , account_address )
307-
308-
309292def run_callback_once (callback : Callable ) -> Callable :
310293 """
311294 Click option callbacks run twice, first to validate the prompt input,
0 commit comments