def process_transaction(bitcoin_rpc, redis, transaction, min_confirmations=5): log.debug("Processing transaction: %s", transaction['txid']) receive_details = next(d for d in transaction['details'] if d['category'] == u'receive') address = receive_details['address'] amount = receive_details['amount'] is_confirmed = int(transaction['confirmations']) >= min_confirmations key = KEY_PREFIX_PENDING_WALLET(address) value = redis.get(key) if not value: # Wallet is discarded. return payout_address, callback_url = json.loads(value) if is_confirmed and payout_address: # FIXME: Is bitcoind ready to sendtoaddress at this point? # TODO: Log receipt. # TODO: Take fee. bitcoin_rpc.sendtoaddress(payout_address, amount) if callback_url: transaction_str = json.dumps(transaction) payload = { # TODO: Add nonce and signing? 'state': 'confirmed' if is_confirmed else 'unconfirmed', 'transaction': transaction_str, } process_callback(redis, callback_url, payload) return transaction
def deque_callback(redis): value = redis.rpop(KEY_CALLBACK_QUEUE) if not value: return r = json.loads(value) seconds_wait = _get_retry_wait(r['num_attempts']) if r['time_attempted'] + seconds_wait < time.time(): # Too soon redis.lpush(value) return return process_callback(r['callback_url'], r['payload'], r['num_attempts'])
def deque_transaction(bitcoin_rpc, redis, seconds_expire=60*60*24, min_confirmations=5): value = redis.rpop(KEY_CONFIRMATION_QUEUE) if not value: # Nothing to do. return transaction = json.loads(value) # Refresh if isinstance(transaction, list): # FIXME: Backwards compat with old format, remove this soon. transaction = bitcoin_rpc.gettransaction(transaction[0]).__dict__ else: transaction = bitcoin_rpc.gettransaction(transaction['txid']).__dict__ if int(transaction['timereceived']) + seconds_expire < time.time(): # TODO: Log expired transaction. return if int(transaction['confirmations']) < min_confirmations: # Not ready yet redis.lpush(KEY_CONFIRMATION_QUEUE, value) return return process_transaction(bitcoin_rpc, redis, transaction, min_confirmations)