Пример #1
0
def check_address(address):
    
    if is_address(address) is False: 

        while is_address(address) is False:

            address = raw_input("Invalid bitcoin address, please enter another address: ")
    
    if is_address(address):

        return address
Пример #2
0
def parse_URI(uri):
    import bitcoin
    from bitcoin import COIN

    if ':' not in uri:
        assert bitcoin.is_address(uri)
        return {'address': uri}

    u = urlparse.urlparse(uri)
    assert u.scheme == 'verge'

    address = u.path

    # python for android fails to parse query
    if address.find('?') > 0:
        address, query = u.path.split('?')
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v) != 1:
            raise Exception('Duplicate Key', k)

    out = {k: v[0] for k, v in pq.items()}
    if address:
        assert bitcoin.is_address(address)
        out['address'] = address
    if 'amount' in out:
        am = out['amount']
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(Decimal(10), k)
        else:
            amount = Decimal(am) * COIN
        out['amount'] = int(amount)
    if 'message' in out:
        out['message'] = out['message'].decode('utf8')
        out['memo'] = out['message']
    if 'time' in out:
        out['time'] = int(out['time'])
    if 'exp' in out:
        out['exp'] = int(out['exp'])
    if 'sig' in out:
        out['sig'] = bitcoin.base_decode(out['sig'], None,
                                         base=58).encode('hex')

    return out
Пример #3
0
def parse_URI(uri):
    import bitcoin
    from bitcoin import COIN

    if ':' not in uri:
        assert bitcoin.is_address(uri)
        return {'address': uri}

    u = urlparse.urlparse(uri)
    assert u.scheme == 'bitcoin'

    address = u.path

    # python for android fails to parse query
    if address.find('?') > 0:
        address, query = u.path.split('?')
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v)!=1:
            raise Exception('Duplicate Key', k)

    out = {k: v[0] for k, v in pq.items()}
    if address:
        assert bitcoin.is_address(address)
        out['address'] = address
    if 'amount' in out:
        am = out['amount']
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(  Decimal(10) , k)
        else:
            amount = Decimal(am) * COIN
        out['amount'] = int(amount)
    if 'message' in out:
        out['message'] = out['message'].decode('utf8')
        out['memo'] = out['message']
    if 'time' in out:
        out['time'] = int(out['time'])
    if 'exp' in out:
        out['exp'] = int(out['exp'])
    if 'sig' in out:
        out['sig'] = bitcoin.base_decode(out['sig'], None, base=58).encode('hex')

    return out
Пример #4
0
def parse_URI(uri, active_chain=None):
    import urlparse
    import bitcoin
    from decimal import Decimal
    import chainparams

    if active_chain is None:
        active_chain = chainparams.get_active_chain()

    if ':' not in uri:
        assert bitcoin.is_address(uri, active_chain)
        return uri, None, None, None, None

    uri_scheme = active_chain.coin_name.lower()
    u = urlparse.urlparse(uri)
    assert u.scheme == uri_scheme

    address = u.path
    valid_address = bitcoin.is_address(address, active_chain)

    pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v) != 1:
            raise Exception('Duplicate Key', k)

    amount = label = message = request_url = ''
    if 'amount' in pq:
        am = pq['amount'][0]
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(Decimal(10), k)
        else:
            amount = Decimal(am) * 100000000
    if 'message' in pq:
        message = pq['message'][0]
    if 'label' in pq:
        label = pq['label'][0]
    if 'r' in pq:
        request_url = pq['r'][0]

    if request_url != '':
        return address, amount, label, message, request_url

    assert valid_address

    return address, amount, label, message, request_url
