Skip to content

Commit d1f8693

Browse files
authored
fix: enable LocalNet dispensing after 30000 rounds (#226)
* fix: enable LocalNet dispensing after 30000 rounds
1 parent afda7ac commit d1f8693

File tree

2 files changed

+42
-19
lines changed

2 files changed

+42
-19
lines changed

src/algokit_utils/accounts/kmd_account_manager.py

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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")

tests/transactions/test_transaction_composer.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
PaymentTxn,
1414
)
1515

16-
from algokit_utils._legacy_v2.account import get_account
1716
from algokit_utils.algorand import AlgorandClient
1817
from algokit_utils.models.account import MultisigMetadata, SigningAccount
1918
from algokit_utils.models.amount import AlgoAmount
@@ -27,7 +26,6 @@
2726
SendAtomicTransactionComposerResults,
2827
TransactionComposer,
2928
)
30-
from legacy_v2_tests.conftest import get_unique_name
3129

3230
if TYPE_CHECKING:
3331
from algokit_utils.models.transaction import Arc2TransactionNote
@@ -59,8 +57,14 @@ def funded_account(algorand: AlgorandClient) -> SigningAccount:
5957

6058
@pytest.fixture
6159
def funded_secondary_account(algorand: AlgorandClient) -> SigningAccount:
62-
secondary_name = get_unique_name()
63-
return get_account(algorand.client.algod, secondary_name)
60+
private_key, _ = algosdk.account.generate_account()
61+
address = str(algosdk.account.address_from_private_key(private_key))
62+
dispenser = algorand.account.localnet_dispenser()
63+
new_account = SigningAccount(private_key=private_key, address=address)
64+
algorand.account.ensure_funded(
65+
new_account, dispenser, AlgoAmount.from_algo(100), min_funding_increment=AlgoAmount.from_algo(1)
66+
)
67+
return new_account
6468

6569

6670
def test_add_transaction(algorand: AlgorandClient, funded_account: SigningAccount) -> None:

0 commit comments

Comments
 (0)