diff --git a/gateway/fields.py b/gateway/fields.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4a207e424b718e4ea086e5b9696b70514ad399f6 100644 --- a/gateway/fields.py +++ b/gateway/fields.py @@ -0,0 +1,8 @@ +from django.db.models.fields import CharField +from gateway.validators import validate_address + + +class AddressField(CharField): + def __init__(self, *args, **kwargs): + self.default_validators.append(validate_address) + super().__init__(*args, **kwargs) diff --git a/gateway/gateway.py b/gateway/gateway.py index 621f731142b1d9e2cfd02a2bc2d6b89309ae674a..fe4356759c7c9ff4035d94359e2c91477b3d7cb5 100644 --- a/gateway/gateway.py +++ b/gateway/gateway.py @@ -159,7 +159,7 @@ class Gateway: def block_is_canonical_poa(self, block_number): last_block_number = self.get_last_blocknumber() tx_block_number = block_number - required_block_difference = math.ceil(self.get_signers_count() / 2) + 1 + required_block_difference = math.ceil(len(self.get_signers()) / 2) + 1 return (last_block_number - tx_block_number) > required_block_difference def pending_transactions(self): @@ -171,6 +171,9 @@ class Gateway: return txs def get_signers_count(self): + return len(self.get_signers()) + + def get_signers(self): return self.w3.manager.request_blocking("clique_getSigners", []) def get_smart_contract_bytecode(self, smart_contract_address): diff --git a/gateway/utils.py b/gateway/utils.py index f81b8a6942225ae5ae699bc034dd18cacd1cde0b..c3d2d22c563c6d8e435073fcf0f54acd9ceca450 100644 --- a/gateway/utils.py +++ b/gateway/utils.py @@ -36,3 +36,20 @@ def hex32bytes_string(some_hex32bytes): return Web3.toText(some_hex32bytes.decode().strip('\\\u0000')) except UnicodeDecodeError as ude: return some_hex32bytes + + +class HexBytesToDict: + def dehex_dict(self, dictionary): + for k, v in dictionary.items(): + if isinstance(v, dict): + self.dehex_dict(dictionary[k]) + elif isinstance(v, list): + self.dehex_list(dictionary[k]) + elif isinstance(v, HexBytes): + dictionary[k] = v.hex() + + def dehex_list(self, sequence): + i = 0 + while i < len(sequence): + sequence[i] = sequence[i].decode() + i = i + 1 diff --git a/gateway/validators.py b/gateway/validators.py new file mode 100644 index 0000000000000000000000000000000000000000..1e662bb0c2460c90e1b83de878c79aee6ebfcd0f --- /dev/null +++ b/gateway/validators.py @@ -0,0 +1,9 @@ +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ +from gateway.gateway import AddressValidation + + +def validate_address(value): + validator = AddressValidation() + if not validator.is_valid(value): + raise ValidationError(_('%(value)s is not a valid address'), params={'value': value}) diff --git a/setup.py b/setup.py index 6df36b30b95a5df1862fe2c4e4b49cd9bbd77188..94ab5a1505ba36d4655d40c5f0fcc89a3ec6ab4e 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( name='django-ethgateway', - version='0.0.2', + version='0.0.4', packages=find_packages(), include_package_data=True, license='GNU GPL License', # example license @@ -20,7 +20,8 @@ setup( author_email='agustindorda@gmail.com', install_requires=[ 'aiohttp==3.5.4', - 'web3==4.6.0' + 'web3==4.6.0', + 'Django==2.1.7' ], classifiers=[ 'Framework :: Django',