Skip to content

Commit f7d7747

Browse files
committed
refactor: simplify mint implementation
1 parent 2868e43 commit f7d7747

File tree

1 file changed

+6
-74
lines changed

1 file changed

+6
-74
lines changed

src/algokit/core/tasks/mint/mint.py

Lines changed: 6 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import pathlib
77
import re
88

9+
from algokit_common import address_from_public_key, sha512_256
910
from algokit_utils.clients import AlgodClient, algod_models
1011
from algokit_utils.transact import get_transaction_id, make_basic_account_transaction_signer
1112
from algokit_utils.transactions.builders.asset import build_asset_create_transaction
@@ -18,64 +19,6 @@
1819

1920
logger = 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

8023
def _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

9940
def _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

228160
def mint_token( # noqa: PLR0913

0 commit comments

Comments
 (0)