network.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from dataclasses import (
  2. dataclass,
  3. )
  4. import json
  5. import os
  6. from typing import (
  7. List,
  8. )
  9. from eth_typing import (
  10. ChainId,
  11. )
  12. from eth_utils import (
  13. ValidationError,
  14. )
  15. @dataclass
  16. class Network:
  17. chain_id: int
  18. name: str
  19. shortName: str
  20. symbol: ChainId
  21. def initialize_network_objects() -> List[Network]:
  22. networks_obj = []
  23. networks_json_path = os.path.abspath(
  24. os.path.join(os.path.dirname(__file__), "__json")
  25. )
  26. with open(
  27. os.path.join(networks_json_path, "eth_networks.json"),
  28. encoding="UTF-8",
  29. ) as open_file:
  30. network_data = json.load(open_file)
  31. for entry in network_data:
  32. try:
  33. network = Network(
  34. chain_id=entry["chainId"],
  35. name=entry["name"],
  36. shortName=entry["shortName"],
  37. symbol=ChainId(entry["chainId"]),
  38. )
  39. networks_obj.append(network)
  40. except ValueError:
  41. # Chain does not have a valid ChainId, network files in eth-utils and
  42. # eth-typing should to be updated. Run `python update_networks.py` in the
  43. # project root.
  44. pass
  45. return networks_obj
  46. networks = initialize_network_objects()
  47. networks_by_id = {network.chain_id: network for network in networks}
  48. network_names_by_id = {network.chain_id: network.name for network in networks}
  49. network_short_names_by_id = {
  50. network.chain_id: network.shortName for network in networks
  51. }
  52. def network_from_chain_id(chain_id: int) -> Network:
  53. try:
  54. return networks_by_id[chain_id]
  55. except KeyError:
  56. raise ValidationError(f"chain_id is not recognized: {chain_id}")
  57. def name_from_chain_id(chain_id: int) -> str:
  58. try:
  59. return network_names_by_id[chain_id]
  60. except KeyError:
  61. raise ValidationError(f"chain_id is not recognized: {chain_id}")
  62. def short_name_from_chain_id(chain_id: int) -> str:
  63. try:
  64. return network_short_names_by_id[chain_id]
  65. except KeyError:
  66. raise ValidationError(f"chain_id is not recognized: {chain_id}")