Skip to content

Commit 51ec711

Browse files
committed
Merge remote-tracking branch 'origin/feat/mainsail' into refactor/class-based-slot-module
2 parents 291e0f4 + 4be49a0 commit 51ec711

File tree

20 files changed

+222
-213
lines changed

20 files changed

+222
-213
lines changed

crypto/configuration/network.py

Lines changed: 18 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,26 @@
1-
from datetime import datetime
2-
from typing import Type, TypedDict, Union
3-
from crypto.networks.mainnet import Mainnet
1+
from crypto.networks.abstract_network import AbstractNetwork
42
from crypto.networks.testnet import Testnet
53

6-
class NetworkType(TypedDict):
7-
epoch: datetime
8-
wif: str
9-
chain_id: int
4+
class Network:
5+
_network: AbstractNetwork
106

11-
network: NetworkType = {
12-
'epoch': Testnet.epoch,
13-
'wif': Testnet.wif,
14-
'chain_id': Testnet.chain_id,
15-
}
7+
@classmethod
8+
def set_network(cls, network: AbstractNetwork) -> None:
9+
"""Set what network you want to use in the crypto library
1610
17-
def set_network(network_object: Union[Type[Mainnet], Type[Testnet]]) -> None:
18-
"""Set what network you want to use in the crypto library
11+
Args:
12+
network_object: Testnet, Devnet, Mainnet
13+
"""
1914

20-
Args:
21-
network_object: Testnet, Devnet, Mainnet
22-
"""
23-
global network
15+
cls._network = network
2416

25-
network = {
26-
'epoch': network_object.epoch,
27-
'wif': network_object.wif,
28-
'chain_id': network_object.chain_id,
29-
}
17+
@classmethod
18+
def get_network(cls) -> AbstractNetwork:
19+
"""Get settings for a selected network
3020
31-
def get_network() -> NetworkType:
32-
"""Get settings for a selected network, default network is devnet
21+
Returns:
22+
AbstractNetwork: network settings (default network is testnet)
23+
"""
24+
return cls._network
3325

34-
Returns:
35-
dict: network settings (default network is devnet)
36-
"""
37-
return network
38-
39-
def set_custom_network(epoch: datetime, wif: str, chain_id: int) -> None:
40-
"""Set custom network
41-
42-
Args:
43-
epoch (datetime): chains epoch time
44-
wif (str): chains wif
45-
chain_id (int): chain id
46-
"""
47-
global network
48-
49-
network = {
50-
'epoch': epoch,
51-
'wif': wif,
52-
'chain_id': chain_id
53-
}
26+
Network.set_network(Testnet())

crypto/identity/address.py

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,76 +4,81 @@
44
from crypto.identity.private_key import PrivateKey
55

66
from Cryptodome.Hash import keccak
7-
from coincurve import PrivateKey, PublicKey
7+
from coincurve import PublicKey
88

9-
def get_checksum_address(address: str) -> str:
10-
"""Get checksum address
9+
class Address:
10+
@classmethod
11+
def from_public_key(cls, public_key: str) -> str:
12+
"""Get an address from a public key
1113
12-
Args:
13-
address (str): address to get checksum
14+
Args:
15+
public_key (str): public key to get address
1416
15-
Returns:
16-
str: checksum address
17-
"""
18-
address = address.lower()
17+
Returns:
18+
str: address
19+
"""
1920

20-
chars = list(address[2:])
21+
public_key_bytes = PublicKey(bytes.fromhex(public_key)).format(compressed=False)[1:]
2122

22-
expanded = bytearray(40)
23-
for i in range(40):
24-
expanded[i] = ord(chars[i])
23+
keccak_hash = keccak.new(
24+
data=bytearray.fromhex(public_key_bytes.hex()),
25+
digest_bits=256,
26+
)
2527

26-
hashed = keccak.new(data=bytes(expanded), digest_bits=256).digest()
28+
return cls.get_checksum_address(unhexlify(keccak_hash.hexdigest()[22:]).hex())
2729

28-
for i in range(0, 40, 2):
29-
if (hashed[i >> 1] >> 4) >= 8:
30-
chars[i] = chars[i].upper()
31-
if (hashed[i >> 1] & 0x0F) >= 8:
32-
chars[i + 1] = chars[i + 1].upper()
30+
@classmethod
31+
def from_private_key(cls, private_key: str) -> str:
32+
"""Get an address from private key
3333
34-
return "0x" + ''.join(chars)
34+
Args:
35+
private_key (string): private key to get address
3536
36-
def address_from_public_key(public_key: str) -> str:
37-
"""Get an address from a public key
37+
Returns:
38+
str: address
39+
"""
40+
private_key_object = PrivateKey.from_hex(private_key)
3841

39-
Args:
40-
public_key (str): public key to get address
42+
return cls.from_public_key(private_key_object.public_key)
4143

42-
Returns:
43-
str: address
44-
"""
44+
@classmethod
45+
def from_passphrase(cls, passphrase: str) -> str:
46+
"""Get an address from passphrase
4547
46-
public_key_bytes = PublicKey(bytes.fromhex(public_key)).format(compressed=False)[1:]
48+
Args:
49+
passphrase (str): passphrase to get address
4750
48-
keccak_hash = keccak.new(
49-
data=bytearray.fromhex(public_key_bytes.hex()),
50-
digest_bits=256,
51-
)
51+
Returns:
52+
str: address
53+
"""
54+
private_key = hashlib.sha256(passphrase.encode()).hexdigest()
5255

53-
return get_checksum_address(unhexlify(keccak_hash.hexdigest()[22:]).hex())
56+
return cls.from_private_key(private_key)
5457

