Source code for credmark.cmf.types.network

# pylint: disable=invalid-name, non-ascii-name
from enum import IntEnum
from itertools import chain
from typing import Any, DefaultDict, Generic, Iterable, TypeVar, Union


[docs]class Network(IntEnum): Mainnet = 1 Ropsten = 3 Rinkeby = 4 Görli = 5 Optimism = 10 Kovan = 42 BSC = 56 BSCTestnet = 97 xDai = 100 Polygon = 137 Fantom = 250 ArbitrumOne = 42161 Avalanche = 43114 def __str__(self): return str(self.value) @property def chain_id(self): return self.value @property def has_ledger(self): return self in [Network.Mainnet] @property def has_dex_price(self): return self in [Network.Mainnet, Network.BSC, Network.Polygon] @property def has_node(self): return self in [Network.Mainnet, Network.BSC, Network.Polygon, Network.ArbitrumOne, Network.Optimism, Network.Avalanche, Network.Fantom] @property def is_testnet(self): return self in [Network.Rinkeby, Network.Ropsten, Network.Görli, Network.Kovan, Network.BSCTestnet] @property def uses_geth_poa(self): return self in [Network.Rinkeby, Network.BSC, Network.Polygon, Network.Optimism, Network.Avalanche] @classmethod def parse_network(cls, n: Any) -> "Network": if isinstance(n, str): if not n.isdigit(): raise KeyError(f'Network {n} is not a valid network') n = int(n) if isinstance(n, int): n = Network(n) return n
NetworkKey = Union[Network, str, int] T = TypeVar('T') _T = TypeVar('_T')
[docs]class NetworkDict(DefaultDict[Network, T], Generic[T]): ''' A dictionary with network as key. It implements a defaultdict to make it easier to provide default values for missing networks. Key can be Network enum, int or int as str. ``` d = NetworkDict(list, { Network.Mainnet: [1, 2, 3], Network.Ropsten: [4, 5, 6], }) print(d[Network.Mainnet]) # [1, 2, 3] print(d[1]) # [1, 2, 3] print(d["1"]) # [1, 2, 3] print(d[Network.Optimism]) # [] d[Network.Optimism].append(10) print(d[Network.Optimism]) # [10] ``` ''' @staticmethod def _process_args(mapping=(), **kwargs): if hasattr(mapping, 'items'): mapping = mapping.items() return ((Network.parse_network(k), v) for k, v in chain(mapping, kwargs.items())) def __setitem__(self, k: NetworkKey, v: T): super().__setitem__(Network.parse_network(k), v) def __getitem__(self, k: NetworkKey): return super().__getitem__(Network.parse_network(k)) def __delitem__(self, k: NetworkKey): super().__delitem__(Network.parse_network(k)) def __contains__(self, k: NetworkKey): return super().__contains__(Network.parse_network(k)) def __missing__(self, k: NetworkKey): return super().__missing__(Network.parse_network(k)) def get(self, k: NetworkKey, default: Union[T, _T] = None) -> Union[T, _T]: return super().get(Network.parse_network(k), default) def pop(self, k: NetworkKey, default: Union[T, _T] = None) -> Union[T, _T]: return super().pop(Network.parse_network(k), default) def setdefault(self, k: NetworkKey, v: T): super().setdefault(Network.parse_network(k), v) def update(self, mapping: Iterable[tuple[NetworkKey, T]] = (), **kwargs): print('update') super().update(self._process_args(mapping, **kwargs)) @classmethod def fromkeys(cls, keys: Iterable[NetworkKey], v: _T = None) -> "NetworkDict[_T]": raise Exception("fromkeys is incompatible with defaultdict")
CREDMARK_PUBLIC_PROVIDERS = { str(Network.Mainnet): "https://nodes.credmark.com/1", str(Network.Optimism): "https://nodes.credmark.com/10", str(Network.BSC): "https://nodes.credmark.com/56", str(Network.Polygon): "https://nodes.credmark.com/137", str(Network.Fantom): "https://nodes.credmark.com/250", str(Network.ArbitrumOne): "https://nodes.credmark.com/42161", str(Network.Avalanche): "https://nodes.credmark.com/43114", }