Пример #5
0
def parse_URI(uri, active_chain=None):
    import urlparse
    import bitcoin
    from decimal import Decimal
    import chainparams

    if active_chain is None:
        active_chain = chainparams.get_active_chain()

    if ':' not in uri:
        assert bitcoin.is_address(uri, active_chain)
        return uri, None, None, None, None

    uri_scheme = active_chain.coin_name.lower()
    u = urlparse.urlparse(uri)
    assert u.scheme == uri_scheme

    address = u.path
    valid_address = bitcoin.is_address(address, active_chain)

    pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v)!=1:
            raise Exception('Duplicate Key', k)

    amount = label = message = request_url = ''
    if 'amount' in pq:
        am = pq['amount'][0]
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(  Decimal(10) , k)
        else:
            amount = Decimal(am) * 100000000
    if 'message' in pq:
        message = pq['message'][0]
    if 'label' in pq:
        label = pq['label'][0]
    if 'r' in pq:
        request_url = pq['r'][0]

    if request_url != '':
        return address, amount, label, message, request_url

    assert valid_address

    return address, amount, label, message, request_url
Пример #6
0
    def resolve(self, k):
        if bitcoin.is_address(k):
            return {
                'address': k,
                'type': 'address'
            }

        if k in self.keys():
            _type, addr = self[k]
            if _type == 'address':
                return {
                    'address': addr,
                    'type': 'contact'
                }

        out = self.resolve_openalias(k)
        if out:
            address, name = out
            try:
                validated = self.validate_dnssec(k)
            except:
                validated = False
                traceback.print_exc(file=sys.stderr)
            return {
                'address': address,
                'name': name,
                'type': 'openalias',
                'validated': validated
            }

        raise Exception("Invalid BataCoin address or alias", k)
Пример #7
0
    def resolve(self, k):
        if bitcoin.is_address(k):
            return {'address': k, 'type': 'address'}

        if k in self.keys():
            _type, addr = self[k]
            if _type == 'address':
                return {'address': addr, 'type': 'contact'}

        out = self.resolve_openalias(k)
        if out:
            address, name = out
            try:
                validated = self.validate_dnssec(k)
            except:
                validated = False
                traceback.print_exc(file=sys.stderr)
            return {
                'address': address,
                'name': name,
                'type': 'openalias',
                'validated': validated
            }

        raise Exception("Invalid BataCoin address or alias", k)
Пример #8
0
def parse_URI(uri):
    import bitcoin
    from decimal import Decimal

    if ":" not in uri:
        assert bitcoin.is_address(uri)
        return uri, None, None, None, None

    u = urlparse.urlparse(uri)
    assert u.scheme == "creditbit"

    address = u.path

    # python for android fails to parse query
    if address.find("?") > 0:
        address, query = u.path.split("?")
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v) != 1:
            raise Exception("Duplicate Key", k)

    amount = label = message = request_url = ""
    if "amount" in pq:
        am = pq["amount"][0]
        m = re.match("([0-9\.]+)X([0-9])", am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(Decimal(10), k)
        else:
            amount = Decimal(am) * 1000000
    if "message" in pq:
        message = pq["message"][0].decode("utf8")
    if "label" in pq:
        label = pq["label"][0]
    if "r" in pq:
        request_url = pq["r"][0]

    if request_url != "":
        return address, amount, label, message, request_url

    assert bitcoin.is_address(address)

    return address, amount, label, message, request_url
Пример #9
0
 def __init__(self, config):
     StoreDict.__init__(self, config, 'contacts')
     # backward compatibility
     for k, v in self.items():
         _type, n = v
         if _type == 'address' and bitcoin.is_address(n):
             self.pop(k)
             self[n] = ('address', k)
Пример #10
0
def parse_URI(uri):
    import bitcoin
    from decimal import Decimal

    if ':' not in uri:
        assert bitcoin.is_address(uri)
        return uri, None, None, None, None

    u = urlparse.urlparse(uri)
    assert u.scheme == 'bitcoin'

    address = u.path

    # python for android fails to parse query
    if address.find('?') > 0:
        address, query = u.path.split('?')
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v) != 1:
            raise Exception('Duplicate Key', k)

    amount = label = message = request_url = ''
    if 'amount' in pq:
        am = pq['amount'][0]
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(Decimal(10), k)
        else:
            amount = Decimal(am) * 100000000
    if 'message' in pq:
        message = pq['message'][0].decode('utf8')
    if 'label' in pq:
        label = pq['label'][0]
    if 'r' in pq:
        request_url = pq['r'][0]

    if request_url != '':
        return address, amount, label, message, request_url

    assert bitcoin.is_address(address)

    return address, amount, label, message, request_url
