Skip to content

Commit 8b49e3f

Browse files
authored
feat(tck): implement dissociateToken JSON-RPC method (hiero-ledger#2450)
Signed-off-by: iron-prog <dt915725@gmail.com>
1 parent e8513a2 commit 8b49e3f

3 files changed

Lines changed: 62 additions & 0 deletions

File tree

tck/handlers/token.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from hiero_sdk_python.tokens.token_associate_transaction import TokenAssociateTransaction
2222
from hiero_sdk_python.tokens.token_create_transaction import TokenCreateTransaction
2323
from hiero_sdk_python.tokens.token_delete_transaction import TokenDeleteTransaction
24+
from hiero_sdk_python.tokens.token_dissociate_transaction import TokenDissociateTransaction
2425
from hiero_sdk_python.tokens.token_freeze_status import TokenFreezeStatus
2526
from hiero_sdk_python.tokens.token_freeze_transaction import TokenFreezeTransaction
2627
from hiero_sdk_python.tokens.token_grant_kyc_transaction import TokenGrantKycTransaction
@@ -41,6 +42,7 @@
4142
ClaimTokenParams,
4243
CreateTokenParams,
4344
DeleteTokenParams,
45+
DissociateTokenParams,
4446
FreezeTokenParams,
4547
GetTokenInfoParams,
4648
GrantTokenKycParams,
@@ -55,6 +57,7 @@
5557
CreateTokenResponse,
5658
CustomFeeResponse,
5759
DeleteTokenResponse,
60+
DissociateTokenResponse,
5861
FreezeTokenResponse,
5962
GetTokenInfoResponse,
6063
GrantTokenKycResponse,
@@ -289,6 +292,20 @@ def _build_associate_token_transaction(params: AssociateTokenParams) -> TokenAss
289292
return transaction
290293

291294

295+
def _build_dissociate_token_transaction(params: DissociateTokenParams) -> TokenDissociateTransaction:
296+
"""Build a TokenDissociateTransaction from TCK params."""
297+
transaction = TokenDissociateTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT)
298+
299+
if params.accountId is not None:
300+
transaction.set_account_id(AccountId.from_string(params.accountId))
301+
302+
if params.tokenIds is not None:
303+
token_ids = [TokenId.from_string(tid) for tid in params.tokenIds]
304+
transaction.set_token_ids(token_ids)
305+
306+
return transaction
307+
308+
292309
def _build_delete_token_transaction(params: DeleteTokenParams) -> TokenDeleteTransaction:
293310
"""Build a TokenDeleteTransaction from TCK params."""
294311
transaction = TokenDeleteTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT)
@@ -374,6 +391,22 @@ def delete_token(params: DeleteTokenParams) -> DeleteTokenResponse:
374391
return DeleteTokenResponse(status=ResponseCode(receipt.status).name)
375392

376393

394+
@rpc_method("dissociateToken")
395+
def dissociate_token(params: DissociateTokenParams) -> DissociateTokenResponse:
396+
"""Dissociate tokens from an account using TCK dissociateToken parameters."""
397+
client = get_client(params.sessionId)
398+
399+
transaction = _build_dissociate_token_transaction(params)
400+
401+
if params.commonTransactionParams is not None:
402+
params.commonTransactionParams.apply_common_params(transaction, client)
403+
404+
response = transaction.execute(client, wait_for_receipt=False)
405+
receipt: TransactionReceipt = response.get_receipt(client, validate_status=True)
406+
407+
return DissociateTokenResponse(status=ResponseCode(receipt.status).name)
408+
409+
377410
@rpc_method("freezeToken")
378411
def freeze_token(params: FreezeTokenParams) -> FreezeTokenResponse:
379412
"""Freeze a token for an account using TCK freezeToken parameters."""

tck/param/token.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,30 @@ def parse_json_params(cls, params: dict) -> FreezeTokenParams:
166166
)
167167

168168

169+
@dataclass
170+
class DissociateTokenParams(BaseTransactionParams):
171+
"""Request parameters for the dissociateToken endpoint."""
172+
173+
accountId: str | None = None
174+
tokenIds: list[str] | None = None
175+
176+
@classmethod
177+
def parse_json_params(cls, params: dict) -> DissociateTokenParams:
178+
"""Parse JSON-RPC params into a DissociateTokenParams instance."""
179+
token_ids = params.get("tokenIds")
180+
if token_ids is not None and not isinstance(token_ids, list):
181+
raise ValueError("tokenIds must be a list")
182+
if token_ids is not None and any(not isinstance(token_id, str) for token_id in token_ids):
183+
raise ValueError("each tokenIds item must be a string")
184+
185+
return cls(
186+
accountId=params.get("accountId"),
187+
tokenIds=token_ids,
188+
sessionId=parse_session_id(params),
189+
commonTransactionParams=parse_common_transaction_params(params),
190+
)
191+
192+
169193
@dataclass
170194
class GrantTokenKycParams(BaseTransactionParams):
171195
"""Request parameters for the grantTokenKyc endpoint."""

tck/response/token.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ class DeleteTokenResponse(StatusOnlyResponse):
3434
"""Response payload for deleteToken."""
3535

3636

37+
@dataclass
38+
class DissociateTokenResponse(StatusOnlyResponse):
39+
"""Response payload for dissociateToken."""
40+
41+
3742
@dataclass
3843
class FreezeTokenResponse(StatusOnlyResponse):
3944
"""Response payload for freezeToken."""

0 commit comments

Comments
 (0)