evmchains 0.0.9__tar.gz → 0.0.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {evmchains-0.0.9 → evmchains-0.0.11}/.github/workflows/test.yaml +1 -1
  2. {evmchains-0.0.9 → evmchains-0.0.11}/PKG-INFO +4 -3
  3. {evmchains-0.0.9 → evmchains-0.0.11}/README.md +2 -2
  4. evmchains-0.0.11/evmchains/__init__.py +50 -0
  5. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains/_meta.py +2 -2
  6. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains/chains.py +162 -64
  7. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains.egg-info/PKG-INFO +4 -3
  8. {evmchains-0.0.9 → evmchains-0.0.11}/pyproject.toml +1 -0
  9. {evmchains-0.0.9 → evmchains-0.0.11}/scripts/update.py +10 -4
  10. evmchains-0.0.11/tests/test_func.py +88 -0
  11. evmchains-0.0.9/evmchains/__init__.py +0 -24
  12. evmchains-0.0.9/tests/test_func.py +0 -28
  13. {evmchains-0.0.9 → evmchains-0.0.11}/.github/workflows/release.yaml +0 -0
  14. {evmchains-0.0.9 → evmchains-0.0.11}/.gitignore +0 -0
  15. {evmchains-0.0.9 → evmchains-0.0.11}/CONTRIBUTING.md +0 -0
  16. {evmchains-0.0.9 → evmchains-0.0.11}/LICENSE +0 -0
  17. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains/py.typed +0 -0
  18. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains/types.py +0 -0
  19. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains.egg-info/SOURCES.txt +0 -0
  20. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains.egg-info/dependency_links.txt +0 -0
  21. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains.egg-info/requires.txt +0 -0
  22. {evmchains-0.0.9 → evmchains-0.0.11}/evmchains.egg-info/top_level.txt +0 -0
  23. {evmchains-0.0.9 → evmchains-0.0.11}/setup.cfg +0 -0
  24. {evmchains-0.0.9 → evmchains-0.0.11}/setup.py +0 -0
@@ -60,7 +60,7 @@ jobs:
60
60
 
61
61
  strategy:
62
62
  matrix:
63
- os: [ubuntu-latest, macos-latest] # eventually add `windows-latest`
63
+ os: [ubuntu-latest, macos-latest, windows-latest]
64
64
  python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
65
65
 
66
66
  steps:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: evmchains
3
- Version: 0.0.9
3
+ Version: 0.0.11
4
4
  Summary: Packaged metadata on Ethereum Virtual Machine (EVM) chains
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -213,6 +213,7 @@ Classifier: License :: OSI Approved :: MIT License
213
213
  Classifier: Natural Language :: English
214
214
  Classifier: Operating System :: MacOS
215
215
  Classifier: Operating System :: POSIX
216
+ Classifier: Operating System :: Microsoft :: Windows
216
217
  Classifier: Programming Language :: Python :: 3
217
218
  Classifier: Programming Language :: Python :: 3.8
218
219
  Classifier: Programming Language :: Python :: 3.9
@@ -238,13 +239,13 @@ Requires-Dist: types-requests>=2.31.0.20240106; extra == "dev"
238
239
 
239
240
  Provides general metadata on EVM-compatible chains organized by Ape-style ecosystem and network.
240
241
 
241
- Original soure data: https://github.com/ethereum-lists/chains
242
+ Original source data: https://github.com/ethereum-lists/chains
242
243
 
243
244
  ## Quick Start
244
245
 
245
246
  ## Dependencies
246
247
 
