Skip to content

Commit 7234b03

Browse files
committed
fix: validate id types and copy id lists in TokenRejectTransaction
Signed-off-by: cheese-cakee <farzanaman99@gmail.com>
1 parent 0bd2ff1 commit 7234b03

2 files changed

Lines changed: 69 additions & 4 deletions

File tree

src/hiero_sdk_python/tokens/token_reject_transaction.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ def __init__(
5252
"""
5353
super().__init__()
5454
self.owner_id: AccountId | None = owner_id
55-
self.token_ids: list[TokenId] = token_ids if token_ids else []
56-
self.nft_ids: list[NftId] = nft_ids if nft_ids else []
55+
self.token_ids: list[TokenId] = list(token_ids) if token_ids else []
56+
self.nft_ids: list[NftId] = list(nft_ids) if nft_ids else []
5757

5858
def set_owner_id(self, owner_id: AccountId) -> TokenRejectTransaction:
5959
"""Set the owner account ID for rejected tokens."""
@@ -64,7 +64,7 @@ def set_owner_id(self, owner_id: AccountId) -> TokenRejectTransaction:
6464
def set_token_ids(self, token_ids: list[TokenId]) -> TokenRejectTransaction:
6565
"""Set the list of fungible token IDs to reject."""
6666
self._require_not_frozen()
67-
self.token_ids = token_ids
67+
self.token_ids = list(token_ids)
6868
return self
6969

7070
def add_token_id(self, token_id: TokenId) -> TokenRejectTransaction:
@@ -76,15 +76,20 @@ def add_token_id(self, token_id: TokenId) -> TokenRejectTransaction:
7676
7777
Returns:
7878
TokenRejectTransaction: This transaction instance (for chaining).
79+
80+
Raises:
81+
TypeError: If token_id is not a TokenId instance.
7982
"""
8083
self._require_not_frozen()
84+
if not isinstance(token_id, TokenId):
85+
raise TypeError("token_id must be a TokenId instance.")
8186
self.token_ids.append(token_id)
8287
return self
8388

8489
def set_nft_ids(self, nft_ids: list[NftId]) -> TokenRejectTransaction:
8590
"""Set the list of NFT IDs to reject."""
8691
self._require_not_frozen()
87-
self.nft_ids = nft_ids
92+
self.nft_ids = list(nft_ids)
8893
return self
8994

9095
def add_nft_id(self, nft_id: NftId) -> TokenRejectTransaction:
@@ -96,8 +101,13 @@ def add_nft_id(self, nft_id: NftId) -> TokenRejectTransaction:
96101
97102
Returns:
98103
TokenRejectTransaction: This transaction instance (for chaining).
104+
105+
Raises:
106+
TypeError: If nft_id is not a NftId instance.
99107
"""
100108
self._require_not_frozen()
109+
if not isinstance(nft_id, NftId):
110+
raise TypeError("nft_id must be a NftId instance.")
101111
self.nft_ids.append(nft_id)
102112
return self
103113

tests/unit/token_reject_transaction_test.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,61 @@ def test_add_methods_require_not_frozen(mock_account_ids, nft_id, mock_client):
200200
reject_tx.add_nft_id(nft_id)
201201

202202

203+
def test_add_token_id_rejects_invalid_type(mock_account_ids):
204+
"""Test that add_token_id rejects a value that is not a TokenId instance."""
205+
_, _, _, token_id, _ = mock_account_ids
206+
nft_id = NftId(token_id=token_id, serial_number=1)
207+
208+
reject_tx = TokenRejectTransaction()
209+
210+
with pytest.raises(TypeError, match="token_id must be a TokenId instance."):
211+
reject_tx.add_token_id(nft_id)
212+
213+
with pytest.raises(TypeError, match="token_id must be a TokenId instance."):
214+
reject_tx.add_token_id("0.0.100")
215+
216+
# The invalid inputs must not have been appended.
217+
assert reject_tx.token_ids == []
218+
219+
220+
def test_add_nft_id_rejects_invalid_type(mock_account_ids):
221+
"""Test that add_nft_id rejects a value that is not a NftId instance."""
222+
_, _, _, token_id, _ = mock_account_ids
223+
224+
reject_tx = TokenRejectTransaction()
225+
226+
with pytest.raises(TypeError, match="nft_id must be a NftId instance."):
227+
reject_tx.add_nft_id(token_id)
228+
229+
with pytest.raises(TypeError, match="nft_id must be a NftId instance."):
230+
reject_tx.add_nft_id("0.0.100")
231+
232+
# The invalid inputs must not have been appended.
233+
assert reject_tx.nft_ids == []
234+
235+
236+
def test_add_id_methods_do_not_mutate_caller_lists(mock_account_ids):
237+
"""Test that add_token_id/add_nft_id do not mutate lists passed to the constructor."""
238+
_, _, _, token_id_1, token_id_2 = mock_account_ids
239+
nft_id_1 = NftId(token_id=token_id_1, serial_number=1)
240+
nft_id_2 = NftId(token_id=token_id_1, serial_number=2)
241+
242+
token_ids = [token_id_1]
243+
nft_ids = [nft_id_1]
244+
245+
reject_tx = TokenRejectTransaction(token_ids=token_ids, nft_ids=nft_ids)
246+
reject_tx.add_token_id(token_id_2)
247+
reject_tx.add_nft_id(nft_id_2)
248+
249+
# The transaction reflects the appended IDs.
250+
assert reject_tx.token_ids == [token_id_1, token_id_2]
251+
assert reject_tx.nft_ids == [nft_id_1, nft_id_2]
252+
253+
# The caller's original lists remain untouched.
254+
assert token_ids == [token_id_1]
255+
assert nft_ids == [nft_id_1]
256+
257+
203258
def test_reject_transaction_can_execute(mock_account_ids):
204259
"""Test that a reject transaction can be executed successfully."""
205260
account_id, owner_account_id, _, token_id, _ = mock_account_ids

0 commit comments

Comments
 (0)