Skip to content

Commit 19e5cf1

Browse files
committed
chore: updated default network
Signed-off-by: Manish Dait <daitmanish88@gmail.com>
1 parent 381b6b3 commit 19e5cf1

5 files changed

Lines changed: 135 additions & 11 deletions

File tree

src/hiero_sdk_python/client/client.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
)
1919
from hiero_sdk_python.hbar import Hbar
2020
from hiero_sdk_python.logger.logger import Logger, LogLevel
21+
from hiero_sdk_python.node import _Node
2122
from hiero_sdk_python.transaction.transaction_id import TransactionId
2223

2324
from .network import Network
@@ -152,6 +153,22 @@ def for_previewnet(cls) -> Client:
152153
"""
153154
return cls(Network("previewnet"))
154155

156+
@classmethod
157+
def for_network(cls, network_map: dict[str, AccountId], network_name: str | None = "localhost") -> Client:
158+
"""
159+
Create a Client with a custom set of nodes and an optional network label.
160+
161+
Args:
162+
network_map (dict[str, AccountId]): A map where keys are "host:port" strings
163+
and values are the node's AccountId.
164+
network_name (str): A label for the network. Defaults to "localhost".
165+
166+
Returns:
167+
Client: A Client instance configured with the custom network.
168+
"""
169+
nodes = [_Node(account_id, address, None) for address, account_id in network_map.items()]
170+
return cls(Network(network=network_name, nodes=nodes))
171+
155172
def _init_mirror_stub(self) -> None:
156173
"""
157174
Connect to a mirror node for topic message subscriptions.

src/hiero_sdk_python/client/network.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class Network:
7373

