Esempio n. 1
0
def add_metadata(request, coin_symbol):
    block_hash = get_latest_block_hash(coin_symbol)

    block_overview = get_block_overview(
            block_representation=block_hash,
            coin_symbol=coin_symbol,
            txn_limit=500,
            api_key=BLOCKCYPHER_API_KEY,
            )

    random_tx_hash = choice(block_overview['txids'])

    redir_url = reverse(
            'add_metadata_to_tx',
            kwargs={'coin_symbol': coin_symbol, 'tx_hash': random_tx_hash},
            )

    msg = _('%(cs_display)s transaction %(tx_hash)s from latest block (%(latest_block_num)s) randomly selected' % {
        'cs_display': COIN_SYMBOL_MAPPINGS[coin_symbol]['currency_abbrev'],
        'tx_hash': random_tx_hash,
        'latest_block_num': intcomma(block_overview['height']),
        })

    messages.success(request, msg, extra_tags='safe')
    return HttpResponseRedirect(redir_url)
Esempio n. 2
0
def add_metadata(request, coin_symbol):
    block_hash = get_latest_block_hash(coin_symbol)

    block_overview = get_block_overview(
            block_representation=block_hash,
            coin_symbol=coin_symbol,
            txn_limit=500,
            api_key=BLOCKCYPHER_API_KEY,
            )

    random_tx_hash = choice(block_overview['txids'])

    redir_url = reverse(
            'add_metadata_to_tx',
            kwargs={'coin_symbol': coin_symbol, 'tx_hash': random_tx_hash},
            )

    msg = _('%(cs_display)s transaction %(tx_hash)s from latest block (%(latest_block_num)s) randomly selected' % {
        'cs_display': COIN_SYMBOL_MAPPINGS[coin_symbol]['currency_abbrev'],
        'tx_hash': random_tx_hash,
        'latest_block_num': intcomma(block_overview['height']),
        })

    messages.success(request, msg, extra_tags='safe')
    return HttpResponseRedirect(redir_url)
Esempio n. 3
0
def block_ordered_tx(request, coin_symbol, block_num, tx_num):

    block_overview = get_block_overview(
        block_representation=block_num,
        coin_symbol=coin_symbol,
        txn_limit=1,
        txn_offset=int(tx_num),
        api_key=BLOCKCYPHER_API_KEY,
    )
    txids = block_overview.get('txids')

    if txids:
        tx_hash = txids[0]
        msg = _(
            'This is transaction <strong>%(tx_num)s</strong> in block <strong>%(block_num)s</strong> (<a href="%(permalink)s">permalink</a>).'
            % {
                'tx_num':
                tx_num,
                'block_num':
                block_num,
                'permalink':
                reverse('block_ordered_tx',
                        kwargs={
                            'coin_symbol': coin_symbol,
                            'block_num': block_num,
                            'tx_num': tx_num,
                        }),
            })
        messages.info(request, msg, extra_tags='safe')

        kwargs = {
            'coin_symbol': coin_symbol,
            'tx_hash': tx_hash,
        }

        redir_uri = reverse('transaction_overview',
                            kwargs=kwargs) + '#advanced-details'

        return HttpResponseRedirect(redir_uri)

    else:
        msg = _(
            'Sorry, block <strong>%(block_num)s</strong> only has <strong>%(n_tx)s</strong> transactions'
            % {
                'block_num': block_num,
                'n_tx': block_overview['n_tx'],
            })
        messages.warning(request, msg, extra_tags='safe')

        kwargs = {
            'coin_symbol': coin_symbol,
            'block_representation': block_num,
        }
        return HttpResponseRedirect(reverse('block_overview', kwargs=kwargs))
Esempio n. 4
0
def block_ordered_tx(request, coin_symbol, block_num, tx_num):

    block_overview = get_block_overview(
            block_representation=block_num,
            coin_symbol=coin_symbol,
            txn_limit=1,
            txn_offset=int(tx_num),
            api_key=BLOCKCYPHER_API_KEY,
            )
    txids = block_overview.get('txids')

    if txids:
        tx_hash = txids[0]
        msg = _('This is transaction <strong>%(tx_num)s</strong> in block <strong>%(block_num)s</strong> (<a href="%(permalink)s">permalink</a>).' % {
            'tx_num': tx_num,
            'block_num': block_num,
            'permalink': reverse('block_ordered_tx', kwargs={
                'coin_symbol': coin_symbol,
                'block_num': block_num,
                'tx_num': tx_num,
                }),
            })
        messages.info(request, msg, extra_tags='safe')

        kwargs = {
                'coin_symbol': coin_symbol,
                'tx_hash': tx_hash,
                }

        redir_uri = reverse('transaction_overview', kwargs=kwargs) + '#show-advanced'

        return HttpResponseRedirect(redir_uri)

    else:
        msg = _('Sorry, block <strong>%(block_num)s</strong> only has <strong>%(n_tx)s</strong> transactions' % {
            'block_num': block_num,
            'n_tx': block_overview['n_tx'],
            })
        messages.warning(request, msg, extra_tags='safe')

        kwargs = {
                'coin_symbol': coin_symbol,
                'block_representation': block_num,
                }
        return HttpResponseRedirect(reverse('block_overview', kwargs=kwargs))