Пример #11
0
def parse_URI(uri):
    import bitcoin
    from decimal import Decimal

    if ':' not in uri:
        assert bitcoin.is_address(uri)
        return uri, None, None, None, None

    u = urlparse.urlparse(uri)
    assert u.scheme == 'VERGE'

    address = u.path

    # python for android fails to parse query
    if address.find('?') > 0:
        address, query = u.path.split('?')
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v)!=1:
            raise Exception('Duplicate Key', k)

    amount = label = message = request_url = ''
    if 'amount' in pq:
        am = pq['amount'][0]
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(  Decimal(10) , k)
        else:
            amount = Decimal(am) * 1000000
    if 'message' in pq:
        message = pq['message'][0].decode('utf8')
    if 'label' in pq:
        label = pq['label'][0]
    if 'r' in pq:
        request_url = pq['r'][0]

    if request_url != '':
        return address, amount, label, message, request_url

    assert bitcoin.is_address(address)

    return address, amount, label, message, request_url
Пример #12
0
 def __init__(self, config):
     StoreDict.__init__(self, config, 'contacts')
     # backward compatibility
     for k, v in self.items():
         _type, n = v
         if _type == 'address' and bitcoin.is_address(n):
             self.pop(k)
             self[n] = ('address', k)
Пример #13
0
 def getprivatekeys(self, address):
     """Get private keys of addresses. You may pass a single wallet address, or a list of wallet addresses."""
     if is_address(address):
         return self.wallet.get_private_key(address, self._password)
     domain = json_loads(address)
     return [
         self.wallet.get_private_key(address, self._password)
         for address in domain
     ]
Пример #14
0
 def __init__(self, storage):
     self.storage = storage
     d = self.storage.get('contacts', {})
     self.update(d)
     # backward compatibility
     for k, v in self.items():
         _type, n = v
         if _type == 'address' and bitcoin.is_address(n):
             self.pop(k)
             self[n] = ('address', k)
Пример #15
0
def parse_URI(uri):
    import bitcoin
    from bitcoin import COIN

    if ':' not in uri:
        assert bitcoin.is_address(uri)
        return uri, None, None, None, None

    u = urlparse.urlparse(uri)
    assert u.scheme == 'bitcoin'

    address = u.path

    # python for android fails to parse query
    if address.find('?') > 0:
        address, query = u.path.split('?')
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v) != 1:
            raise Exception('Duplicate Key', k)
        if k not in ['amount', 'label', 'message', 'r', 's']:
            raise BaseException('Unknown key', k)

    out = {k: v[0] for k, v in pq.items()}
    if address:
        assert bitcoin.is_address(address)
        out['address'] = address
    if 'amount' in out:
        am = out['amount']
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(Decimal(10), k)
        else:
            amount = Decimal(am) * COIN
        out['amount'] = amount
    if 'message' in out:
        out['message'] = out['message'].decode('utf8')
    return out
Пример #16
0
def parse_URI(uri):
    import bitcoin
    from bitcoin import COIN

    if ':' not in uri:
        assert bitcoin.is_address(uri)
        return uri, None, None, None, None

    u = urlparse.urlparse(uri)
    assert u.scheme == 'bitcoin'

    address = u.path

    # python for android fails to parse query
    if address.find('?') > 0:
        address, query = u.path.split('?')
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v)!=1:
            raise Exception('Duplicate Key', k)
        if k not in ['amount', 'label', 'message', 'r', 's']:
            raise BaseException('Unknown key', k)

    out = {k: v[0] for k, v in pq.items()}
    if address:
        assert bitcoin.is_address(address)
        out['address'] = address
    if 'amount' in out:
        am = out['amount']
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(  Decimal(10) , k)
        else:
            amount = Decimal(am) * COIN
        out['amount'] = amount
    if 'message' in out:
        out['message'] = out['message'].decode('utf8')
    return out
