Skip to content

Commit f56deac

Browse files
committed
chore: wip
1 parent ec8cb13 commit f56deac

26 files changed

+1290
-932
lines changed

src/algokit_utils/_debugging.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ def simulate_response(
211211
exec_trace_config: SimulateTraceConfig | None = None,
212212
round: int | None = None, # noqa: A002 TODO: revisit
213213
skip_signatures: int | None = None, # noqa: ARG001 TODO: revisit
214-
fix_signers: bool | None = None, # noqa: ARG001 TODO: revisit
215214
) -> SimulateAtomicTransactionResponse:
216215
"""
217216
Simulate and fetch response for the given AtomicTransactionComposer and AlgodClient.
@@ -256,7 +255,6 @@ def simulate_and_persist_response( # noqa: PLR0913 TODO: revisit
256255
exec_trace_config: SimulateTraceConfig | None = None,
257256
round: int | None = None, # noqa: A002 TODO: revisit
258257
skip_signatures: int | None = None,
259-
fix_signers: bool | None = None,
260258
) -> SimulateAtomicTransactionResponse:
261259
"""
262260
Simulates the atomic transactions using the provided `AtomicTransactionComposer` object and `AlgodClient` object,
@@ -291,7 +289,6 @@ def simulate_and_persist_response( # noqa: PLR0913 TODO: revisit
291289
exec_trace_config,
292290
round,
293291
skip_signatures,
294-
fix_signers,
295292
)
296293
txn_results = response.simulate_response["txn-groups"]
297294

src/algokit_utils/accounts/account_manager.py

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@
1515
from algokit_utils.config import config
1616
from algokit_utils.models.account import DISPENSER_ACCOUNT_NAME, Account, MultiSigAccount, MultisigMetadata
1717
from algokit_utils.models.amount import AlgoAmount
18+
from algokit_utils.models.transaction import SendAtomicTransactionComposerResults, SendSingleTransactionResult
1819
from algokit_utils.transactions.transaction_composer import (
1920
PaymentParams,
20-
SendAtomicTransactionComposerResults,
2121
TransactionComposer,
2222
)
23-
from algokit_utils.transactions.transaction_sender import SendSingleTransactionResult
2423

2524
logger = config.logger
2625

@@ -41,6 +40,40 @@ class EnsureFundedFromTestnetDispenserApiResponse(_CommonEnsureFundedParams):
4140
pass
4241

4342

43+
@dataclass(frozen=True, kw_only=True)
44+
class AccountInformation:
45+
address: str
46+
amount: int
47+
amount_without_pending_rewards: int
48+
min_balance: int
49+
pending_rewards: int
50+
rewards: int
51+
round: int
52+
status: str
53+
total_apps_opted_in: int | None = None
54+
total_assets_opted_in: int | None = None
55+
total_box_bytes: int | None = None
56+
total_boxes: int | None = None
57+
total_created_apps: int | None = None
58+
total_created_assets: int | None = None
59+
apps_local_state: list[dict] | None = None
60+
apps_total_extra_pages: int | None = None
61+
apps_total_schema: dict | None = None
62+
assets: list[dict] | None = None
63+
auth_addr: str | None = None
64+
closed_at_round: int | None = None
65+
created_apps: list[dict] | None = None
66+
created_assets: list[dict] | None = None
67+
created_at_round: int | None = None
68+
deleted: bool | None = None
69+
incentive_eligible: bool | None = None
70+
last_heartbeat: int | None = None
71+
last_proposed: int | None = None
72+
participation: dict | None = None
73+
reward_base: int | None = None
74+
sig_type: str | None = None
75+
76+
4477
class AccountManager:
4578
"""Creates and keeps track of addresses and signers"""
4679

@@ -106,7 +139,7 @@ def get_signer(self, sender: str | Account | LogicSigAccount) -> TransactionSign
106139
raise ValueError(f"No signer found for address {sender}")
107140
return signer
108141

