Пример #1
0
    def clean_search_string(self):
        search_string = self.cleaned_data['search_string'].strip()
        # process possible Wallet Names
        if is_valid_wallet_name(search_string):
            return search_string

        # get rid of non alphanumerics
        if search_string.lower().startswith("0x"):
            search_string = search_string[2:]
        search_string = re.sub(r'[^a-zA-Z0-9]+', '', search_string)
        if is_valid_hash(search_string) or is_valid_address(search_string) or is_valid_eth_address(search_string) or is_valid_block_num(search_string):
            return search_string
        else:
            err_msg = _('Not a valid address, transaction hash, or block number')
            raise forms.ValidationError(err_msg)
Пример #2
0
def home(request):
    form = SearchForm(initial={
        'search_string': '16Fg2yjwrbtC6fZp61EV9mNVKmwCzGasw5',
        'coin_symbol': 'btc',
        })
    if request.method == 'POST':
        form = SearchForm(data=request.POST)
        if form.is_valid():
            redirect_url = None
            search_string = form.cleaned_data['search_string']
            coin_symbol = form.cleaned_data['coin_symbol']
            kwargs = {'coin_symbol': coin_symbol}
            if is_valid_block_num(search_string):
                kwargs['block_representation'] = search_string
                redirect_url = reverse('block_overview', kwargs=kwargs)
            elif is_valid_hash(search_string):
                if coin_symbol in SHA_COINS:
                    if is_valid_sha_block_hash(search_string):
                        kwargs['block_representation'] = search_string
                        redirect_url = reverse('block_overview', kwargs=kwargs)
                    else:
                        kwargs['tx_hash'] = search_string
                        redirect_url = reverse('transaction_overview', kwargs=kwargs)
                elif coin_symbol in SCRYPT_COINS:
                    # Try to see if it's a valid TX hash
                    tx_details = get_transaction_details(
                            tx_hash=search_string,
                            coin_symbol=coin_symbol,
                            limit=1,
                            api_key=BLOCKCYPHER_API_KEY,
                            )
                    if 'error' in tx_details:
                        # Not a valid TX hash, see if it's a block hash by checking blockchain
                        block_details = get_block_overview(
                                block_representation=search_string,
                                coin_symbol=coin_symbol,
                                txn_limit=1,
                                api_key=BLOCKCYPHER_API_KEY,
                                )
                        if 'error' in block_details:
                            msg = _("Sorry, '%(search_string)s' is not a valid transaction or block hash for %(currency)s" % {
                                'currency': coin_symbol,
                                'search_string': search_string,
                                })
                            messages.error(request, msg)
                        else:
                            kwargs['block_representation'] = search_string
                            redirect_url = reverse('block_overview', kwargs=kwargs)
                    else:
                        kwargs['tx_hash'] = search_string
                        redirect_url = reverse('transaction_overview', kwargs=kwargs)

                elif coin_symbol in ETHASH_COINS:
                    # Try to see if it's a valid TX hash
                    search_string = search_string.lower()
                    tx_details = get_transaction_details(
                            tx_hash=search_string,
                            coin_symbol=coin_symbol,
                            limit=1,
                            api_key=BLOCKCYPHER_API_KEY,
                            )
                    if 'error' in tx_details:
                        # Not a valid TX hash, see if it's a block hash by checking blockchain
                        block_details = get_block_overview(
                                block_representation=search_string,
                                coin_symbol=coin_symbol,
                                txn_limit=1,
                                api_key=BLOCKCYPHER_API_KEY,
                                )
                        if 'error' in block_details:
                            msg = _("Sorry, '%(search_string)s' is not a valid transaction or block hash for %(currency)s" % {
                                'currency': coin_symbol,
                                'search_string': search_string,
                                })
                            messages.error(request, msg)
                        else:
                            kwargs['block_representation'] = search_string
                            redirect_url = reverse('block_overview', kwargs=kwargs)
                    else:
                        kwargs['tx_hash'] = search_string
                        redirect_url = reverse('transaction_overview', kwargs=kwargs)

            elif is_valid_address(search_string):
                # It's an address
                kwargs['address'] = search_string
                # Look first for bech32 address
                if search_string.startswith('bc1'):
                    kwargs['coin_symbol'] = 'btc'
                elif search_string.startswith('ltc1'):
                    kwargs['coin_symbol'] = 'ltc'
                elif search_string.startswith('tb1'):
                    kwargs['coin_symbol'] = 'btc-testnet'
                elif search_string.startswith('bcy1'):
                    kwargs['coin_symbol'] = 'bcy'
                    print(kwargs)
                else:
                    # After look at first char
                    first_char = search_string[0]
                    # Override coin_symbol if we can infer it from the blockchain
                    # There is now generic constants in the python library (constants.py)
                    # Not migrating because this is custom (those constants have overlap/ambiguity)
                    if first_char in ('1', 'b', ):
                        # Do not force addresses starting with 3 to be BTC because that's also used by LTC
                        kwargs['coin_symbol'] = 'btc'
                    elif first_char in ('m', 'n', '2', 't', ):
                        # Note that addresses starting in 2 can be LTC testnet, but since we don't support that it's okay to include
                        kwargs['coin_symbol'] = 'btc-testnet'
                    elif first_char in ('9', 'A', 'D',):
                        kwargs['coin_symbol'] = 'doge'
                    elif first_char in ('X', '7'):
                        kwargs['coin_symbol'] = 'dash'
                    elif first_char in ('L', 'l','M', ):
                        # Do not force addresses starting with 3 to be LTC because that's also used by BTC
                        kwargs['coin_symbol'] = 'ltc'
                    elif first_char in ('B', 'C'):
                        kwargs['coin_symbol'] = 'bcy'
                redirect_url = reverse('address_overview', kwargs=kwargs)
            elif is_valid_eth_address(search_string):
                    # It's an address
                    kwargs['address'] = search_string
                    kwargs['coin_symbol'] = 'eth'
                    redirect_url = reverse('address_overview', kwargs=kwargs)

            elif is_valid_wallet_name(search_string):
                addr = lookup_wallet_name(search_string, kwargs['coin_symbol'])
                if addr:
                    kwargs['address'] = addr
                    kwargs['wallet_name'] = search_string
                    redirect_url = reverse('address_overview', kwargs=kwargs)
                else:
                    msg = _("Sorry, that's not a valid wallet name")
                    messages.error(request, msg)

            if redirect_url:
                return HttpResponseRedirect(redirect_url)

        else:
            currency = COIN_SYMBOL_MAPPINGS[request.POST['coin_symbol']]['display_shortname']
            msg = _("Sorry, '%(search_string)s' is not a valid %(currency)s address, wallet name, transaction or block" % {
                'currency': currency,
                'search_string': request.POST['search_string'],
                })
            messages.error(request, msg)

    return {
        'is_home': True,
        'form': form,
        'is_input_page': True,
    }