Esempio n. 5
0
def coin_overview(request, coin_symbol):

    initial = {
        'coin_symbol': coin_symbol,
        'search_string': COIN_SYMBOL_MAPPINGS[coin_symbol]['example_address']
    }
    form = SearchForm(initial=initial)

    latest_bh = get_latest_block_height(coin_symbol=coin_symbol,
                                        api_key=BLOCKCYPHER_API_KEY)

    recent_blocks = [
        get_block_overview(block_height,
                           coin_symbol=coin_symbol,
                           txn_limit=1,
                           api_key=BLOCKCYPHER_API_KEY)
        for block_height in reversed(range(latest_bh - 3, latest_bh + 1))
    ]
    #import pprint; pprint.pprint(recent_blocks, width=1)

    recent_txs = get_broadcast_transactions(coin_symbol=coin_symbol,
                                            api_key=BLOCKCYPHER_API_KEY,
                                            limit=10)

    recent_txs_filtered = []
    tx_hashes_seen = set([])
    for recent_tx in recent_txs:
        if recent_tx['hash'] in tx_hashes_seen:
            continue
        else:
            tx_hashes_seen.add(recent_tx['hash'])
            recent_txs_filtered.append(recent_tx)

    # sort recent txs by order (they're not always returning in order)
    recent_txs_filtered = sorted(recent_txs_filtered,
                                 key=itemgetter('received'),
                                 reverse=True)

    return {
        'coin_symbol': coin_symbol,
        'form': form,
        'recent_blocks': recent_blocks,
        'recent_txs': recent_txs_filtered,
        'BLOCKCYPHER_PUBLIC_KEY': BLOCKCYPHER_PUBLIC_KEY,
    }
Esempio n. 6
0
def coin_overview(request, coin_symbol):

    initial = {
            'coin_symbol': coin_symbol,
            'search_string': COIN_SYMBOL_MAPPINGS[coin_symbol]['example_address']
            }
    form = SearchForm(initial=initial)

    latest_bh = get_latest_block_height(coin_symbol=coin_symbol, api_key=BLOCKCYPHER_API_KEY)

    recent_blocks = [get_block_overview(block_height, coin_symbol=coin_symbol, txn_limit=1, api_key=BLOCKCYPHER_API_KEY) for block_height in reversed(range(latest_bh-3, latest_bh+1))]
    #import pprint; pprint.pprint(recent_blocks, width=1)

    recent_txs = get_broadcast_transactions(coin_symbol=coin_symbol,
            api_key=BLOCKCYPHER_API_KEY,
            limit=10)

    recent_txs_filtered = []
    tx_hashes_seen = set([])
    for recent_tx in recent_txs:
        if recent_tx['hash'] in tx_hashes_seen:
            continue
        else:
            tx_hashes_seen.add(recent_tx['hash'])
            recent_txs_filtered.append(recent_tx)

    # sort recent txs by order (they're not always returning in order)
    recent_txs_filtered = sorted(recent_txs_filtered, key=itemgetter('received'), reverse=True)

    return {
            'coin_symbol': coin_symbol,
            'form': form,
            'recent_blocks': recent_blocks,
            'recent_txs': recent_txs_filtered,
            'BLOCKCYPHER_PUBLIC_KEY': BLOCKCYPHER_PUBLIC_KEY,
            }
Esempio n. 7
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 is_valid_address(search_string):
                # It's an address
                kwargs['address'] = search_string
                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', ):
                    # 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'):
                    # 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'):
                    kwargs['coin_symbol'] = 'doge'
                elif first_char in ('L', ):
                    # 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_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}
Esempio n. 8
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, that's not a valid transaction or block hash for %(currency)s" % {'currency': coin_symbol})
                            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
                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', ):
                    # 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'):
                    # 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'):
                    kwargs['coin_symbol'] = 'doge'
                elif first_char in ('L', ):
                    # 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 ('U', ):
                    kwargs['coin_symbol'] = 'uro'
                elif first_char in ('B', 'C'):
                    kwargs['coin_symbol'] = 'bcy'

                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, that's not a valid %(currency)s address, wallet name, transaction or block" % {
                'currency': currency})
            messages.error(request, msg)

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