Example #1
0
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
Example #2
0
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'])
Example #3
0
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)