From c048c75c9daa14b04a8330f58712af686ab017ba Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Wed, 5 Jan 2022 15:30:44 +0330 Subject: [PATCH 01/11] Stellar: Use fastcrc instead of crc16 --- coinaddrng/validation.py | 4 ++-- requirements.txt | 2 +- setup.py | 2 +- tests/test_coinaddr.py | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/coinaddrng/validation.py b/coinaddrng/validation.py index 01c18c8..dbde00a 100644 --- a/coinaddrng/validation.py +++ b/coinaddrng/validation.py @@ -20,7 +20,7 @@ import math from binascii import unhexlify, crc32 import base64 -import crc16 +from fastcrc import crc16 from blake256 import blake256 import cbor import bech32 @@ -440,7 +440,7 @@ def validate(self): if version_byte != 6 << 3: # ed25519PublicKey return False - checksum = crc16.crc16xmodem(payload) + checksum = crc16.xmodem(payload) if checksum != expected_checksum: return False diff --git a/requirements.txt b/requirements.txt index 8a00f0b..9826583 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,4 @@ bech32 cbor blake256 groestlcoin_hash2 -crc16 \ No newline at end of file +fastcrc diff --git a/setup.py b/setup.py index 81bc4d2..3f13653 100644 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ 'pysha3>=1.0.2', 'base58check>=1.0.1', 'zope.interface>=4.4.3', - 'crc16>=0.1.1', + 'fastcrc>=0.1.1', 'blake256>=0.1.1', 'cbor>=1.0.0', 'bech32>=1.1.0', diff --git a/tests/test_coinaddr.py b/tests/test_coinaddr.py index a846d3d..5b8a87a 100644 --- a/tests/test_coinaddr.py +++ b/tests/test_coinaddr.py @@ -37,6 +37,7 @@ ('terramoney', 'luna', b'terra1v5hrqlv8dqgzvy0pwzqzg0gxy899rm4kdn0jp4', ''), ('polkadot', 'dot', b'12gX42C4Fj1wgtfgoP624zeHrcPBqzhb4yAENyvFdGX6EUnN', ''), ('kusama', 'ksm', b'GLdQ4D4wkeEJUX8DBT9HkpycFVYQZ3fmJyQ5ZgBRxZ4LD3S', ''), + ('stellar', 'xlm', b'GA7YNBW5CBTJZ3ZZOWX3ZNBKD6OE7A7IHUQVWMY62W2ZBG2SGZVOOPVH', ''), ] WRONG_DATA = [ From 27a4ea54e996047bfbf0f0f83a3b4d66eb0e4ac7 Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Wed, 5 Jan 2022 19:30:29 +0330 Subject: [PATCH 02/11] LTC: Support segwit address in ltc --- coinaddrng/currency.py | 7 ++++--- coinaddrng/validation.py | 7 +++++-- tests/test_coinaddr.py | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/coinaddrng/currency.py b/coinaddrng/currency.py index 72de7d2..dbd2821 100644 --- a/coinaddrng/currency.py +++ b/coinaddrng/currency.py @@ -78,11 +78,12 @@ class Currency(metaclass=CurrencyMeta): Currency('bitcoin-cash', ticker='bch', validator='Base58Check', networks=dict( main=(0x00, 0x05), test=(0x6f, 0xc4))) -Currency('litecoin', ticker='ltc', validator='Base58Check', +Currency('litecoin', ticker='ltc', validator='BitcoinBasedCheck', networks=dict( main=(0x30, 0x05, 0x32, 0x019da462, 0x01b26ef6, - 0x488B21E, 0x49D7CB2, 0x4B24746, 0x295B43F, 0x2AA7ED3), - test=(0x6f, 0xc4, 0x0436f6e1))) + 0x488B21E, 0x49D7CB2, 0x4B24746, 0x295B43F, + 0x2AA7ED3, 'ltc'), + test=(0x6f, 0xc4, 0x0436f6e1, 'tltc'))) Currency('dogecoin', ticker='doge', validator='Base58Check', networks=dict( main=(0x1e, 0x16), test=(0x71, 0xc4))) diff --git a/coinaddrng/validation.py b/coinaddrng/validation.py index 01c18c8..0506f94 100644 --- a/coinaddrng/validation.py +++ b/coinaddrng/validation.py @@ -291,8 +291,11 @@ def validate_extended(self,checksum_algo='sha256'): @property def network(self): """Return network derived from network version bytes.""" - abytes = base58check.b58decode( - self.request.address, **self.request.extras) + try: + abytes = base58check.b58decode( + self.request.address, **self.request.extras) + except ValueError: + return '' nbyte = abytes[0] for name, networks in self.request.currency.networks.items(): diff --git a/tests/test_coinaddr.py b/tests/test_coinaddr.py index a846d3d..72266d2 100644 --- a/tests/test_coinaddr.py +++ b/tests/test_coinaddr.py @@ -23,6 +23,7 @@ ('bitcoin-cash', 'bch', b'3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC', 'main'), ('litecoin', 'ltc', b'LeF6vC9k1qfFDEj6UGjM5e4fwHtiKsakTd', 'main'), ('litecoin', 'ltc', b'mkwV3DZkgYwKaXkphBtcXAjsYQEqZ8aB3x', 'test'), + ('litecoin', 'ltc', b'ltc1qs54v679auflz9y88nleyy6qknalwwmfx6kcf8z', 'main'), ('neocoin', 'neo', b'AL9fzczwjV6ynoFAJVz4fBDu4NYLG6MBwm', 'both'), ('dogecoin', 'doge', b'DAnBU2rLkUgQb1ZLBJd6Bm5pZ45RN4TQC4', 'main'), ('dogecoin', 'doge', b'njscgXBB3HUUTXH7njim1Uw82PF9da4R8k', 'test'), From 21b85c1f40e66afb31d6161230c50fe0db6d4a6f Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Fri, 7 Jan 2022 18:22:29 +0330 Subject: [PATCH 03/11] Name: Change name of package --- CHANGELOG.md | 7 +++++++ Makefile | 8 ++++---- README.md | 16 +++++++-------- {coinaddrng => coinaddrvalid}/__init__.py | 0 {coinaddrng => coinaddrvalid}/base.py | 0 {coinaddrng => coinaddrvalid}/currency.py | 0 {coinaddrng => coinaddrvalid}/interfaces.py | 0 {coinaddrng => coinaddrvalid}/validation.py | 0 setup.py | 16 +++++++-------- tests/test_coinaddr.py | 22 ++++++++++----------- tests/test_currency.py | 4 ++-- tests/test_validation.py | 4 ++-- 12 files changed, 42 insertions(+), 35 deletions(-) rename {coinaddrng => coinaddrvalid}/__init__.py (100%) rename {coinaddrng => coinaddrvalid}/base.py (100%) rename {coinaddrng => coinaddrvalid}/currency.py (100%) rename {coinaddrng => coinaddrvalid}/interfaces.py (100%) rename {coinaddrng => coinaddrvalid}/validation.py (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45420a8..d0c9747 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [1.1.0] - 2022-01-07 +### Added +- LTC segwit address support + +### Fixed +- Fix wheel build by replacing crc16 with fastcrc + ## [1.0.1] - 2018-04-16 ### Added - Start using zope.interfaces for all objects. diff --git a/Makefile b/Makefile index 488d09d..2a5dd9b 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all: help help: @echo 'NAME' - @echo ' Makefile for coinaddrng' + @echo ' Makefile for coinaddrvalid' @echo '' @echo 'SYNOPSIS' @echo ' make [options]' @@ -12,16 +12,16 @@ help: @echo '' @echo ' dist builds both binary and source distribution' @echo '' - @echo ' install installs blockapi library' + @echo ' install installs coinaddrvalid library' @echo '' - @echo ' uninstall uninstalls blockapi library' + @echo ' uninstall uninstalls coinaddrvalid library' install: pip3 install --upgrade . uninstall: - pip3 uninstall -y coinaddrng + pip3 uninstall -y coinaddrvalid dist: diff --git a/README.md b/README.md index cc368f6..3df9d4c 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# CoinAddrNG -[![Github Repo](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/crypkit/coinaddrng) [![Pypi Version](https://img.shields.io/pypi/v/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrng) [![Pypi License](https://img.shields.io/pypi/l/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrng) [![Pypi Wheel](https://img.shields.io/pypi/wheel/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrng) [![Pypi Versions](https://img.shields.io/pypi/pyversions/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrng) +# CoinAddrValid +[![Github Repo](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/nobitex/coinaddrvalid) [![Pypi Version](https://img.shields.io/pypi/v/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi License](https://img.shields.io/pypi/l/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi Wheel](https://img.shields.io/pypi/wheel/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi Versions](https://img.shields.io/pypi/pyversions/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrvalid) ## Maintainer -Devmons s.r.o. - *Maintainer of this fork* - [coinaddrng](https://github.com/crypkit/coinaddrng) +Devmons s.r.o. - *Maintainer of this fork* - [coinaddrvalid](https://github.com/nobitex/coinaddrvalid) -See also the list of [contributors](https://github.com/crypkit/coinaddrng/contributors) who participated in this project. +See also the list of [contributors](https://github.com/nobitex/coinaddrvalid/contributors) who participated in this project. ## Original Maintainer Joe Black | | [github](https://github.com/joeblackwaslike) @@ -46,13 +46,13 @@ A cryptocurrency address inspection/validation library for python. ## Installation ```shell -pip3 install coinaddrng +pip3 install coinaddrvalid ``` ## Usage ```python ->>> import coinaddrng ->>> coinaddrng.validate('btc', b'1BoatSLRHtKNngkdXEeobR76b53LETtpyT') +>>> import coinaddrvalid +>>> coinaddrvalid.validate('btc', b'1BoatSLRHtKNngkdXEeobR76b53LETtpyT') ValidationResult(name='bitcoin', ticker='btc', address=b'1BoatSLRHtKNngkdXEeobR76b53LETtpyT', valid=True, network='main', is_extended=False, address_type='address') ``` @@ -64,7 +64,7 @@ format, which is returned as address_type. If there's none, 'address' is being r #### Currencies To add a new currency, simply instantiate a new `coinaddr.currency.Currency` class. It will be automatically registered. ```python -from coinaddrng import Currency +from coinaddrvalid import Currency Currency('decred', ticker='dcr', validator='DecredCheck', networks=dict( main=(0x073f,0x071a,0x02fda926), test=(0x0f21,0x0efc,0x043587d1)), diff --git a/coinaddrng/__init__.py b/coinaddrvalid/__init__.py similarity index 100% rename from coinaddrng/__init__.py rename to coinaddrvalid/__init__.py diff --git a/coinaddrng/base.py b/coinaddrvalid/base.py similarity index 100% rename from coinaddrng/base.py rename to coinaddrvalid/base.py diff --git a/coinaddrng/currency.py b/coinaddrvalid/currency.py similarity index 100% rename from coinaddrng/currency.py rename to coinaddrvalid/currency.py diff --git a/coinaddrng/interfaces.py b/coinaddrvalid/interfaces.py similarity index 100% rename from coinaddrng/interfaces.py rename to coinaddrvalid/interfaces.py diff --git a/coinaddrng/validation.py b/coinaddrvalid/validation.py similarity index 100% rename from coinaddrng/validation.py rename to coinaddrvalid/validation.py diff --git a/setup.py b/setup.py index 3f13653..7b5f5b7 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -with open('coinaddrng/__init__.py', 'rt') as fd: +with open('coinaddrvalid/__init__.py', 'rt') as fd: version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', fd.read(), re.MULTILINE).group(1) @@ -18,7 +18,7 @@ setup( - name='coinaddrng', + name='coinaddrvalid', version=version, description='A crypto-currency address inspection/validation library.', #long_description=long_description, @@ -31,13 +31,13 @@ 'validation', 'inspection', ], - author='Joe Black', - author_email='me@joeblack.nyc', - maintainer='Joe Black', - maintainer_email='me@joeblack.nyc', - url='https://github.com/joeblackwaslike/coinaddr', + author='Mohammad Aghamir', + author_email='maghamir@nobitex.net', + maintainer='Mohammad Aghamir', + maintainer_email='maghamir@nobitex.net', + url='https://github.com/nobitex/coinaddrvalid', download_url=( - 'https://github.com/joeblackwaslike/coinaddr/tarball/v%s' % version), + 'https://github.com/nobitex/coinaddrvalid/tarball/v%s' % version), license='MIT', install_requires=[ 'attrs>=17.4.0', diff --git a/tests/test_coinaddr.py b/tests/test_coinaddr.py index 7432636..3cf93b8 100644 --- a/tests/test_coinaddr.py +++ b/tests/test_coinaddr.py @@ -1,13 +1,13 @@ import unittest -import coinaddrng +import coinaddrvalid -from coinaddrng.interfaces import ( +from coinaddrvalid.interfaces import ( INamedSubclassContainer, INamedInstanceContainer, ICurrency, IValidator, IValidationRequest, IValidationResult ) -from coinaddrng.currency import Currencies, Currency -from coinaddrng.validation import ( +from coinaddrvalid.currency import Currencies, Currency +from coinaddrvalid.validation import ( Validators, ValidatorBase, ValidationRequest, ValidationResult, Base58CheckValidator, EthereumValidator ) @@ -54,7 +54,7 @@ class TestCoinaddr(unittest.TestCase): def test_validation_by_name(self): for name, ticker, addr, net in TEST_DATA: with self.subTest(name=name, address=addr, net=net): - res = coinaddrng.validate(name, addr) + res = coinaddrvalid.validate(name, addr) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) @@ -63,13 +63,13 @@ def test_validation_by_name(self): for name, ticker, addr, net in WRONG_DATA: with self.subTest(name=name, address=addr, net=net): - res = coinaddrng.validate(name, addr) + res = coinaddrvalid.validate(name, addr) self.assertNotEqual(True, res.valid) def test_validation_by_ticker(self): for name, ticker, addr, net in TEST_DATA: with self.subTest(name=name, ticker=ticker, address=addr, net=net): - res = coinaddrng.validate(ticker, addr) + res = coinaddrvalid.validate(ticker, addr) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) @@ -80,7 +80,7 @@ def test_validation_by_ticker(self): def test_validation_from_text(self): for name, ticker, addr, net in TEST_DATA: with self.subTest(name=name, address=addr, net=net): - res = coinaddrng.validate(name, addr.decode()) + res = coinaddrvalid.validate(name, addr.decode()) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) @@ -91,7 +91,7 @@ def test_validation_wrong_data(self): for currency in Currencies.instances.values(): for addr in WRONG_ADDRESSES: with self.subTest(name=currency.name, address=addr): - res = coinaddrng.validate(currency.name, addr) + res = coinaddrvalid.validate(currency.name, addr) self.assertEqual(res.valid, False) @@ -111,7 +111,7 @@ def test_extending_currency(self): ] for name, ticker, addr, net in test_data: with self.subTest(name=name, ticker=ticker, address=addr, net=net): - res = coinaddrng.validate(name, addr) + res = coinaddrvalid.validate(name, addr) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) @@ -119,7 +119,7 @@ def test_extending_currency(self): self.assertEqual(net, res.network) with self.subTest(name=name, ticker=ticker, address=addr, net=net): - res = coinaddrng.validate(ticker, addr) + res = coinaddrvalid.validate(ticker, addr) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) diff --git a/tests/test_currency.py b/tests/test_currency.py index c9ee151..b129b70 100644 --- a/tests/test_currency.py +++ b/tests/test_currency.py @@ -1,7 +1,7 @@ import unittest -from coinaddrng.interfaces import INamedInstanceContainer, ICurrency -from coinaddrng.currency import Currencies, Currency +from coinaddrvalid.interfaces import INamedInstanceContainer, ICurrency +from coinaddrvalid.currency import Currencies, Currency class TestCurrency(unittest.TestCase): diff --git a/tests/test_validation.py b/tests/test_validation.py index 3ac7db5..b768ebb 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -1,9 +1,9 @@ import unittest -from coinaddrng.interfaces import ( +from coinaddrvalid.interfaces import ( INamedSubclassContainer, IValidator, IValidationRequest, IValidationResult ) -from coinaddrng.validation import ( +from coinaddrvalid.validation import ( Validators, ValidatorBase, ValidationRequest, ValidationResult, Base58CheckValidator, EthereumValidator ) From 7e6e031cc05cdd6215d723a9b488248d2737eda1 Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Fri, 7 Jan 2022 18:26:12 +0330 Subject: [PATCH 04/11] README: Fix old and new information in readme --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3df9d4c..93a27d4 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ # CoinAddrValid [![Github Repo](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/nobitex/coinaddrvalid) [![Pypi Version](https://img.shields.io/pypi/v/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi License](https://img.shields.io/pypi/l/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi Wheel](https://img.shields.io/pypi/wheel/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi Versions](https://img.shields.io/pypi/pyversions/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrvalid) - ## Maintainer -Devmons s.r.o. - *Maintainer of this fork* - [coinaddrvalid](https://github.com/nobitex/coinaddrvalid) +Mohammad Aghamir - *Maintainer of this repository* - [coinaddrvalid](https://github.com/nobitex/coinaddrvalid) + +## Fork Maintainer +Devmons s.r.o. - *Maintainer of this fork* - [coinaddrng](https://github.com/crypkit/coinaddrng) -See also the list of [contributors](https://github.com/nobitex/coinaddrvalid/contributors) who participated in this project. +See also the list of [contributors](https://github.com/crypkit/coinaddrng/contributors) who participated in this project. ## Original Maintainer Joe Black | | [github](https://github.com/joeblackwaslike) From 9b1c9caba255db9204b478df71afa0ee38561320 Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Fri, 7 Jan 2022 18:41:03 +0330 Subject: [PATCH 05/11] Update: Add support till python3.10 --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index b7afaac..cfc4e6a 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py34,py35,py36 +envlist = py34,py35,py36,py37,py38,py39,py310 [testenv] commands = pytest From 84085e3efdc8b2d563cc7c6ac46580e57cd5a8b7 Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Fri, 7 Jan 2022 18:41:40 +0330 Subject: [PATCH 06/11] Bump version to 1.1.0 --- coinaddrvalid/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coinaddrvalid/__init__.py b/coinaddrvalid/__init__.py index 1c86817..9d9b124 100644 --- a/coinaddrvalid/__init__.py +++ b/coinaddrvalid/__init__.py @@ -16,7 +16,7 @@ :license: MIT, see LICENSE for more details. """ -__version__ = '1.0.30' +__version__ = '1.1.0' from . import interfaces, currency, validation from .validation import validate From 4e7fea9293eed87bc729ab2764c386be780687f1 Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Sat, 8 Jan 2022 12:30:51 +0330 Subject: [PATCH 07/11] PackageName: Change package name --- Makefile | 8 +++---- README.md | 14 ++++++------ .../__init__.py | 0 {coinaddrvalid => coinaddrvalidator}/base.py | 0 .../currency.py | 0 .../interfaces.py | 0 .../validation.py | 0 setup.py | 7 +++--- tests/test_coinaddr.py | 22 +++++++++---------- tests/test_currency.py | 4 ++-- tests/test_validation.py | 4 ++-- 11 files changed, 30 insertions(+), 29 deletions(-) rename {coinaddrvalid => coinaddrvalidator}/__init__.py (100%) rename {coinaddrvalid => coinaddrvalidator}/base.py (100%) rename {coinaddrvalid => coinaddrvalidator}/currency.py (100%) rename {coinaddrvalid => coinaddrvalidator}/interfaces.py (100%) rename {coinaddrvalid => coinaddrvalidator}/validation.py (100%) diff --git a/Makefile b/Makefile index 2a5dd9b..cd42c6c 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all: help help: @echo 'NAME' - @echo ' Makefile for coinaddrvalid' + @echo ' Makefile for coinaddrvalidor' @echo '' @echo 'SYNOPSIS' @echo ' make [options]' @@ -12,16 +12,16 @@ help: @echo '' @echo ' dist builds both binary and source distribution' @echo '' - @echo ' install installs coinaddrvalid library' + @echo ' install installs coinaddrvalidor library' @echo '' - @echo ' uninstall uninstalls coinaddrvalid library' + @echo ' uninstall uninstalls coinaddrvalidor library' install: pip3 install --upgrade . uninstall: - pip3 uninstall -y coinaddrvalid + pip3 uninstall -y coinaddrvalidor dist: diff --git a/README.md b/README.md index 93a27d4..04c18a1 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# CoinAddrValid -[![Github Repo](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/nobitex/coinaddrvalid) [![Pypi Version](https://img.shields.io/pypi/v/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi License](https://img.shields.io/pypi/l/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi Wheel](https://img.shields.io/pypi/wheel/coinaddrvalid.svg)](https://pypi.python.org/pypi/coinaddrvalid) [![Pypi Versions](https://img.shields.io/pypi/pyversions/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrvalid) +# CoinAddrValidator +[![Github Repo](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/nobitex/coinaddrvalidator) [![Pypi Version](https://img.shields.io/pypi/v/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi License](https://img.shields.io/pypi/l/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi Wheel](https://img.shields.io/pypi/wheel/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi Versions](https://img.shields.io/pypi/pyversions/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrvalidator) ## Maintainer -Mohammad Aghamir - *Maintainer of this repository* - [coinaddrvalid](https://github.com/nobitex/coinaddrvalid) +Mohammad Aghamir - *Maintainer of this repository* - [coinaddrvalidator](https://github.com/nobitex/coinaddrvalidator) ## Fork Maintainer Devmons s.r.o. - *Maintainer of this fork* - [coinaddrng](https://github.com/crypkit/coinaddrng) @@ -48,13 +48,13 @@ A cryptocurrency address inspection/validation library for python. ## Installation ```shell -pip3 install coinaddrvalid +pip3 install coinaddrvalidator ``` ## Usage ```python ->>> import coinaddrvalid ->>> coinaddrvalid.validate('btc', b'1BoatSLRHtKNngkdXEeobR76b53LETtpyT') +>>> import coinaddrvalidator +>>> coinaddrvalidator.validate('btc', b'1BoatSLRHtKNngkdXEeobR76b53LETtpyT') ValidationResult(name='bitcoin', ticker='btc', address=b'1BoatSLRHtKNngkdXEeobR76b53LETtpyT', valid=True, network='main', is_extended=False, address_type='address') ``` @@ -66,7 +66,7 @@ format, which is returned as address_type. If there's none, 'address' is being r #### Currencies To add a new currency, simply instantiate a new `coinaddr.currency.Currency` class. It will be automatically registered. ```python -from coinaddrvalid import Currency +from coinaddrvalidator import Currency Currency('decred', ticker='dcr', validator='DecredCheck', networks=dict( main=(0x073f,0x071a,0x02fda926), test=(0x0f21,0x0efc,0x043587d1)), diff --git a/coinaddrvalid/__init__.py b/coinaddrvalidator/__init__.py similarity index 100% rename from coinaddrvalid/__init__.py rename to coinaddrvalidator/__init__.py diff --git a/coinaddrvalid/base.py b/coinaddrvalidator/base.py similarity index 100% rename from coinaddrvalid/base.py rename to coinaddrvalidator/base.py diff --git a/coinaddrvalid/currency.py b/coinaddrvalidator/currency.py similarity index 100% rename from coinaddrvalid/currency.py rename to coinaddrvalidator/currency.py diff --git a/coinaddrvalid/interfaces.py b/coinaddrvalidator/interfaces.py similarity index 100% rename from coinaddrvalid/interfaces.py rename to coinaddrvalidator/interfaces.py diff --git a/coinaddrvalid/validation.py b/coinaddrvalidator/validation.py similarity index 100% rename from coinaddrvalid/validation.py rename to coinaddrvalidator/validation.py diff --git a/setup.py b/setup.py index 7b5f5b7..34abc90 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -with open('coinaddrvalid/__init__.py', 'rt') as fd: +with open('coinaddrvalidator/__init__.py', 'rt') as fd: version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', fd.read(), re.MULTILINE).group(1) @@ -18,10 +18,11 @@ setup( - name='coinaddrvalid', + name='coinaddrvalidator', version=version, description='A crypto-currency address inspection/validation library.', - #long_description=long_description, + long_description=long_description, + long_description_content_type='text/markdown', keywords=[ 'bitcoin', 'litecoin', diff --git a/tests/test_coinaddr.py b/tests/test_coinaddr.py index 3cf93b8..b054d05 100644 --- a/tests/test_coinaddr.py +++ b/tests/test_coinaddr.py @@ -1,13 +1,13 @@ import unittest -import coinaddrvalid +import coinaddrvalidator -from coinaddrvalid.interfaces import ( +from coinaddrvalidator.interfaces import ( INamedSubclassContainer, INamedInstanceContainer, ICurrency, IValidator, IValidationRequest, IValidationResult ) -from coinaddrvalid.currency import Currencies, Currency -from coinaddrvalid.validation import ( +from coinaddrvalidator.currency import Currencies, Currency +from coinaddrvalidator.validation import ( Validators, ValidatorBase, ValidationRequest, ValidationResult, Base58CheckValidator, EthereumValidator ) @@ -54,7 +54,7 @@ class TestCoinaddr(unittest.TestCase): def test_validation_by_name(self): for name, ticker, addr, net in TEST_DATA: with self.subTest(name=name, address=addr, net=net): - res = coinaddrvalid.validate(name, addr) + res = coinaddrvalidator.validate(name, addr) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) @@ -63,13 +63,13 @@ def test_validation_by_name(self): for name, ticker, addr, net in WRONG_DATA: with self.subTest(name=name, address=addr, net=net): - res = coinaddrvalid.validate(name, addr) + res = coinaddrvalidator.validate(name, addr) self.assertNotEqual(True, res.valid) def test_validation_by_ticker(self): for name, ticker, addr, net in TEST_DATA: with self.subTest(name=name, ticker=ticker, address=addr, net=net): - res = coinaddrvalid.validate(ticker, addr) + res = coinaddrvalidator.validate(ticker, addr) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) @@ -80,7 +80,7 @@ def test_validation_by_ticker(self): def test_validation_from_text(self): for name, ticker, addr, net in TEST_DATA: with self.subTest(name=name, address=addr, net=net): - res = coinaddrvalid.validate(name, addr.decode()) + res = coinaddrvalidator.validate(name, addr.decode()) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) @@ -91,7 +91,7 @@ def test_validation_wrong_data(self): for currency in Currencies.instances.values(): for addr in WRONG_ADDRESSES: with self.subTest(name=currency.name, address=addr): - res = coinaddrvalid.validate(currency.name, addr) + res = coinaddrvalidator.validate(currency.name, addr) self.assertEqual(res.valid, False) @@ -111,7 +111,7 @@ def test_extending_currency(self): ] for name, ticker, addr, net in test_data: with self.subTest(name=name, ticker=ticker, address=addr, net=net): - res = coinaddrvalid.validate(name, addr) + res = coinaddrvalidator.validate(name, addr) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) @@ -119,7 +119,7 @@ def test_extending_currency(self): self.assertEqual(net, res.network) with self.subTest(name=name, ticker=ticker, address=addr, net=net): - res = coinaddrvalid.validate(ticker, addr) + res = coinaddrvalidator.validate(ticker, addr) self.assertEqual(name, res.name) self.assertEqual(ticker, res.ticker) self.assertEqual(addr, res.address) diff --git a/tests/test_currency.py b/tests/test_currency.py index b129b70..cbe6a27 100644 --- a/tests/test_currency.py +++ b/tests/test_currency.py @@ -1,7 +1,7 @@ import unittest -from coinaddrvalid.interfaces import INamedInstanceContainer, ICurrency -from coinaddrvalid.currency import Currencies, Currency +from coinaddrvalidator.interfaces import INamedInstanceContainer, ICurrency +from coinaddrvalidator.currency import Currencies, Currency class TestCurrency(unittest.TestCase): diff --git a/tests/test_validation.py b/tests/test_validation.py index b768ebb..e2790a1 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -1,9 +1,9 @@ import unittest -from coinaddrvalid.interfaces import ( +from coinaddrvalidator.interfaces import ( INamedSubclassContainer, IValidator, IValidationRequest, IValidationResult ) -from coinaddrvalid.validation import ( +from coinaddrvalidator.validation import ( Validators, ValidatorBase, ValidationRequest, ValidationResult, Base58CheckValidator, EthereumValidator ) From 90b8dce3d822d2777d8825ff29ad58d0ae85dead Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Sat, 8 Jan 2022 12:46:06 +0330 Subject: [PATCH 08/11] PythonVersions: Fix supported python versions --- README.md | 2 +- setup.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 04c18a1..681c44f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # CoinAddrValidator -[![Github Repo](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/nobitex/coinaddrvalidator) [![Pypi Version](https://img.shields.io/pypi/v/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi License](https://img.shields.io/pypi/l/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi Wheel](https://img.shields.io/pypi/wheel/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi Versions](https://img.shields.io/pypi/pyversions/coinaddrng.svg)](https://pypi.python.org/pypi/coinaddrvalidator) +[![Github Repo](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/nobitex/coinaddrvalidator) [![Pypi Version](https://img.shields.io/pypi/v/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi License](https://img.shields.io/pypi/l/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi Wheel](https://img.shields.io/pypi/wheel/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) [![Pypi Versions](https://img.shields.io/pypi/pyversions/coinaddrvalidator.svg)](https://pypi.python.org/pypi/coinaddrvalidator) ## Maintainer Mohammad Aghamir - *Maintainer of this repository* - [coinaddrvalidator](https://github.com/nobitex/coinaddrvalidator) diff --git a/setup.py b/setup.py index 34abc90..11e75a8 100644 --- a/setup.py +++ b/setup.py @@ -64,6 +64,10 @@ 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3 :: Only', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Software Development', From b78b09a1933bb39ff8f4f84abbc865dc0aaffebd Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Sun, 9 Jan 2022 20:12:10 +0330 Subject: [PATCH 09/11] CRC16: remove fastcrc and use pure python version --- coinaddrvalidator/__init__.py | 2 +- coinaddrvalidator/encoding/crc16.py | 318 ++++++++++++++++++++++++++++ requirements.txt | 1 - setup.py | 1 - 4 files changed, 319 insertions(+), 3 deletions(-) create mode 100644 coinaddrvalidator/encoding/crc16.py diff --git a/coinaddrvalidator/__init__.py b/coinaddrvalidator/__init__.py index 9d9b124..3daa6fa 100644 --- a/coinaddrvalidator/__init__.py +++ b/coinaddrvalidator/__init__.py @@ -16,7 +16,7 @@ :license: MIT, see LICENSE for more details. """ -__version__ = '1.1.0' +__version__ = '1.1.1' from . import interfaces, currency, validation from .validation import validate diff --git a/coinaddrvalidator/encoding/crc16.py b/coinaddrvalidator/encoding/crc16.py new file mode 100644 index 0000000..6545659 --- /dev/null +++ b/coinaddrvalidator/encoding/crc16.py @@ -0,0 +1,318 @@ +"""Pure python library for calculating CRC16""" + +############################################################################## +# +# Copyright (C) Gennady Trafimenkov, 2011 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +############################################################################## + + +# table for calculating CRC +# this particular table was generated using pycrc v0.7.6, http://www.tty1.net/pycrc/ +# using the configuration: +# * Width = 16 +# * Poly = 0x1021 +# * XorIn = 0x0000 +# * ReflectIn = False +# * XorOut = 0x0000 +# * ReflectOut = False +# * Algorithm = table-driven +# by following command: +# python pycrc.py --model xmodem --algorithm table-driven --generate c +from typing import List + +__all__ = ["crc16xmodem"] + + +_CRC16_XMODEM_TABLE = [ + 0x0000, + 0x1021, + 0x2042, + 0x3063, + 0x4084, + 0x50A5, + 0x60C6, + 0x70E7, + 0x8108, + 0x9129, + 0xA14A, + 0xB16B, + 0xC18C, + 0xD1AD, + 0xE1CE, + 0xF1EF, + 0x1231, + 0x0210, + 0x3273, + 0x2252, + 0x52B5, + 0x4294, + 0x72F7, + 0x62D6, + 0x9339, + 0x8318, + 0xB37B, + 0xA35A, + 0xD3BD, + 0xC39C, + 0xF3FF, + 0xE3DE, + 0x2462, + 0x3443, + 0x0420, + 0x1401, + 0x64E6, + 0x74C7, + 0x44A4, + 0x5485, + 0xA56A, + 0xB54B, + 0x8528, + 0x9509, + 0xE5EE, + 0xF5CF, + 0xC5AC, + 0xD58D, + 0x3653, + 0x2672, + 0x1611, + 0x0630, + 0x76D7, + 0x66F6, + 0x5695, + 0x46B4, + 0xB75B, + 0xA77A, + 0x9719, + 0x8738, + 0xF7DF, + 0xE7FE, + 0xD79D, + 0xC7BC, + 0x48C4, + 0x58E5, + 0x6886, + 0x78A7, + 0x0840, + 0x1861, + 0x2802, + 0x3823, + 0xC9CC, + 0xD9ED, + 0xE98E, + 0xF9AF, + 0x8948, + 0x9969, + 0xA90A, + 0xB92B, + 0x5AF5, + 0x4AD4, + 0x7AB7, + 0x6A96, + 0x1A71, + 0x0A50, + 0x3A33, + 0x2A12, + 0xDBFD, + 0xCBDC, + 0xFBBF, + 0xEB9E, + 0x9B79, + 0x8B58, + 0xBB3B, + 0xAB1A, + 0x6CA6, + 0x7C87, + 0x4CE4, + 0x5CC5, + 0x2C22, + 0x3C03, + 0x0C60, + 0x1C41, + 0xEDAE, + 0xFD8F, + 0xCDEC, + 0xDDCD, + 0xAD2A, + 0xBD0B, + 0x8D68, + 0x9D49, + 0x7E97, + 0x6EB6, + 0x5ED5, + 0x4EF4, + 0x3E13, + 0x2E32, + 0x1E51, + 0x0E70, + 0xFF9F, + 0xEFBE, + 0xDFDD, + 0xCFFC, + 0xBF1B, + 0xAF3A, + 0x9F59, + 0x8F78, + 0x9188, + 0x81A9, + 0xB1CA, + 0xA1EB, + 0xD10C, + 0xC12D, + 0xF14E, + 0xE16F, + 0x1080, + 0x00A1, + 0x30C2, + 0x20E3, + 0x5004, + 0x4025, + 0x7046, + 0x6067, + 0x83B9, + 0x9398, + 0xA3FB, + 0xB3DA, + 0xC33D, + 0xD31C, + 0xE37F, + 0xF35E, + 0x02B1, + 0x1290, + 0x22F3, + 0x32D2, + 0x4235, + 0x5214, + 0x6277, + 0x7256, + 0xB5EA, + 0xA5CB, + 0x95A8, + 0x8589, + 0xF56E, + 0xE54F, + 0xD52C, + 0xC50D, + 0x34E2, + 0x24C3, + 0x14A0, + 0x0481, + 0x7466, + 0x6447, + 0x5424, + 0x4405, + 0xA7DB, + 0xB7FA, + 0x8799, + 0x97B8, + 0xE75F, + 0xF77E, + 0xC71D, + 0xD73C, + 0x26D3, + 0x36F2, + 0x0691, + 0x16B0, + 0x6657, + 0x7676, + 0x4615, + 0x5634, + 0xD94C, + 0xC96D, + 0xF90E, + 0xE92F, + 0x99C8, + 0x89E9, + 0xB98A, + 0xA9AB, + 0x5844, + 0x4865, + 0x7806, + 0x6827, + 0x18C0, + 0x08E1, + 0x3882, + 0x28A3, + 0xCB7D, + 0xDB5C, + 0xEB3F, + 0xFB1E, + 0x8BF9, + 0x9BD8, + 0xABBB, + 0xBB9A, + 0x4A75, + 0x5A54, + 0x6A37, + 0x7A16, + 0x0AF1, + 0x1AD0, + 0x2AB3, + 0x3A92, + 0xFD2E, + 0xED0F, + 0xDD6C, + 0xCD4D, + 0xBDAA, + 0xAD8B, + 0x9DE8, + 0x8DC9, + 0x7C26, + 0x6C07, + 0x5C64, + 0x4C45, + 0x3CA2, + 0x2C83, + 0x1CE0, + 0x0CC1, + 0xEF1F, + 0xFF3E, + 0xCF5D, + 0xDF7C, + 0xAF9B, + 0xBFBA, + 0x8FD9, + 0x9FF8, + 0x6E17, + 0x7E36, + 0x4E55, + 0x5E74, + 0x2E93, + 0x3EB2, + 0x0ED1, + 0x1EF0, +] + + +def _crc16(data: bytes, crc: int, table: List[int]): + """Calculate CRC16 using the given table. + `data` - data for calculating CRC, must be bytes + `crc` - initial value + `table` - table for caclulating CRC (list of 256 integers) + Return calculated value of CRC + """ + for byte in data: + crc = ((crc << 8) & 0xFF00) ^ table[((crc >> 8) & 0xFF) ^ byte] + return crc & 0xFFFF + + +def crc16xmodem(data: bytes, crc: int = 0) -> int: + """Calculate CRC-CCITT (XModem) variant of CRC16. + `data` - data for calculating CRC, must be bytes + `crc` - initial value + Return calculated value of CRC + """ + return _crc16(data, crc, _CRC16_XMODEM_TABLE) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 9826583..48d03df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,3 @@ bech32 cbor blake256 groestlcoin_hash2 -fastcrc diff --git a/setup.py b/setup.py index 11e75a8..98d817e 100644 --- a/setup.py +++ b/setup.py @@ -45,7 +45,6 @@ 'pysha3>=1.0.2', 'base58check>=1.0.1', 'zope.interface>=4.4.3', - 'fastcrc>=0.1.1', 'blake256>=0.1.1', 'cbor>=1.0.0', 'bech32>=1.1.0', From f771e9504cd628cb754cb5e9d7d6bac707ce1ea9 Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Wed, 12 Jan 2022 14:23:50 +0330 Subject: [PATCH 10/11] CRC16: remove missing import fastcrc --- coinaddrvalidator/__init__.py | 2 +- coinaddrvalidator/validation.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coinaddrvalidator/__init__.py b/coinaddrvalidator/__init__.py index 3daa6fa..38e7bce 100644 --- a/coinaddrvalidator/__init__.py +++ b/coinaddrvalidator/__init__.py @@ -16,7 +16,7 @@ :license: MIT, see LICENSE for more details. """ -__version__ = '1.1.1' +__version__ = '1.1.2' from . import interfaces, currency, validation from .validation import validate diff --git a/coinaddrvalidator/validation.py b/coinaddrvalidator/validation.py index fe41008..5566e63 100644 --- a/coinaddrvalidator/validation.py +++ b/coinaddrvalidator/validation.py @@ -20,12 +20,12 @@ import math from binascii import unhexlify, crc32 import base64 -from fastcrc import crc16 from blake256 import blake256 import cbor import bech32 import groestlcoin_hash2 +from .encoding import crc16 from .interfaces import ( INamedSubclassContainer, IValidator, IValidationRequest, IValidationResult, ICurrency @@ -443,7 +443,7 @@ def validate(self): if version_byte != 6 << 3: # ed25519PublicKey return False - checksum = crc16.xmodem(payload) + checksum = crc16.crc16xmodem(payload) if checksum != expected_checksum: return False From 2de2450563417732ab3af8c53c7bbbab1641b397 Mon Sep 17 00:00:00 2001 From: Mohammad Aghamir Date: Wed, 12 Jan 2022 17:30:53 +0330 Subject: [PATCH 11/11] HotFix: Fix module missing init --- coinaddrvalidator/__init__.py | 2 +- coinaddrvalidator/encoding/__init__.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 coinaddrvalidator/encoding/__init__.py diff --git a/coinaddrvalidator/__init__.py b/coinaddrvalidator/__init__.py index 38e7bce..02333a9 100644 --- a/coinaddrvalidator/__init__.py +++ b/coinaddrvalidator/__init__.py @@ -16,7 +16,7 @@ :license: MIT, see LICENSE for more details. """ -__version__ = '1.1.2' +__version__ = '1.1.3' from . import interfaces, currency, validation from .validation import validate diff --git a/coinaddrvalidator/encoding/__init__.py b/coinaddrvalidator/encoding/__init__.py new file mode 100644 index 0000000..139597f --- /dev/null +++ b/coinaddrvalidator/encoding/__init__.py @@ -0,0 +1,2 @@ + +