Пример #17
0
 def resolve(self, k):
     if bitcoin.is_address(k):
         return {'address':k, 'type':'address'}
     if k in self.keys():
         _type, addr = self[k]
         if _type == 'address':
             return {'address':addr, 'type':'contact'}
     out = run_hook('resolve_address', k)
     if out:
         return out
     raise Exception("Invalid Bitcoin address or alias", k)
Пример #18
0
 def _read_csv(self, csvpath):
     import csv
     outputs = []
     with open(csvpath, 'rb') as csvfile:
         csvReader = csv.reader(csvfile, delimiter=',')
         for row in csvReader:
             address, amount = row
             assert bitcoin.is_address(address)
             amount = Decimal(amount)
             outputs.append((address, amount))
     return outputs
Пример #19
0
 def _validate(self, data):
     for k, v in data.items():
         if k == 'contacts':
             return self._validate(v)
         if not bitcoin.is_address(k):
             data.pop(k)
         else:
             _type, _ = v
             if _type != 'address':
                 data.pop(k)
     return data
Пример #20
0
 def _read_csv(self, csvpath):
     import csv
     outputs = []
     with open(csvpath, 'rb') as csvfile:
         csvReader = csv.reader(csvfile, delimiter=',')
         for row in csvReader:
             address, amount = row
             assert bitcoin.is_address(address)
             amount = Decimal(amount)
             outputs.append((address, amount))
     return outputs
Пример #21
0
 def __init__(self, storage):
     self.storage = storage
     d = self.storage.get('contacts', {})
     try:
         self.update(d)
     except:
         return
     # backward compatibility
     for k, v in self.items():
         _type, n = v
         if _type == 'address' and bitcoin.is_address(n):
             self.pop(k)
             self[n] = ('address', k)
Пример #22
0
 def resolve(self, k, nocheck=False):
     if bitcoin.is_address(k):
         return {'address': k, 'type': 'address'}
     if k in self.keys():
         _type, addr = self[k]
         if _type == 'address':
             return {'address': addr, 'type': 'contact'}
     out = run_hook('resolve_address', k)
     if out:
         if not nocheck and out.get('validated') is False:
             raise Exception("cannot validate alias")
         return out
     raise Exception("invalid coin address", k)
Пример #23
0
def create_URI(addr, amount, message):
    import bitcoin
    if not bitcoin.is_address(addr):
        return ""
    query = []
    if amount:
        query.append('amount=%s'%format_satoshis_plain(amount))
    if message:
        if type(message) == unicode:
            message = message.encode('utf8')
        query.append('message=%s'%urllib.quote(message))
    p = urlparse.ParseResult(scheme='VERGE', netloc='', path=addr, params='', query='&'.join(query), fragment='')
    return urlparse.urlunparse(p)
Пример #24
0
 def resolve(self, k, nocheck=False):
     if bitcoin.is_address(k):
         return {'address':k, 'type':'address'}
     if k in self.keys():
         _type, addr = self[k]
         if _type == 'address':
             return {'address':addr, 'type':'contact'}
     out = run_hook('resolve_address', k)
     if out:
         if not nocheck and out.get('validated') is False:
             raise Exception("cannot validate alias")
         return out
     raise Exception("invalid coin address", k)
Пример #25
0
def create_URI(addr, amount, message):
    import bitcoin
    if not bitcoin.is_address(addr):
        return ""
    query = []
    if amount:
        query.append('amount=%s'%format_satoshis_plain(amount))
    if message:
        if type(message) == unicode:
            message = message.encode('utf8')
        query.append('message=%s'%urllib.quote(message))
    p = urlparse.ParseResult(scheme='bitcoin', netloc='', path=addr, params='', query='&'.join(query), fragment='')
    return urlparse.urlunparse(p)
