trudy_to_dan = trudy.send_transaction(
    deposit1_utxo, coin['deposit_block'], dan.token_contract.account.address
)
authority.submit_block()
trudy_to_dan_block = authority.get_block_number()
trudy.stop_watching_exits(deposit1_utxo)

# Dan attempts to exit his coin
coin = dan.get_plasma_coin(deposit1_utxo)
dan.start_exit(deposit1_utxo, coin['deposit_block'], trudy_to_dan_block)
authority.submit_block()
dan.watch_exits(deposit1_utxo)
dan.watch_challenges(deposit1_utxo)

# Dan is challenged by Trudy
trudy.challenge_before(deposit1_utxo, 0, coin['deposit_block'])

# Wait for dan to automatically respond to the challenge
time.sleep(2)

# Dan successfully finalizes his exit
w3 = dan.root_chain.w3
increaseTime(w3, 8 * 24 * 3600)
authority.finalize_exits()

dan.withdraw(deposit1_utxo)

danTokensEnd = dan.token_contract.balance_of()
print('dan has {} tokens'.format(danTokensEnd))
assert (
    danTokensEnd == danTokensStart + 1