From 781138e521d6ab7a7074bb03aed564dc9f3ff364 Mon Sep 17 00:00:00 2001 From: aceppaluni Date: Tue, 30 Jun 2026 16:09:38 -0400 Subject: [PATCH 1/2] feat: Add RejctToken to TCK Signed-off-by: aceppaluni --- tck/handlers/token.py | 37 +++++++++++++++++++++++++++++++++++++ tck/param/token.py | 30 ++++++++++++++++++++++++++++++ tck/response/token.py | 5 +++++ 3 files changed, 72 insertions(+) diff --git a/tck/handlers/token.py b/tck/handlers/token.py index a66b4b01e..e56414b30 100644 --- a/tck/handlers/token.py +++ b/tck/handlers/token.py @@ -23,6 +23,7 @@ from hiero_sdk_python.tokens.token_id import TokenId from hiero_sdk_python.tokens.token_mint_transaction import TokenMintTransaction from hiero_sdk_python.tokens.token_pause_transaction import TokenPauseTransaction +from hiero_sdk_python.tokens.token_reject_transaction import TokenRejectTransaction from hiero_sdk_python.tokens.token_type import TokenType from hiero_sdk_python.transaction.transaction_receipt import TransactionReceipt from tck.handlers.registry import rpc_method @@ -36,6 +37,7 @@ FreezeTokenParams, MintTokenParams, PauseTokenParams, + RejectTokenParams, ) from tck.response.token import ( AirdropTokenResponse, @@ -46,6 +48,7 @@ FreezeTokenResponse, MintTokenResponse, PauseTokenResponse, + RejectTokenResponse, ) from tck.util.client_utils import get_client from tck.util.constants import DEFAULT_GRPC_TIMEOUT @@ -478,3 +481,37 @@ def claim_token(params: ClaimTokenParams) -> ClaimTokenResponse: receipt: TransactionReceipt = response.get_receipt(client, validate_status=True) return ClaimTokenResponse(status=ResponseCode(receipt.status).name) + + +def _build_reject_token_transaction( + params: RejectTokenParams, +) -> TokenRejectTransaction: + transaction = TokenRejectTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT) + + if params.ownerId: + transaction.set_owner_id(AccountId.from_string(params.ownerId)) + + if params.tokenIds: + transaction.set_token_ids([TokenId.from_string(token) for token in params.tokenIds]) + + if params.serialNumbers: + transaction.set_nft_ids([NftId.from_string(serial) for serial in params.serialNumbers]) + + return transaction + + +@rpc_method("rejectToken") +def reject_token(params: RejectTokenParams) -> RejectTokenResponse: + client = get_client(params.sessionId) + + transaction = _build_reject_token_transaction(params) + + if params.commonTransactionParams is not None: + params.commonTransactionParams.apply_common_params(transaction, params.commonTransactionParams) + + response = transaction.execute(client, wait_for_receipt=False) + receipt = response.get_receipt(client, validate_status=True) + + return RejectTokenResponse( + status=ResponseCode(receipt.status).name, + ) diff --git a/tck/param/token.py b/tck/param/token.py index fe34cc7c3..b0c43930e 100644 --- a/tck/param/token.py +++ b/tck/param/token.py @@ -232,3 +232,33 @@ def parse_json_params(cls, params: dict) -> ClaimTokenParams: sessionId=parse_session_id(params), commonTransactionParams=parse_common_transaction_params(params), ) + + +@dataclass +class RejectTokenParams(BaseTransactionParams): + ownerId: str | None = None + tokenIds: list[str] | None = None + serialNumbers: list[str] | None = None + + @classmethod + def parse_json_params(cls, params: dict) -> RejectTokenParams: + token_ids = params.get("tokenIds") + if token_ids is not None and ( + not isinstance(token_ids, list) or not all(isinstance(token_id, str) for token_id in token_ids) + ): + raise ValueError("tokenIds must be a list of strings") + + serial_numbers = params.get("serialNumbers") + if serial_numbers is not None and ( + not isinstance(serial_numbers, list) + or not all(isinstance(serial_number, str) for serial_number in serial_numbers) + ): + raise ValueError("serialNumbers must be a list of strings") + + return cls( + ownerId=params.get("ownerId"), + tokenIds=token_ids, + serialNumbers=serial_numbers, + sessionId=parse_session_id(params), + commonTransactionParams=parse_common_transaction_params(params), + ) diff --git a/tck/response/token.py b/tck/response/token.py index e124f91ec..bb7535ae0 100644 --- a/tck/response/token.py +++ b/tck/response/token.py @@ -34,6 +34,11 @@ class DeleteTokenResponse(StatusOnlyResponse): """Response payload for deleteToken.""" +@dataclass +class RejectTokenResponse(StatusOnlyResponse): + """Response payload for rejectToken.""" + + @dataclass class FreezeTokenResponse(StatusOnlyResponse): """Response payload for freezeToken.""" From 1af88ecc3eab29080422f4244c7c1a60044f2b35 Mon Sep 17 00:00:00 2001 From: aceppaluni Date: Wed, 1 Jul 2026 14:23:57 -0400 Subject: [PATCH 2/2] fix: Apply Suggestion Signed-off-by: aceppaluni --- tck/handlers/token.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tck/handlers/token.py b/tck/handlers/token.py index e56414b30..079d4cb2d 100644 --- a/tck/handlers/token.py +++ b/tck/handlers/token.py @@ -488,14 +488,22 @@ def _build_reject_token_transaction( ) -> TokenRejectTransaction: transaction = TokenRejectTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT) - if params.ownerId: + if params.ownerId is not None: transaction.set_owner_id(AccountId.from_string(params.ownerId)) - if params.tokenIds: - transaction.set_token_ids([TokenId.from_string(token) for token in params.tokenIds]) - if params.serialNumbers: - transaction.set_nft_ids([NftId.from_string(serial) for serial in params.serialNumbers]) + nft_ids = [ + NftId( + TokenId.from_string(params.tokenIds[0]), + int(serial_number), + ) + for serial_number in params.serialNumbers + ] + + transaction.set_nft_ids(nft_ids) + + elif params.tokenIds: + transaction.set_token_ids([TokenId.from_string(token) for token in params.tokenIds]) return transaction @@ -507,7 +515,7 @@ def reject_token(params: RejectTokenParams) -> RejectTokenResponse: transaction = _build_reject_token_transaction(params) if params.commonTransactionParams is not None: - params.commonTransactionParams.apply_common_params(transaction, params.commonTransactionParams) + params.commonTransactionParams.apply_common_params(transaction, client) response = transaction.execute(client, wait_for_receipt=False) receipt = response.get_receipt(client, validate_status=True)