Пример #26
0
def parse_URI(uri):
    import urlparse
    import bitcoin
    from decimal import Decimal

    if ':' not in uri:
        assert bitcoin.is_address(uri)
        return uri, None, None, None, None

    u = urlparse.urlparse(uri)
    assert u.scheme == 'litecoin'

    address = u.path
    assert bitcoin.is_address(address)

    pq = urlparse.parse_qs(u.query)
    
    for k, v in pq.items():
        if len(v)!=1:
            raise Exception('Duplicate Key', k)

    amount = label = message = request_url = ''
    if 'amount' in pq:
        am = pq['amount'][0]
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(  Decimal(10) , k)
        else:
            amount = Decimal(am) * 100000000
    if 'message' in pq:
        message = pq['message'][0]
    if 'label' in pq:
        label = pq['label'][0]
    if 'r' in pq:
        request_url = pq['r'][0]
        
    return address, amount, label, message, request_url
Пример #27
0
def parse_URI(uri):
    import urlparse
    import bitcoin
    from decimal import Decimal

    if ':' not in uri:
        assert bitcoin.is_address(uri)
        return uri, None, None, None, None

    u = urlparse.urlparse(uri)
    assert u.scheme == 'bitcoin'

    address = u.path
    assert bitcoin.is_address(address)

    pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v) != 1:
            raise Exception('Duplicate Key', k)

    amount = label = message = request_url = ''
    if 'amount' in pq:
        am = pq['amount'][0]
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(Decimal(10), k)
        else:
            amount = Decimal(am)
    if 'message' in pq:
        message = pq['message'][0]
    if 'label' in pq:
        label = pq['label'][0]
    if 'r' in pq:
        request_url = pq['r'][0]

    return address, amount, label, message, request_url
Пример #28
0
def create_URI(addr, amount, message):
    import bitcoin

    if not bitcoin.is_address(addr):
        return ""
    query = []
    if amount:
        query.append("amount=%s" % format_satoshis_plain(amount))
    if message:
        if type(message) == unicode:
            message = message.encode("utf8")
        query.append("message=%s" % urllib.quote(message))
    p = urlparse.ParseResult(scheme="bitcoin", netloc="", path=addr, params="", query="&".join(query), fragment="")
    return urlparse.urlunparse(p)
    def check_valid(self):
        """Evaluate whether this proposal is valid."""
        if not self.proposal_name:
            raise ValueError(_('A proposal name is required.'))
        elif len(self.proposal_name) > 20:
            raise ValueError(
                _('Proposal names have a limit of 20 characters.'))
        if not is_safe(self.proposal_name):
            raise ValueError(_('Unsafe characters in proposal name.'))

        if not self.proposal_url:
            raise ValueError(_('A proposal URL is required.'))
        elif len(self.proposal_url) > 64:
            raise ValueError(_('Proposal URLs have a limit of 64 characters.'))
        if not is_safe(self.proposal_url):
            raise ValueError(_('Unsafe characters in proposal URL.'))

        if self.end_block < self.start_block:
            raise ValueError(_('End block must be after start block.'))

        if not bitcoin.is_address(self.address):
            raise ValueError(_('Invalid address:') + ' %s' % self.address)
        addrtype, h160 = bitcoin.bc_address_to_hash_160(self.address)
        if addrtype != bitcoin.PUBKEY_ADDR:
            raise ValueError(
                _('Only P2PKH addresses are currently supported.'))

        if self.payment_amount < bitcoin.COIN:
            raise ValueError(_('Payments must be at least 1 DSR.'))

        # Calculate max budget.
        subsidy = 5 * bitcoin.COIN
        if bitcoin.TESTNET:
            for i in range(46200, self.start_block + 1,
                           SUBSIDY_HALVING_INTERVAL):
                subsidy -= subsidy / 14
        else:
            for i in range(SUBSIDY_HALVING_INTERVAL, self.start_block + 1,
                           SUBSIDY_HALVING_INTERVAL):
                subsidy -= subsidy / 14

        # 10%
        total_budget = ((subsidy / 100) * 10) * BUDGET_PAYMENTS_CYCLE_BLOCKS
        if self.payment_amount > total_budget:
            raise ValueError(
                _('Payment is more than max') +
                ' (%s).' % util.format_satoshis_plain(total_budget))
