Skip to content

Commit 07be7f6

Browse files
authored
feat(tck): Implement claimToken functionality with request and response models (hiero-ledger#2393)
Signed-off-by: Ntege Daniel <danientege785@gmail.com>
1 parent 2f1705a commit 07be7f6

3 files changed

Lines changed: 82 additions & 0 deletions

File tree

tck/handlers/token.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from hiero_sdk_python.tokens.fee_assessment_method import FeeAssessmentMethod
1414
from hiero_sdk_python.tokens.nft_id import NftId
1515
from hiero_sdk_python.tokens.supply_type import SupplyType
16+
from hiero_sdk_python.tokens.token_airdrop_claim import TokenClaimAirdropTransaction
17+
from hiero_sdk_python.tokens.token_airdrop_pending_id import PendingAirdropId
1618
from hiero_sdk_python.tokens.token_airdrop_transaction import TokenAirdropTransaction
1719
from hiero_sdk_python.tokens.token_associate_transaction import TokenAssociateTransaction
1820
from hiero_sdk_python.tokens.token_create_transaction import TokenCreateTransaction
@@ -28,6 +30,7 @@
2830
from tck.param.token import (
2931
AirdropTokenParams,
3032
AssociateTokenParams,
33+
ClaimTokenParams,
3134
CreateTokenParams,
3235
DeleteTokenParams,
3336
FreezeTokenParams,
@@ -37,6 +40,7 @@
3740
from tck.response.token import (
3841
AirdropTokenResponse,
3942
AssociateTokenResponse,
43+
ClaimTokenResponse,
4044
CreateTokenResponse,
4145
DeleteTokenResponse,
4246
FreezeTokenResponse,
@@ -429,3 +433,48 @@ def airdrop_token(params: AirdropTokenParams) -> AirdropTokenResponse:
429433
)
430434

431435
return AirdropTokenResponse(status=ResponseCode(receipt.status).name)
436+
437+
438+
def _build_claim_token_transaction(params: ClaimTokenParams) -> TokenClaimAirdropTransaction:
439+
"""Build a TokenClaimAirdropTransaction from TCK params."""
440+
transaction = TokenClaimAirdropTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT)
441+
442+
sender_id = AccountId.from_string(params.senderAccountId)
443+
receiver_id = AccountId.from_string(params.receiverAccountId)
444+
token_id = TokenId.from_string(params.tokenId)
445+
446+
if params.serialNumbers:
447+
for serial_number in params.serialNumbers:
448+
transaction.add_pending_airdrop_id(
449+
PendingAirdropId(
450+
sender_id=sender_id,
451+
receiver_id=receiver_id,
452+
nft_id=NftId(token_id=token_id, serial_number=int(serial_number)),
453+
)
454+
)
455+
else:
456+
transaction.add_pending_airdrop_id(
457+
PendingAirdropId(
458+
sender_id=sender_id,
459+
receiver_id=receiver_id,
460+
token_id=token_id,
461+
)
462+
)
463+
464+
return transaction
465+
466+
467+
@rpc_method("claimToken")
468+
def claim_token(params: ClaimTokenParams) -> ClaimTokenResponse:
469+
"""Claim pending token airdrops using TCK claimToken parameters."""
470+
client = get_client(params.sessionId)
471+
472+
transaction = _build_claim_token_transaction(params)
473+
474+
if params.commonTransactionParams is not None:
475+
params.commonTransactionParams.apply_common_params(transaction, client)
476+
477+
response = transaction.execute(client, wait_for_receipt=False)
478+
receipt: TransactionReceipt = response.get_receipt(client, validate_status=True)
479+
480+
return ClaimTokenResponse(status=ResponseCode(receipt.status).name)

tck/param/token.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,31 @@ def parse_json_params(cls, params: dict) -> AirdropTokenParams:
204204
sessionId=parse_session_id(params),
205205
commonTransactionParams=parse_common_transaction_params(params),
206206
)
207+
208+
209+
@dataclass
210+
class ClaimTokenParams(BaseTransactionParams):
211+
"""Request parameters for the claimToken endpoint."""
212+
213+
senderAccountId: str | None = None
214+
receiverAccountId: str | None = None
215+
tokenId: str | None = None
216+
serialNumbers: list[str] | None = None
217+
218+
@classmethod
219+
def parse_json_params(cls, params: dict) -> ClaimTokenParams:
220+
"""Parse JSON-RPC params into a ClaimTokenParams instance."""
221+
serial_numbers = params.get("serialNumbers")
222+
if serial_numbers is not None and not isinstance(serial_numbers, list):
223+
raise ValueError("serialNumbers must be a list")
224+
if serial_numbers is not None and any(not isinstance(serial_number, str) for serial_number in serial_numbers):
225+
raise ValueError("each serialNumbers item must be a string")
226+
227+
return cls(
228+
senderAccountId=params.get("senderAccountId"),
229+
receiverAccountId=params.get("receiverAccountId"),
230+
tokenId=params.get("tokenId"),
231+
serialNumbers=serial_numbers,
232+
sessionId=parse_session_id(params),
233+
commonTransactionParams=parse_common_transaction_params(params),
234+
)

tck/response/token.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,8 @@ class PauseTokenResponse(StatusOnlyResponse):
4747
@dataclass
4848
class AirdropTokenResponse(StatusOnlyResponse):
4949
"""Response payload for airdropToken."""
50+
51+
52+
@dataclass
53+
class ClaimTokenResponse(StatusOnlyResponse):
54+
"""Response payload for claimToken."""

0 commit comments

Comments
 (0)