Skip to content

Commit ed9a947

Browse files
aorumbayevdaniel-makerx
authored andcommitted
feat!: align Python API with TypeScript naming conventions
BREAKING CHANGE: Multiple API field and type renames to align with algokit-utils-ts ## Changes ### MultisigSubsignature - Renamed \`address: str\` to \`public_key: bytes\` to match TypeScript's \`publicKey: Uint8Array\` - Aligns with go-algorand canonical definition (\`Key PublicKey\` with wire key \`pk\`) - Wire format unchanged - backward compatible at protocol level ### AppCallTransactionFields - Renamed \`access\` to \`access_references\` to match TypeScript's \`accessReferences\` - Wire key remains \`al\` ### Transaction - Renamed \`app_call\` to \`application_call\` to match TypeScript's \`applicationCall\` ### SendAtomicTransactionComposerResults - Removed backwards compatibility alias completely - Use \`SendTransactionComposerResults\` instead"
1 parent 1bb2366 commit ed9a947

File tree

26 files changed

+174
-143
lines changed

26 files changed

+174
-143
lines changed

docs/markdown/autoapi/algokit_utils/transactions/builders/common/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959

6060
### algokit_utils.transactions.builders.common.build_transaction_header(params: [algokit_utils.transactions.types.CommonTxnParams](../../types/index.md#algokit_utils.transactions.types.CommonTxnParams), suggested_params: SuggestedParamsLike, \*, default_validity_window: int, default_validity_window_is_explicit: bool, is_localnet: bool) → tuple[[TransactionHeader](#algokit_utils.transactions.builders.common.TransactionHeader), [FeeConfig](#algokit_utils.transactions.builders.common.FeeConfig)]
6161

62-
### algokit_utils.transactions.builders.common.build_transaction(txn_type: algokit_transact.models.transaction.TransactionType, header: [TransactionHeader](#algokit_utils.transactions.builders.common.TransactionHeader), \*, payment: algokit_transact.models.payment.PaymentTransactionFields | None = None, asset_transfer: algokit_transact.models.asset_transfer.AssetTransferTransactionFields | None = None, asset_config: algokit_transact.models.asset_config.AssetConfigTransactionFields | None = None, asset_freeze: algokit_transact.models.asset_freeze.AssetFreezeTransactionFields | None = None, app_call: algokit_transact.models.app_call.AppCallTransactionFields | None = None, key_registration: algokit_transact.models.key_registration.KeyRegistrationTransactionFields | None = None) → algokit_transact.models.transaction.Transaction
62+
### algokit_utils.transactions.builders.common.build_transaction(txn_type: algokit_transact.models.transaction.TransactionType, header: [TransactionHeader](#algokit_utils.transactions.builders.common.TransactionHeader), \*, payment: algokit_transact.models.payment.PaymentTransactionFields | None = None, asset_transfer: algokit_transact.models.asset_transfer.AssetTransferTransactionFields | None = None, asset_config: algokit_transact.models.asset_config.AssetConfigTransactionFields | None = None, asset_freeze: algokit_transact.models.asset_freeze.AssetFreezeTransactionFields | None = None, application_call: algokit_transact.models.app_call.AppCallTransactionFields | None = None, key_registration: algokit_transact.models.key_registration.KeyRegistrationTransactionFields | None = None) → algokit_transact.models.transaction.Transaction
6363

6464
### algokit_utils.transactions.builders.common.apply_transaction_fees(txn: algokit_transact.models.transaction.Transaction, params: [algokit_utils.transactions.types.CommonTxnParams](../../types/index.md#algokit_utils.transactions.types.CommonTxnParams), fee_config: [FeeConfig](#algokit_utils.transactions.builders.common.FeeConfig)) → [BuiltTransaction](#algokit_utils.transactions.builders.common.BuiltTransaction)
6565

docs/markdown/autoapi/algokit_utils/transactions/transaction_composer/index.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
## Attributes
44

