URI:
       tpy3specials.py - electrum-personal-server - Maximally lightweight electrum server for a single user
  HTML git clone https://git.parazyd.org/electrum-personal-server
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
       tpy3specials.py (3394B)
       ---
            1 import sys, os
            2 import binascii
            3 import hashlib
            4 
            5 if sys.version_info.major == 3:
            6     string_types = (str)
            7     string_or_bytes_types = (str, bytes)
            8     int_types = (int, float)
            9     # Base switching
           10     code_strings = {
           11         2: '01',
           12         10: '0123456789',
           13         16: '0123456789abcdef',
           14         32: 'abcdefghijklmnopqrstuvwxyz234567',
           15         58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
           16         256: ''.join([chr(x) for x in range(256)])
           17     }
           18 
           19     def bin_dbl_sha256(s):
           20         bytes_to_hash = from_string_to_bytes(s)
           21         return hashlib.sha256(hashlib.sha256(bytes_to_hash).digest()).digest()
           22 
           23     def lpad(msg, symbol, length):
           24         if len(msg) >= length:
           25             return msg
           26         return symbol * (length - len(msg)) + msg
           27 
           28     def get_code_string(base):
           29         if base in code_strings:
           30             return code_strings[base]
           31         else:
           32             raise ValueError("Invalid base!")
           33 
           34     def changebase(string, frm, to, minlen=0):
           35         if frm == to:
           36             return lpad(string, get_code_string(frm)[0], minlen)
           37         return encode(decode(string, frm), to, minlen)
           38 
           39     def bin_to_b58check(inp, magicbyte=0):
           40         inp_fmtd = from_int_to_byte(int(magicbyte)) + inp
           41 
           42         leadingzbytes = 0
           43         for x in inp_fmtd:
           44             if x != 0:
           45                 break
           46             leadingzbytes += 1
           47 
           48         checksum = bin_dbl_sha256(inp_fmtd)[:4]
           49         return '1' * leadingzbytes + changebase(inp_fmtd + checksum, 256, 58)
           50 
           51     def bytes_to_hex_string(b):
           52         if isinstance(b, str):
           53             return b
           54 
           55         return ''.join('{:02x}'.format(y) for y in b)
           56 
           57     def safe_from_hex(s):
           58         return bytes.fromhex(s)
           59 
           60     def from_int_to_byte(a):
           61         return bytes([a])
           62 
           63     def from_byte_to_int(a):
           64         return a
           65 
           66     def from_string_to_bytes(a):
           67         return a if isinstance(a, bytes) else bytes(a, 'utf-8')
           68 
           69     def safe_hexlify(a):
           70         return str(binascii.hexlify(a), 'utf-8')
           71 
           72     def encode(val, base, minlen=0):
           73         base, minlen = int(base), int(minlen)
           74         code_string = get_code_string(base)
           75         result_bytes = bytes()
           76         while val > 0:
           77             curcode = code_string[val % base]
           78             result_bytes = bytes([ord(curcode)]) + result_bytes
           79             val //= base
           80 
           81         pad_size = minlen - len(result_bytes)
           82 
           83         padding_element = b'\x00' if base == 256 else b'1' \
           84             if base == 58 else b'0'
           85         if (pad_size > 0):
           86             result_bytes = padding_element * pad_size + result_bytes
           87 
           88         result_string = ''.join([chr(y) for y in result_bytes])
           89         result = result_bytes if base == 256 else result_string
           90 
           91         return result
           92 
           93     def decode(string, base):
           94         if base == 256 and isinstance(string, str):
           95             string = bytes(bytearray.fromhex(string))
           96         base = int(base)
           97         code_string = get_code_string(base)
           98         result = 0
           99         if base == 256:
          100 
          101             def extract(d, cs):
          102                 return d
          103         else:
          104 
          105             def extract(d, cs):
          106                 return cs.find(d if isinstance(d, str) else chr(d))
          107 
          108         if base == 16:
          109             string = string.lower()
          110         while len(string) > 0:
          111             result *= base
          112             result += extract(string[0], code_string)
          113             string = string[1:]
          114         return result
          115 
          116     def from_int_representation_to_bytes(a):
          117         return bytes(str(a), 'utf-8')