# Buggy code
def on_JM_FILL_RESPONSE(self, success, ioauth_data):
    """Receives the entire set of phase 1 data (principally utxos)
    from the counterparties and passes through to the Taker for
    tx construction, if successful. Then passes back the phase 2
    initiating data to the daemon.
    """
    ioauth_data = json.loads(ioauth_data)
    if not success:
        nonresponders = ioauth_data
        jlog.info("Makers didnt respond: " + str(nonresponders))
        self.client.add_ignored_makers(nonresponders)
        return {"accepted": True}
    else:
        jlog.info("Makers responded with: " + json.dumps(ioauth_data))
        retval = self.client.receive_utxos(ioauth_data)
        if not retval[0]:
            jlog.info("Taker is not continuing, phase 2 abandoned.")
            jlog.info("Reason: " + str(retval[1]))
            return {"accepted": False}
        else:
            nick_list, txhex = retval[1:]
            reactor.callLater(0, self.make_tx, nick_list, txhex)
            return {"accepted": True}


# Traceback (exceptions.AttributeError)
2018-07-21 00:03:59,900 [MainThread  ] [INFO ]  Makers didnt respond: [u'J57XBPc4Ub5b3xxO', u'J54nByhefebjZFkB']
2018-07-21 00:21:32,779 [MainThread  ] [INFO ]  STALL MONITOR:
2018-07-21 00:21:32,779 [MainThread  ] [INFO ]  Stall detected. Regenerating transactions and retrying.
Unhandled Error
Traceback (most recent call last):
File "sendpayment.py", line 233, in main
clientfactory, daemon=daemon)
File "/home/alex/Documents/joinmarket-dev/test_ranr-under-max/joinmarket-clientserver/jmvenv/local/lib/python2.7/site-packages/jmclient/client_protocol.py", line 495, in start_reactor
reactor.run(installSignalHandlers=ish)
File "/home/alex/Documents/joinmarket-dev/test_ranr-under-max/joinmarket-clientserver/jmvenv/local/lib/python2.7/site-packages/twisted/internet/base.py", line 1199, in run
self.mainLoop()
File "/home/alex/Documents/joinmarket-dev/test_ranr-under-max/joinmarket-clientserver/jmvenv/local/lib/python2.7/site-packages/twisted/internet/base.py", line 1208, in mainLoop
self.runUntilCurrent()
--- <exception caught here> ---
File "/home/alex/Documents/joinmarket-dev/test_ranr-under-max/joinmarket-clientserver/jmvenv/local/lib/python2.7/site-packages/twisted/internet/base.py", line 828, in runUntilCurrent
call.func(*call.args, **call.kw)
File "/home/alex/Documents/joinmarket-dev/test_ranr-under-max/joinmarket-clientserver/jmvenv/local/lib/python2.7/site-packages/jmclient/client_protocol.py", line 346, in stallMonitor
self.client.on_finished_callback(False, True, 0.0)
File "sendpayment.py", line 189, in taker_finished
"makers didn't respond: ", taker.nonrespondants,
exceptions.AttributeError: 'Taker' object has no attribute 'nonrespondants'

# Fixed code
def on_JM_FILL_RESPONSE(self, success, ioauth_data):
    """Receives the entire set of phase 1 data (principally utxos)
    from the counterparties and passes through to the Taker for
    tx construction. If there were sufficient makers, data is passed
    over for exactly those makers that responded. If not, the list
    of non-responsive makers is added to the permanent "ignored_makers"
    list, but the Taker processing is bypassed and the transaction
    is abandoned here (so will be picked up as stalled in multi-join
    schedules).
    In the first of the above two cases, after the Taker processes
    the ioauth data and returns the proposed
    transaction, passes the phase 2 initiating data to the daemon.
    """
    ioauth_data = json.loads(ioauth_data)
    if not success:
        jlog.info("Makers who didnt respond: " + str(ioauth_data))
        self.client.add_ignored_makers(ioauth_data)
        return {"accepted": True}
    else:
        jlog.info("Makers responded with: " + json.dumps(ioauth_data))
        retval = self.client.receive_utxos(ioauth_data)
        if not retval[0]:
            jlog.info("Taker is not continuing, phase 2 abandoned.")
            jlog.info("Reason: " + str(retval[1]))
            return {"accepted": False}
        else:
            nick_list, txhex = retval[1:]
            reactor.callLater(0, self.make_tx, nick_list, txhex)
            return {"accepted": True}