def METHOD_NAME(node_operator_address: Address, validators_file_path: Path, reward_address: Union[Address, None]) -> Tuple[str, int]:
    validators_file = ValidatorsFile(validators_file_path)
    num_of_nodes = validators_file.get_num_of_nodes()
    validators_list = validators_file.get_validators_list()
    call_arguments: List[Any] = []
    call_arguments.append(num_of_nodes)
    for validator in validators_list:
        # Get path of "pemFile", make it absolute
        validator_pem = Path(validator.get("pemFile")).expanduser()
        validator_pem = validator_pem if validator_pem.is_absolute() else validators_file_path.parent / validator_pem
        pem_file = ValidatorPEM.from_file(validator_pem)
        validator_signer = ValidatorSigner(pem_file.secret_key)
        message = ArbitraryMessage(bytes.fromhex(node_operator_address.hex()))
        signed_message = validator_signer.sign(message).hex()
        call_arguments.append(f"0x{pem_file.secret_key.generate_public_key().hex()}")
        call_arguments.append(f"0x{signed_message}")
    if reward_address:
        call_arguments.append(f"0x{reward_address.hex()}")
    data = SmartContract().prepare_execute_transaction_data("stake", call_arguments)
    gas_limit = estimate_system_sc_call(str(data), MetaChainSystemSCsCost.STAKE, num_of_nodes)
    return str(data), gas_limit