Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions crypto/transactions/builder/base.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from typing import Optional

from crypto.configuration.network import get_network
from crypto.identity.private_key import PrivateKey
from crypto.transactions.types.abstract_transaction import AbstractTransaction
Expand All @@ -8,7 +7,7 @@
class AbstractTransactionBuilder:
def __init__(self, data: Optional[dict] = None):
default_data = {
'value': '0',
'value': 0,
'senderPublicKey': '',
'gasPrice': '5',
'nonce': '1',
Expand All @@ -26,15 +25,15 @@ def new(cls, data: Optional[dict] = None):
return cls(data)

def gas_limit(self, gas_limit: int):
self.transaction.data['gasLimit'] = gas_limit
self.transaction.data['gasLimit'] = int(gas_limit)
return self

def recipient_address(self, recipient_address: str):
self.transaction.data['recipientAddress'] = recipient_address
return self

def gas_price(self, gas_price: int):
self.transaction.data['gasPrice'] = gas_price
self.transaction.data['gasPrice'] = int(gas_price)
return self

def nonce(self, nonce: str):
Expand Down
4 changes: 2 additions & 2 deletions crypto/transactions/builder/transfer_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@


class TransferBuilder(AbstractTransactionBuilder):
def value(self, value: str):
self.transaction.data['value'] = value
def value(self, value: int):
self.transaction.data['value'] = int(value)
self.transaction.refresh_payload_data()
return self

Expand Down
8 changes: 4 additions & 4 deletions crypto/utils/unit_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@ class UnitConverter:
ARK_MULTIPLIER = '1000000000000000000' # 1e18

@staticmethod
def parse_units(value: Union[float, int, str, Decimal], unit='ark') -> str:
def parse_units(value: Union[float, int, str, Decimal], unit='ark') -> int:
value = Decimal(str(value))

unit = unit.lower()
if unit == 'wei':
return format((value * Decimal(UnitConverter.WEI_MULTIPLIER)).normalize(), 'f')
return int((value * Decimal(UnitConverter.WEI_MULTIPLIER)).normalize())

if unit == 'gwei':
return format((value * Decimal(UnitConverter.GWEI_MULTIPLIER)).normalize(), 'f')
return int((value * Decimal(UnitConverter.GWEI_MULTIPLIER)).normalize())

if unit == 'ark':
return format((value * Decimal(UnitConverter.ARK_MULTIPLIER)).normalize(), 'f')
return int((value * Decimal(UnitConverter.ARK_MULTIPLIER)).normalize())

raise ValueError(f"Unsupported unit: {unit}. Supported units are 'wei', 'gwei', and 'ark'.")

Expand Down
6 changes: 6 additions & 0 deletions tests/transactions/builder/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,9 @@ def username():
"""Username used for tests"""

return 'fixture'

@pytest.fixture
def address():
"""Address used for tests"""

return '0x6F0182a0cc707b055322CcF6d4CB6a5Aff1aEb22'
2 changes: 1 addition & 1 deletion tests/transactions/builder/test_evm_call_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def test_evm_call_transaction(passphrase, load_transaction_fixture):
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'].lower() == fixture['data']['recipientAddress'].lower()
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand Down
21 changes: 20 additions & 1 deletion tests/transactions/builder/test_transfer_builder.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from crypto.transactions.builder.transfer_builder import TransferBuilder
from crypto.utils.unit_converter import UnitConverter

def test_it_should_sign_it_with_a_passphrase(passphrase, load_transaction_fixture):
fixture = load_transaction_fixture('transfer')
Expand All @@ -19,11 +20,29 @@ def test_it_should_sign_it_with_a_passphrase(passphrase, load_transaction_fixtur
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'] == fixture['data']['recipientAddress']
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']

assert builder.transaction.serialize().hex() == fixture['serialized']
assert builder.transaction.data['id'] == fixture['data']['id']
assert builder.verify()

def test_it_should_handle_unit_converter(passphrase, address):
builder = (
TransferBuilder()
.gas_price(UnitConverter.parse_units(5, 'gwei'))
.nonce('1')
.gas_limit(UnitConverter.parse_units(0.1, 'gwei'))
.recipient_address(address)
.value(UnitConverter.parse_units(10, 'ark'))
.sign(passphrase)
)

assert builder.transaction.data['gasPrice'] == 5000000000
assert builder.transaction.data['nonce'] == '1'
assert builder.transaction.data['gasLimit'] == 100000000
assert builder.transaction.data['value'] == 10000000000000000000

assert builder.verify()
4 changes: 2 additions & 2 deletions tests/transactions/builder/test_unvote_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_unvote_transaction(passphrase, load_transaction_fixture):
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'] == fixture['data']['recipientAddress']
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand All @@ -44,7 +44,7 @@ def test_unvote_transaction_with_default_recipient_address(passphrase, load_tran
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'].lower() == fixture['data']['recipientAddress'].lower()
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def test_validator_registration_transaction(passphrase, validator_public_key, lo
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'] == fixture['data']['recipientAddress']
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand All @@ -47,7 +47,7 @@ def test_validator_registration_transaction_with_default_recipient_address(passp
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'].lower() == fixture['data']['recipientAddress'].lower()
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_validator_resignation_transaction(passphrase, load_transaction_fixture)
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'] == fixture['data']['recipientAddress']
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand All @@ -44,7 +44,7 @@ def test_validator_resignation_transaction_with_default_recipient_address(passph
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'].lower() == fixture['data']['recipientAddress'].lower()
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand Down
4 changes: 2 additions & 2 deletions tests/transactions/builder/test_vote_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def test_vote_transaction(passphrase, load_transaction_fixture):
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'] == fixture['data']['recipientAddress']
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand All @@ -46,7 +46,7 @@ def test_vote_transaction_with_default_recipient_address(passphrase, load_transa
assert builder.transaction.data['network'] == fixture['data']['network']
assert builder.transaction.data['gasLimit'] == fixture['data']['gasLimit']
assert builder.transaction.data['recipientAddress'].lower() == fixture['data']['recipientAddress'].lower()
assert builder.transaction.data['value'] == fixture['data']['value']
assert builder.transaction.data['value'] == int(fixture['data']['value'])
assert builder.transaction.data['v'] == fixture['data']['v']
assert builder.transaction.data['r'] == fixture['data']['r']
assert builder.transaction.data['s'] == fixture['data']['s']
Expand Down
3 changes: 1 addition & 2 deletions tests/transactions/test_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ def test_transfer_serialization(load_transaction_fixture):
def test_vote_serialization(load_transaction_fixture):
fixture = load_transaction_fixture('vote')
transaction = Vote(fixture['data'])
print(f"transaction: {transaction.data}")
serializer = Serializer.new(transaction)
assert serializer.serialize().hex() == fixture['serialized']

Expand All @@ -34,4 +33,4 @@ def test_validator_resignation_serialization(load_transaction_fixture):
fixture = load_transaction_fixture('validator-resignation')
transaction = ValidatorResignation(fixture['data'])
serializer = Serializer.new(transaction)
assert serializer.serialize().hex() == fixture['serialized']
assert serializer.serialize().hex() == fixture['serialized']
56 changes: 28 additions & 28 deletions tests/utils/test_unit_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,41 @@
from decimal import Decimal

def test_it_should_parse_units_into_wei():
assert UnitConverter.parse_units(1, 'wei') == '1'
assert UnitConverter.parse_units(1.0, 'wei') == '1'
assert UnitConverter.parse_units('1', 'wei') == '1'
assert UnitConverter.parse_units('1.0', 'wei') == '1'
assert UnitConverter.parse_units(1, 'wei') == 1
assert UnitConverter.parse_units(1.0, 'wei') == 1
assert UnitConverter.parse_units('1', 'wei') == 1
assert UnitConverter.parse_units('1.0', 'wei') == 1

assert UnitConverter.parse_units(Decimal(1), 'wei') == '1'
assert UnitConverter.parse_units(Decimal(1.0), 'wei') == '1'
assert UnitConverter.parse_units(Decimal('1'), 'wei') == '1'
assert UnitConverter.parse_units(Decimal('1.0'), 'wei') == '1'
assert UnitConverter.parse_units(Decimal(1), 'wei') == 1
assert UnitConverter.parse_units(Decimal(1.0), 'wei') == 1
assert UnitConverter.parse_units(Decimal('1'), 'wei') == 1
assert UnitConverter.parse_units(Decimal('1.0'), 'wei') == 1

def test_it_should_parse_units_into_gwei():
assert UnitConverter.parse_units(1, 'gwei') == '1000000000'
assert UnitConverter.parse_units(1.0, 'gwei') == '1000000000'
assert UnitConverter.parse_units('1', 'gwei') == '1000000000'
assert UnitConverter.parse_units('1.0', 'gwei') == '1000000000'
assert UnitConverter.parse_units(1, 'gwei') == 1000000000
assert UnitConverter.parse_units(1.0, 'gwei') == 1000000000
assert UnitConverter.parse_units('1', 'gwei') == 1000000000
assert UnitConverter.parse_units('1.0', 'gwei') == 1000000000

assert UnitConverter.parse_units(Decimal(1), 'gwei') == '1000000000'
assert UnitConverter.parse_units(Decimal(1.0), 'gwei') == '1000000000'
assert UnitConverter.parse_units(Decimal('1'), 'gwei') == '1000000000'
assert UnitConverter.parse_units(Decimal('1.0'), 'gwei') == '1000000000'
assert UnitConverter.parse_units(Decimal(1), 'gwei') == 1000000000
assert UnitConverter.parse_units(Decimal(1.0), 'gwei') == 1000000000
assert UnitConverter.parse_units(Decimal('1'), 'gwei') == 1000000000
assert UnitConverter.parse_units(Decimal('1.0'), 'gwei') == 1000000000

def test_it_should_parse_units_into_ark():
assert UnitConverter.parse_units(1, 'ark') == '1000000000000000000'
assert UnitConverter.parse_units(1.0, 'ark') == '1000000000000000000'
assert UnitConverter.parse_units('1', 'ark') == '1000000000000000000'
assert UnitConverter.parse_units('1.0', 'ark') == '1000000000000000000'
assert UnitConverter.parse_units(1, 'ark') == 1000000000000000000
assert UnitConverter.parse_units(1.0, 'ark') == 1000000000000000000
assert UnitConverter.parse_units('1', 'ark') == 1000000000000000000
assert UnitConverter.parse_units('1.0', 'ark') == 1000000000000000000

assert UnitConverter.parse_units(Decimal(1), 'ark') == '1000000000000000000'
assert UnitConverter.parse_units(Decimal(1.0), 'ark') == '1000000000000000000'
assert UnitConverter.parse_units(Decimal('1'), 'ark') == '1000000000000000000'
assert UnitConverter.parse_units(Decimal('1.0'), 'ark') == '1000000000000000000'
assert UnitConverter.parse_units(Decimal(1), 'ark') == 1000000000000000000
assert UnitConverter.parse_units(Decimal(1.0), 'ark') == 1000000000000000000
assert UnitConverter.parse_units(Decimal('1'), 'ark') == 1000000000000000000
assert UnitConverter.parse_units(Decimal('1.0'), 'ark') == 1000000000000000000

def test_it_should_parse_decimal_units_into_ark():
assert UnitConverter.parse_units(0.1, 'ark') == '100000000000000000'
assert UnitConverter.parse_units('0.1', 'ark') == '100000000000000000'
assert UnitConverter.parse_units(0.1, 'ark') == 100000000000000000
assert UnitConverter.parse_units('0.1', 'ark') == 100000000000000000

def test_it_should_format_units_from_wei():
assert UnitConverter.format_units(1, 'wei') == 1.0
Expand Down Expand Up @@ -76,8 +76,8 @@ def test_it_should_throw_exception_for_unsupported_unit_in_format():
assert str(e) == 'Unsupported unit: unsupported. Supported units are \'wei\', \'gwei\', and \'ark\'.'

def test_it_should_parse_units_into_ark_with_fraction():
assert UnitConverter.parse_units(0.1, 'ark') == '100000000000000000'
assert UnitConverter.parse_units('0.1', 'ark') == '100000000000000000'
assert UnitConverter.parse_units(0.1, 'ark') == 100000000000000000
assert UnitConverter.parse_units('0.1', 'ark') == 100000000000000000

def test_it_should_convert_wei_to_ark():
assert UnitConverter.wei_to_ark(1, 'DARK') == '0.000000000000000001 DARK'
Expand Down