Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove deprecated classes #835

Merged
merged 5 commits into from
Jul 12, 2024
Merged
Show file tree
Hide file tree
Changes from 2 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
95 changes: 0 additions & 95 deletions gnosis/eth/django/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,44 +24,6 @@
connection = connections["default"]


class EthereumAddressField(models.CharField):
default_validators = [validate_checksumed_address]
description = "DEPRECATED. Use `EthereumAddressV2Field`. Ethereum address (EIP55)"
default_error_messages = {
"invalid": _('"%(value)s" value must be an EIP55 checksummed address.'),
}

def __init__(self, *args, **kwargs):
kwargs["max_length"] = 42
super().__init__(*args, **kwargs)

def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
del kwargs["max_length"]
return name, path, args, kwargs

def from_db_value(self, value, expression, connection):
return self.to_python(value)

def to_python(self, value):
value = super().to_python(value)
if value:
try:
return fast_to_checksum_address(value)
except ValueError:
raise exceptions.ValidationError(
self.error_messages["invalid"],
code="invalid",
params={"value": value},
)
else:
return value

def get_prep_value(self, value):
value = super().get_prep_value(value)
return self.to_python(value)


class EthereumAddressV2Field(models.Field):
default_validators = [validate_checksumed_address]
description = "Ethereum address (EIP55)"
Expand Down Expand Up @@ -176,50 +138,6 @@ def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)


class HexField(models.CharField):
"""
Field to store hex values (without 0x). Returns hex with 0x prefix.

On Database side a CharField is used.
"""

description = "Stores a hex value into a CharField. DEPRECATED, use a BinaryField"

def from_db_value(self, value, expression, connection):
return self.to_python(value)

def to_python(self, value):
return value if value is None else HexBytes(value).hex()

def get_prep_value(self, value):
if value is None:
return value
elif isinstance(value, HexBytes):
return value.hex()[
2:
] # HexBytes.hex() retrieves hexadecimal with '0x', remove it
elif isinstance(value, bytes):
return value.hex() # bytes.hex() retrieves hexadecimal without '0x'
else: # str
return HexBytes(value).hex()[2:]

def formfield(self, **kwargs):
# We need max_lenght + 2 on forms because of `0x`
defaults = {"max_length": self.max_length + 2}
# TODO: Handle multiple backends with different feature flags.
if self.null and not connection.features.interprets_empty_strings_as_nulls:
defaults["empty_value"] = None
defaults.update(kwargs)
return super().formfield(**defaults)

def clean(self, value, model_instance):
value = self.to_python(value)
self.validate(value, model_instance)
# Validation didn't work because of `0x`
self.run_validators(value[2:])
return value


