From 504d092258bdf677b966f64f9d8658f0bf251752 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 04:41:46 +0330 Subject: [PATCH 01/38] add validator for eth addresses --- validators/__init__.py | 2 ++ validators/eth_address.py | 55 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 validators/eth_address.py diff --git a/validators/__init__.py b/validators/__init__.py index c78c27ab..7ba5477d 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -13,6 +13,7 @@ from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .domain import domain from .email import email +from .eth_address import eth_address from .hashes import md5, sha1, sha224, sha256, sha512 from .hostname import hostname from .iban import iban @@ -30,6 +31,7 @@ "amex", "between", "btc_address", + "eth_address", "card_number", "diners", "discover", diff --git a/validators/eth_address.py b/validators/eth_address.py new file mode 100644 index 00000000..3c8b9e2a --- /dev/null +++ b/validators/eth_address.py @@ -0,0 +1,55 @@ +"""ETH Address.""" +# -*- coding: utf-8 -*- + +# standard +import re + +from sha3 import keccak_256 + +# local +from .utils import validator + + +def _validate_eth_checksum_address(addr: str): + """Validate ETH type checksum address.""" + addr = addr.replace("0x", "") + addr_hash = keccak_256(addr.lower().encode("ascii")).hexdigest() + + for i in range(0, 40): + if ((int(addr_hash[i], 16) > 7 and addr[i].upper() != addr[i]) or + (int(addr_hash[i], 16) <= 7 and addr[i].lower() != addr[i])): + return False + return True + + +@validator +def eth_address(value: str, /): + """Return whether or not given value is a valid ethereum address. + + Full validation is implemented for ERC20 addresses. + + Examples: + >>> eth_address('0x9cc14ba4f9f68ca159ea4ebf2c292a808aaeb598') + # Output: True + >>> eth_address('0x8Ba1f109551bD432803012645Ac136ddd64DBa72') + # Output: ValidationFailure(func=eth_address, args=...) + + Args: + value: + Ethereum address string to validate. + + Returns: + (Literal[True]): + If `value` is a valid ethereum address. + (ValidationFailure): + If `value` is an invalid ethereum address. + + """ + if not value: + return False + + return ( + re.compile(r"^0x[0-9a-f]{40}$").match(value) or + re.compile(r"^0x[0-9A-F]{40}$").match(value) or + _validate_eth_checksum_address(value) + ) From cef562cafb076ef5c9c1f6cc1b1a85a520498e5c Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 04:42:26 +0330 Subject: [PATCH 02/38] add test for eth address validator --- tests/test_eth_address.py | 47 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 tests/test_eth_address.py diff --git a/tests/test_eth_address.py b/tests/test_eth_address.py new file mode 100644 index 00000000..984858de --- /dev/null +++ b/tests/test_eth_address.py @@ -0,0 +1,47 @@ +"""Test ETH address.""" +# -*- coding: utf-8 -*- + +# external +import pytest + +# local +from validators import eth_address, ValidationFailure + + +@pytest.mark.parametrize( + "value", + [ + "0x8ba1f109551bd432803012645ac136ddd64dba72", + "0x9cc14ba4f9f68ca159ea4ebf2c292a808aaeb598", + "0x5AEDA56215b167893e80B4fE645BA6d5Bab767DE", + "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "742d35Cc6634C0532925a3b844Bc454e4438f44e", + "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", + "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", + "0x1234567890123456789012345678901234567890", + "0x57Ab1ec28D129707052df4dF418D58a2D46d5f51", + ], +) +def test_returns_true_on_valid_eth_address(value: str): + """Test returns true on valid eth address.""" + assert eth_address(value) + + +@pytest.mark.parametrize( + "value", + [ + "0x742d35Cc6634C0532925a3b844Bc454e4438f44g", + "0x742d35Cc6634C0532925a3b844Bc454e4438f44", + "0xAbcdefg1234567890Abcdefg1234567890Abcdefg", + "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c72" + "0x80fBD7F8B3f81D0e1d6EACAb69AF104A6508AFB1", + "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c7g", + "0x8Ba1f109551bD432803012645Ac136ddd64DBa72", + "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c", + "0x7Fb21a171205f3B8d8E4d88A2d2f8A56E45DdB5c" + "validators.eth", + ], +) +def test_returns_failed_validation_on_invalid_eth_address(value: str): + """Test returns failed validation on invalid eth address.""" + assert isinstance(eth_address(value), ValidationFailure) From 498166ccc90c1febd2c4d602c23534361f60723d Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 04:59:59 +0330 Subject: [PATCH 03/38] add pysha3 dependency --- poetry.lock | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/poetry.lock b/poetry.lock index 7f859f4c..929d4922 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1087,6 +1087,37 @@ nodeenv = ">=1.6.0" all = ["twine (>=3.4.1)"] dev = ["twine (>=3.4.1)"] +[[package]] +name = "pysha3" +version = "1.0.2" +description = "SHA-3 (Keccak) for Python 2.7 - 3.5" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6e6a84efb7856f5d760ee55cd2b446972cb7b835676065f6c4f694913ea8f8d9"}, + {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f9046d59b3e72aa84f6dae83a040bd1184ebd7fef4e822d38186a8158c89e3cf"}, + {file = "pysha3-1.0.2-cp27-cp27m-win32.whl", hash = "sha256:9fdd28884c5d0b4edfed269b12badfa07f1c89dbc5c9c66dd279833894a9896b"}, + {file = "pysha3-1.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:41be70b06c8775a9e4d4eeb52f2f6a3f356f17539a54eac61f43a29e42fd453d"}, + {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:68c3a60a39f9179b263d29e221c1bd6e01353178b14323c39cc70593c30f21c5"}, + {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:59111c08b8f34495575d12e5f2ce3bafb98bea470bc81e70c8b6df99aef0dd2f"}, + {file = "pysha3-1.0.2-cp33-cp33m-win32.whl", hash = "sha256:571a246308a7b63f15f5aa9651f99cf30f2a6acba18eddf28f1510935968b603"}, + {file = "pysha3-1.0.2-cp33-cp33m-win_amd64.whl", hash = "sha256:93abd775dac570cb9951c4e423bcb2bc6303a9d1dc0dc2b7afa2dd401d195b24"}, + {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:11a2ba7a2e1d9669d0052fc8fb30f5661caed5512586ecbeeaf6bf9478ab5c48"}, + {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:5ec8da7c5c70a53b5fa99094af3ba8d343955b212bc346a0d25f6ff75853999f"}, + {file = "pysha3-1.0.2-cp34-cp34m-win32.whl", hash = "sha256:9c778fa8b161dc9348dc5cc361e94d54aa5ff18413788f4641f6600d4893a608"}, + {file = "pysha3-1.0.2-cp34-cp34m-win_amd64.whl", hash = "sha256:fd7e66999060d079e9c0e8893e78d8017dad4f59721f6fe0be6307cd32127a07"}, + {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:827b308dc025efe9b6b7bae36c2e09ed0118a81f792d888548188e97b9bf9a3d"}, + {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4416f16b0f1605c25f627966f76873e432971824778b369bd9ce1bb63d6566d9"}, + {file = "pysha3-1.0.2-cp35-cp35m-win32.whl", hash = "sha256:c93a2676e6588abcfaecb73eb14485c81c63b94fca2000a811a7b4fb5937b8e8"}, + {file = "pysha3-1.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:684cb01d87ed6ff466c135f1c83e7e4042d0fc668fa20619f581e6add1d38d77"}, + {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:386998ee83e313b6911327174e088021f9f2061cbfa1651b97629b761e9ef5c4"}, + {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c7c2adcc43836223680ebdf91f1d3373543dc32747c182c8ca2e02d1b69ce030"}, + {file = "pysha3-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:cd5c961b603bd2e6c2b5ef9976f3238a561c58569945d4165efb9b9383b050ef"}, + {file = "pysha3-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0060a66be16665d90c432f55a0ba1f6480590cfb7d2ad389e688a399183474f0"}, + {file = "pysha3-1.0.2.tar.gz", hash = "sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e"}, +] + [[package]] name = "pytest" version = "7.3.0" From ef43f0a40ebcd0c52ec3459817b36cea9aeec2e7 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:27:48 +0330 Subject: [PATCH 04/38] add validator for trx addresses --- validators/__init__.py | 2 ++ validators/trx_address.py | 60 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 validators/trx_address.py diff --git a/validators/__init__.py b/validators/__init__.py index c78c27ab..6d97b672 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -20,6 +20,7 @@ from .length import length from .mac_address import mac_address from .slug import slug +from .trx_address import trx_address from .url import url from .utils import validator, ValidationFailure from .uuid import uuid @@ -49,6 +50,7 @@ "sha256", "sha512", "slug", + "trx_address", "unionpay", "url", "uuid", diff --git a/validators/trx_address.py b/validators/trx_address.py new file mode 100644 index 00000000..ce716520 --- /dev/null +++ b/validators/trx_address.py @@ -0,0 +1,60 @@ +"""TRX Address.""" +# -*- coding: utf-8 -*- + +# standard +from _sha256 import sha256 +import re + +import base58 + +# local +from .utils import validator + + +def _validate_trx_checksum_address(addr: str): + """Validate TRX type checksum address.""" + if len(addr) != 34: + return False + + address = base58.b58decode(addr) + if len(address) != 25: + return False + + if address[0] != 0x41: + return False + + check_sum = sha256(sha256(address[:-4]).digest()).digest()[:4] + if address[-4:] == check_sum: + return True + + +@validator +def trx_address(value: str, /): + """Return whether or not given value is a valid tron (trx) address. + + Full validation is implemented for TRC20 addresses. + + Examples: + >>> trx_address('TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38') + # Output: True + >>> trx_address('TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd ') + # Output: ValidationFailure(func=trx_address, args=...) + + Args: + value: + Tron address string to validate. + + Returns: + (Literal[True]): + If `value` is a valid tron address. + (ValidationFailure): + If `value` is an invalid tron address. + + """ + if not value: + return False + + return ( + re.compile(r"^(T|41)[a-zA-Z0-9]{33}$").match(value) and + _validate_trx_checksum_address(value) + ) From 2094e29e274349def47fb9e8295408e09fe12d27 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:28:06 +0330 Subject: [PATCH 05/38] add unit test for trx address validator --- tests/test_trx_address.py | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/test_trx_address.py diff --git a/tests/test_trx_address.py b/tests/test_trx_address.py new file mode 100644 index 00000000..1223ce4b --- /dev/null +++ b/tests/test_trx_address.py @@ -0,0 +1,54 @@ +"""Test TRX address.""" +# -*- coding: utf-8 -*- + +# external +import pytest + +# local +from validators import trx_address, ValidationFailure + + +@pytest.mark.parametrize( + "value", + [ + "TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38", + "TDQ6C92wuNqvMWE967sMptCFaXq77uj1PF", + "TFuGbxCQGSL4oLnJzVsen844LDwFbrUY4e", + "TFAPKADDRhkSe3v27CsR8TZSjN8eJ8ycDK", + "TSJHywLNva2MNjCD5iYfn5QAKD9Rk5Ncit", + "TEi1qhi5LuTicg1u9oAstyXCSf5uibSyqo", + "TAGvx5An6VBeHTu91cQwdABNcAYMRPcP4n", + "TXbE5tXTejqT3Q47sYKCDb9NJDm3xrFpab", + "TMTxQWNuWHXvHcYXc5D1wQhFmZFJijAxcG", + "TPHgw9E8QYM3esNWih5KVnUVpUHwLTPfpA", + "TFFLtBTi9jdaGwV3hznjCmPYaJme5AeqwU", + ], +) +def test_returns_true_on_valid_trx_address(value: str): + """Test returns true on valid trx address.""" + assert trx_address(value) + + +@pytest.mark.parametrize( + "value", + [ + "T12345678901234567890123456789012345", + "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd", + "TP6ah2v5mdsj8Z3hGz1yDMvDq7BzEbK8o", + "TQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4XX", + "TQNy2C6VHJPk4P32bsEX3QSGx2Qqm4J2k9", + "TP6ah2v5mdsj8Z3hGz1yDMvDq7BzEbK8oN", + "TSTVdfU1x4L7K3Bc3v5C28Gp2J1rPyeL3f", + "THPByuCzvU5QER9j2NC2mUQ2JPyRCam4e7", + "TW5eZqUZgdW4rxFKAKsc2ryJbfFA94WXvD", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vdd", + "tQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4X", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8VD", + "TQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4x", + "my-trox-address.trx" + ], +) +def test_returns_failed_validation_on_invalid_trx_address(value: str): + """Test returns failed validation on invalid trx address.""" + assert isinstance(trx_address(value), ValidationFailure) From 95047c3fe23b52ea946274979834bb0bd22c5cd2 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:28:20 +0330 Subject: [PATCH 06/38] add base58 dependency --- poetry.lock | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5425562a..f680d793 100644 --- a/poetry.lock +++ b/poetry.lock @@ -51,6 +51,18 @@ test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", toml = ["tomli (>=1.1.0)"] yaml = ["PyYAML"] +[[package]] +name = "base58" +version = "2.1.1" +description = "Base58 and Base58Check implementation." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] + [[package]] name = "black" version = "23.3.0" @@ -1274,21 +1286,21 @@ files = [ [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] From 1892a773c48d65e4f693752c90a5a545b3e649ae Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:30:27 +0330 Subject: [PATCH 07/38] change an invalid trx address --- tests/test_trx_address.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_trx_address.py b/tests/test_trx_address.py index 1223ce4b..3d5c3c41 100644 --- a/tests/test_trx_address.py +++ b/tests/test_trx_address.py @@ -44,7 +44,7 @@ def test_returns_true_on_valid_trx_address(value: str): "TW5eZqUZgdW4rxFKAKsc2ryJbfFA94WXvD", "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vdd", "tQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4X", - "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8VD", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7Xg", "TQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4x", "my-trox-address.trx" ], From dd65e7c442847a2b58a0312f8a63f9d8e2dcfd21 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:30:43 +0330 Subject: [PATCH 08/38] minor change in docstrings --- validators/trx_address.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/validators/trx_address.py b/validators/trx_address.py index ce716520..84b9c4dd 100644 --- a/validators/trx_address.py +++ b/validators/trx_address.py @@ -32,12 +32,12 @@ def _validate_trx_checksum_address(addr: str): def trx_address(value: str, /): """Return whether or not given value is a valid tron (trx) address. - Full validation is implemented for TRC20 addresses. + Full validation is implemented for TRC20 tron addresses. Examples: >>> trx_address('TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38') # Output: True - >>> trx_address('TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd ') + >>> trx_address('TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd') # Output: ValidationFailure(func=trx_address, args=...) Args: From 5592922ff6d22c1e5971d6cc537a15fccf1953e2 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:38:06 +0330 Subject: [PATCH 09/38] move trx validator to a submodule --- validators/__init__.py | 2 +- validators/crypto_addresses/__init__.py | 10 ++++++++++ validators/{ => crypto_addresses}/trx_address.py | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 validators/crypto_addresses/__init__.py rename validators/{ => crypto_addresses}/trx_address.py (97%) diff --git a/validators/__init__.py b/validators/__init__.py index 6d97b672..5bfad12f 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -20,7 +20,7 @@ from .length import length from .mac_address import mac_address from .slug import slug -from .trx_address import trx_address +from crypto_addresses.trx_address import trx_address from .url import url from .utils import validator, ValidationFailure from .uuid import uuid diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py new file mode 100644 index 00000000..7acf0da7 --- /dev/null +++ b/validators/crypto_addresses/__init__.py @@ -0,0 +1,10 @@ +"""Crypto addresses.""" +# -*- coding: utf-8 -*- + +# isort: skip_file + +# local +from .eth_address import eth_address +from .trx_address import trx_address + +__all__ = ("eth_address", "trx_address") diff --git a/validators/trx_address.py b/validators/crypto_addresses/trx_address.py similarity index 97% rename from validators/trx_address.py rename to validators/crypto_addresses/trx_address.py index 84b9c4dd..03ff98b9 100644 --- a/validators/trx_address.py +++ b/validators/crypto_addresses/trx_address.py @@ -8,7 +8,7 @@ import base58 # local -from .utils import validator +from validators.utils import validator def _validate_trx_checksum_address(addr: str): From 3f1d36804db2ad7fec8e537a281b3e6def5fc5ec Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:38:22 +0330 Subject: [PATCH 10/38] move trx validator tests to a submodule --- tests/crypto_addresses/__init__.py | 4 ++++ tests/{ => crypto_addresses}/test_trx_address.py | 0 2 files changed, 4 insertions(+) create mode 100644 tests/crypto_addresses/__init__.py rename tests/{ => crypto_addresses}/test_trx_address.py (100%) diff --git a/tests/crypto_addresses/__init__.py b/tests/crypto_addresses/__init__.py new file mode 100644 index 00000000..956d8177 --- /dev/null +++ b/tests/crypto_addresses/__init__.py @@ -0,0 +1,4 @@ +"""Test crypto addresses.""" +# -*- coding: utf-8 -*- + +# isort: skip_file diff --git a/tests/test_trx_address.py b/tests/crypto_addresses/test_trx_address.py similarity index 100% rename from tests/test_trx_address.py rename to tests/crypto_addresses/test_trx_address.py From 02267c32fc2a1d9acefcdb130858f2cfb2019bd4 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:42:07 +0330 Subject: [PATCH 11/38] move eth and btc validators to a new submodule --- validators/__init__.py | 4 ++-- validators/{ => crypto_addresses}/btc_address.py | 0 validators/{ => crypto_addresses}/eth_address.py | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename validators/{ => crypto_addresses}/btc_address.py (100%) rename validators/{ => crypto_addresses}/eth_address.py (100%) diff --git a/validators/__init__.py b/validators/__init__.py index 7ba5477d..2dfd7063 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -9,11 +9,11 @@ # local from .between import between -from .btc_address import btc_address +from crypto_addresses.btc_address import btc_address from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .domain import domain from .email import email -from .eth_address import eth_address +from crypto_addresses.eth_address import eth_address from .hashes import md5, sha1, sha224, sha256, sha512 from .hostname import hostname from .iban import iban diff --git a/validators/btc_address.py b/validators/crypto_addresses/btc_address.py similarity index 100% rename from validators/btc_address.py rename to validators/crypto_addresses/btc_address.py diff --git a/validators/eth_address.py b/validators/crypto_addresses/eth_address.py similarity index 100% rename from validators/eth_address.py rename to validators/crypto_addresses/eth_address.py From 8a66692a64cc52c2b5026d159d8bae00e1507f9e Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:42:28 +0330 Subject: [PATCH 12/38] move eth and btc validators' tests to a new submodule --- tests/{ => crypto_addresses}/test_btc_address.py | 0 tests/{ => crypto_addresses}/test_eth_address.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/{ => crypto_addresses}/test_btc_address.py (100%) rename tests/{ => crypto_addresses}/test_eth_address.py (100%) diff --git a/tests/test_btc_address.py b/tests/crypto_addresses/test_btc_address.py similarity index 100% rename from tests/test_btc_address.py rename to tests/crypto_addresses/test_btc_address.py diff --git a/tests/test_eth_address.py b/tests/crypto_addresses/test_eth_address.py similarity index 100% rename from tests/test_eth_address.py rename to tests/crypto_addresses/test_eth_address.py From 875dcd351d05ef68c116f935d2eb00509209d1a9 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:48:22 +0330 Subject: [PATCH 13/38] add init files for new submodules --- tests/crypto_addresses/__init__.py | 4 ++++ validators/crypto_addresses/__init__.py | 10 ++++++++++ 2 files changed, 14 insertions(+) create mode 100644 tests/crypto_addresses/__init__.py create mode 100644 validators/crypto_addresses/__init__.py diff --git a/tests/crypto_addresses/__init__.py b/tests/crypto_addresses/__init__.py new file mode 100644 index 00000000..956d8177 --- /dev/null +++ b/tests/crypto_addresses/__init__.py @@ -0,0 +1,4 @@ +"""Test crypto addresses.""" +# -*- coding: utf-8 -*- + +# isort: skip_file diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py new file mode 100644 index 00000000..b6b90b36 --- /dev/null +++ b/validators/crypto_addresses/__init__.py @@ -0,0 +1,10 @@ +"""Crypto addresses.""" +# -*- coding: utf-8 -*- + +# isort: skip_file + +# local +from .btc_address import btc_address +from .eth_address import eth_address + +__all__ = ("btc_address", "eth_address") From fbd43f8217eb8d1c337d1741a060473a6789afa4 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:49:54 +0330 Subject: [PATCH 14/38] add btc and eth validators to init --- validators/crypto_addresses/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 7acf0da7..25f1183d 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -4,7 +4,8 @@ # isort: skip_file # local +from .btc_address import btc_address from .eth_address import eth_address from .trx_address import trx_address -__all__ = ("eth_address", "trx_address") +__all__ = ("btc_address", "eth_address", "trx_address") From ec1071f90f0462dd596bda7ffa85d999397e5d05 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:54:22 +0330 Subject: [PATCH 15/38] add trx validator to init --- validators/crypto_addresses/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index b6b90b36..25f1183d 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -6,5 +6,6 @@ # local from .btc_address import btc_address from .eth_address import eth_address +from .trx_address import trx_address -__all__ = ("btc_address", "eth_address") +__all__ = ("btc_address", "eth_address", "trx_address") From 11ee0e1895f2220dadffb8e106eda3a0c1c2128a Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 15:15:04 +0330 Subject: [PATCH 16/38] fix bug in importing validator --- validators/crypto_addresses/eth_address.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validators/crypto_addresses/eth_address.py b/validators/crypto_addresses/eth_address.py index 3c8b9e2a..7e39a49f 100644 --- a/validators/crypto_addresses/eth_address.py +++ b/validators/crypto_addresses/eth_address.py @@ -7,7 +7,7 @@ from sha3 import keccak_256 # local -from .utils import validator +from validators.utils import validator def _validate_eth_checksum_address(addr: str): From a3b73671417cae497ed3e311c93a86c132639d8e Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 15:16:09 +0330 Subject: [PATCH 17/38] revert moving btc validator and its tests to new submodules --- tests/{crypto_addresses => }/test_btc_address.py | 0 validators/{crypto_addresses => }/btc_address.py | 0 validators/crypto_addresses/__init__.py | 3 +-- 3 files changed, 1 insertion(+), 2 deletions(-) rename tests/{crypto_addresses => }/test_btc_address.py (100%) rename validators/{crypto_addresses => }/btc_address.py (100%) diff --git a/tests/crypto_addresses/test_btc_address.py b/tests/test_btc_address.py similarity index 100% rename from tests/crypto_addresses/test_btc_address.py rename to tests/test_btc_address.py diff --git a/validators/crypto_addresses/btc_address.py b/validators/btc_address.py similarity index 100% rename from validators/crypto_addresses/btc_address.py rename to validators/btc_address.py diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 25f1183d..7acf0da7 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -4,8 +4,7 @@ # isort: skip_file # local -from .btc_address import btc_address from .eth_address import eth_address from .trx_address import trx_address -__all__ = ("btc_address", "eth_address", "trx_address") +__all__ = ("eth_address", "trx_address") From 9345ae4489c934a59367008a62e604a37ea28f19 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 15:19:27 +0330 Subject: [PATCH 18/38] remove btc validator from init --- validators/crypto_addresses/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 25f1183d..7acf0da7 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -4,8 +4,7 @@ # isort: skip_file # local -from .btc_address import btc_address from .eth_address import eth_address from .trx_address import trx_address -__all__ = ("btc_address", "eth_address", "trx_address") +__all__ = ("eth_address", "trx_address") From 80c8fb930bafced0f21945f2c38a85857cdf73a5 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 15:26:55 +0330 Subject: [PATCH 19/38] move btc estimator and its test to crypto addresses submodules --- tests/{ => crypto_addresses}/test_btc_address.py | 0 validators/__init__.py | 2 +- validators/crypto_addresses/__init__.py | 3 ++- validators/{ => crypto_addresses}/btc_address.py | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) rename tests/{ => crypto_addresses}/test_btc_address.py (100%) rename validators/{ => crypto_addresses}/btc_address.py (97%) diff --git a/tests/test_btc_address.py b/tests/crypto_addresses/test_btc_address.py similarity index 100% rename from tests/test_btc_address.py rename to tests/crypto_addresses/test_btc_address.py diff --git a/validators/__init__.py b/validators/__init__.py index 5bfad12f..d7b5a8e2 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -9,7 +9,7 @@ # local from .between import between -from .btc_address import btc_address +from crypto_addresses.btc_address import btc_address from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .domain import domain from .email import email diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 7acf0da7..25f1183d 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -4,7 +4,8 @@ # isort: skip_file # local +from .btc_address import btc_address from .eth_address import eth_address from .trx_address import trx_address -__all__ = ("eth_address", "trx_address") +__all__ = ("btc_address", "eth_address", "trx_address") diff --git a/validators/btc_address.py b/validators/crypto_addresses/btc_address.py similarity index 97% rename from validators/btc_address.py rename to validators/crypto_addresses/btc_address.py index e8267ddc..a92513d8 100644 --- a/validators/btc_address.py +++ b/validators/crypto_addresses/btc_address.py @@ -6,7 +6,7 @@ import re # local -from .utils import validator +from validators.utils import validator def _decode_base58(addr: str): From a97c5d186cb40db467b6311388735d4e1b13bc8e Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 15:27:39 +0330 Subject: [PATCH 20/38] fix import --- validators/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validators/__init__.py b/validators/__init__.py index 2dfd7063..20197e93 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -9,7 +9,7 @@ # local from .between import between -from crypto_addresses.btc_address import btc_address +from .btc_address import btc_address from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .domain import domain from .email import email From d0a1eac8721dc36d89b4526835be7efb3afbd8ed Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sat, 17 Jun 2023 12:23:03 +0330 Subject: [PATCH 21/38] remove faulty test value --- tests/crypto_addresses/test_eth_address.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/crypto_addresses/test_eth_address.py b/tests/crypto_addresses/test_eth_address.py index 984858de..40b4d25f 100644 --- a/tests/crypto_addresses/test_eth_address.py +++ b/tests/crypto_addresses/test_eth_address.py @@ -15,7 +15,6 @@ "0x9cc14ba4f9f68ca159ea4ebf2c292a808aaeb598", "0x5AEDA56215b167893e80B4fE645BA6d5Bab767DE", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "742d35Cc6634C0532925a3b844Bc454e4438f44e", "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", "0x1234567890123456789012345678901234567890", From e4128c9943788e7a338ca72bb9552f1a129637ee Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sat, 17 Jun 2023 12:24:03 +0330 Subject: [PATCH 22/38] use relative import --- validators/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validators/__init__.py b/validators/__init__.py index 20197e93..2df05054 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -13,7 +13,6 @@ from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .domain import domain from .email import email -from crypto_addresses.eth_address import eth_address from .hashes import md5, sha1, sha224, sha256, sha512 from .hostname import hostname from .iban import iban @@ -25,6 +24,7 @@ from .utils import validator, ValidationFailure from .uuid import uuid +from .crypto_addresses import eth_address from .i18n import es_cif, es_doi, es_nie, es_nif, fi_business_id, fi_ssn __all__ = ( From 1715ea38098e3650c322aa73851d08a5044344b0 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sat, 17 Jun 2023 12:24:49 +0330 Subject: [PATCH 23/38] remove trx_validator --- validators/crypto_addresses/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 7acf0da7..2b62a3bf 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -5,6 +5,5 @@ # local from .eth_address import eth_address -from .trx_address import trx_address -__all__ = ("eth_address", "trx_address") +__all__ = ("eth_address", ) From 8be96ea764cbd80775a5f0b39e1f47617a88cbc2 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sat, 17 Jun 2023 12:50:37 +0330 Subject: [PATCH 24/38] fix bugs in test values --- tests/crypto_addresses/test_eth_address.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/crypto_addresses/test_eth_address.py b/tests/crypto_addresses/test_eth_address.py index 40b4d25f..4c0c8814 100644 --- a/tests/crypto_addresses/test_eth_address.py +++ b/tests/crypto_addresses/test_eth_address.py @@ -32,12 +32,11 @@ def test_returns_true_on_valid_eth_address(value: str): "0x742d35Cc6634C0532925a3b844Bc454e4438f44g", "0x742d35Cc6634C0532925a3b844Bc454e4438f44", "0xAbcdefg1234567890Abcdefg1234567890Abcdefg", - "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c72" + "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c72", "0x80fBD7F8B3f81D0e1d6EACAb69AF104A6508AFB1", "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c7g", - "0x8Ba1f109551bD432803012645Ac136ddd64DBa72", "0x7c8EE9977c6f96b6b9774b3e8e4Cc9B93B12b2c", - "0x7Fb21a171205f3B8d8E4d88A2d2f8A56E45DdB5c" + "0x7Fb21a171205f3B8d8E4d88A2d2f8A56E45DdB5c", "validators.eth", ], ) From 8f2e25345ca05b6d812af4e021389193f5374d56 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sat, 17 Jun 2023 12:59:12 +0330 Subject: [PATCH 25/38] combine eth regex checks into one check --- validators/crypto_addresses/eth_address.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/validators/crypto_addresses/eth_address.py b/validators/crypto_addresses/eth_address.py index 7e39a49f..67686ab0 100644 --- a/validators/crypto_addresses/eth_address.py +++ b/validators/crypto_addresses/eth_address.py @@ -49,7 +49,6 @@ def eth_address(value: str, /): return False return ( - re.compile(r"^0x[0-9a-f]{40}$").match(value) or - re.compile(r"^0x[0-9A-F]{40}$").match(value) or + re.compile(r"^0x[0-9a-f]{40}$|^0x[0-9A-F]{40}$").match(value) or _validate_eth_checksum_address(value) ) From 04d9b8b87540a2f740652d5d5c2839b3121c18bb Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sat, 17 Jun 2023 13:12:15 +0330 Subject: [PATCH 26/38] check length in checksum validation --- validators/crypto_addresses/eth_address.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/validators/crypto_addresses/eth_address.py b/validators/crypto_addresses/eth_address.py index 67686ab0..e181b0b7 100644 --- a/validators/crypto_addresses/eth_address.py +++ b/validators/crypto_addresses/eth_address.py @@ -15,6 +15,9 @@ def _validate_eth_checksum_address(addr: str): addr = addr.replace("0x", "") addr_hash = keccak_256(addr.lower().encode("ascii")).hexdigest() + if len(addr) != 40: + return False + for i in range(0, 40): if ((int(addr_hash[i], 16) > 7 and addr[i].upper() != addr[i]) or (int(addr_hash[i], 16) <= 7 and addr[i].lower() != addr[i])): From 989d262636f0161d6efda13cd83c909d955e3c62 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:27:48 +0330 Subject: [PATCH 27/38] add validator for trx addresses --- validators/__init__.py | 2 ++ validators/trx_address.py | 60 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 validators/trx_address.py diff --git a/validators/__init__.py b/validators/__init__.py index 2df05054..6e4dd516 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -20,6 +20,7 @@ from .length import length from .mac_address import mac_address from .slug import slug +from .trx_address import trx_address from .url import url from .utils import validator, ValidationFailure from .uuid import uuid @@ -51,6 +52,7 @@ "sha256", "sha512", "slug", + "trx_address", "unionpay", "url", "uuid", diff --git a/validators/trx_address.py b/validators/trx_address.py new file mode 100644 index 00000000..ce716520 --- /dev/null +++ b/validators/trx_address.py @@ -0,0 +1,60 @@ +"""TRX Address.""" +# -*- coding: utf-8 -*- + +# standard +from _sha256 import sha256 +import re + +import base58 + +# local +from .utils import validator + + +def _validate_trx_checksum_address(addr: str): + """Validate TRX type checksum address.""" + if len(addr) != 34: + return False + + address = base58.b58decode(addr) + if len(address) != 25: + return False + + if address[0] != 0x41: + return False + + check_sum = sha256(sha256(address[:-4]).digest()).digest()[:4] + if address[-4:] == check_sum: + return True + + +@validator +def trx_address(value: str, /): + """Return whether or not given value is a valid tron (trx) address. + + Full validation is implemented for TRC20 addresses. + + Examples: + >>> trx_address('TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38') + # Output: True + >>> trx_address('TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd ') + # Output: ValidationFailure(func=trx_address, args=...) + + Args: + value: + Tron address string to validate. + + Returns: + (Literal[True]): + If `value` is a valid tron address. + (ValidationFailure): + If `value` is an invalid tron address. + + """ + if not value: + return False + + return ( + re.compile(r"^(T|41)[a-zA-Z0-9]{33}$").match(value) and + _validate_trx_checksum_address(value) + ) From 657f7c6e724f93bac757c7bf508e64d5285f9c4f Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:28:06 +0330 Subject: [PATCH 28/38] add unit test for trx address validator --- tests/test_trx_address.py | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/test_trx_address.py diff --git a/tests/test_trx_address.py b/tests/test_trx_address.py new file mode 100644 index 00000000..1223ce4b --- /dev/null +++ b/tests/test_trx_address.py @@ -0,0 +1,54 @@ +"""Test TRX address.""" +# -*- coding: utf-8 -*- + +# external +import pytest + +# local +from validators import trx_address, ValidationFailure + + +@pytest.mark.parametrize( + "value", + [ + "TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38", + "TDQ6C92wuNqvMWE967sMptCFaXq77uj1PF", + "TFuGbxCQGSL4oLnJzVsen844LDwFbrUY4e", + "TFAPKADDRhkSe3v27CsR8TZSjN8eJ8ycDK", + "TSJHywLNva2MNjCD5iYfn5QAKD9Rk5Ncit", + "TEi1qhi5LuTicg1u9oAstyXCSf5uibSyqo", + "TAGvx5An6VBeHTu91cQwdABNcAYMRPcP4n", + "TXbE5tXTejqT3Q47sYKCDb9NJDm3xrFpab", + "TMTxQWNuWHXvHcYXc5D1wQhFmZFJijAxcG", + "TPHgw9E8QYM3esNWih5KVnUVpUHwLTPfpA", + "TFFLtBTi9jdaGwV3hznjCmPYaJme5AeqwU", + ], +) +def test_returns_true_on_valid_trx_address(value: str): + """Test returns true on valid trx address.""" + assert trx_address(value) + + +@pytest.mark.parametrize( + "value", + [ + "T12345678901234567890123456789012345", + "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd", + "TP6ah2v5mdsj8Z3hGz1yDMvDq7BzEbK8o", + "TQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4XX", + "TQNy2C6VHJPk4P32bsEX3QSGx2Qqm4J2k9", + "TP6ah2v5mdsj8Z3hGz1yDMvDq7BzEbK8oN", + "TSTVdfU1x4L7K3Bc3v5C28Gp2J1rPyeL3f", + "THPByuCzvU5QER9j2NC2mUQ2JPyRCam4e7", + "TW5eZqUZgdW4rxFKAKsc2ryJbfFA94WXvD", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vdd", + "tQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4X", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8VD", + "TQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4x", + "my-trox-address.trx" + ], +) +def test_returns_failed_validation_on_invalid_trx_address(value: str): + """Test returns failed validation on invalid trx address.""" + assert isinstance(trx_address(value), ValidationFailure) From 2ad44246780fe9ce862f715d75603b6ca77c4ec2 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:28:20 +0330 Subject: [PATCH 29/38] add base58 dependency --- poetry.lock | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/poetry.lock b/poetry.lock index 929d4922..5768d2e8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -51,6 +51,18 @@ test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", toml = ["tomli (>=1.1.0)"] yaml = ["PyYAML"] +[[package]] +name = "base58" +version = "2.1.1" +description = "Base58 and Base58Check implementation." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] + [[package]] name = "black" version = "23.3.0" From 9dd10b1393eacf02067e30f6967b5624c340241c Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:30:27 +0330 Subject: [PATCH 30/38] change an invalid trx address --- tests/test_trx_address.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_trx_address.py b/tests/test_trx_address.py index 1223ce4b..3d5c3c41 100644 --- a/tests/test_trx_address.py +++ b/tests/test_trx_address.py @@ -44,7 +44,7 @@ def test_returns_true_on_valid_trx_address(value: str): "TW5eZqUZgdW4rxFKAKsc2ryJbfFA94WXvD", "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vdd", "tQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4X", - "TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8VD", + "TR2G7Rm4vFqF8EpY4U5xdLdQ7Xg", "TQmmhp6uz2Xre8yL3FsPYZyo4mhtw4vg4x", "my-trox-address.trx" ], From 0369ab16037ca98b3babe4e643fa9ad548bc0d3e Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sun, 11 Jun 2023 11:30:43 +0330 Subject: [PATCH 31/38] minor change in docstrings --- validators/trx_address.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/validators/trx_address.py b/validators/trx_address.py index ce716520..84b9c4dd 100644 --- a/validators/trx_address.py +++ b/validators/trx_address.py @@ -32,12 +32,12 @@ def _validate_trx_checksum_address(addr: str): def trx_address(value: str, /): """Return whether or not given value is a valid tron (trx) address. - Full validation is implemented for TRC20 addresses. + Full validation is implemented for TRC20 tron addresses. Examples: >>> trx_address('TLjfbTbpZYDQ4EoA4N5CLNgGjfbF8ZWz38') # Output: True - >>> trx_address('TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd ') + >>> trx_address('TR2G7Rm4vFqF8EpY4U5xdLdQ7XgJ2U8Vd') # Output: ValidationFailure(func=trx_address, args=...) Args: From 7e015384a0aab3c0923d90eb667957abf23f7cc6 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:38:06 +0330 Subject: [PATCH 32/38] rebase with parent branch --- validators/__init__.py | 3 +-- validators/crypto_addresses/__init__.py | 3 ++- validators/{ => crypto_addresses}/trx_address.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename validators/{ => crypto_addresses}/trx_address.py (97%) diff --git a/validators/__init__.py b/validators/__init__.py index 6e4dd516..2aaf25be 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -20,12 +20,11 @@ from .length import length from .mac_address import mac_address from .slug import slug -from .trx_address import trx_address from .url import url from .utils import validator, ValidationFailure from .uuid import uuid -from .crypto_addresses import eth_address +from .crypto_addresses import eth_address, trx_address from .i18n import es_cif, es_doi, es_nie, es_nif, fi_business_id, fi_ssn __all__ = ( diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 2b62a3bf..7acf0da7 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -5,5 +5,6 @@ # local from .eth_address import eth_address +from .trx_address import trx_address -__all__ = ("eth_address", ) +__all__ = ("eth_address", "trx_address") diff --git a/validators/trx_address.py b/validators/crypto_addresses/trx_address.py similarity index 97% rename from validators/trx_address.py rename to validators/crypto_addresses/trx_address.py index 84b9c4dd..03ff98b9 100644 --- a/validators/trx_address.py +++ b/validators/crypto_addresses/trx_address.py @@ -8,7 +8,7 @@ import base58 # local -from .utils import validator +from validators.utils import validator def _validate_trx_checksum_address(addr: str): From 49fa8e6537ee807eb4eb51dad20c768bf66c3d75 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:38:22 +0330 Subject: [PATCH 33/38] move trx validator tests to a submodule --- tests/{ => crypto_addresses}/test_trx_address.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{ => crypto_addresses}/test_trx_address.py (100%) diff --git a/tests/test_trx_address.py b/tests/crypto_addresses/test_trx_address.py similarity index 100% rename from tests/test_trx_address.py rename to tests/crypto_addresses/test_trx_address.py From d35aceb5f4a2fde547d0e4b0a8ff38067c0d43f1 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 13:49:54 +0330 Subject: [PATCH 34/38] add btc and eth validators to init --- validators/crypto_addresses/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 7acf0da7..25f1183d 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -4,7 +4,8 @@ # isort: skip_file # local +from .btc_address import btc_address from .eth_address import eth_address from .trx_address import trx_address -__all__ = ("eth_address", "trx_address") +__all__ = ("btc_address", "eth_address", "trx_address") From 472518d9f50b09a2de199f5454f4487d3c933438 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 15:19:27 +0330 Subject: [PATCH 35/38] remove btc validator from init --- validators/crypto_addresses/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 25f1183d..7acf0da7 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -4,8 +4,7 @@ # isort: skip_file # local -from .btc_address import btc_address from .eth_address import eth_address from .trx_address import trx_address -__all__ = ("btc_address", "eth_address", "trx_address") +__all__ = ("eth_address", "trx_address") From 9b29318c87c954e29ae6e546cba9ac33dfabac32 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sat, 17 Jun 2023 13:37:15 +0330 Subject: [PATCH 36/38] use relative import --- validators/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/validators/__init__.py b/validators/__init__.py index 2e23c1b5..2aaf25be 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -20,7 +20,6 @@ from .length import length from .mac_address import mac_address from .slug import slug -from crypto_addresses.trx_address import trx_address from .url import url from .utils import validator, ValidationFailure from .uuid import uuid From 4d9904f443c46134b628309e7e1984fe3b88453a Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Mon, 12 Jun 2023 15:26:55 +0330 Subject: [PATCH 37/38] move btc estimator and its test to crypto addresses submodules --- tests/{ => crypto_addresses}/test_btc_address.py | 0 validators/__init__.py | 2 +- validators/crypto_addresses/__init__.py | 3 ++- validators/{ => crypto_addresses}/btc_address.py | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) rename tests/{ => crypto_addresses}/test_btc_address.py (100%) rename validators/{ => crypto_addresses}/btc_address.py (97%) diff --git a/tests/test_btc_address.py b/tests/crypto_addresses/test_btc_address.py similarity index 100% rename from tests/test_btc_address.py rename to tests/crypto_addresses/test_btc_address.py diff --git a/validators/__init__.py b/validators/__init__.py index 2aaf25be..614f19dd 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -9,7 +9,7 @@ # local from .between import between -from .btc_address import btc_address +from crypto_addresses.btc_address import btc_address from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .domain import domain from .email import email diff --git a/validators/crypto_addresses/__init__.py b/validators/crypto_addresses/__init__.py index 7acf0da7..25f1183d 100644 --- a/validators/crypto_addresses/__init__.py +++ b/validators/crypto_addresses/__init__.py @@ -4,7 +4,8 @@ # isort: skip_file # local +from .btc_address import btc_address from .eth_address import eth_address from .trx_address import trx_address -__all__ = ("eth_address", "trx_address") +__all__ = ("btc_address", "eth_address", "trx_address") diff --git a/validators/btc_address.py b/validators/crypto_addresses/btc_address.py similarity index 97% rename from validators/btc_address.py rename to validators/crypto_addresses/btc_address.py index e8267ddc..a92513d8 100644 --- a/validators/btc_address.py +++ b/validators/crypto_addresses/btc_address.py @@ -6,7 +6,7 @@ import re # local -from .utils import validator +from validators.utils import validator def _decode_base58(addr: str): From 27c6d70144d4e17cac264c30f42d9e3f5a7e6f35 Mon Sep 17 00:00:00 2001 From: Mehdi Samsami Date: Sat, 17 Jun 2023 13:42:35 +0330 Subject: [PATCH 38/38] use relative import --- validators/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/validators/__init__.py b/validators/__init__.py index 614f19dd..b84a5c1b 100644 --- a/validators/__init__.py +++ b/validators/__init__.py @@ -9,7 +9,6 @@ # local from .between import between -from crypto_addresses.btc_address import btc_address from .card import amex, card_number, diners, discover, jcb, mastercard, unionpay, visa from .domain import domain from .email import email @@ -24,7 +23,7 @@ from .utils import validator, ValidationFailure from .uuid import uuid -from .crypto_addresses import eth_address, trx_address +from .crypto_addresses import btc_address, eth_address, trx_address from .i18n import es_cif, es_doi, es_nie, es_nif, fi_business_id, fi_ssn __all__ = (