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)
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))
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))
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, }
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, }
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}
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 }