diff --git a/tck/handlers/token.py b/tck/handlers/token.py index 44cbb42f4..f0eb56592 100644 --- a/tck/handlers/token.py +++ b/tck/handlers/token.py @@ -34,6 +34,7 @@ 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.tokens.token_update_transaction import TokenUpdateTransaction from hiero_sdk_python.tokens.token_wipe_transaction import TokenWipeTransaction from hiero_sdk_python.transaction.transaction_receipt import TransactionReceipt from tck.handlers.registry import rpc_method @@ -52,6 +53,7 @@ PauseTokenParams, RejectTokenParams, RevokeTokenKycParams, + UpdateTokenParams, WipeTokenParams, ) from tck.response.token import ( @@ -69,6 +71,7 @@ PauseTokenResponse, RejectTokenResponse, RevokeTokenKycResponse, + UpdateTokenResponse, WipeTokenResponse, ) from tck.util.client_utils import get_client @@ -781,6 +784,80 @@ def reject_token(params: RejectTokenParams) -> RejectTokenResponse: ) +def _build_update_token_transaction(params: UpdateTokenParams) -> TokenUpdateTransaction: + """Build a TokenUpdateTransaction from TCK params.""" + transaction = TokenUpdateTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT) + + if params.tokenId is not None: + transaction.set_token_id(TokenId.from_string(params.tokenId)) + + if params.name is not None: + transaction.set_token_name(params.name) + + if params.symbol is not None: + transaction.set_token_symbol(params.symbol) + + if params.treasuryAccountId is not None: + transaction.set_treasury_account_id(AccountId.from_string(params.treasuryAccountId)) + + if params.adminKey is not None: + transaction.set_admin_key(get_key_from_string(params.adminKey)) + + if params.kycKey is not None: + transaction.set_kyc_key(get_key_from_string(params.kycKey)) + + if params.freezeKey is not None: + transaction.set_freeze_key(get_key_from_string(params.freezeKey)) + + if params.wipeKey is not None: + transaction.set_wipe_key(get_key_from_string(params.wipeKey)) + + if params.supplyKey is not None: + transaction.set_supply_key(get_key_from_string(params.supplyKey)) + + if params.feeScheduleKey is not None: + transaction.set_fee_schedule_key(get_key_from_string(params.feeScheduleKey)) + + if params.pauseKey is not None: + transaction.set_pause_key(get_key_from_string(params.pauseKey)) + + if params.metadataKey is not None: + transaction.set_metadata_key(get_key_from_string(params.metadataKey)) + + if params.memo is not None: + transaction.set_token_memo(params.memo) + + if params.expirationTime is not None: + transaction.set_expiration_time(Timestamp(seconds=to_int(params.expirationTime), nanos=0)) + + if params.autoRenewAccountId is not None: + transaction.set_auto_renew_account_id(AccountId.from_string(params.autoRenewAccountId)) + + if params.autoRenewPeriod is not None: + transaction.set_auto_renew_period(Duration(seconds=to_int(params.autoRenewPeriod))) + + if params.metadata is not None: + transaction.set_metadata(params.metadata.encode()) + + return transaction + + +@rpc_method("updateToken") +def update_token(params: UpdateTokenParams) -> UpdateTokenResponse: + """Update a token using TCK updateToken parameters.""" + client = get_client(params.sessionId) + + transaction = _build_update_token_transaction(params) + + if params.commonTransactionParams is not None: + params.commonTransactionParams.apply_common_params(transaction, client) + + response = transaction.execute(client, wait_for_receipt=False) + receipt: TransactionReceipt = response.get_receipt(client, validate_status=True) + + return UpdateTokenResponse(status=ResponseCode(receipt.status).name) + + def _build_wipe_token_transaction(params: WipeTokenParams) -> TokenWipeTransaction: """Build a TokenWipeTransaction from TCK params.""" diff --git a/tck/param/token.py b/tck/param/token.py index 3dba5dbbc..b4de005f1 100644 --- a/tck/param/token.py +++ b/tck/param/token.py @@ -376,3 +376,51 @@ def parse_json_params(cls, params: dict) -> WipeTokenParams: sessionId=parse_session_id(params), commonTransactionParams=parse_common_transaction_params(params), ) + + +@dataclass +class UpdateTokenParams(BaseTransactionParams): + """Request parameters for the updateToken endpoint.""" + + tokenId: str | None = None + name: str | None = None + symbol: str | None = None + treasuryAccountId: str | None = None + adminKey: str | None = None + kycKey: str | None = None + freezeKey: str | None = None + wipeKey: str | None = None + supplyKey: str | None = None + feeScheduleKey: str | None = None + pauseKey: str | None = None + metadataKey: str | None = None + memo: str | None = None + expirationTime: str | None = None + autoRenewAccountId: str | None = None + autoRenewPeriod: str | None = None + metadata: str | None = None + + @classmethod + def parse_json_params(cls, params: dict) -> UpdateTokenParams: + """Parse JSON-RPC params into an UpdateTokenParams instance.""" + return cls( + tokenId=params.get("tokenId"), + name=params.get("name"), + symbol=params.get("symbol"), + treasuryAccountId=params.get("treasuryAccountId"), + adminKey=params.get("adminKey"), + kycKey=params.get("kycKey"), + freezeKey=params.get("freezeKey"), + wipeKey=params.get("wipeKey"), + supplyKey=params.get("supplyKey"), + feeScheduleKey=params.get("feeScheduleKey"), + pauseKey=params.get("pauseKey"), + metadataKey=params.get("metadataKey"), + memo=params.get("memo"), + expirationTime=params.get("expirationTime"), + autoRenewAccountId=params.get("autoRenewAccountId"), + autoRenewPeriod=params.get("autoRenewPeriod"), + metadata=params.get("metadata"), + sessionId=parse_session_id(params), + commonTransactionParams=parse_common_transaction_params(params), + ) diff --git a/tck/response/token.py b/tck/response/token.py index 6c633c818..16c904d05 100644 --- a/tck/response/token.py +++ b/tck/response/token.py @@ -122,3 +122,8 @@ class GetTokenInfoResponse: @dataclass class WipeTokenResponse(StatusOnlyResponse): """Response payload for wipeToken.""" + + +@dataclass +class UpdateTokenResponse(StatusOnlyResponse): + """Response payload for updateToken."""