7474
def __init__(
7575
self,
76-
network: str = "testnet",
76+
network: str | None = None,
7777
nodes: list[_Node] | None = None,
7878
mirror_address: str | None = None,
7979
ledger_id: bytes | None = None,
@@ -96,7 +96,7 @@ def __init__(
9696
Certificate verification is enabled by default for all networks.
9797
Use Client.set_transport_security() and Client.set_verify_certificates() to customize.
9898
"""
99-
self.network: str = network or "testnet"
99+
self.network: str = network or "localhost"
100100
self.mirror_address: str = mirror_address or self.MIRROR_ADDRESS_DEFAULT.get(network, "localhost:5600")
101101

102102
self.ledger_id = ledger_id or self.LEDGER_ID.get(network, bytes.fromhex("03"))
@@ -128,7 +128,8 @@ def _set_network_nodes(self, nodes: list[_Node] | None = None):
128128

129129
# Apply TLS configuration to all nodes
130130
for node in final_nodes:
131-
node._apply_transport_security(self._transport_security) # pylint: disable=protected-access
131+
if self._transport_security:
132+
node._apply_transport_security(self._transport_security) # pylint: disable=protected-access
132133
node._set_verify_certificates(self._verify_certificates) # pylint: disable=protected-access
133134
node._set_root_certificates(self._root_certificates) # pylint: disable=protected-access
134135

tck/handlers/sdk.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

3-
from hiero_sdk_python import AccountId, Client, Network, PrivateKey
4-
from hiero_sdk_python.node import _Node
3+
from hiero_sdk_python import AccountId, Client, PrivateKey
54
from tck.handlers.registry import rpc_method
65
from tck.param.base import BaseParams
76
from tck.param.sdk import SetupParams
@@ -15,11 +14,11 @@ def setup_handler(params: SetupParams) -> SetupResponse:
1514
operator_private_key = PrivateKey.from_string(params.operatorPrivateKey)
1615

1716
if params.nodeIp and params.nodeAccountId and params.mirrorNetworkIp:
18-
client = Client()
19-
client.network = Network(
20-
nodes=[_Node(AccountId.from_string(params.nodeAccountId), params.nodeIp, None)],
21-
mirror_address=params.mirrorNetworkIp,
22-
)
17+
nodes = {params.nodeIp: AccountId.from_string(params.nodeAccountId)}
18+
19+
client = Client.for_network(network_map=nodes)
20+
client.network.mirror_address = params.mirrorNetworkIp
21+
2322
client.set_operator(operator_account_id, operator_private_key)
2423

2524
client_type = "custom"

tests/unit/client_test.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010

1111
import pytest
1212

13-
from hiero_sdk_python import AccountId, Client, PrivateKey
13+
from hiero_sdk_python import AccountId, Client
1414
from hiero_sdk_python.client import client as client_module
15+
from hiero_sdk_python.client.network import Network
16+
from hiero_sdk_python.crypto.private_key import PrivateKey
1517
from hiero_sdk_python.hbar import Hbar
1618
from hiero_sdk_python.node import _Node
1719
from hiero_sdk_python.transaction.transaction_id import TransactionId
@@ -527,3 +529,53 @@ def test_get_node_account_ids_raises_when_no_nodes():
527529
client.get_node_account_ids()
528530

529531
client.close()
532+
533+
534+
def test_for_network_initializes_with_custom_map():
535+
"""Test for_network correctly maps strings to AccountIds and Nodes."""
536+
network_map = {"127.0.0.1:50211": AccountId(0, 0, 3), "127.0.0.1:50212": AccountId(0, 0, 4)}
537+
538+
client = Client.for_network(network_map)
539+
540+
assert isinstance(client.network, Network)
541+
assert len(client.network.nodes) == 2
542+
543+
node_accounts = [node._account_id.__str__() for node in client.network.nodes]
544+
assert "0.0.3" in node_accounts
545+
assert "0.0.4" in node_accounts
546+
547+
548+
@pytest.mark.parametrize("network", ["mainnet", "testnet", "previewnet"])
549+
def test_for_network_with_hosted_network_forces_tls(network):
550+
"""Test that if hosted-net the port 50211 is upgraded to 50212."""
551+
network_map = {"34.94.106.61:50211": AccountId(0, 0, 3)}
552+
client = Client.for_network(network_map, network_name=network)
553+
554+
node = client.network.nodes[0]
555+
assert str(node._address) == "34.94.106.61:50212"
556+
assert node._address._is_transport_security() is True
557+
assert client.network.is_transport_security() is True
558+
559+
560+
@pytest.mark.parametrize("network", ["local", "localhost", "solo", "custom", None])
561+
def test_for_network_with_non_hosted_network_not_forces_tls(network):
562+
"""Test that if non hosted-net the port 50211 does not change."""
563+
network_map = {"127.0.0.1:50211": AccountId(0, 0, 3)}
564+
client = Client.for_network(network_map, network_name=network)
565+
566+
node = client.network.nodes[0]
567+
assert str(node._address) == "127.0.0.1:50211"
568+
assert node._address._is_transport_security() is False
569+
assert client.network.is_transport_security() is False
570+
571+
572+
@pytest.mark.parametrize("network", ["local", "localhost", "solo", "custom", None])
573+
def test_for_network_with_non_hosted_network_not_downgrade_tls(network):
574+
"""Test that if non hosted-net the port 50212 does not change."""
575+
network_map = {"127.0.0.1:50212": AccountId(0, 0, 3)}
576+
client = Client.for_network(network_map, network_name=network)
577+
578+
node = client.network.nodes[0]
579+
assert str(node._address) == "127.0.0.1:50212"
580+
assert node._address._is_transport_security() is True
581+
assert client.network.is_transport_security() is False # Non hosted network.

tests/unit/network_test.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,3 +449,58 @@ def test_resolve_nodes_fallback_to_default(monkeypatch):
449449
assert all(isinstance(n, _Node) for n in resolved_nodes)
450450
assert len(resolved_nodes) == expected_count
451451
assert resolved_nodes[0]._account_id == network.DEFAULT_NODES[network_name][0][1]
452+
453+
454+
def test_network_default_is_local():
455+
"""Test that a new Network defaults to localhost and non-tls."""
456+
network = Network()
457+
assert network.network == "localhost"
458+
assert network._transport_security is False
459+
460+
461+
@pytest.mark.parametrize("network", ["mainnet", "previewnet", "testnet"])
462+
def test_self_hosted_net_auto_converts_port_50211_to_50212(network):
463+
"""Test that self hosted port 50211 is upgraded to 50212 and TLS is enabled."""
464+
node_50211 = _Node(AccountId(0, 0, 3), "34.94.106.61:50211", None)
465+
466+
network = Network(network=network, nodes=[node_50211])
467+
468+
assert ":50212" in str(network.nodes[0]._address)
469+
assert network.nodes[0]._address._is_transport_security() is True
470+
assert network._transport_security is True
471+
472+
473+
@pytest.mark.parametrize("network", ["mainnet", "previewnet", "testnet"])
474+
def test_self_hosted_network_respect_port_50212(network):
475+
"""Test that on self hosted network respect port 50212"""
476+
node_50211 = _Node(AccountId(0, 0, 3), "127.0.0.1:50212", None)
477+
478+
network = Network(network=network, nodes=[node_50211])
479+
480+
assert ":50212" in str(network.nodes[0]._address)
481+
assert network.nodes[0]._address._is_transport_security() is True
482+
assert network._transport_security is True
483+
484+
485+
@pytest.mark.parametrize("network", ["local", "localhost", "solo", "custom", None])
486+
def test_non_hosted_network_respects_port_50211(network):
487+
"""Test that on non-hosted network, port 50211 stays 50211 and remains non-tls."""
488+
node_50211 = _Node(AccountId(0, 0, 3), "127.0.0.1:50211", None)
489+
490+
network = Network(network=None, nodes=[node_50211])
491+
492+
assert ":50211" in str(network.nodes[0]._address)
493+
assert network.nodes[0]._address._is_transport_security() is False
494+
assert network._transport_security is False
495+
496+
497+
@pytest.mark.parametrize("network", ["local", "localhost", "solo", "custom", None])
498+
def test_non_hosted_network_respect_port_50212(network):
499+
"""Test that on non hosted network respect port 50212"""
500+
node_50211 = _Node(AccountId(0, 0, 3), "127.0.0.1:50212", None)
501+
502+
network = Network(network=network, nodes=[node_50211])
503+
504+
assert ":50212" in str(network.nodes[0]._address)
505+
assert network.nodes[0]._address._is_transport_security() is True
506+
assert network._transport_security is False

0 commit comments

Comments
 (0)