55-
def address_from_private_key(private_key: str) -> str:
56-
"""Get an address from private key
58+
@classmethod
59+
def get_checksum_address(cls, address: str) -> str:
60+
"""Get checksum address
5761
58-
Args:
59-
private_key (string): private key to get address
62+
Args:
63+
address (str): address to get checksum
6064
61-
Returns:
62-
str: address
63-
"""
64-
private_key_object = PrivateKey.from_hex(private_key)
65+
Returns:
66+
str: checksum address
67+
"""
68+
address = address.lower()
6569

66-
return address_from_public_key(private_key_object.public_key.format(compressed=False).hex())
70+
chars = list(address[2:])
6771

68-
def address_from_passphrase(passphrase: str) -> str:
69-
"""Get an address from passphrase
72+
expanded = bytearray(40)
73+
for i in range(40):
74+
expanded[i] = ord(chars[i])
7075

71-
Args:
72-
passphrase (str): passphrase to get address
76+
hashed = keccak.new(data=bytes(expanded), digest_bits=256).digest()
7377

74-
Returns:
75-
str: address
76-
"""
77-
private_key = hashlib.sha256(passphrase.encode()).hexdigest()
78+
for i in range(0, 40, 2):
79+
if (hashed[i >> 1] >> 4) >= 8:
80+
chars[i] = chars[i].upper()
81+
if (hashed[i >> 1] & 0x0F) >= 8:
82+
chars[i + 1] = chars[i + 1].upper()
7883

79-
return address_from_private_key(private_key)
84+
return "0x" + ''.join(chars)

crypto/identity/private_key.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from Cryptodome.Hash import keccak
55
from base58 import b58decode
66

7-
from crypto.configuration.network import get_network
7+
from crypto.configuration.network import Network
88
from crypto.enums.constants import Constants
99

1010
class PrivateKey(object):
@@ -76,7 +76,7 @@ def from_wif(cls, wif: str):
7676
wif = b58decode(wif).hex()
7777

7878
version = wif[0:2]
79-
if version != get_network()['wif']:
79+
if version != Network.get_network().wif():
8080
raise ValueError(f"Invalid network version: {version}")
8181

8282
private_key = wif[2:66]

crypto/identity/public_key.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ class PublicKey(object):
88
def __init__(self, public_key: str):
99
self.public_key = PubKey(unhexlify(public_key.encode()))
1010

11-
def to_hex(self) -> str:
12-
return hexlify(self.public_key.format()).decode()
13-
1411
@classmethod
1512
def from_passphrase(cls, passphrase: str) -> str:
1613
private_key = PrivateKey.from_passphrase(passphrase)

crypto/identity/wif.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from binary.unsigned_integer.writer import write_bit8
77

8-
from crypto.configuration.network import get_network
8+
from crypto.configuration.network import Network
99

1010
def wif_from_passphrase(passphrase: str, network_wif: Optional[str] = None):
1111
"""Get wif from passphrase
@@ -18,9 +18,9 @@ def wif_from_passphrase(passphrase: str, network_wif: Optional[str] = None):
1818
string: wif
1919
"""
2020
if not network_wif:
21-
network = get_network()
21+
network = Network.get_network()
2222

23-
network_wif = network['wif']
23+
network_wif = network.wif()
2424

2525
private_key = hashlib.sha256(passphrase.encode())
2626
seed = write_bit8(int(network_wif, 16)) + private_key.digest() + write_bit8(0x01)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from abc import ABC, abstractmethod
2+
3+
class AbstractNetwork(ABC):
4+
@abstractmethod
5+
def chain_id(self) -> int:
6+
"""Return the chain ID of the network."""
7+
8+
@abstractmethod
9+
def epoch(self) -> str:
10+
"""Return the epoch time of the network."""
11+
12+
@abstractmethod
13+
def wif(self) -> str:
14+
"""Return the WIF (Wallet Import Format) of the network."""

crypto/networks/mainnet.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
from datetime import datetime
1+
from crypto.networks.abstract_network import AbstractNetwork
22

3-
class Mainnet(object):
4-
epoch = datetime(2017, 3, 21, 13, 00, 00)
5-
wif = 'ba'
6-
chain_id = 10000
3+
class Mainnet(AbstractNetwork):
4+
def chain_id(self):
5+
return 10000
6+
7+
def epoch(self):
8+
return '2017-03-21T13:00:00.000Z'
9+
10+
def wif(self):
11+
return 'ba'

crypto/networks/testnet.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
from datetime import datetime
1+
from crypto.networks.abstract_network import AbstractNetwork
22

3-
class Testnet(object):
4-
epoch = datetime(2017, 3, 21, 13, 00, 00)
5-
wif = 'ba'
6-
chain_id = 10000
3+
class Testnet(AbstractNetwork):
4+
def chain_id(self):
5+
return 10000
6+
7+
def epoch(self):
8+
return '2017-03-21T13:00:00.000Z'
9+
10+
def wif(self):
11+
return 'ba'

crypto/transactions/builder/base.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from typing import Optional
2-
from crypto.configuration.network import get_network
1+
from crypto.configuration.network import Network
32
from crypto.identity.private_key import PrivateKey
43
from crypto.transactions.types.abstract_transaction import AbstractTransaction
54

@@ -11,7 +10,7 @@ def __init__(self, data: dict):
1110
'senderPublicKey': '',
1211
'gasPrice': '5',
1312
'nonce': '1',
14-
'network': get_network()['chain_id'],
13+
'network': Network.get_network().chain_id(),
1514
'gasLimit': 1_000_000,
1615
'data': '',
1716

0 commit comments

Comments
 (0)