109-
def get_information(self, sender: str | Account) -> dict[str, Any]:
142+
def get_information(self, sender: str | Account) -> AccountInformation:
110143
"""
111144
Returns the given sender account's current status, balance and spendable amounts.
112145
@@ -115,7 +148,8 @@ def get_information(self, sender: str | Account) -> dict[str, Any]:
115148
"""
116149
info = self._client_manager.algod.account_info(self._get_address(sender))
117150
assert isinstance(info, dict)
118-
return info
151+
info = {k.replace("-", "_"): v for k, v in info.items()}
152+
return AccountInformation(**info)
119153

120154
def _register_account(self, private_key: str) -> Account:
121155
"""Helper method to create and register an account with its signer.
@@ -516,7 +550,7 @@ def _get_ensure_funded_amount(
516550
min_funding_increment: AlgoAmount | None = None,
517551
) -> AlgoAmount | None:
518552
account_info = self.get_information(sender)
519-
current_spending_balance = account_info["amount"] - account_info["min-balance"]
553+
current_spending_balance = account_info.amount - account_info.min_balance
520554

521555
min_increment = min_funding_increment.micro_algo if min_funding_increment else 0
522556
amount_funded = self._calculate_fund_amount(

src/algokit_utils/applications/app_client.py

Lines changed: 38 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -12,49 +12,53 @@
1212
from algosdk.transaction import OnComplete, Transaction
1313

1414
from algokit_utils._legacy_v2.application_specification import ApplicationSpecification
15-
from algokit_utils.applications.app_manager import BoxABIValue, BoxName, BoxValue
1615
from algokit_utils.applications.utils import (
1716
get_abi_decoded_value,
1817
get_abi_encoded_value,
1918
get_abi_tuple_from_abi_struct,
2019
get_arc56_method,
2120
)
2221
from algokit_utils.errors.logic_error import LogicError, parse_logic_error
22+
from algokit_utils.models.abi import BoxABIValue
2323
from algokit_utils.models.application import (
24+
AppClientCompilationParams,
25+
AppClientCompilationResult,
26+
AppClientParams,
27+
AppSourceMaps,
2428
AppState,
2529
Arc56Contract,
26-
CompiledTeal,
2730
ProgramSourceInfo,
2831
SourceInfoDetail,
2932
StorageKey,
3033
StorageMap,
3134
)
32-
from algokit_utils.models.transaction import SendParams
35+
from algokit_utils.models.state import BoxName, BoxValue
36+
from algokit_utils.models.transaction import (
37+
SendAppTransactionResult,
38+
SendAppUpdateTransactionResult,
39+
SendParams,
40+
SendSingleTransactionResult,
41+
)
3342
from algokit_utils.transactions.transaction_composer import (
34-
AppCallMethodCall,
43+
AppCallMethodCallParams,
3544
AppCallParams,
36-
AppDeleteMethodCall,
45+
AppDeleteMethodCallParams,
3746
AppMethodCallTransactionArgument,
38-
AppUpdateMethodCall,
47+
AppUpdateMethodCallParams,
3948
AppUpdateParams,
4049
BuiltTransactions,
4150
PaymentParams,
4251
)
43-
from algokit_utils.transactions.transaction_sender import SendAppTransactionResult, SendSingleTransactionResult
4452

4553
if TYPE_CHECKING:
4654
from collections.abc import Callable
4755

4856
from algosdk.atomic_transaction_composer import TransactionSigner
4957

50-
from algokit_utils.applications.app_manager import (
51-
AppManager,
52-
BoxIdentifier,
53-
BoxReference,
54-
TealTemplateParams,
55-
)
58+
from algokit_utils.applications.app_manager import AppManager
5659
from algokit_utils.models.abi import ABIStruct, ABIType, ABIValue
5760
from algokit_utils.models.amount import AlgoAmount
61+
from algokit_utils.models.state import BoxIdentifier, BoxReference, TealTemplateParams
5862
from algokit_utils.protocols.application import AlgorandClientProtocol
5963
from algokit_utils.transactions.transaction_composer import TransactionComposer
6064

@@ -127,13 +131,6 @@ def get_constant_block_offset(program: bytes) -> int: # noqa: C901
127131
return max(bytecblock_offset or 0, intcblock_offset or 0)
128132

129133

130-
@dataclass(kw_only=True, frozen=True)
131-
class AppClientCompilationParams:
132-
deploy_time_params: TealTemplateParams | None = None
133-
updatable: bool | None = None
134-
deletable: bool | None = None
135-
136-
137134
@dataclass(kw_only=True, frozen=True)
138135
class ExposedLogicErrorDetails:
139136
is_clear_state_program: bool = False
@@ -145,31 +142,7 @@ class ExposedLogicErrorDetails:
145142

146143

147144
@dataclass(kw_only=True, frozen=True)
148-
class AppClientParams:
149-
"""Full parameters for creating an app client"""
150-
151-
app_spec: (
152-
Arc56Contract | ApplicationSpecification | str
153-
) # Using string quotes since these types may be defined elsewhere
154-
algorand: AlgorandClientProtocol # Using string quotes since this type may be defined elsewhere
155-
app_id: int
156-
app_name: str | None = None
157-
default_sender: str | bytes | None = None # Address can be string or bytes
158-
default_signer: TransactionSigner | None = None
159-
approval_source_map: SourceMap | None = None
160-
clear_source_map: SourceMap | None = None
161-
162-
163-
@dataclass(kw_only=True, frozen=True)
164-
class AppClientCompilationResult:
165-
approval_program: bytes
166-
clear_state_program: bytes
167-
compiled_approval: CompiledTeal | None = None
168-
compiled_clear: CompiledTeal | None = None
169-
170-
171-
@dataclass(kw_only=True, frozen=True)
172-
class CommonTxnParams:
145+
class _CommonTxnParams:
173146
sender: str
174147
signer: TransactionSigner | None = None
175148
rekey_to: str | None = None
@@ -313,12 +286,6 @@ class ResolveAppClientByNetwork:
313286
clear_source_map: SourceMap | None = None
314287

315288

316-
@dataclass(kw_only=True, frozen=True)
317-
class AppSourceMaps:
318-
approval_source_map: SourceMap | None = None
319-
clear_source_map: SourceMap | None = None
320-
321-
322289
class _AppClientStateMethodsProtocol(Protocol):
323290
def get_all(self) -> dict[str, Any]: ...
324291

@@ -558,23 +525,23 @@ def random_note() -> bytes:
558525
close_remainder_to=params.close_remainder_to,
559526
)
560527

561-
def opt_in(self, params: AppClientMethodCallParams) -> AppCallMethodCall:
528+
def opt_in(self, params: AppClientMethodCallParams) -> AppCallMethodCallParams:
562529
input_params = self._get_abi_params(params.__dict__, on_complete=algosdk.transaction.OnComplete.OptInOC)
563-
return AppCallMethodCall(**input_params)
530+
return AppCallMethodCallParams(**input_params)
564531

565-
def call(self, params: AppClientMethodCallParams) -> AppCallMethodCall:
532+
def call(self, params: AppClientMethodCallParams) -> AppCallMethodCallParams:
566533
input_params = self._get_abi_params(params.__dict__, on_complete=algosdk.transaction.OnComplete.NoOpOC)
567-
return AppCallMethodCall(**input_params)
534+
return AppCallMethodCallParams(**input_params)
568535

569-
def delete(self, params: AppClientMethodCallParams) -> AppDeleteMethodCall:
536+
def delete(self, params: AppClientMethodCallParams) -> AppDeleteMethodCallParams:
570537
input_params = self._get_abi_params(
571538
params.__dict__, on_complete=algosdk.transaction.OnComplete.DeleteApplicationOC
572539
)
573-
return AppDeleteMethodCall(**input_params)
540+
return AppDeleteMethodCallParams(**input_params)
574541

575542
def update(
576543
self, params: AppClientMethodCallParams | AppClientMethodCallWithCompilationAndSendParams
577-
) -> AppUpdateMethodCall:
544+
) -> AppUpdateMethodCallParams:
578545
compile_params = (
579546
self._client.compile(
580547
app_spec=self._client.app_spec,
@@ -591,14 +558,14 @@ def update(
591558
**self._get_abi_params(params.__dict__, on_complete=algosdk.transaction.OnComplete.UpdateApplicationOC),
592559
**compile_params,
593560
}
594-
# Filter input_params to include only fields valid for AppUpdateMethodCall
595-
app_update_method_call_fields = {field.name for field in fields(AppUpdateMethodCall)}
561+
# Filter input_params to include only fields valid for AppUpdateMethodCallParams
562+
app_update_method_call_fields = {field.name for field in fields(AppUpdateMethodCallParams)}
596563
filtered_input_params = {k: v for k, v in input_params.items() if k in app_update_method_call_fields}
597-
return AppUpdateMethodCall(**filtered_input_params)
564+
return AppUpdateMethodCallParams(**filtered_input_params)
598565

599-
def close_out(self, params: AppClientMethodCallParams) -> AppCallMethodCall:
566+
def close_out(self, params: AppClientMethodCallParams) -> AppCallMethodCallParams:
600567
input_params = self._get_abi_params(params.__dict__, on_complete=algosdk.transaction.OnComplete.CloseOutOC)
601-
return AppCallMethodCall(**input_params)
568+
return AppCallMethodCallParams(**input_params)
602569

603570
def _get_abi_params(self, params: dict[str, Any], on_complete: algosdk.transaction.OnComplete) -> dict[str, Any]:
604571
input_params = copy.deepcopy(params)
@@ -761,7 +728,7 @@ def delete(self, params: AppClientMethodCallWithSendParams) -> SendAppTransactio
761728
lambda: self._algorand.send.app_delete_method_call(self._client.params.delete(params))
762729
)
763730

764-
def update(self, params: AppClientMethodCallWithCompilationAndSendParams) -> SendAppTransactionResult:
731+
def update(self, params: AppClientMethodCallWithCompilationAndSendParams) -> SendAppUpdateTransactionResult:
765732
return self._client._handle_call_errors( # type: ignore[no-any-return]
766733
lambda: self._algorand.send.app_update_method_call(self._client.params.update(params))
767734
)
@@ -790,7 +757,6 @@ def call(self, params: AppClientMethodCallWithSendParams) -> SendAppTransactionR
790757
extra_opcode_budget=None,
791758
exec_trace_config=None,
792759
round=None,
793-
fix_signers=None, # TODO: double check on whether algosdk py even has this param
794760
)
795761
)
796762

@@ -802,7 +768,7 @@ def call(self, params: AppClientMethodCallWithSendParams) -> SendAppTransactionR
802768
confirmations=simulate_response.confirmations,
803769
group_id=simulate_response.group_id or "",
804770
returns=simulate_response.returns,
805-
return_value=simulate_response.returns[-1],
771+
abi_return=simulate_response.returns[-1],
806772
)
807773

808774
return self._client._handle_call_errors(
@@ -1320,28 +1286,28 @@ def _get_abi_args_with_default_values( # noqa: C901, PLR0912
13201286
default_method = get_arc56_method(default_value.data, self._app_spec)
13211287
empty_args = [None] * len(default_method.args)
13221288
call_result = self._algorand.send.app_call_method_call(
1323-
AppCallMethodCall(
1289+
AppCallMethodCallParams(
13241290
app_id=self._app_id,
13251291
method=algosdk.abi.Method.from_signature(default_value.data),
13261292
args=empty_args,
13271293
sender=sender,
13281294
)
13291295
)
13301296

1331-
if not call_result.return_value:
1297+
if not call_result.abi_return:
13321298
raise ValueError("Default value method call did not return a value")
13331299

1334-
if isinstance(call_result.return_value, dict):
1300+
if isinstance(call_result.abi_return, dict):
13351301
# Convert struct return value to tuple
13361302
result.append(
13371303
get_abi_tuple_from_abi_struct(
1338-
call_result.return_value,
1304+
call_result.abi_return,
13391305
self._app_spec.structs[str(default_method.arc56_returns.type)],
13401306
self._app_spec.structs,
13411307
)
13421308
)
1343-
else:
1344-
result.append(call_result.return_value.return_value)
1309+
elif call_result.abi_return.value:
1310+
result.append(call_result.abi_return.value)
13451311

13461312
case "local" | "global":
13471313
# Get state value

0 commit comments

Comments
 (0)