Пример #30
0
 def resolve(self, k):
     if bitcoin.is_address(k):
         return {'address': k, 'type': 'address'}
     if k in self.keys():
         _type, addr = self[k]
         if _type == 'address':
             return {'address': addr, 'type': 'contact'}
     out = self.resolve_openalias(k)
     if out:
         address, name, validated = out
         return {
             'address': address,
             'name': name,
             'type': 'openalias',
             'validated': validated
         }
     raise Exception("Invalid Viacoin address or alias", k)
Пример #31
0
def _process_outputs(outputs, timestamp):
    total_out = 0
    outs = []
    for out in sorted(outputs, key=lambda x: x[0]):
        address, amount = out
        if amount != _cut_to_8(amount):
            raise InvalidAmounts(
                "Output amounts limited to 8 decimal places: %s" % amount)

        if amount <= 0:
            raise InvalidAmounts("Output can't be zero or negative")
        total_out += amount

        outs.append("%s,%s" % (address, amount))

        if not is_address(address) or not address.startswith("1"):
            raise InvalidAddress("Invalid address: %s" % address)

    if type(timestamp) == datetime.datetime:
        timestamp = timestamp.isoformat()

    return total_out, ";".join(outs + [timestamp])
Пример #32
0
 def resolve(self, k):
     if bitcoin.is_address(k):
         return {
             'address': k,
             'type': 'address'
         }
     if k in self.keys():
         _type, addr = self[k]
         if _type == 'address':
             return {
                 'address': addr,
                 'type': 'contact'
             }
     out = self.resolve_openalias(k)
     if out:
         address, name, validated = out
         return {
             'address': address,
             'name': name,
             'type': 'openalias',
             'validated': validated
         }
     raise Exception("Invalid Bitcoin address or alias", k)
Пример #33
0
def is_address_list(text):
    parts = text.split()
    return bool(parts) and all(bitcoin.is_address(x) for x in parts)
Пример #34
0
def is_address_list(text):
    parts = text.split()
    return bool(parts) and all(bitcoin.is_address(x) for x in parts)
Пример #35
0
def parse_URI(uri, on_pr=None):
    import bitcoin
    from bitcoin import COIN

    if ":" not in uri:
        assert bitcoin.is_address(uri)
        return {"address": uri}

    u = urlparse.urlparse(uri)
    assert u.scheme == "bitcoin"

    address = u.path

    # python for android fails to parse query
    if address.find("?") > 0:
        address, query = u.path.split("?")
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v) != 1:
            raise Exception("Duplicate Key", k)

    out = {k: v[0] for k, v in pq.items()}
    if address:
        assert bitcoin.is_address(address)
        out["address"] = address
    if "amount" in out:
        am = out["amount"]
        m = re.match("([0-9\.]+)X([0-9])", am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(Decimal(10), k)
        else:
            amount = Decimal(am) * COIN
        out["amount"] = int(amount)
    if "message" in out:
        out["message"] = out["message"].decode("utf8")
        out["memo"] = out["message"]
    if "time" in out:
        out["time"] = int(out["time"])
    if "exp" in out:
        out["exp"] = int(out["exp"])
    if "sig" in out:
        out["sig"] = bitcoin.base_decode(out["sig"], None, base=58).encode("hex")

    r = out.get("r")
    sig = out.get("sig")
    name = out.get("name")
    if r or (name and sig):

        def get_payment_request_thread():
            import paymentrequest as pr

            if name and sig:
                s = pr.serialize_request(out).SerializeToString()
                request = pr.PaymentRequest(s)
            else:
                request = pr.get_payment_request(r)
            on_pr(request)

        t = threading.Thread(target=get_payment_request_thread)
        t.setDaemon(True)
        t.start()

    return out
Пример #36
0
def parse_URI(uri, on_pr=None):
    import bitcoin
    from bitcoin import COIN

    if ':' not in uri:
        if not bitcoin.is_address(uri):
            raise BaseException("Not a bitcoin address")
        return {'address': uri}

    u = urlparse.urlparse(uri)
    if u.scheme != 'bitcoin':
        raise BaseException("Not a bitcoin URI")
    address = u.path

    # python for android fails to parse query
    if address.find('?') > 0:
        address, query = u.path.split('?')
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v)!=1:
            raise Exception('Duplicate Key', k)

    out = {k: v[0] for k, v in pq.items()}
    if address:
        if not bitcoin.is_address(address):
            raise BaseException("Invalid bitcoin address:" + address)
        out['address'] = address
    if 'amount' in out:
        am = out['amount']
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(  Decimal(10) , k)
        else:
            amount = Decimal(am) * COIN
        out['amount'] = int(amount)
    if 'message' in out:
        out['message'] = out['message'].decode('utf8')
        out['memo'] = out['message']
    if 'time' in out:
        out['time'] = int(out['time'])
    if 'exp' in out:
        out['exp'] = int(out['exp'])
    if 'sig' in out:
        out['sig'] = bitcoin.base_decode(out['sig'], None, base=58).encode('hex')

    r = out.get('r')
    sig = out.get('sig')
    name = out.get('name')
    if on_pr and (r or (name and sig)):
        def get_payment_request_thread():
            import paymentrequest as pr
            if name and sig:
                s = pr.serialize_request(out).SerializeToString()
                request = pr.PaymentRequest(s)
            else:
                request = pr.get_payment_request(r)
            on_pr(request)
        t = threading.Thread(target=get_payment_request_thread)
        t.setDaemon(True)
        t.start()

    return out