247
- - [python3](https://www.python.org/downloads) version 3.8 up to 3.11.
248
+ - [python3](https://www.python.org/downloads) version 3.8 up to 3.12.
248
249
 
249
250
  ## Installation
250
251
 
@@ -2,13 +2,13 @@
2
2
 
3
3
  Provides general metadata on EVM-compatible chains organized by Ape-style ecosystem and network.
4
4
 
5
- Original soure data: https://github.com/ethereum-lists/chains
5
+ Original source data: https://github.com/ethereum-lists/chains
6
6
 
7
7
  ## Quick Start
8
8
 
9
9
  ## Dependencies
10
10
 
11
- - [python3](https://www.python.org/downloads) version 3.8 up to 3.11.
11
+ - [python3](https://www.python.org/downloads) version 3.8 up to 3.12.
12
12
 
13
13
  ## Installation
14
14
 
@@ -0,0 +1,50 @@
1
+ import os
2
+ import random
3
+ import re
4
+ from typing import List
5
+
6
+ from evmchains.chains import PUBLIC_CHAIN_META
7
+ from evmchains.types import Chain
8
+
9
+ ENV_VAR_REGEX = re.compile(r"\$\{([A-Za-z0-9_]+)\}")
10
+
11
+
12
+ def get_chain_meta(ecosystem: str, network: str) -> Chain:
13
+ """Return a Chain instance with metadata for an EVM chain"""
14
+ if (
15
+ ecosystem not in PUBLIC_CHAIN_META
16
+ or network not in PUBLIC_CHAIN_META[ecosystem]
17
+ ):
18
+ raise KeyError(f"Unknown ecosystem:network: {ecosystem}:{network}")
19
+
20
+ return Chain(**PUBLIC_CHAIN_META[ecosystem][network])
21
+
22
+
23
+ def get_rpcs(ecosystem: str, network: str) -> List[str]:
24
+ """Get a list of valid RPC endpoints for an ecosystem:network pair"""
25
+ rpcs = []
26
+
27
+ chain = get_chain_meta(ecosystem, network)
28
+
29
+ for rpc in chain.rpc:
30
+ # Look for env var replacements in the endpoint URL
31
+ match = ENV_VAR_REGEX.search(rpc)
32
+ if match:
33
+ to_replace = match.group(0)
34
+ env_var = match.group(1)
35
+ # Include them only if the env var is available
36
+ if env_var in os.environ:
37
+ rpcs.append(rpc.replace(to_replace, os.environ[env_var]))
38
+ else:
39
+ rpcs.append(rpc)
40
+
41
+ return rpcs
42
+
43
+
44
+ def get_random_rpc(ecosystem: str, network: str) -> str:
45
+ """Return a random RPC endpoint for an ecosystem:network pair"""
46
+ rpcs = get_rpcs(ecosystem, network)
47
+ return random.choice(rpcs)
48
+
49
+
50
+ __all__ = ["PUBLIC_CHAIN_META", "Chain", "get_chain_meta", "get_random_rpc", "get_rpcs"]
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.0.9'
16
- __version_tuple__ = version_tuple = (0, 0, 9)
15
+ __version__ = version = '0.0.11'
16
+ __version_tuple__ = version_tuple = (0, 0, 11)
@@ -1,5 +1,5 @@
1
1
  # This file is auto-generated by scripts/update.py
2
- # 2024-05-30 20:30:00.884580
2
+ # 2024-07-03 20:26:21.491217
3
3
  # Do not edit this file directly.
4
4
  from typing import Any, Dict
5
5
 
@@ -253,6 +253,7 @@ PUBLIC_CHAIN_META: Dict[str, Dict[str, Dict[str, Any]]] = {
253
253
  "https://blast.din.dev/rpc",
254
254
  "https://blastl2-mainnet.public.blastapi.io",
255
255
  "https://blast.blockpi.network/v1/rpc/public",
256
+ "https://blast-rpc.publicnode.com",
256
257
  ],
257
258
  "shortName": "blastmainnet",
258
259
  "slip44": None,
@@ -652,6 +653,78 @@ PUBLIC_CHAIN_META: Dict[str, Dict[str, Dict[str, Any]]] = {
652
653
  "slip44": 700,
653
654
  },
654
655
  },
656
+ "linea": {
657
+ "mainnet": {
658
+ "chain": "ETH",
659
+ "chainId": 59144,
660
+ "ens": None,
661
+ "explorers": [
662
+ {
663
+ "icon": "linea",
664
+ "name": "Etherscan",
665
+ "standard": "EIP3091",
666
+ "url": "https://lineascan.build",
667
+ },
668
+ {
669
+ "icon": "linea",
670
+ "name": "Blockscout",
671
+ "standard": "EIP3091",
672
+ "url": "https://explorer.linea.build",
673
+ },
674
+ {
675
+ "icon": "linea",
676
+ "name": "L2scan",
677
+ "standard": "EIP3091",
678
+ "url": "https://linea.l2scan.co",
679
+ },
680
+ ],
681
+ "faucets": [],
682
+ "features": None,
683
+ "icon": "linea",
684
+ "infoURL": "https://linea.build",
685
+ "name": "Linea",
686
+ "nativeCurrency": {"decimals": 18, "name": "Linea Ether", "symbol": "ETH"},
687
+ "networkId": 59144,
688
+ "rpc": [
689
+ "https://rpc.linea.build",
690
+ "https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}",
691
+ ],
692
+ "shortName": "linea",
693
+ "slip44": None,
694
+ },
695
+ "sepolia": {
696
+ "chain": "ETH",
697
+ "chainId": 59141,
698
+ "ens": None,
699
+ "explorers": [
700
+ {
701
+ "icon": "linea",
702
+ "name": "Etherscan",
703
+ "standard": "EIP3091",
704
+ "url": "https://sepolia.lineascan.build",
705
+ },
706
+ {
707
+ "icon": "linea",
708
+ "name": "Blockscout",
709
+ "standard": "EIP3091",
710
+ "url": "https://explorer.sepolia.linea.build",
711
+ },
712
+ ],
713
+ "faucets": [],
714
+ "features": None,
715
+ "icon": "linea",
716
+ "infoURL": "https://linea.build",
717
+ "name": "Linea Sepolia",
718
+ "nativeCurrency": {"decimals": 18, "name": "Linea Ether", "symbol": "ETH"},
719
+ "networkId": 59141,
720
+ "rpc": [
721
+ "https://rpc.sepolia.linea.build",
722
+ "https://linea-sepolia.infura.io/v3/${INFURA_API_KEY}",
723
+ ],
724
+ "shortName": "linea-sepolia",
725
+ "slip44": 1,
726
+ },
727
+ },
655
728
  "optimism": {
656
729
  "mainnet": {
657
730
  "chain": "ETH",
@@ -861,6 +934,31 @@ PUBLIC_CHAIN_META: Dict[str, Dict[str, Dict[str, Any]]] = {
861
934
  "shortName": "maticmum",
862
935
  "slip44": 1,
863
936
  },
937
+ "amoy": {
938
+ "chain": "Polygon",
939
+ "chainId": 80002,
940
+ "ens": None,
941
+ "explorers": [
942
+ {
943
+ "name": "polygonamoy",
944
+ "standard": "EIP3091",
945
+ "url": "https://www.oklink.com/amoy",
946
+ }
947
+ ],
948
+ "faucets": ["https://faucet.polygon.technology/"],
949
+ "features": None,
950
+ "icon": "polygon",
951
+ "infoURL": "https://polygon.technology/",
952
+ "name": "Amoy",
953
+ "nativeCurrency": {"decimals": 18, "name": "MATIC", "symbol": "MATIC"},
954
+ "networkId": 80002,
955
+ "rpc": [
956
+ "https://rpc-amoy.polygon.technology",
957
+ "https://polygon-amoy-bor-rpc.publicnode.com",
958
+ ],
959
+ "shortName": "polygonamoy",
960
+ "slip44": 1,
961
+ },
864
962
  },
865
963
  "polygon-zkevm": {
866
964
  "mainnet": {
@@ -911,78 +1009,28 @@ PUBLIC_CHAIN_META: Dict[str, Dict[str, Dict[str, Any]]] = {
911
1009
  "shortName": "testnet-zkEVM-mango",
912
1010
  "slip44": 1,
913
1011
  },
914
- },
915
- "linea": {
916
- "mainnet": {
917
- "chain": "ETH",
918
- "chainId": 59144,
1012
+ "cardona": {
1013
+ "chain": "Polygon",
1014
+ "chainId": 2442,
919
1015
  "ens": None,
920
1016
  "explorers": [
921
1017
  {
922
- "icon": "linea",
923
- "name": "Etherscan",
924
- "standard": "EIP3091",
925
- "url": "https://lineascan.build",
926
- },
927
- {
928
- "icon": "linea",
929
- "name": "Blockscout",
930
- "standard": "EIP3091",
931
- "url": "https://explorer.linea.build",
932
- },
933
- {
934
- "icon": "linea",
935
- "name": "L2scan",
1018
+ "name": "polygonscan",
936
1019
  "standard": "EIP3091",
937
- "url": "https://linea.l2scan.co",
938
- },
1020
+ "url": "https://cardona-zkevm.polygonscan.com",
1021
+ }
939
1022
  ],
940
1023
  "faucets": [],
941
1024
  "features": None,
942
- "icon": "linea",
943
- "infoURL": "https://linea.build",
944
- "name": "Linea",
945
- "nativeCurrency": {"decimals": 18, "name": "Linea Ether", "symbol": "ETH"},
946
- "networkId": 59144,
947
- "rpc": [
948
- "https://rpc.linea.build",
949
- "https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}",
950
- ],
951
- "shortName": "linea",
1025
+ "icon": "zkevm",
1026
+ "infoURL": "https://polygon.technology/polygon-zkevm",
1027
+ "name": "Polygon zkEVM Cardona Testnet",
1028
+ "nativeCurrency": {"decimals": 18, "name": "Ether", "symbol": "ETH"},
1029
+ "networkId": 2442,
1030
+ "rpc": ["https://rpc.cardona.zkevm-rpc.com"],
1031
+ "shortName": "zkevm-testnet-cardona",
952
1032
  "slip44": None,
953
1033
  },
954
- "sepolia": {
955
- "chain": "ETH",
956
- "chainId": 59141,
957
- "ens": None,
958
- "explorers": [
959
- {
960
- "icon": "linea",
961
- "name": "Etherscan",
962
- "standard": "EIP3091",
963
- "url": "https://sepolia.lineascan.build",
964
- },
965
- {
966
- "icon": "linea",
967
- "name": "Blockscout",
968
- "standard": "EIP3091",
969
- "url": "https://explorer.sepolia.linea.build",
970
- },
971
- ],
972
- "faucets": [],
973
- "features": None,
974
- "icon": "linea",
975
- "infoURL": "https://linea.build",
976
- "name": "Linea Sepolia",
977
- "nativeCurrency": {"decimals": 18, "name": "Linea Ether", "symbol": "ETH"},
978
- "networkId": 59141,
979
- "rpc": [
980
- "https://rpc.sepolia.linea.build",
981
- "https://linea-sepolia.infura.io/v3/${INFURA_API_KEY}",
982
- ],
983
- "shortName": "linea-sepolia",
984
- "slip44": 1,
985
- },
986
1034
  },
987
1035
  "rootstock": {
988
1036
  "mainnet": {
@@ -1047,4 +1095,54 @@ PUBLIC_CHAIN_META: Dict[str, Dict[str, Dict[str, Any]]] = {
1047
1095
  "slip44": 1,
1048
1096
  },
1049
1097
  },
1098
+ "shibarium": {
1099
+ "mainnet": {
1100
+ "chain": "Shibarium",
1101
+ "chainId": 109,
1102
+ "ens": None,
1103
+ "explorers": [
1104
+ {
1105
+ "name": "shibariumscan",
1106
+ "standard": "none",
1107
+ "url": "https://www.shibariumscan.io",
1108
+ }
1109
+ ],
1110
+ "faucets": [],
1111
+ "features": None,
1112
+ "icon": "shibarium",
1113
+ "infoURL": "https://shibariumecosystem.com",
1114
+ "name": "Shibarium",
1115
+ "nativeCurrency": {
1116
+ "decimals": 18,
1117
+ "name": "BONE Shibarium",
1118
+ "symbol": "BONE",
1119
+ },
1120
+ "networkId": 109,
1121
+ "rpc": ["https://www.shibrpc.com"],
1122
+ "shortName": "shibariumecosystem",
1123
+ "slip44": None,
1124
+ },
1125
+ "puppynet": {
1126
+ "chain": "Puppynet Shibarium",
1127
+ "chainId": 157,
1128
+ "ens": None,
1129
+ "explorers": [
1130
+ {
1131
+ "name": "puppyscan",
1132
+ "standard": "none",
1133
+ "url": "https://puppyscan.shib.io",
1134
+ }
1135
+ ],
1136
+ "faucets": ["https://beta.shibariumtech.com/faucet"],
1137
+ "features": None,
1138
+ "icon": "shibarium",
1139
+ "infoURL": "https://shibariumecosystem.com",
1140
+ "name": "Puppynet Shibarium",
1141
+ "nativeCurrency": {"decimals": 18, "name": "BONE", "symbol": "BONE"},
1142
+ "networkId": 157,
1143
+ "rpc": ["https://puppynet.shibrpc.com"],
1144
+ "shortName": "puppynet",
1145
+ "slip44": None,
1146
+ },
1147
+ },
1050
1148
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: evmchains
3
- Version: 0.0.9
3
+ Version: 0.0.11
4
4
  Summary: Packaged metadata on Ethereum Virtual Machine (EVM) chains
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -213,6 +213,7 @@ Classifier: License :: OSI Approved :: MIT License
213
213
  Classifier: Natural Language :: English
214
214
  Classifier: Operating System :: MacOS
215
215
  Classifier: Operating System :: POSIX
216
+ Classifier: Operating System :: Microsoft :: Windows
216
217
  Classifier: Programming Language :: Python :: 3
217
218
  Classifier: Programming Language :: Python :: 3.8
218
219
  Classifier: Programming Language :: Python :: 3.9
@@ -238,13 +239,13 @@ Requires-Dist: types-requests>=2.31.0.20240106; extra == "dev"
238
239
 
239
240
  Provides general metadata on EVM-compatible chains organized by Ape-style ecosystem and network.
240
241
 
241
- Original soure data: https://github.com/ethereum-lists/chains
242
+ Original source data: https://github.com/ethereum-lists/chains
242
243
 
243
244
  ## Quick Start
244
245
 
245
246
  ## Dependencies
246
247
 
247
- - [python3](https://www.python.org/downloads) version 3.8 up to 3.11.
248
+ - [python3](https://www.python.org/downloads) version 3.8 up to 3.12.
248
249
 
249
250
  ## Installation
250
251
 
@@ -18,6 +18,7 @@ classifiers = [
18
18
  "Natural Language :: English",
19
19
  "Operating System :: MacOS",
20
20
  "Operating System :: POSIX",
21
+ "Operating System :: Microsoft :: Windows",
21
22
  "Programming Language :: Python :: 3",
22
23
  "Programming Language :: Python :: 3.8",
23
24
  "Programming Language :: Python :: 3.9",
@@ -56,6 +56,10 @@ CHAIN_IDS = {
56
56
  "gnosis": {
57
57
  "mainnet": 100,
58
58
  },
59
+ "linea": {
60
+ "mainnet": 59144,
61
+ "sepolia": 59141,
62
+ },
59
63
  "optimism": {
60
64
  "mainnet": 10,
61
65
  "goerli": 420,
@@ -68,19 +72,21 @@ CHAIN_IDS = {
68
72
  "polygon": {
69
73
  "mainnet": 137,
70
74
  "mumbai": 80001,
75
+ "amoy": 80002,
71
76
  },
72
77
  "polygon-zkevm": {
73
78
  "mainnet": 1101,
74
79
  "testnet": 1442,
75
- },
76
- "linea": {
77
- "mainnet": 59144,
78
- "sepolia": 59141,
80
+ "cardona": 2442,
79
81
  },
80
82
  "rootstock": {
81
83
  "mainnet": 30,
82
84
  "testnet": 31,
83
85
  },
86
+ "shibarium": {
87
+ "mainnet": 109,
88
+ "puppynet": 157,
89
+ }
84
90
  }
85
91
 
86
92
  pp = PrettyPrinter(indent=4)
@@ -0,0 +1,88 @@
1
+ import os
2
+ from contextlib import contextmanager
3
+
4
+ import pytest
5
+
6
+ from evmchains import PUBLIC_CHAIN_META, Chain, get_chain_meta, get_rpcs
7
+
8
+
9
+ @pytest.fixture()
10
+ def env():
11
+ @contextmanager
12
+ def inner(environ=dict(), unset=list()):
13
+ old_environ = os.environ.copy()
14
+ os.environ.update(environ)
15
+ for key in unset:
16
+ try:
17
+ del os.environ[key]
18
+ except KeyError:
19
+ pass
20
+ yield
21
+ os.environ = old_environ
22
+
23
+ return inner
24
+
25
+
26
+ def test_chain_structure():
27
+ assert "ethereum" in PUBLIC_CHAIN_META
28
+ assert "mainnet" in PUBLIC_CHAIN_META["ethereum"]
29
+
30
+ chain = PUBLIC_CHAIN_META["ethereum"]["mainnet"]
31
+ assert isinstance(chain, dict)
32
+ assert len(chain["rpc"]) > 0
33
+ assert chain["chainId"] == 1
34
+ assert chain["networkId"] == 1
35
+ assert chain["shortName"] == "eth"
36
+ assert chain["name"] == "Ethereum Mainnet"
37
+ assert chain["nativeCurrency"]["symbol"] == "ETH"
38
+ assert len(chain["explorers"]) > 0
39
+
40
+
41
+ def test_get_chain_meta():
42
+ chain = get_chain_meta("arbitrum", "mainnet")
43
+ assert isinstance(chain, Chain)
44
+ assert len(chain.rpc) > 0
45
+ assert chain.chainId == 42161
46
+ assert chain.networkId == 42161
47
+ assert chain.shortName == "arb1"
48
+ assert chain.name == "Arbitrum One"
49
+ assert chain.nativeCurrency["symbol"] == "ETH"
50
+ assert len(chain.explorers) > 0
51
+
52
+
53
+ def test_get_rpcs_alchemy(env):
54
+ alchemy_key = "alchemistsayswhat"
55
+ expected_rpc = f"https://arb-mainnet.g.alchemy.com/v2/{alchemy_key}"
56
+
57
+ def find_rpc(rpcs, expected):
58
+ for rpc in rpcs:
59
+ if rpc == expected:
60
+ return True
61
+ return False
62
+
63
+ with env({"ALCHEMY_API_KEY": alchemy_key}, unset=["INFURA_API_KEY"]):
64
+ rpcs = get_rpcs("arbitrum", "mainnet")
65
+ assert isinstance(rpcs, list)
66
+ assert len(rpcs) > 0
67
+ assert find_rpc(rpcs, expected_rpc)
68
+ # Ensure the infura endpoint was also filtered out
69
+ assert len([rpc for rpc in rpcs if "infura" in rpc]) == 0
70
+
71
+
72
+ def test_get_rpcs_infura(env):
73
+ infura_key = "infuraaaaaa"
74
+ expected_rpc = f"https://arbitrum-mainnet.infura.io/v3/{infura_key}"
75
+
76
+ def find_rpc(rpcs, expected):
77
+ for rpc in rpcs:
78
+ if rpc == expected:
79
+ return True
80
+ return False
81
+
82
+ with env({"INFURA_API_KEY": infura_key}, unset=["ALCHEMY_API_KEY"]):
83
+ rpcs = get_rpcs("arbitrum", "mainnet")
84
+ assert isinstance(rpcs, list)
85
+ assert len(rpcs) > 0
86
+ assert find_rpc(rpcs, expected_rpc)
87
+ # Ensure the alchemy endpoint was also filtered out
88
+ assert len([rpc for rpc in rpcs if "alchemy" in rpc]) == 0
@@ -1,24 +0,0 @@
1
- import random
2
-
3
- from evmchains.chains import PUBLIC_CHAIN_META
4
- from evmchains.types import Chain
5
-
6
-
7
- def get_chain_meta(ecosystem: str, network: str) -> Chain:
8
- """Return a Chain instance with metadata for an EVM chain"""
9
- if (
10
- ecosystem not in PUBLIC_CHAIN_META
11
- or network not in PUBLIC_CHAIN_META[ecosystem]
12
- ):
13
- raise KeyError(f"Unknown ecosystem:network: {ecosystem}:{network}")
14
-
15
- return Chain(**PUBLIC_CHAIN_META[ecosystem][network])
16
-
17
-
18
- def get_random_rpc(ecosystem: str, network: str) -> str:
19
- """Return a random RPC endpoint for an ecosystem:network pair"""
20
- chain = get_chain_meta(ecosystem, network)
21
- return random.choice(chain.rpc)
22
-
23
-
24
- __all__ = ["PUBLIC_CHAIN_META", "Chain", "get_chain_meta"]
@@ -1,28 +0,0 @@
1
- from evmchains import PUBLIC_CHAIN_META, Chain, get_chain_meta
2
-
3
-
4
- def test_chain_structure():
5
- assert "ethereum" in PUBLIC_CHAIN_META
6
- assert "mainnet" in PUBLIC_CHAIN_META["ethereum"]
7
-
8
- chain = PUBLIC_CHAIN_META["ethereum"]["mainnet"]
9
- assert isinstance(chain, dict)
10
- assert len(chain["rpc"]) > 0
11
- assert chain["chainId"] == 1
12
- assert chain["networkId"] == 1
13
- assert chain["shortName"] == "eth"
14
- assert chain["name"] == "Ethereum Mainnet"
15
- assert chain["nativeCurrency"]["symbol"] == "ETH"
16
- assert len(chain["explorers"]) > 0
17
-
18
-
19
- def test_get_chain_meta():
20
- chain = get_chain_meta("arbitrum", "mainnet")
21
- assert isinstance(chain, Chain)
22
- assert len(chain.rpc) > 0
23
- assert chain.chainId == 42161
24
- assert chain.networkId == 42161
25
- assert chain.shortName == "arb1"
26
- assert chain.name == "Arbitrum One"
27
- assert chain.nativeCurrency["symbol"] == "ETH"
28
- assert len(chain.explorers) > 0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes