URI: 
       tuse base43 in order to send transactions by QR code - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 46c290e30deab3726321bc224724cb87fc27d8ec
   DIR parent c427e085b3d193723c49432c187d7d3704f2660d
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Thu, 26 Feb 2015 13:59:29 +0100
       
       use base43 in order to send transactions by QR code
       
       Diffstat:
         M gui/qt/main_window.py               |       4 ++--
         M gui/qt/transaction_dialog.py        |       4 ++--
         M lib/bitcoin.py                      |      47 ++++++++++++++++---------------
       
       3 files changed, 29 insertions(+), 26 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -2240,8 +2240,8 @@ class ElectrumWindow(QMainWindow):
                    return
                # else if the user scanned an offline signed tx
                # transactions are binary, but qrcode seems to return utf8...
       -        import base64
       -        z = base64.b64decode(data.decode('utf8'))
       +        data = data.decode('utf8')
       +        z = bitcoin.base_decode(data, length=None, base=43)
                data = ''.join(chr(ord(b)) for b in z).encode('hex')
                tx = self.tx_from_text(data)
                if not tx:
   DIR diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py
       t@@ -34,6 +34,7 @@ from PyQt4.QtCore import *
        import PyQt4.QtCore as QtCore
        
        from electrum import transaction
       +from electrum.bitcoin import base_encode
        from electrum.plugins import run_hook
        
        from util import MyTreeWidget
       t@@ -108,9 +109,8 @@ class TxDialog(QDialog):
        
        
            def show_qr(self):
       -        import base64
                text = self.tx.raw.decode('hex')
       -        text = base64.b64encode(text)
       +        text = base_encode(text, base=43)
                try:
                    self.parent.show_qrcode(text, 'Transaction')
                except Exception as e:
   DIR diff --git a/lib/bitcoin.py b/lib/bitcoin.py
       t@@ -239,73 +239,76 @@ def hash_160_to_bc_address(h160, addrtype = 0):
            vh160 = chr(addrtype) + h160
            h = Hash(vh160)
            addr = vh160 + h[0:4]
       -    return b58encode(addr)
       +    return base_encode(addr, base=58)
        
        def bc_address_to_hash_160(addr):
       -    bytes = b58decode(addr, 25)
       +    bytes = base_decode(addr, 25, base=58)
            return ord(bytes[0]), bytes[1:21]
        
        
        __b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
       -__b58base = len(__b58chars)
       +assert len(__b58chars) == 58
        
       +__b43chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$*+-./:'
       +assert len(__b43chars) == 43
        
       -def b58encode(v):
       -    """ encode v, which is a string of bytes, to base58."""
        
       +def base_encode(v, base):
       +    """ encode v, which is a string of bytes, to base58."""
       +    if base == 58:
       +        chars = __b58chars
       +    elif base == 43:
       +        chars = __b43chars
            long_value = 0L
            for (i, c) in enumerate(v[::-1]):
                long_value += (256**i) * ord(c)
       -
            result = ''
       -    while long_value >= __b58base:
       -        div, mod = divmod(long_value, __b58base)
       -        result = __b58chars[mod] + result
       +    while long_value >= base:
       +        div, mod = divmod(long_value, base)
       +        result = chars[mod] + result
                long_value = div
       -    result = __b58chars[long_value] + result
       -
       +    result = chars[long_value] + result
            # Bitcoin does a little leading-zero-compression:
            # leading 0-bytes in the input become leading-1s
            nPad = 0
            for c in v:
                if c == '\0': nPad += 1
                else: break
       -
       -    return (__b58chars[0]*nPad) + result
       +    return (chars[0]*nPad) + result
        
        
       -def b58decode(v, length):
       +def base_decode(v, length, base):
            """ decode v into a string of len bytes."""
       +    if base == 58:
       +        chars = __b58chars
       +    elif base == 43:
       +        chars = __b43chars
            long_value = 0L
            for (i, c) in enumerate(v[::-1]):
       -        long_value += __b58chars.find(c) * (__b58base**i)
       -
       +        long_value += chars.find(c) * (base**i)
            result = ''
            while long_value >= 256:
                div, mod = divmod(long_value, 256)
                result = chr(mod) + result
                long_value = div
            result = chr(long_value) + result
       -
            nPad = 0
            for c in v:
       -        if c == __b58chars[0]: nPad += 1
       +        if c == chars[0]: nPad += 1
                else: break
       -
            result = chr(0)*nPad + result
            if length is not None and len(result) != length:
                return None
       -
            return result
        
        
        def EncodeBase58Check(vchIn):
            hash = Hash(vchIn)
       -    return b58encode(vchIn + hash[0:4])
       +    return base_encode(vchIn + hash[0:4], base=58)
        
        
        def DecodeBase58Check(psz):
       -    vchRet = b58decode(psz, None)
       +    vchRet = base_decode(psz, None, base=58)
            key = vchRet[0:-4]
            csum = vchRet[-4:]
            hash = Hash(key)