Skip to content

Commit 0495363

Browse files
feat(tck): implement createFile JSON-RPC method (hiero-ledger#2500)
Signed-off-by: iron-prog <dt915725@gmail.com> Signed-off-by: Deepak Tiwari <dt915725@gmail.com> Co-authored-by: Manish Dait <90558243+manishdait@users.noreply.github.com>
1 parent cc09d03 commit 0495363

4 files changed

Lines changed: 102 additions & 0 deletions

File tree

tck/handlers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from . import (
66
account,
77
allowance,
8+
file,
89
key,
910
sdk, # setup, reset
1011
token,

tck/handlers/file.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from __future__ import annotations
2+
3+
from hiero_sdk_python.file.file_create_transaction import FileCreateTransaction
4+
from hiero_sdk_python.response_code import ResponseCode
5+
from hiero_sdk_python.timestamp import Timestamp
6+
from hiero_sdk_python.transaction.transaction_receipt import TransactionReceipt
7+
from tck.errors import JsonRpcError
8+
from tck.handlers.registry import rpc_method
9+
from tck.param.file import CreateFileParams
10+
from tck.response.file import CreateFileResponse
11+
from tck.util.client_utils import get_client
12+
from tck.util.constants import DEFAULT_GRPC_TIMEOUT
13+
from tck.util.key_utils import get_key_from_string
14+
from tck.util.param_utils import to_int
15+
16+
17+
def _build_create_file_transaction(params: CreateFileParams) -> FileCreateTransaction:
18+
transaction = FileCreateTransaction().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT)
19+
20+
if params.keys is not None:
21+
transaction.set_keys([get_key_from_string(key) for key in params.keys])
22+
23+
if params.contents is not None:
24+
transaction.set_contents(params.contents)
25+
26+
if params.expirationTime is not None:
27+
expiration_time = to_int(params.expirationTime)
28+
if expiration_time is None:
29+
raise JsonRpcError.invalid_params_error("expirationTime must be an integer")
30+
transaction.set_expiration_time(Timestamp(seconds=expiration_time, nanos=0))
31+
32+
if params.memo is not None:
33+
transaction.set_file_memo(params.memo)
34+
35+
return transaction
36+
37+
38+
@rpc_method("createFile")
39+
def create_file(params: CreateFileParams) -> CreateFileResponse:
40+
"""Create a file."""
41+
client = get_client(params.sessionId)
42+
43+
transaction = _build_create_file_transaction(params)
44+
45+
if params.commonTransactionParams is not None:
46+
params.commonTransactionParams.apply_common_params(transaction, client)
47+
48+
response = transaction.execute(client, wait_for_receipt=False)
49+
receipt: TransactionReceipt = response.get_receipt(client, validate_status=True)
50+
51+
file_id = ""
52+
if receipt.status == ResponseCode.SUCCESS and receipt.file_id is not None:
53+
file_id = str(receipt.file_id)
54+
55+
return CreateFileResponse(file_id, ResponseCode(receipt.status).name)

tck/param/file.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from __future__ import annotations
2+
3+
from dataclasses import dataclass
4+
5+
from tck.param.base import BaseTransactionParams
6+
from tck.util.param_utils import parse_common_transaction_params, parse_session_id
7+
8+
9+
@dataclass
10+
class CreateFileParams(BaseTransactionParams):
11+
"""Parameters for creating a file. Extends BaseTransactionParams to include common transaction parameters."""
12+
13+
keys: list[str] | None = None
14+
contents: str | None = None
15+
expirationTime: str | None = None
16+
memo: str | None = None
17+
18+
@classmethod
19+
def parse_json_params(cls, params: dict) -> CreateFileParams:
20+
keys = params.get("keys")
21+
if keys is not None:
22+
if not isinstance(keys, list):
23+
raise ValueError("keys must be a list")
24+
for key in keys:
25+
if not isinstance(key, str) or not key.strip():
26+
raise ValueError("keys must be a list of non-empty strings")
27+
28+
return cls(
29+
keys=keys,
30+
contents=params.get("contents"),
31+
expirationTime=params.get("expirationTime"),
32+
memo=params.get("memo"),
33+
sessionId=parse_session_id(params),
34+
commonTransactionParams=parse_common_transaction_params(params),
35+
)

tck/response/file.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from __future__ import annotations
2+
3+
from dataclasses import dataclass
4+
5+
6+
@dataclass
7+
class CreateFileResponse:
8+
"""Response payload for createFile."""
9+
10+
fileId: str | None = None
11+
status: str | None = None

0 commit comments

Comments
 (0)