def unspent(*addrs, coin_symbol=None, api_key=None, **kwargs): if len(addrs) == 0: return [] addrs = parse_addr_args(*addrs) if len(addrs) == 1: txs = api.get_address_details(addrs[0], coin_symbol=coin_symbol, unspent_only=True, **kwargs)['txrefs'] for tx in txs: tx['output'] = "%s:%s" % (tx['tx_hash'], tx['tx_output_n']) return txs result = api.get_addresses_details(addrs, coin_symbol=coin_symbol, api_key=None, unspent_only=True, **kwargs)['txrefs'] return result
def address_overview(request, coin_symbol, address, wallet_name=None): TXNS_PER_PAGE = 100 # 1 indexed page current_page = request.GET.get('page') if current_page: current_page = int(current_page) else: current_page = 1 try: address_details = get_address_details( address=address, coin_symbol=coin_symbol, txn_limit=TXNS_PER_PAGE, api_key=BLOCKCYPHER_API_KEY, ) except AssertionError: msg = _('Invalid Address') messages.warning(request, msg) redir_url = reverse('coin_overview', kwargs={'coin_symbol': coin_symbol}) return HttpResponseRedirect(redir_url) # import pprint; pprint.pprint(address_details, width=1) if 'error' in address_details: msg = _('Sorry, that address was not found') messages.warning(request, msg) return HttpResponseRedirect(reverse('home')) if request.user.is_authenticated(): # notify user on page of any forwarding or subscriptions they may have for address_subscription in AddressSubscription.objects.filter( auth_user=request.user, b58_address=address, coin_symbol=coin_symbol, unsubscribed_at=None, ): if address_subscription.auth_user.email_verified: msg = _('Private Message: you are subscribed to this address and will receive email notifications at <b>%(user_email)s</b> (<a href="%(unsub_url)s">unsubscribe</a>)' % { 'user_email': request.user.email, 'unsub_url': reverse('user_unsubscribe_address', kwargs={ 'address_subscription_id': address_subscription.id, }), }) messages.info(request, msg, extra_tags='safe') else: msg = _('Private Message: you are not subscribed to this address because you have not clicked the link sent to <b>%(user_email)s</b>' % { 'user_email': request.user.email, }) messages.error(request, msg, extra_tags='safe') print('ERROR') # there can be only one af_initial = get_object_or_None(AddressForwarding, auth_user=request.user, initial_address=address, coin_symbol=coin_symbol, ) if af_initial: msg = _(''' Private Message: this address will automatically forward to <a href="%(destination_addr_uri)s">%(destination_address)s</a> any time a payment is received. <br /><br /> <i>%(small_payments_msg)s</i> ''' % { 'destination_address': af_initial.destination_address, 'destination_addr_uri': reverse('address_overview', kwargs={ 'address': af_initial.destination_address, 'coin_symbol': coin_symbol, }), 'small_payments_msg': SMALL_PAYMENTS_MSG, }) messages.info(request, msg, extra_tags='safe') # There could be many for af_destination in AddressForwarding.objects.filter( auth_user=request.user, destination_address=address, coin_symbol=coin_symbol, ): msg = _(''' Private Message: this address will automatically receive forwarded transactions from <a href="%(initial_addr_uri)s">%(initial_address)s</a>. <br /><br /> <i>%(small_payments_msg)s</i> ''' % { 'initial_address': af_destination.initial_address, 'initial_addr_uri': reverse('address_overview', kwargs={ 'address': af_destination.initial_address, 'coin_symbol': coin_symbol, }), 'small_payments_msg': SMALL_PAYMENTS_MSG, }) messages.info(request, msg, extra_tags='safe') all_transactions = address_details.get('unconfirmed_txrefs', []) + address_details.get('txrefs', []) # transaction pagination: 0-indexed and inclusive tx_start_num = (current_page - 1) * TXNS_PER_PAGE tx_end_num = current_page * TXNS_PER_PAGE - 1 # filter address details for pagination. HACK! all_transactions = all_transactions[tx_start_num:tx_end_num] flattened_txs = flatten_txns_by_hash(all_transactions, nesting=False) api_url = 'https://api.blockcypher.com/v1/%s/%s/addrs/%s' % ( COIN_SYMBOL_MAPPINGS[coin_symbol]['blockcypher_code'], COIN_SYMBOL_MAPPINGS[coin_symbol]['blockcypher_network'], address) return { 'coin_symbol': coin_symbol, 'address': address, 'api_url': api_url, 'wallet_name': wallet_name, 'current_page': current_page, 'max_pages': get_max_pages(num_items=address_details['final_n_tx'], items_per_page=TXNS_PER_PAGE), 'total_sent_satoshis': address_details['total_sent'], 'total_received_satoshis': address_details['total_received'], 'unconfirmed_balance_satoshis': address_details['unconfirmed_balance'], 'confirmed_balance_satoshis': address_details['balance'], 'total_balance_satoshis': address_details['final_balance'], 'flattened_txs': flattened_txs, 'num_confirmed_txns': address_details['n_tx'], 'num_unconfirmed_txns': address_details['unconfirmed_n_tx'], 'num_all_txns': address_details['final_n_tx'], 'BLOCKCYPHER_PUBLIC_KEY': BLOCKCYPHER_PUBLIC_KEY, }
def address_overview(request, coin_symbol, address, wallet_name=None): TXNS_PER_PAGE = 100 # 1 indexed page current_page = request.GET.get('page') if current_page: current_page = int(current_page) else: current_page = 1 try: address_details = get_address_details( address=address, coin_symbol=coin_symbol, txn_limit=5000, api_key=BLOCKCYPHER_API_KEY, ) except AssertionError: msg = _('Invalid Address') messages.warning(request, msg) redir_url = reverse('coin_overview', kwargs={'coin_symbol': coin_symbol}) return HttpResponseRedirect(redir_url) #import pprint; pprint.pprint(address_details, width=1) if 'error' in address_details: msg = _('Sorry, that address was not found') messages.warning(request, msg) return HttpResponseRedirect(reverse('home')) all_transactions = address_details.get('unconfirmed_txrefs', []) + address_details.get('txrefs', []) # doesn't cover pagination confirmed_sent_satoshis, confirmed_received_satoshis = 0, 0 unconfirmed_sent_satoshis, unconfirmed_received_satoshis = 0, 0 for transaction in all_transactions: if transaction['tx_input_n'] >= 0: # It's sent if transaction['confirmations'] > 6: confirmed_sent_satoshis += transaction['value'] else: unconfirmed_sent_satoshis += transaction['value'] else: # It's received if transaction['confirmations'] > 6: confirmed_received_satoshis += transaction['value'] else: unconfirmed_received_satoshis += transaction['value'] # transaction pagination: 0-indexed and inclusive tx_start_num = (current_page - 1) * TXNS_PER_PAGE tx_end_num = current_page * TXNS_PER_PAGE - 1 # filter address details for pagination. HACK! all_transactions = all_transactions[tx_start_num:tx_end_num] all_txids = set([tx['tx_hash'] for tx in all_transactions]) return { 'coin_symbol': coin_symbol, 'address': address, 'api_url': get_address_details_url(address=address, coin_symbol=coin_symbol), 'wallet_name': wallet_name, 'current_page': current_page, 'max_pages': get_max_pages(num_items=address_details['final_n_tx'], items_per_page=TXNS_PER_PAGE), 'confirmed_sent_satoshis': confirmed_sent_satoshis, 'unconfirmed_sent_satoshis': unconfirmed_sent_satoshis, 'total_sent_satoshis': unconfirmed_sent_satoshis + confirmed_sent_satoshis, 'confirmed_received_satoshis': confirmed_received_satoshis, 'unconfirmed_received_satoshis': unconfirmed_received_satoshis, 'total_received_satoshis': unconfirmed_received_satoshis + confirmed_received_satoshis, 'unconfirmed_balance_satoshis': address_details['unconfirmed_balance'], 'confirmed_balance_satoshis': address_details['balance'], 'total_balance_satoshis': address_details['final_balance'], 'all_transactions': all_transactions, 'num_confirmed_txns': address_details['n_tx'], 'num_unconfirmed_txns': address_details['unconfirmed_n_tx'], 'num_all_txns': address_details['final_n_tx'], 'has_more': bool(len(all_txids) != address_details['final_n_tx']), 'BLOCKCYPHER_PUBLIC_KEY': BLOCKCYPHER_PUBLIC_KEY, }
def address_overview(request, coin_symbol, address, wallet_name=None): TXNS_PER_PAGE = 100 # 1 indexed page current_page = request.GET.get('page') if current_page: current_page = int(current_page) else: current_page = 1 try: address_details = get_address_details( address=address, coin_symbol=coin_symbol, txn_limit=TXNS_PER_PAGE, api_key=BLOCKCYPHER_API_KEY, ) except AssertionError: msg = _('Invalid Address') messages.warning(request, msg) redir_url = reverse('coin_overview', kwargs={'coin_symbol': coin_symbol}) return HttpResponseRedirect(redir_url) # import pprint; pprint.pprint(address_details, width=1) if 'error' in address_details: msg = _('Sorry, that address was not found') messages.warning(request, msg) return HttpResponseRedirect(reverse('home')) if request.user.is_authenticated(): # notify user on page of any forwarding or subscriptions they may have for address_subscription in AddressSubscription.objects.filter( auth_user=request.user, b58_address=address, coin_symbol=coin_symbol, unsubscribed_at=None, ): if address_subscription.auth_user.email_verified: msg = _( 'Private Message: you are subscribed to this address and will receive email notifications at <b>%(user_email)s</b> (<a href="%(unsub_url)s">unsubscribe</a>)' % { 'user_email': request.user.email, 'unsub_url': reverse('user_unsubscribe_address', kwargs={ 'address_subscription_id': address_subscription.id, }), }) messages.info(request, msg, extra_tags='safe') else: msg = _( 'Private Message: you are not subscribed to this address because you have not clicked the link sent to <b>%(user_email)s</b>' % { 'user_email': request.user.email, }) messages.error(request, msg, extra_tags='safe') print('ERROR') # there can be only one af_initial = get_object_or_None( AddressForwarding, auth_user=request.user, initial_address=address, coin_symbol=coin_symbol, ) if af_initial: msg = _( ''' Private Message: this address will automatically forward to <a href="%(destination_addr_uri)s">%(destination_address)s</a> any time a payment is received. <br /><br /> <i>%(small_payments_msg)s</i> ''' % { 'destination_address': af_initial.destination_address, 'destination_addr_uri': reverse('address_overview', kwargs={ 'address': af_initial.destination_address, 'coin_symbol': coin_symbol, }), 'small_payments_msg': SMALL_PAYMENTS_MSG, }) messages.info(request, msg, extra_tags='safe') # There could be many for af_destination in AddressForwarding.objects.filter( auth_user=request.user, destination_address=address, coin_symbol=coin_symbol, ): msg = _( ''' Private Message: this address will automatically receive forwarded transactions from <a href="%(initial_addr_uri)s">%(initial_address)s</a>. <br /><br /> <i>%(small_payments_msg)s</i> ''' % { 'initial_address': af_destination.initial_address, 'initial_addr_uri': reverse('address_overview', kwargs={ 'address': af_destination.initial_address, 'coin_symbol': coin_symbol, }), 'small_payments_msg': SMALL_PAYMENTS_MSG, }) messages.info(request, msg, extra_tags='safe') all_transactions = address_details.get( 'unconfirmed_txrefs', []) + address_details.get('txrefs', []) # transaction pagination: 0-indexed and inclusive tx_start_num = (current_page - 1) * TXNS_PER_PAGE tx_end_num = current_page * TXNS_PER_PAGE - 1 # filter address details for pagination. HACK! all_transactions = all_transactions[tx_start_num:tx_end_num] flattened_txs = flatten_txns_by_hash(all_transactions, nesting=False) api_url = 'https://api.blockcypher.com/v1/%s/%s/addrs/%s' % ( COIN_SYMBOL_MAPPINGS[coin_symbol]['blockcypher_code'], COIN_SYMBOL_MAPPINGS[coin_symbol]['blockcypher_network'], address) return { 'coin_symbol': coin_symbol, 'address': address, 'api_url': api_url, 'wallet_name': wallet_name, 'current_page': current_page, 'max_pages': get_max_pages(num_items=address_details['final_n_tx'], items_per_page=TXNS_PER_PAGE), 'total_sent_satoshis': address_details['total_sent'], 'total_received_satoshis': address_details['total_received'], 'unconfirmed_balance_satoshis': address_details['unconfirmed_balance'], 'confirmed_balance_satoshis': address_details['balance'], 'total_balance_satoshis': address_details['final_balance'], 'flattened_txs': flattened_txs, 'num_confirmed_txns': address_details['n_tx'], 'num_unconfirmed_txns': address_details['unconfirmed_n_tx'], 'num_all_txns': address_details['final_n_tx'], 'BLOCKCYPHER_PUBLIC_KEY': BLOCKCYPHER_PUBLIC_KEY, }
def address_overview(request, coin_symbol, address): TXNS_PER_PAGE = 100 # 1 indexed page current_page = request.GET.get('page') if current_page: current_page = int(current_page) else: current_page = 1 address_details = get_address_details( address=address, coin_symbol=coin_symbol, txn_limit=5000, api_key=BLOCKCYPHER_API_KEY, ) #import pprint; pprint.pprint(address_details, width=1) if 'error' in address_details: msg = _('Sorry, that address was not found') messages.warning(request, msg) return HttpResponseRedirect(reverse('home')) all_transactions = address_details.get('unconfirmed_txrefs', []) + address_details.get('txrefs', []) # doesn't cover pagination confirmed_sent_satoshis, confirmed_received_satoshis = 0, 0 unconfirmed_sent_satoshis, unconfirmed_received_satoshis = 0, 0 for transaction in all_transactions: if transaction['tx_input_n'] >= 0: # It's sent if transaction['confirmations'] > 6: confirmed_sent_satoshis += transaction['value'] else: unconfirmed_sent_satoshis += transaction['value'] else: # It's received if transaction['confirmations'] > 6: confirmed_received_satoshis += transaction['value'] else: unconfirmed_received_satoshis += transaction['value'] # transaction pagination: 0-indexed and inclusive tx_start_num = (current_page - 1) * TXNS_PER_PAGE tx_end_num = current_page * TXNS_PER_PAGE - 1 # filter address details for pagination. HACK! all_transactions = all_transactions[tx_start_num:tx_end_num] api_url = get_address_details_url(address=address, coin_symbol=coin_symbol) all_txids = set([tx['tx_hash'] for tx in all_transactions]) return { 'coin_symbol': coin_symbol, 'address': address, 'api_url': api_url, 'current_page': current_page, 'max_pages': get_max_pages(num_items=address_details['final_n_tx'], items_per_page=TXNS_PER_PAGE), 'confirmed_sent_satoshis': confirmed_sent_satoshis, 'unconfirmed_sent_satoshis': unconfirmed_sent_satoshis, 'total_sent_satoshis': unconfirmed_sent_satoshis + confirmed_sent_satoshis, 'confirmed_received_satoshis': confirmed_received_satoshis, 'unconfirmed_received_satoshis': unconfirmed_received_satoshis, 'total_received_satoshis': unconfirmed_received_satoshis + confirmed_received_satoshis, 'unconfirmed_balance_satoshis': address_details['unconfirmed_balance'], 'confirmed_balance_satoshis': address_details['balance'], 'total_balance_satoshis': address_details['final_balance'], 'all_transactions': all_transactions, 'num_confirmed_txns': address_details['n_tx'], 'num_unconfirmed_txns': address_details['unconfirmed_n_tx'], 'num_all_txns': address_details['final_n_tx'], 'has_more': bool(len(all_txids) != address_details['final_n_tx']), 'BLOCKCYPHER_PUBLIC_KEY': BLOCKCYPHER_PUBLIC_KEY, }