From aebec6f130377a189f2189cfed8776e639df3c77 Mon Sep 17 00:00:00 2001 From: aceppaluni Date: Wed, 15 Jul 2026 12:17:54 -0400 Subject: [PATCH 1/2] feat: Adds RejctToken in 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 ce1f0bb2a..440112b0d 100644 --- a/tck/handlers/token.py +++ b/tck/handlers/token.py @@ -30,6 +30,7 @@ from hiero_sdk_python.tokens.token_mint_transaction import TokenMintTransaction from hiero_sdk_python.tokens.token_pause_status import TokenPauseStatus 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_revoke_kyc_transaction import TokenRevokeKycTransaction from hiero_sdk_python.tokens.token_type import TokenType from hiero_sdk_python.transaction.transaction_receipt import TransactionReceipt @@ -46,6 +47,7 @@ GrantTokenKycParams, MintTokenParams, PauseTokenParams, + RejectTokenParams, RevokeTokenKycParams, ) from tck.response.token import ( @@ -60,6 +62,7 @@ GrantTokenKycResponse, MintTokenResponse, PauseTokenResponse, + RejectTokenResponse, RevokeTokenKycResponse, ) from tck.util.client_utils import get_client @@ -699,3 +702,37 @@ def get_token_info(params: GetTokenInfoParams) -> GetTokenInfoResponse: info = query.execute(client) return _build_token_info_response(info) + + +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 d5294edf0..a7a38a20b 100644 --- a/tck/param/token.py +++ b/tck/param/token.py @@ -287,3 +287,33 @@ def parse_json_params(cls, params: dict) -> GetTokenInfoParams: maxQueryPayment=params.get("maxQueryPayment"), sessionId=parse_session_id(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 25a845fa6..f9213f8d1 100644 --- a/tck/response/token.py +++ b/tck/response/token.py @@ -49,6 +49,11 @@ class RevokeTokenKycResponse(StatusOnlyResponse): """Response payload for revokeTokenKyc.""" +@dataclass +class RejectTokenResponse(StatusOnlyResponse): + """Response payload for rejectToken.""" + + @dataclass class PauseTokenResponse(StatusOnlyResponse): """Response payload for pauseToken.""" From 9b3df0695ffcecd362597123fe660f0ef742c859 Mon Sep 17 00:00:00 2001 From: aceppaluni Date: Thu, 16 Jul 2026 13:32:18 -0400 Subject: [PATCH 2/2] fix: If conditional in Rejct Token Signed-off-by: aceppaluni --- tck/handlers/token.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tck/handlers/token.py b/tck/handlers/token.py index 440112b0d..cfaef0021 100644 --- a/tck/handlers/token.py +++ b/tck/handlers/token.py @@ -709,14 +709,21 @@ 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 is not None and params.tokenIds is not None: + nft_ids = [] - if params.serialNumbers: - transaction.set_nft_ids([NftId.from_string(serial) for serial in params.serialNumbers]) + for token_id in params.tokenIds: + nft_ids.extend( + NftId(TokenId.from_string(token_id), int(serial_number)) for serial_number in params.serialNumbers + ) + + transaction.set_nft_ids(nft_ids) + + elif params.tokenIds is not None: + transaction.set_token_ids([TokenId.from_string(token) for token in params.tokenIds]) return transaction @@ -728,7 +735,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)