Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions tck/handlers/token.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from hiero_sdk_python.tokens.token_airdrop_claim import TokenClaimAirdropTransaction
from hiero_sdk_python.tokens.token_airdrop_pending_id import PendingAirdropId
from hiero_sdk_python.tokens.token_airdrop_transaction import TokenAirdropTransaction
from hiero_sdk_python.tokens.token_airdrop_transaction_cancel import TokenCancelAirdropTransaction
from hiero_sdk_python.tokens.token_associate_transaction import TokenAssociateTransaction
from hiero_sdk_python.tokens.token_burn_transaction import TokenBurnTransaction
from hiero_sdk_python.tokens.token_create_transaction import TokenCreateTransaction
Expand Down Expand Up @@ -47,6 +48,7 @@
AirdropTokenParams,
AssociateTokenParams,
BurnTokenParams,
CancelAirdropParams,
ClaimTokenParams,
CreateTokenParams,
DeleteTokenParams,
Expand All @@ -67,6 +69,7 @@
AirdropTokenResponse,
AssociateTokenResponse,
BurnTokenResponse,
CancelAirdropResponse,
ClaimTokenResponse,
CreateTokenResponse,
CustomFeeResponse,
Expand Down Expand Up @@ -257,6 +260,52 @@ def create_token(params: CreateTokenParams) -> CreateTokenResponse:
)


def _build_cancel_airdrop_transaction(params: CancelAirdropParams) -> TokenCancelAirdropTransaction:
"""Build a TokenCancelAirdropTransaction from TCK params."""
transaction = TokenCancelAirdropTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT)

sender_id = AccountId.from_string(params.senderAccountId)
receiver_id = AccountId.from_string(params.receiverAccountId)
token_id = TokenId.from_string(params.tokenId)

if params.serialNumbers:
for serial_number in params.serialNumbers:
nft_id = NftId(token_id, int(serial_number))
pending_airdrop = PendingAirdropId(
sender_id,
receiver_id,
nft_id=nft_id,
)
transaction.add_pending_airdrop(pending_airdrop)
else:
pending_airdrop = PendingAirdropId(
sender_id,
receiver_id,
token_id=token_id,
)
transaction.add_pending_airdrop(pending_airdrop)

transaction.set_max_transaction_fee(transaction.get_max_transaction_fee())
transaction.set_transaction_valid_duration(transaction.get_transaction_valid_duration())
return transaction
Comment thread
coderabbitai[bot] marked this conversation as resolved.


@rpc_method("cancelAirdrop")
def cancel_airdrop(params: CancelAirdropParams) -> CancelAirdropResponse:
"""Cancel a token airdrop using TCK cancelAirdrop parameters."""
client = get_client(params.sessionId)

transaction = _build_cancel_airdrop_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 CancelAirdropResponse(status=ResponseCode(receipt.status).name)


def _build_mint_token_transaction(params: MintTokenParams) -> TokenMintTransaction:
"""Build a TokenMintTransaction from TCK params."""
transaction = TokenMintTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT)
Expand Down
29 changes: 29 additions & 0 deletions tck/param/token.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,35 @@ def parse_json_params(cls, params: dict) -> ClaimTokenParams:
)


class CancelAirdropParams(BaseTransactionParams):
"""Request parameters for the cancelAirdrop endpoint."""

senderAccountId: str | None = None
Comment thread
aceppaluni marked this conversation as resolved.
receiverAccountId: str | None = None
tokenId: str | None = None
serialNumbers: list[str] | None = None

@classmethod
def parse_json_params(cls, params: dict) -> CancelAirdropParams:
"""Parse JSON-RPC params into a CancelAirdropParams instance."""
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(
senderAccountId=params.get("senderAccountId"),
receiverAccountId=params.get("receiverAccountId"),
tokenId=params.get("tokenId"),
serialNumbers=params.get("serialNumbers"),
sessionId=parse_session_id(params),
commonTransactionParams=parse_common_transaction_params(params),
)


@dataclass
class GetTokenInfoParams(BaseParams):
"""Request parameters for the getTokenInfo endpoint."""
Expand Down
5 changes: 5 additions & 0 deletions tck/response/token.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@ class ClaimTokenResponse(StatusOnlyResponse):
"""Response payload for claimToken."""


@dataclass
class CancelAirdropResponse(StatusOnlyResponse):
"""Response payload for cancelAirdrop."""


@dataclass
class CustomFeeResponse:
"""Nested custom fee details for getTokenInfo."""
Expand Down
Loading