Skip to content

Commit 155502a

Browse files
authored
feat: unit converter (#148)
1 parent 79358b9 commit 155502a

2 files changed

Lines changed: 182 additions & 0 deletions

File tree

crypto/utils/unit_converter.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# import numpy as np
2+
from decimal import Decimal
3+
from typing import Union
4+
5+
class UnitConverter:
6+
WEI_MULTIPLIER = '1'
7+
GWEI_MULTIPLIER = '1000000000' # 1e9
8+
ARK_MULTIPLIER = '1000000000000000000' # 1e18
9+
10+
@staticmethod
11+
def parse_units(value: Union[float, int, str, Decimal], unit='ark') -> str:
12+
value = Decimal(str(value))
13+
14+
unit = unit.lower()
15+
if unit == 'wei':
16+
return format((value * Decimal(UnitConverter.WEI_MULTIPLIER)).normalize(), 'f')
17+
18+
if unit == 'gwei':
19+
return format((value * Decimal(UnitConverter.GWEI_MULTIPLIER)).normalize(), 'f')
20+
21+
if unit == 'ark':
22+
return format((value * Decimal(UnitConverter.ARK_MULTIPLIER)).normalize(), 'f')
23+
24+
raise ValueError(f"Unsupported unit: {unit}. Supported units are 'wei', 'gwei', and 'ark'.")
25+
26+
@staticmethod
27+
def format_units(value: Union[float, int, str, Decimal], unit='ark') -> Decimal:
28+
value = Decimal(str(value))
29+
30+
unit = unit.lower()
31+
if unit == 'wei':
32+
return value / Decimal(UnitConverter.WEI_MULTIPLIER)
33+
34+
if unit == 'gwei':
35+
return value / Decimal(UnitConverter.GWEI_MULTIPLIER)
36+
37+
if unit == 'ark':
38+
return value / Decimal(UnitConverter.ARK_MULTIPLIER)
39+
40+
raise ValueError(f"Unsupported unit: {unit}. Supported units are 'wei', 'gwei', and 'ark'.")
41+
42+
@staticmethod
43+
def wei_to_ark(value: Union[float, int, str, Decimal], suffix=None):
44+
converted_value = UnitConverter.format_units(UnitConverter.parse_units(value, 'wei'), 'ark')
45+
converted_value = format(converted_value.normalize(), 'f')
46+
47+
if suffix is not None:
48+
return f"{converted_value} {suffix}"
49+
50+
return str(converted_value)
51+
52+
@staticmethod
53+
def gwei_to_ark(value: Union[float, int, str, Decimal], suffix=None):
54+
converted_value = UnitConverter.format_units(UnitConverter.parse_units(value, 'gwei'), 'ark')
55+
converted_value = format(converted_value.normalize(), 'f')
56+
57+
if suffix is not None:
58+
return f"{converted_value} {suffix}"
59+
60+
return str(converted_value)

tests/utils/test_unit_converter.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from crypto.utils.unit_converter import UnitConverter
2+
from decimal import Decimal
3+
4+
def test_it_should_parse_units_into_wei():
5+
assert UnitConverter.parse_units(1, 'wei') == '1'
6+
assert UnitConverter.parse_units(1.0, 'wei') == '1'
7+
assert UnitConverter.parse_units('1', 'wei') == '1'
8+
assert UnitConverter.parse_units('1.0', 'wei') == '1'
9+
10+
assert UnitConverter.parse_units(Decimal(1), 'wei') == '1'
11+
assert UnitConverter.parse_units(Decimal(1.0), 'wei') == '1'
12+
assert UnitConverter.parse_units(Decimal('1'), 'wei') == '1'
13+
assert UnitConverter.parse_units(Decimal('1.0'), 'wei') == '1'
14+
15+
def test_it_should_parse_units_into_gwei():
16+
assert UnitConverter.parse_units(1, 'gwei') == '1000000000'
17+
assert UnitConverter.parse_units(1.0, 'gwei') == '1000000000'
18+
assert UnitConverter.parse_units('1', 'gwei') == '1000000000'
19+
assert UnitConverter.parse_units('1.0', 'gwei') == '1000000000'
20+
21+
assert UnitConverter.parse_units(Decimal(1), 'gwei') == '1000000000'
22+
assert UnitConverter.parse_units(Decimal(1.0), 'gwei') == '1000000000'
23+
assert UnitConverter.parse_units(Decimal('1'), 'gwei') == '1000000000'
24+
assert UnitConverter.parse_units(Decimal('1.0'), 'gwei') == '1000000000'
25+
26+
def test_it_should_parse_units_into_ark():
27+
assert UnitConverter.parse_units(1, 'ark') == '1000000000000000000'
28+
assert UnitConverter.parse_units(1.0, 'ark') == '1000000000000000000'
29+
assert UnitConverter.parse_units('1', 'ark') == '1000000000000000000'
30+
assert UnitConverter.parse_units('1.0', 'ark') == '1000000000000000000'
31+
32+
assert UnitConverter.parse_units(Decimal(1), 'ark') == '1000000000000000000'
33+
assert UnitConverter.parse_units(Decimal(1.0), 'ark') == '1000000000000000000'
34+
assert UnitConverter.parse_units(Decimal('1'), 'ark') == '1000000000000000000'
35+
assert UnitConverter.parse_units(Decimal('1.0'), 'ark') == '1000000000000000000'
36+
37+
def test_it_should_parse_decimal_units_into_ark():
38+
assert UnitConverter.parse_units(0.1, 'ark') == '100000000000000000'
39+
assert UnitConverter.parse_units('0.1', 'ark') == '100000000000000000'
40+
41+
def test_it_should_format_units_from_wei():
42+
assert UnitConverter.format_units(1, 'wei') == 1.0
43+
assert UnitConverter.format_units(1.0, 'wei') == 1.0
44+
assert UnitConverter.format_units('1', 'wei') == 1.0
45+
assert UnitConverter.format_units('1.0', 'wei') == 1.0
46+
47+
assert UnitConverter.format_units(Decimal(1), 'wei') == 1.0
48+
assert UnitConverter.format_units(Decimal(1.0), 'wei') == 1.0
49+
assert UnitConverter.format_units(Decimal('1'), 'wei') == 1.0
50+
assert UnitConverter.format_units(Decimal('1.0'), 'wei') == 1.0
51+
52+
def test_it_should_format_units_from_gwei():
53+
assert UnitConverter.format_units(1000000000, 'gwei') == 1.0
54+
assert UnitConverter.format_units('1000000000', 'gwei') == 1.0
55+
56+
assert UnitConverter.format_units(Decimal(1000000000), 'gwei') == 1.0
57+
assert UnitConverter.format_units(Decimal('1000000000'), 'gwei') == 1.0
58+
59+
def test_it_should_format_units_from_ark():
60+
assert UnitConverter.format_units(1000000000000000000, 'ark') == 1.0
61+
assert UnitConverter.format_units('1000000000000000000', 'ark') == 1.0
62+
63+
assert UnitConverter.format_units(Decimal(1000000000000000000), 'ark') == 1.0
64+
assert UnitConverter.format_units(Decimal('1000000000000000000'), 'ark') == 1.0
65+
66+
def test_it_should_throw_exception_for_unsupported_unit_in_parse():
67+
try:
68+
UnitConverter.parse_units(1, 'unsupported')
69+
except ValueError as e:
70+
assert str(e) == 'Unsupported unit: unsupported. Supported units are \'wei\', \'gwei\', and \'ark\'.'
71+
72+
def test_it_should_throw_exception_for_unsupported_unit_in_format():
73+
try:
74+
UnitConverter.format_units('1', 'unsupported')
75+
except ValueError as e:
76+
assert str(e) == 'Unsupported unit: unsupported. Supported units are \'wei\', \'gwei\', and \'ark\'.'
77+
78+
def test_it_should_parse_units_into_ark_with_fraction():
79+
assert UnitConverter.parse_units(0.1, 'ark') == '100000000000000000'
80+
assert UnitConverter.parse_units('0.1', 'ark') == '100000000000000000'
81+
82+
def test_it_should_convert_wei_to_ark():
83+
assert UnitConverter.wei_to_ark(1, 'DARK') == '0.000000000000000001 DARK'
84+
assert UnitConverter.wei_to_ark(1) == '0.000000000000000001'
85+
assert UnitConverter.wei_to_ark(1000000000000000000, 'DARK') == '1 DARK'
86+
assert UnitConverter.wei_to_ark(1000000000000000000) == '1'
87+
88+
assert UnitConverter.wei_to_ark('1', 'DARK') == '0.000000000000000001 DARK'
89+
assert UnitConverter.wei_to_ark('1') == '0.000000000000000001'
90+
assert UnitConverter.wei_to_ark('1000000000000000000', 'DARK') == '1 DARK'
91+
assert UnitConverter.wei_to_ark('1000000000000000000') == '1'
92+
93+
assert UnitConverter.wei_to_ark(Decimal(1), 'DARK') == '0.000000000000000001 DARK'
94+
assert UnitConverter.wei_to_ark(Decimal(1)) == '0.000000000000000001'
95+
assert UnitConverter.wei_to_ark(Decimal(1000000000000000000), 'DARK') == '1 DARK'
96+
assert UnitConverter.wei_to_ark(Decimal(1000000000000000000)) == '1'
97+
98+
assert UnitConverter.wei_to_ark(Decimal('1'), 'DARK') == '0.000000000000000001 DARK'
99+
assert UnitConverter.wei_to_ark(Decimal('1')) == '0.000000000000000001'
100+
assert UnitConverter.wei_to_ark(Decimal('1000000000000000000'), 'DARK') == '1 DARK'
101+
assert UnitConverter.wei_to_ark(Decimal('1000000000000000000')) == '1'
102+
103+
def test_it_should_convert_gwei_to_ark():
104+
assert UnitConverter.gwei_to_ark(1, 'DARK') == '0.000000001 DARK'
105+
assert UnitConverter.gwei_to_ark(1) == '0.000000001'
106+
assert UnitConverter.gwei_to_ark(1000000000, 'DARK') == '1 DARK'
107+
assert UnitConverter.gwei_to_ark(1000000000) == '1'
108+
109+
assert UnitConverter.gwei_to_ark('1', 'DARK') == '0.000000001 DARK'
110+
assert UnitConverter.gwei_to_ark('1') == '0.000000001'
111+
assert UnitConverter.gwei_to_ark('1000000000', 'DARK') == '1 DARK'
112+
assert UnitConverter.gwei_to_ark('1000000000') == '1'
113+
114+
assert UnitConverter.gwei_to_ark(Decimal(1), 'DARK') == '0.000000001 DARK'
115+
assert UnitConverter.gwei_to_ark(Decimal(1)) == '0.000000001'
116+
assert UnitConverter.gwei_to_ark(Decimal(1000000000), 'DARK') == '1 DARK'
117+
assert UnitConverter.gwei_to_ark(Decimal(1000000000)) == '1'
118+
119+
assert UnitConverter.gwei_to_ark(Decimal('1'), 'DARK') == '0.000000001 DARK'
120+
assert UnitConverter.gwei_to_ark(Decimal('1')) == '0.000000001'
121+
assert UnitConverter.gwei_to_ark(Decimal('1000000000'), 'DARK') == '1 DARK'
122+
assert UnitConverter.gwei_to_ark(Decimal('1000000000')) == '1'

0 commit comments

Comments
 (0)