class HexV2Field(models.BinaryField):
def formfield(self, **kwargs):
defaults = {
Expand All @@ -229,19 +147,6 @@ def formfield(self, **kwargs):
return super().formfield(**defaults)


class Sha3HashField(HexField):
description = "DEPRECATED. Use `Keccak256Field`"

def __init__(self, *args, **kwargs):
kwargs["max_length"] = 64
super().__init__(*args, **kwargs)

def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
del kwargs["max_length"]
return name, path, args, kwargs


class Keccak256Field(models.BinaryField):
description = "Keccak256 hash stored as binary"
default_error_messages = {
Expand Down
10 changes: 0 additions & 10 deletions gnosis/eth/django/tests/models.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
from django.db import models

from ..models import (
EthereumAddressField,
EthereumAddressV2Field,
Keccak256Field,
Sha3HashField,
Uint32Field,
Uint96Field,
Uint256Field,
)


class EthereumAddress(models.Model):
value = EthereumAddressField(null=True)


class EthereumAddressV2(models.Model):
value = EthereumAddressV2Field(null=True)

Expand All @@ -31,9 +25,5 @@ class Uint32(models.Model):
value = Uint32Field(null=True)


class Sha3Hash(models.Model):
value = Sha3HashField(null=True)


class Keccak256Hash(models.Model):
value = Keccak256Field(null=True)
117 changes: 32 additions & 85 deletions gnosis/eth/django/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -1,60 +1,50 @@
from django.core.exceptions import ValidationError
from django.core.serializers import serialize
from django.db import DataError, transaction
from django.db import transaction
from django.test import TestCase

from eth_account import Account
from faker import Faker

from ...constants import NULL_ADDRESS, SENTINEL_ADDRESS
from ...utils import fast_is_checksum_address, fast_keccak_text
from .models import (
EthereumAddress,
EthereumAddressV2,
Keccak256Hash,
Sha3Hash,
Uint32,
Uint96,
Uint256,
)
from .models import EthereumAddressV2, Keccak256Hash, Uint32, Uint96, Uint256

faker = Faker()


class TestModels(TestCase):
def test_ethereum_address_field(self):
for EthereumAddressModel in (EthereumAddress, EthereumAddressV2):
with self.subTest(EthereumAddressModel=EthereumAddressModel):
address = Account.create().address
self.assertTrue(fast_is_checksum_address(address))
ethereum_address = EthereumAddressModel.objects.create(value=address)
ethereum_address.refresh_from_db()
self.assertTrue(fast_is_checksum_address(ethereum_address.value))
self.assertEqual(address, ethereum_address.value)

# Test addresses
for addresss in (
None,
NULL_ADDRESS,
SENTINEL_ADDRESS,
Account.create().address,
):
with self.subTest(special_address=addresss):
EthereumAddressModel.objects.create(value=addresss)
self.assertEqual(
EthereumAddressModel.objects.get(value=addresss).value,
addresss,
)

with self.assertRaisesMessage(
ValidationError,
'"0x23" value must be an EIP55 checksummed address.',
):
with transaction.atomic():
EthereumAddressModel.objects.create(value="0x23")

ethereum_address = EthereumAddressModel(value=Account.create().address)
self.assertIsNone(ethereum_address.full_clean())
address = Account.create().address
self.assertTrue(fast_is_checksum_address(address))
ethereum_address = EthereumAddressV2.objects.create(value=address)
ethereum_address.refresh_from_db()
self.assertTrue(fast_is_checksum_address(ethereum_address.value))
self.assertEqual(address, ethereum_address.value)

# Test addresses
for addresss in (
None,
NULL_ADDRESS,
SENTINEL_ADDRESS,
Account.create().address,
):
with self.subTest(special_address=addresss):
EthereumAddressV2.objects.create(value=addresss)
self.assertEqual(
EthereumAddressV2.objects.get(value=addresss).value,
addresss,
)

with self.assertRaisesMessage(
ValidationError,
'"0x23" value must be an EIP55 checksummed address.',
):
with transaction.atomic():
EthereumAddressV2.objects.create(value="0x23")

ethereum_address = EthereumAddressV2(value=Account.create().address)
self.assertIsNone(ethereum_address.full_clean())

def test_uint256_field(self):
for value in [
Expand Down Expand Up @@ -115,35 +105,6 @@ def test_uint32_field(self):
with self.assertRaises(ValidationError):
Uint32.objects.create(value=-2)

def test_sha3_hash_field(self):
value_hexbytes = fast_keccak_text(faker.name())
value_hex_with_0x: str = value_hexbytes.hex()
value_hex_without_0x: str = value_hex_with_0x[2:]
value: bytes = bytes(value_hexbytes)

values = [value, value_hex_without_0x, value_hex_with_0x, value_hexbytes]

for v in values:
sha3_hash = Sha3Hash.objects.create(value=v)
sha3_hash.refresh_from_db()
self.assertEqual(sha3_hash.value, value_hex_with_0x)

for v in values:
self.assertEqual(Sha3Hash.objects.filter(value=v).count(), len(values))

# Hash null
sha3_hash = Sha3Hash.objects.create(value=None)
sha3_hash.refresh_from_db()
self.assertIsNone(sha3_hash.value)

# Hash too big
value_hex_invalid: str = "0x" + value_hex_without_0x + "a"
with self.assertRaisesMessage(
DataError, "value too long for type character varying(64)"
):
with transaction.atomic():
Sha3Hash.objects.create(value=value_hex_invalid)

def test_keccak256_field(self):
value_hexbytes = fast_keccak_text(faker.name())
value_hex_with_0x: str = value_hexbytes.hex()
Expand Down Expand Up @@ -205,13 +166,6 @@ def test_serialize_keccak256_field_to_json(self):
# hexvalue should be in serialized data
self.assertIn(hexvalue, serialized)

def test_serialize_ethereum_address_field_to_json(self):
address: str = "0x5aFE3855358E112B5647B952709E6165e1c1eEEe"
EthereumAddress.objects.create(value=address)
serialized = serialize("json", EthereumAddress.objects.all())
# address should be in serialized data
self.assertIn(address, serialized)

def test_serialize_ethereum_address_v2_field_to_json(self):
address: str = "0x5aFE3855358E112B5647B952709E6165e1c1eEEe"
EthereumAddressV2.objects.create(value=address)
Expand All @@ -225,10 +179,3 @@ def test_serialize_uint256_field_to_json(self):
serialized = serialize("json", Uint256.objects.all())
# value should be in serialized data
self.assertIn(str(value), serialized)

def test_serialize_sha3_hash_to_json(self):
hash = fast_keccak_text("testSerializer")
Sha3Hash.objects.create(value=hash)
serialized = serialize("json", Sha3Hash.objects.all())
# hash should be in serialized data
self.assertIn(hash.hex(), serialized)
14 changes: 0 additions & 14 deletions gnosis/safe/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,20 +99,6 @@ def validate(self, data):
return data


class SafeMultisigTxSerializer(SafeMultisigEstimateTxSerializer):
"""
DEPRECATED, use `SafeMultisigTxSerializerV1` instead
"""

safe_tx_gas = serializers.IntegerField(min_value=0)
data_gas = serializers.IntegerField(min_value=0)
gas_price = serializers.IntegerField(min_value=0)
refund_receiver = EthereumAddressField(
default=None, allow_null=True, allow_zero_address=True
)
nonce = serializers.IntegerField(min_value=0)


class SafeMultisigTxSerializerV1(SafeMultisigEstimateTxSerializer):
"""
Version 1.0.0 of the Safe changes `data_gas` to `base_gas`
Expand Down
Loading