Skip to content

Commit 1077f30

Browse files
committed
refactor: simplify assets module
1 parent f7d7747 commit 1077f30

File tree

3 files changed

+22
-39
lines changed

3 files changed

+22
-39
lines changed

src/algokit/cli/tasks/assets.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from algokit.cli.common.constants import AlgorandNetwork, ExplorerEntityType
77
from algokit.cli.common.utils import get_explorer_url
88
from algokit.cli.tasks.utils import (
9-
get_account_info,
109
get_account_with_private_key,
1110
load_algod_client,
1211
validate_account_balance_to_opt_in,
@@ -22,10 +21,10 @@ def _get_zero_balanced_assets(
2221
) -> list[int]:
2322
asset_ids_list = []
2423
if all_assets:
25-
account_info = get_account_info(algod_client, address)
26-
for asset in account_info.get("assets", []):
27-
if asset.get("amount", 0) == 0:
28-
asset_ids_list.append(int(asset["asset-id"]))
24+
account_info = algod_client.account_information(address)
25+
for asset in account_info.assets or ():
26+
if asset.amount == 0:
27+
asset_ids_list.append(asset.asset_id)
2928
else:
3029
for asset_id in provided_asset_ids:
3130
asset_ids_list.append(asset_id)

src/algokit/cli/tasks/utils.py

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import click
1414
import nacl.signing
15+
from algokit_algod_client import models as algod
1516
from algokit_utils import AlgoAmount, ClientManager
1617
from algokit_utils.algo25 import seed_from_mnemonic
1718
from algokit_utils.clients import AlgodClient
@@ -24,33 +25,24 @@
2425
logger = 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

155142
def 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-
309292
def run_callback_once(callback: Callable) -> Callable:
310293
"""
311294
Click option callbacks run twice, first to validate the prompt input,

tests/tasks/test_asset.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22

3+
from algokit_algod_client.models import Account, AssetHolding
34
from algokit_utils import BulkAssetOptInOutResult
45
from pytest_mock import MockerFixture
56

@@ -125,8 +126,8 @@ def test_opt_out_of_assets_from_account_address_successful(mocker: MockerFixture
125126

126127

127128
def test_opt_out_of_all_assets_from_account_address_successful(mocker: MockerFixture) -> None:
128-
dummy_account_info = {"assets": [{"asset-id": 1, "amount": 0}]}
129-
mocker.patch("algokit.cli.tasks.assets.get_account_info", return_value=dummy_account_info)
129+
dummy_account_info = Account(assets=[AssetHolding(asset_id=1)])
130+
mocker.patch("algokit_algod_client.client.AlgodClient.account_information", return_value=dummy_account_info)
130131
algorand_mock = mocker.MagicMock()
131132
algorand_mock.asset.bulk_opt_out.return_value = [
132133
BulkAssetOptInOutResult(asset_id=123, transaction_id="dummy_txn_id")

0 commit comments

Comments
 (0)