66import pathlib
77import re
88
9+ from algokit_common import address_from_public_key , sha512_256
910from algokit_utils .clients import AlgodClient , algod_models
1011from algokit_utils .transact import get_transaction_id , make_basic_account_transaction_signer
1112from algokit_utils .transactions .builders .asset import build_asset_create_transaction
1819
1920logger = logging .getLogger (__name__ )
2021
21- # Constants for Algorand address validation
22- ALGORAND_ADDRESS_LENGTH = 58
23- ALGORAND_ADDRESS_DECODED_LENGTH = 36 # 32 bytes address + 4 bytes checksum
24-
25-
26- def _encode_address_from_bytes (digest : bytes ) -> str :
27- """
28- Encode an address from a 32-byte digest using Algorand address encoding.
29-
30- Args:
31- digest: 32-byte hash digest
32-
33- Returns:
34- str: Base32-encoded address with checksum
35- """
36- # Standard Algorand checksum uses sha512_256, taking last 4 bytes
37- h = hashlib .new ("sha512_256" )
38- h .update (digest )
39- checksum = h .digest ()[- 4 :]
40- address_bytes = digest + checksum
41- # Base32 encode without padding
42- encoded = base64 .b32encode (address_bytes ).decode ("utf-8" )
43- # Remove padding
44- return encoded .rstrip ("=" )
45-
46-
47- def _is_valid_address (address : str ) -> bool :
48- """
49- Validate an Algorand address.
50-
51- Args:
52- address: The address string to validate
53-
54- Returns:
55- bool: True if valid, False otherwise
56- """
57- if len (address ) != ALGORAND_ADDRESS_LENGTH :
58- return False
59- try :
60- # Add padding back for base32 decoding
61- padding_needed = (8 - len (address ) % 8 ) % 8
62- padded = address + "=" * padding_needed
63- decoded = base64 .b32decode (padded )
64-
65- if len (decoded ) != ALGORAND_ADDRESS_DECODED_LENGTH :
66- return False
67-
68- addr_hash = decoded [:32 ]
69- checksum = decoded [32 :]
70-
71- # Standard Algorand checksum uses sha512_256, taking last 4 bytes
72- h = hashlib .new ("sha512_256" )
73- h .update (addr_hash )
74- expected_checksum = h .digest ()[- 4 :]
75- return checksum == expected_checksum
76- except Exception :
77- return False
78-
7922
8023def _reserve_address_from_cid (cid : str ) -> str :
8124 """
@@ -91,9 +34,7 @@ def _reserve_address_from_cid(cid: str) -> str:
9134 # Workaround to fix `multiformats` package issue, remove first two bytes before using `encode_address`.
9235 # Initial fix using `py-multiformats-cid` and `multihash.decode` was dropped due to PEP 517 incompatibility.
9336 digest = CID .decode (cid ).digest [2 :]
94- reserve_address = _encode_address_from_bytes (digest )
95- assert _is_valid_address (reserve_address )
96- return reserve_address
37+ return address_from_public_key (digest )
9738
9839
9940def _create_url_from_cid (cid : str ) -> str :
@@ -205,24 +146,15 @@ def _compute_metadata_hash(
205146 return b""
206147
207148 json_metadata = token_metadata .to_json ()
149+ json_metadata_bytes = json_metadata .encode ("utf-8" )
208150 metadata = json .loads (json_metadata )
209151
210152 if "extra_metadata" in metadata :
211- h = hashlib .new ("sha512_256" )
212- h .update (b"arc0003/amj" )
213- h .update (json_metadata .encode ("utf-8" ))
214- json_metadata_hash = h .digest ()
215-
216- h = hashlib .new ("sha512_256" )
217- h .update (b"arc0003/am" )
153+ json_metadata_hash = sha512_256 (b"arc0003/amj" + json_metadata_bytes )
218154
219- h .update (json_metadata_hash )
220- h .update (base64 .b64decode (metadata ["extra_metadata" ]))
221- return h .digest ()
155+ return sha512_256 (b"arc0003/am" + json_metadata_hash + base64 .b64decode (metadata ["extra_metadata" ]))
222156 else :
223- h = hashlib .new ("sha256" )
224- h .update (json_metadata .encode ("utf-8" ))
225- return h .digest ()
157+ return hashlib .sha256 (json_metadata_bytes ).digest ()
226158
227159
228160def mint_token ( # noqa: PLR0913
0 commit comments