5-
| [`AppMethodCallTransactionArgument`](#algokit_utils.transactions.transaction_composer.AppMethodCallTransactionArgument) | |
6-
|---------------------------------------------------------------------------------------------------------------------------------|----|
7-
| [`ErrorTransformer`](#algokit_utils.transactions.transaction_composer.ErrorTransformer) | |
8-
| [`SendAtomicTransactionComposerResults`](#algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults) | |
5+
| [`AppMethodCallTransactionArgument`](#algokit_utils.transactions.transaction_composer.AppMethodCallTransactionArgument) | |
6+
|---------------------------------------------------------------------------------------------------------------------------|----|
7+
| [`ErrorTransformer`](#algokit_utils.transactions.transaction_composer.ErrorTransformer) | |
98

109
## Exceptions
1110

@@ -108,8 +107,6 @@ Contains detailed debugging information including simulation traces and sent tra
108107

109108
#### simulate_response *: algokit_algod_client.models.SimulateResponse | None* *= None*
110109

111-
### algokit_utils.transactions.transaction_composer.SendAtomicTransactionComposerResults
112-
113110
### *class* algokit_utils.transactions.transaction_composer.TransactionComposer(params: [TransactionComposerParams](#algokit_utils.transactions.transaction_composer.TransactionComposerParams))
114111

115112
Light-weight transaction composer built on top of algokit_transact.

docs/markdown/capabilities/transaction.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Transaction management is one of the core capabilities provided by AlgoKit Utils
44

55
## Transaction Results
66

7-
All AlgoKit Utils functions that send transactions return either a `SendSingleTransactionResult` or `SendAtomicTransactionComposerResults`, providing consistent mechanisms to interpret transaction outcomes.
7+
All AlgoKit Utils functions that send transactions return either a `SendSingleTransactionResult` or `SendTransactionComposerResults`, providing consistent mechanisms to interpret transaction outcomes.
88

99
### SendSingleTransactionResult
1010

@@ -30,13 +30,13 @@ Common variations include:
3030
- `SendAppUpdateTransactionResult` - Adds compilation results
3131
- `SendAppCreateTransactionResult` - Adds `app_id` and `app_address`
3232

33-
### SendAtomicTransactionComposerResults
33+
### SendTransactionComposerResults
3434

35-
When using the atomic transaction composer directly via `TransactionComposer.send()` or `TransactionComposer.simulate()`, you’ll receive a `SendAtomicTransactionComposerResults`:
35+
When using the atomic transaction composer directly via `TransactionComposer.send()` or `TransactionComposer.simulate()`, you’ll receive a `SendTransactionComposerResults`:
3636

3737
```python
3838
@dataclass
39-
class SendAtomicTransactionComposerResults:
39+
class SendTransactionComposerResults:
4040
group_id: str # The group ID if this was a transaction group
4141
confirmations: list[AlgodResponseType] # The confirmation info for each transaction
4242
tx_ids: list[str] # The transaction IDs that were sent
@@ -64,8 +64,8 @@ These types extend the base transaction results to add an `abi_value` field that
6464
Different interfaces return different result types:
6565

6666
1. **Direct Transaction Composer**
67-
- `TransactionComposer.send()``SendAtomicTransactionComposerResults`
68-
- `TransactionComposer.simulate()``SendAtomicTransactionComposerResults`
67+
- `TransactionComposer.send()``SendTransactionComposerResults`
68+
- `TransactionComposer.simulate()``SendTransactionComposerResults`
6969
2. **AlgorandClient Methods**
7070
- `.send.payment()``SendSingleTransactionResult`
7171
- `.send.asset_create()``SendSingleAssetCreateTransactionResult`
@@ -110,7 +110,7 @@ Key differences between result types:
110110
- Focus on transaction confirmation details
111111
- Include group support but optimized for single transactions
112112
- No direct ABI value parsing
113-
2. **Atomic Transaction Results** (`SendAtomicTransactionComposerResults`)
113+
2. **Atomic Transaction Results** (`SendTransactionComposerResults`)
114114
- Built for transaction groups
115115
- Include simulation support
116116
- Raw ABI returns via `.returns`

docs/source/capabilities/transaction.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Transaction management is one of the core capabilities provided by AlgoKit Utils
44

55
## Transaction Results
66

7-
All AlgoKit Utils functions that send transactions return either a `SendSingleTransactionResult` or `SendAtomicTransactionComposerResults`, providing consistent mechanisms to interpret transaction outcomes.
7+
All AlgoKit Utils functions that send transactions return either a `SendSingleTransactionResult` or `SendTransactionComposerResults`, providing consistent mechanisms to interpret transaction outcomes.
88

99
### SendSingleTransactionResult
1010

@@ -30,13 +30,13 @@ Common variations include:
3030
- `SendAppUpdateTransactionResult` - Adds compilation results
3131
- `SendAppCreateTransactionResult` - Adds `app_id` and `app_address`
3232

33-
### SendAtomicTransactionComposerResults
33+
### SendTransactionComposerResults
3434

35-
When using the atomic transaction composer directly via `TransactionComposer.send()` or `TransactionComposer.simulate()`, you'll receive a `SendAtomicTransactionComposerResults`:
35+
When using the atomic transaction composer directly via `TransactionComposer.send()` or `TransactionComposer.simulate()`, you'll receive a `SendTransactionComposerResults`:
3636

3737
```python
3838
@dataclass
39-
class SendAtomicTransactionComposerResults:
39+
class SendTransactionComposerResults:
4040
group_id: str # The group ID if this was a transaction group
4141
confirmations: list[AlgodResponseType] # The confirmation info for each transaction
4242
tx_ids: list[str] # The transaction IDs that were sent
@@ -65,8 +65,8 @@ Different interfaces return different result types:
6565

6666
1. **Direct Transaction Composer**
6767

68-
- `TransactionComposer.send()``SendAtomicTransactionComposerResults`
69-
- `TransactionComposer.simulate()``SendAtomicTransactionComposerResults`
68+
- `TransactionComposer.send()``SendTransactionComposerResults`
69+
- `TransactionComposer.simulate()``SendTransactionComposerResults`
7070

7171
2. **AlgorandClient Methods**
7272

@@ -118,7 +118,7 @@ Key differences between result types:
118118
- Include group support but optimized for single transactions
119119
- No direct ABI value parsing
120120

121-
2. **Atomic Transaction Results** (`SendAtomicTransactionComposerResults`)
121+
2. **Atomic Transaction Results** (`SendTransactionComposerResults`)
122122

123123
- Built for transaction groups
124124
- Include simulation support

src/algokit_transact/logicsig.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,10 @@ def delegate_multisig(
208208
address_to_signer = {account.addr: account.delegated_lsig_signer for account in signing_accounts}
209209

210210
for subsig in msig.subsignatures:
211-
if subsig.address in address_to_signer:
212-
signature = address_to_signer[subsig.address](self._program, msig_public_key)
213-
msig = apply_multisig_subsignature(msig, subsig.address, signature)
211+
subsig_addr = address_from_public_key(subsig.public_key)
212+
if subsig_addr in address_to_signer:
213+
signature = address_to_signer[subsig_addr](self._program, msig_public_key)
214+
msig = apply_multisig_subsignature(msig, subsig_addr, signature)
214215

215216
self._multisig_signature = msig
216217
self._delegated_address = address_from_multisig_signature(msig)

src/algokit_transact/models/app_call.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ class AppCallTransactionFields:
275275
pass_obj=True,
276276
),
277277
)
278-
access: list[ResourceReference] | None = field(
278+
access_references: list[ResourceReference] | None = field(
279279
default=None,
280280
metadata=wire(
281281
"al",
@@ -291,9 +291,11 @@ def __post_init__(self) -> None:
291291
_normalize_box_reference(self, item) for item in _coerce_box_sequence(self.box_references)
292292
]
293293
object.__setattr__(self, "box_references", normalized_boxes or None)
294-
if self.access:
295-
normalized_access = [_normalize_resource_reference(item) for item in _coerce_resource_sequence(self.access)]
296-
object.__setattr__(self, "access", normalized_access or None)
294+
if self.access_references:
295+
normalized_access = [
296+
_normalize_resource_reference(item) for item in _coerce_resource_sequence(self.access_references)
297+
]
298+
object.__setattr__(self, "access_references", normalized_access or None)
297299

298300

299301
def _coerce_box_sequence(

src/algokit_transact/models/transaction.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class Transaction:
6464
asset_config: AssetConfigTransactionFields | None = field(
6565
default=None, metadata=flatten(AssetConfigTransactionFields, present_if=lambda p: _get_tx_type(p) == "acfg")
6666
)
67-
app_call: AppCallTransactionFields | None = field(
67+
application_call: AppCallTransactionFields | None = field(
6868
default=None, metadata=flatten(AppCallTransactionFields, present_if=lambda p: _get_tx_type(p) == "appl")
6969
)
7070
key_registration: KeyRegistrationTransactionFields | None = field(

src/algokit_transact/multisig.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from collections.abc import Callable, Sequence
55
from functools import cached_property
66

7+
from algokit_common import address_from_public_key
78
from algokit_transact.codec.signed import encode_signed_transaction
89
from algokit_transact.codec.transaction import encode_transaction
910
from algokit_transact.models.signed_transaction import SignedTransaction
@@ -64,9 +65,10 @@ def signer(txn_group: Sequence[AlgokitTransaction], indexes_to_sign: Sequence[in
6465

6566
multisig_sig = base_multisig
6667
for subsig in base_multisig.subsignatures:
67-
if subsig.address in address_to_signer:
68-
signature = address_to_signer[subsig.address](payload)
69-
multisig_sig = apply_multisig_subsignature(multisig_sig, subsig.address, signature)
68+
subsig_addr = address_from_public_key(subsig.public_key)
69+
if subsig_addr in address_to_signer:
70+
signature = address_to_signer[subsig_addr](payload)
71+
multisig_sig = apply_multisig_subsignature(multisig_sig, subsig_addr, signature)
7072

7173
signed = SignedTransaction(
7274
transaction=txn,

src/algokit_transact/ops/validate.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def validate_transaction(transaction: Transaction) -> None:
6363
transaction.payment,
6464
transaction.asset_transfer,
6565
transaction.asset_config,
66-
transaction.app_call,
66+
transaction.application_call,
6767
transaction.key_registration,
6868
transaction.asset_freeze,
6969
transaction.heartbeat,
@@ -79,7 +79,7 @@ def validate_transaction(transaction: Transaction) -> None:
7979
type_label: str | None = None
8080

8181
match transaction:
82-
case Transaction(app_call=app_call) if app_call is not None:
82+
case Transaction(application_call=app_call) if app_call is not None:
8383
issues.extend(validate_app_call_fields(app_call))
8484
type_label = "App call"
8585
case Transaction(asset_config=asset_config) if asset_config is not None:

src/algokit_transact/signing/multisig.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@ def new_multisig_signature(version: int, threshold: int, participants: Iterable[
2020
if threshold == 0 or threshold > len(participants):
2121
raise ValueError("Threshold must be greater than zero and less than or equal to the number of participants")
2222

23-
subsignatures = [MultisigSubsignature(address=address) for address in participants]
23+
subsignatures = [MultisigSubsignature(public_key=public_key_from_address(address)) for address in participants]
2424
return MultisigSignature(version=version, threshold=threshold, subsignatures=subsignatures)
2525

2626

2727
def participants_from_multisig_signature(multisig_signature: MultisigSignature) -> list[str]:
28-
return [subsig.address for subsig in multisig_signature.subsignatures]
28+
return [address_from_public_key(subsig.public_key) for subsig in multisig_signature.subsignatures]
2929

3030

3131
def address_from_multisig_signature(multisig_signature: MultisigSignature) -> str:
3232
prefix = MULTISIG_DOMAIN_SEPARATOR.encode()
33-
participant_keys = [public_key_from_address(subsig.address) for subsig in multisig_signature.subsignatures]
33+
participant_keys = [subsig.public_key for subsig in multisig_signature.subsignatures]
3434

3535
buffer = bytearray()
3636
buffer.extend(prefix)
@@ -50,10 +50,11 @@ def apply_multisig_subsignature(
5050
) -> MultisigSignature:
5151
found = False
5252
updated = []
53+
participant_pk = public_key_from_address(participant)
5354
for subsig in multisig_signature.subsignatures:
54-
if subsig.address == participant:
55+
if subsig.public_key == participant_pk:
5556
found = True
56-
updated.append(MultisigSubsignature(address=subsig.address, signature=signature))
57+
updated.append(MultisigSubsignature(public_key=subsig.public_key, signature=signature))
5758
else:
5859
updated.append(subsig)
5960
if not found:
@@ -75,7 +76,7 @@ def merge_multisignatures(multisig_a: MultisigSignature, multisig_b: MultisigSig
7576
merged_subsigs = []
7677
for subsig_a, subsig_b in zip(multisig_a.subsignatures, multisig_b.subsignatures, strict=False):
7778
signature = subsig_b.signature if subsig_b.signature is not None else subsig_a.signature
78-
merged_subsigs.append(MultisigSubsignature(address=subsig_a.address, signature=signature))
79+
merged_subsigs.append(MultisigSubsignature(public_key=subsig_a.public_key, signature=signature))
7980
return MultisigSignature(
8081
version=multisig_a.version,
8182
threshold=multisig_a.threshold,

0 commit comments

Comments
 (0)