test_bitcoin.doctest - more detailed doctests for stdnum.bitcoin module

Copyright (C) 2018 Arthur de Jong

This library 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 2.1 of the License, or (at your option) any later version.

This library 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 library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA


This file contains more detailed doctests for the stdnum.bitcoin module. It
tries to test more corner cases and detailed functionality that is not really
useful as module documentation.

>>> from stdnum import bitcoin


These are found and constructed P2PKH addresses (P2SH addresses are basically
the same because they follow the same validation, except that the first digit
is a 3).

>>> bitcoin.validate('1NEDqZPvTWRaoho48qXuLLsrYomMXPABfD')
'1NEDqZPvTWRaoho48qXuLLsrYomMXPABfD'
>>> bitcoin.validate('1NEDqZPvTWRaoho48qXuLLsrYomMXPABfA')  # mangled digit
Traceback (most recent call last):
    ...
InvalidChecksum: ...
>>> bitcoin.validate('1NEDqZPvTWRaoho48qXu==srYomMXPABfD')  # invalid digit
Traceback (most recent call last):
    ...
InvalidFormat: ...
>>> bitcoin.validate('1111111111111111111114oLvT2')  # constructed but valid
'1111111111111111111114oLvT2'
>>> bitcoin.validate('111111111111111111aGQAo')  # invalid binary length
Traceback (most recent call last):
    ...
InvalidLength: ...


Bech32 are more recent but also supported. Uppercase addresses will be
automatically lowercased.

>>> bitcoin.validate('BC1QARDV855YJNGSPVXUTTQ897AQCA3LXJU2Y69JCE')
'bc1qardv855yjngspvxuttq897aqca3lxju2y69jce'
>>> bitcoin.validate('bc1qardv855yjngspvxuttq897aqca3lxju2y69jZZ')  # some digits changed
Traceback (most recent call last):
    ...
InvalidChecksum: ...
>>> bitcoin.validate('bc1qardv855yjngspvxuttq897aqca3lxju2y69j11')  # non-bech32 characters
Traceback (most recent call last):
    ...
InvalidFormat: ...
>>> bitcoin.validate('bc1pc54a7w')  # too short but valid checksum
Traceback (most recent call last):
    ...
InvalidLength: ...
>>> bitcoin.validate('bc1qv93xxeqnnq0uz')  # too short for witness version
Traceback (most recent call last):
    ...
InvalidLength: ...
>>> bitcoin.validate('bc1lv93xxer9venks6t2ddkx6mn0wpchyum5rtc42k')  # invalid witness version
Traceback (most recent call last):
    ...
InvalidComponent: ...
>>> bitcoin.validate('bc1pv93xxer9venks6t2ddkx6mn0wpchyum5w4m8w7re0fq5ys6yg4rywjzfff95cn2wfumys6cj')  # too long witness program
Traceback (most recent call last):
    ...
InvalidLength: ...
>>> bitcoin.validate('bc1ppzry7g5z8k')  # invalid Base32 padding
Traceback (most recent call last):
    ...
InvalidComponent: ...


Test for unknown address type.

>>> bitcoin.validate('gzXESMi1caU4L4CWEV96kQMkn5TKLsMzuX')
Traceback (most recent call last):
    ...
InvalidComponent: ...


These have been found online and should all be valid numbers.

>>> numbers = '''
...
... 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
... 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2
... 1G5Tjyznf4hmWoStygje9h2u1Y7rFBjtmS
... 1NEDqZPvTWRaoho48qXuLLsrYomMXPABfD
... 1NXYoJ5xU91Jp83XfVMHwwTUyZFK64BoAD
... 1P2c1W3x1TCUFvyDmVyVmUxrRqFtuF2w6
... 39y1UjCMmxzMYtt4S4wii9e3xmfHngKncL
... 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy
... 3KwLBFMtU9Wtn9Yys3imuU2hs2oSDsfZY4
... BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4
... BC1SW50QA3JX3S
... bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx
... bc1q362mcakh9p0zr380s4uhhz26263yjep36c8se8
... bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq
... bc1qardv855yjngspvxuttq897aqca3lxju2y69jce
... bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9
... bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3
... bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
... bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj
...
... '''
>>> [x for x in numbers.splitlines() if x and not bitcoin.is_valid(x)]
[]