def test_cancel_transfer(raiden_chain, token, deposit): app0, app1, app2, app3 = raiden_chain # pylint: disable=unbalanced-tuple-unpacking messages = setup_messages_cb() mlogger = MessageLogger() assert_synched_channels(channel(app0, app1, token), deposit, [], channel(app1, app0, token), deposit, []) assert_synched_channels(channel(app1, app2, token), deposit, [], channel(app2, app1, token), deposit, []) assert_synched_channels(channel(app2, app3, token), deposit, [], channel(app3, app2, token), deposit, []) assert_synched_channels(channel(app0, app1, token), deposit, [], channel(app1, app0, token), deposit, []) # drain the channel app1 -> app2 amount12 = 50 direct_transfer(app1, app2, token, amount12, identifier=1) # drain the channel app2 -> app3 amount23 = 80 direct_transfer(app2, app3, token, amount23, identifier=2) assert_synched_channels(channel(app1, app2, token), deposit - amount12, [], channel(app2, app1, token), deposit + amount12, []) assert_synched_channels(channel(app2, app3, token), deposit - amount23, [], channel(app3, app2, token), deposit + amount23, []) # app1 -> app3 is the only available path but app2 -> app3 doesnt have # resources and needs to send a RefundTransfer down the path transfer(app0, app3, token, amount=50, identifier=1) assert_synched_channels(channel(app0, app1, token), deposit, [], channel(app1, app0, token), deposit, []) assert_synched_channels(channel(app1, app2, token), deposit - amount12, [], channel(app2, app1, token), deposit + amount12, []) assert_synched_channels(channel(app2, app3, token), deposit - amount23, [], channel(app3, app2, token), deposit + amount23, []) assert len(unique(messages)) == 12 # DT + DT + SMT + MT + RT + RT + ACKs app1_messages = mlogger.get_node_messages(pex(app1.raiden.address), only='sent') assert isinstance(app1_messages[-1], RefundTransfer) app2_messages = mlogger.get_node_messages(pex(app2.raiden.address), only='sent') assert isinstance(app2_messages[-1], RefundTransfer)
def test_cancel_transfer(): deposit = 100 asset = sha3('test_cancel_transfer')[:20] # pylint: disable=unbalanced-tuple-unpacking app0, app1, app2 = create_sequential_network(num_nodes=3, deposit=deposit, asset=asset) messages = setup_messages_cb() mlogger = MessageLogger() assert_synched_channels( channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, [] ) assert_synched_channels( channel(app1, app2, asset), deposit, [], channel(app2, app1, asset), deposit, [] ) # drain the channel app1 -> app2 amount = 80 direct_transfer(app1, app2, asset, amount) assert_synched_channels( channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, [] ) assert_synched_channels( channel(app1, app2, asset), deposit - amount, [], channel(app2, app1, asset), deposit + amount, [] ) # app1 -> app2 is the only available path and doens't have resource, app1 # needs to send CancelTransfer to app0 transfer(app0, app2, asset, 50) assert_synched_channels( channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, [] ) assert_synched_channels( channel(app1, app2, asset), deposit - amount, [], channel(app2, app1, asset), deposit + amount, [] ) assert len(messages) == 6 # DirectTransfer + MediatedTransfer + CancelTransfer + a Ack for each app1_messages = mlogger.get_node_messages(pex(app1.raiden.address), only='sent') assert isinstance(app1_messages[-1], CancelTransfer)
def test_cancel_transfer(raiden_chain, asset, deposit): app0, app1, app2 = raiden_chain # pylint: disable=unbalanced-tuple-unpacking messages = setup_messages_cb() mlogger = MessageLogger() assert_synched_channels(channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, []) assert_synched_channels(channel(app1, app2, asset), deposit, [], channel(app2, app1, asset), deposit, []) # drain the channel app1 -> app2 amount = 80 direct_transfer(app1, app2, asset, amount) assert_synched_channels(channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, []) assert_synched_channels(channel(app1, app2, asset), deposit - amount, [], channel(app2, app1, asset), deposit + amount, []) # app1 -> app2 is the only available path and doens't have resource, app1 # needs to send RefundTransfer to app0 transfer(app0, app2, asset, 50) assert_synched_channels(channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, []) assert_synched_channels(channel(app1, app2, asset), deposit - amount, [], channel(app2, app1, asset), deposit + amount, []) assert len( messages ) == 6 # DirectTransfer + MediatedTransfer + RefundTransfer + a Ack for each app1_messages = mlogger.get_node_messages(pex(app1.raiden.address), only='sent') assert isinstance(app1_messages[-1], RefundTransfer)
def test_transfer(): apps = create_network(num_nodes=2, num_assets=1, channels_per_node=1) app0, app1 = apps # pylint: disable=unbalanced-tuple-unpacking messages = setup_messages_cb() mlogger = MessageLogger() a0_address = pex(app0.raiden.address) a1_address = pex(app1.raiden.address) asset_manager0 = app0.raiden.assetmanagers.values()[0] asset_manager1 = app1.raiden.assetmanagers.values()[0] channel0 = asset_manager0.channels[app1.raiden.address] channel1 = asset_manager1.channels[app0.raiden.address] balance0 = channel0.our_state.balance balance1 = channel1.our_state.balance assert asset_manager0.asset_address == asset_manager1.asset_address assert app1.raiden.address in asset_manager0.channels amount = 10 app0.raiden.api.transfer( asset_manager0.asset_address, amount, target=app1.raiden.address, ) gevent.sleep(1) assert_synched_channels( channel0, balance0 - amount, [], channel1, balance1 + amount, [] ) assert len(messages) == 2 # DirectTransfer, Ack directtransfer_message = decode(messages[0]) assert isinstance(directtransfer_message, DirectTransfer) assert directtransfer_message.balance == balance1 + amount ack_message = decode(messages[1]) assert isinstance(ack_message, Ack) assert ack_message.echo == directtransfer_message.hash a0_messages = mlogger.get_node_messages(a0_address) assert len(a0_messages) == 2 assert isinstance(a0_messages[0], DirectTransfer) assert isinstance(a0_messages[1], Ack) a0_sent_messages = mlogger.get_node_messages(a0_address, only='sent') assert len(a0_sent_messages) == 1 assert isinstance(a0_sent_messages[0], DirectTransfer) a0_recv_messages = mlogger.get_node_messages(a0_address, only='recv') assert len(a0_recv_messages) == 1 assert isinstance(a0_recv_messages[0], Ack) a1_messages = mlogger.get_node_messages(a1_address) assert len(a1_messages) == 2 assert isinstance(a1_messages[0], Ack) assert isinstance(a1_messages[1], DirectTransfer) a1_sent_messages = mlogger.get_node_messages(a1_address, only='sent') assert len(a1_sent_messages) == 1 assert isinstance(a1_sent_messages[0], Ack) a1_recv_messages = mlogger.get_node_messages(a1_address, only='recv') assert len(a1_recv_messages) == 1 assert isinstance(a1_recv_messages[0], DirectTransfer)
def test_transfer(raiden_network): app0, app1 = raiden_network # pylint: disable=unbalanced-tuple-unpacking messages = setup_messages_cb() mlogger = MessageLogger() a0_address = pex(app0.raiden.address) a1_address = pex(app1.raiden.address) graph0 = app0.raiden.channelgraphs.values()[0] graph1 = app1.raiden.channelgraphs.values()[0] channel0 = graph0.partneraddress_channel[app1.raiden.address] channel1 = graph1.partneraddress_channel[app0.raiden.address] balance0 = channel0.balance balance1 = channel1.balance assert graph0.token_address == graph1.token_address assert app1.raiden.address in graph0.partneraddress_channel amount = 10 target = app1.raiden.address result = app0.raiden.transfer_async( graph0.token_address, amount, target, ) result.wait(timeout=10) gevent.sleep(1) assert_synched_channels( channel0, balance0 - amount, [], channel1, balance1 + amount, [] ) assert len(messages) == 2 # DirectTransfer, Ack directtransfer_message = decode(messages[0]) assert isinstance(directtransfer_message, DirectTransfer) assert directtransfer_message.transferred_amount == amount ack_message = decode(messages[1]) assert isinstance(ack_message, Ack) assert ack_message.echo == sha3(directtransfer_message.encode() + app1.raiden.address) a0_messages = mlogger.get_node_messages(a0_address) assert len(a0_messages) == 2 assert isinstance(a0_messages[0], DirectTransfer) assert isinstance(a0_messages[1], Ack) a0_sent_messages = mlogger.get_node_messages(a0_address, only='sent') assert len(a0_sent_messages) == 1 assert isinstance(a0_sent_messages[0], DirectTransfer) a0_recv_messages = mlogger.get_node_messages(a0_address, only='recv') assert len(a0_recv_messages) == 1 assert isinstance(a0_recv_messages[0], Ack) a1_messages = mlogger.get_node_messages(a1_address) assert len(a1_messages) == 2 assert isinstance(a1_messages[0], Ack) assert isinstance(a1_messages[1], DirectTransfer) a1_sent_messages = mlogger.get_node_messages(a1_address, only='sent') assert len(a1_sent_messages) == 1 assert isinstance(a1_sent_messages[0], Ack) a1_recv_messages = mlogger.get_node_messages(a1_address, only='recv') assert len(a1_recv_messages) == 1 assert isinstance(a1_recv_messages[0], DirectTransfer)
def test_transfer(raiden_network): app0, app1 = raiden_network # pylint: disable=unbalanced-tuple-unpacking messages = setup_messages_cb() mlogger = MessageLogger() a0_address = pex(app0.raiden.address) a1_address = pex(app1.raiden.address) asset_manager0 = app0.raiden.managers_by_asset_address.values()[0] asset_manager1 = app1.raiden.managers_by_asset_address.values()[0] channel0 = asset_manager0.partneraddress_channel[app1.raiden.address] channel1 = asset_manager1.partneraddress_channel[app0.raiden.address] balance0 = channel0.balance balance1 = channel1.balance assert asset_manager0.asset_address == asset_manager1.asset_address assert app1.raiden.address in asset_manager0.partneraddress_channel amount = 10 app0.raiden.api.transfer( asset_manager0.asset_address, amount, target=app1.raiden.address, ) gevent.sleep(1) assert_synched_channels( channel0, balance0 - amount, [], channel1, balance1 + amount, [] ) assert len(messages) == 2 # DirectTransfer, Ack directtransfer_message = decode(messages[0]) assert isinstance(directtransfer_message, DirectTransfer) assert directtransfer_message.transferred_amount == amount ack_message = decode(messages[1]) assert isinstance(ack_message, Ack) assert ack_message.echo == sha3(directtransfer_message.encode() + app1.raiden.address) a0_messages = mlogger.get_node_messages(a0_address) assert len(a0_messages) == 2 assert isinstance(a0_messages[0], DirectTransfer) assert isinstance(a0_messages[1], Ack) a0_sent_messages = mlogger.get_node_messages(a0_address, only='sent') assert len(a0_sent_messages) == 1 assert isinstance(a0_sent_messages[0], DirectTransfer) a0_recv_messages = mlogger.get_node_messages(a0_address, only='recv') assert len(a0_recv_messages) == 1 assert isinstance(a0_recv_messages[0], Ack) a1_messages = mlogger.get_node_messages(a1_address) assert len(a1_messages) == 2 assert isinstance(a1_messages[0], Ack) assert isinstance(a1_messages[1], DirectTransfer) a1_sent_messages = mlogger.get_node_messages(a1_address, only='sent') assert len(a1_sent_messages) == 1 assert isinstance(a1_sent_messages[0], Ack) a1_recv_messages = mlogger.get_node_messages(a1_address, only='recv') assert len(a1_recv_messages) == 1 assert isinstance(a1_recv_messages[0], DirectTransfer)
def test_cancel_transfer(raiden_chain, asset, deposit): app0, app1, app2, app3 = raiden_chain # pylint: disable=unbalanced-tuple-unpacking messages = setup_messages_cb() mlogger = MessageLogger() assert_synched_channels( channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, [] ) assert_synched_channels( channel(app1, app2, asset), deposit, [], channel(app2, app1, asset), deposit, [] ) assert_synched_channels( channel(app2, app3, asset), deposit, [], channel(app3, app2, asset), deposit, [] ) assert_synched_channels( channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, [] ) # drain the channel app1 -> app2 amount12 = 50 direct_transfer(app1, app2, asset, amount12) # drain the channel app2 -> app3 amount23 = 80 direct_transfer(app2, app3, asset, amount23) assert_synched_channels( channel(app1, app2, asset), deposit - amount12, [], channel(app2, app1, asset), deposit + amount12, [] ) assert_synched_channels( channel(app2, app3, asset), deposit - amount23, [], channel(app3, app2, asset), deposit + amount23, [] ) # app1 -> app3 is the only available path but app2 -> app3 doesnt have # resources and needs to send a RefundTransfer down the path transfer(app0, app3, asset, 50) assert_synched_channels( channel(app0, app1, asset), deposit, [], channel(app1, app0, asset), deposit, [] ) assert_synched_channels( channel(app1, app2, asset), deposit - amount12, [], channel(app2, app1, asset), deposit + amount12, [] ) assert_synched_channels( channel(app2, app3, asset), deposit - amount23, [], channel(app3, app2, asset), deposit + amount23, [] ) assert len(messages) == 12 # DT + DT + SMT + MT + RT + RT + ACKs app1_messages = mlogger.get_node_messages(pex(app1.raiden.address), only='sent') assert isinstance(app1_messages[-1], RefundTransfer) app2_messages = mlogger.get_node_messages(pex(app2.raiden.address), only='sent') assert isinstance(app2_messages[-1], RefundTransfer)