Пример #37
0
def parse_URI(uri, on_pr=None):
    import bitcoin
    from bitcoin import COIN

    if ':' not in uri:
        if not bitcoin.is_address(uri):
            raise BaseException("Not a bitcoin address")
        return {'address': uri}

    u = urlparse.urlparse(uri)
    if u.scheme != 'bitcoin':
        raise BaseException("Not a bitcoin URI")
    address = u.path

    # python for android fails to parse query
    if address.find('?') > 0:
        address, query = u.path.split('?')
        pq = urlparse.parse_qs(query)
    else:
        pq = urlparse.parse_qs(u.query)

    for k, v in pq.items():
        if len(v)!=1:
            raise Exception('Duplicate Key', k)

    out = {k: v[0] for k, v in pq.items()}
    if address:
        if not bitcoin.is_address(address):
            raise BaseException("Invalid bitcoin address:" + address)
        out['address'] = address
    if 'amount' in out:
        am = out['amount']
        m = re.match('([0-9\.]+)X([0-9])', am)
        if m:
            k = int(m.group(2)) - 8
            amount = Decimal(m.group(1)) * pow(  Decimal(10) , k)
        else:
            amount = Decimal(am) * COIN
        out['amount'] = int(amount)
    if 'message' in out:
        out['message'] = out['message'].decode('utf8')
        out['memo'] = out['message']
    if 'time' in out:
        out['time'] = int(out['time'])
    if 'exp' in out:
        out['exp'] = int(out['exp'])
    if 'sig' in out:
        out['sig'] = bitcoin.base_decode(out['sig'], None, base=58).encode('hex')

    r = out.get('r')
    sig = out.get('sig')
    name = out.get('name')
    if on_pr and (r or (name and sig)):
        def get_payment_request_thread():
            import paymentrequest as pr
            if name and sig:
                s = pr.serialize_request(out).SerializeToString()
                request = pr.PaymentRequest(s)
            else:
                request = pr.get_payment_request(r)
            on_pr(request)
        t = threading.Thread(target=get_payment_request_thread)
        t.setDaemon(True)
        t.start()

    return out
Пример #38
0
 def validateaddress(self, address):
     """Check that an address is valid. """
     return is_address(address)
Пример #39
0
 def validateaddress(self, address):
     """Check that an address is valid. """
     return is_address(address)
Пример #40
0
 def getprivatekeys(self, address):
     """Get private keys of addresses. You may pass a single wallet address, or a list of wallet addresses."""
     if is_address(address):
         return self.wallet.get_private_key(address, self._password)
     domain = json_loads(address)
     return [self.wallet.get_private_key(address, self._password) for address in domain]