def test_pfs_rejects_capacity_update_with_wrong_channel_identifier( pathfinding_service_web3_mock, ): pathfinding_service_web3_mock.chain_id = ChainID(1) token_network = TokenNetwork( token_network_address=DEFAULT_TOKEN_NETWORK_ADDRESS) pathfinding_service_web3_mock.token_networks[ token_network.address] = token_network token_network.handle_channel_opened_event( channel_identifier=ChannelID(0), participant1=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), participant2=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), settle_timeout=15, ) # Check that the new channel has id == 0 assert token_network.channel_id_to_addresses[ChannelID(0)] == ( private_key_to_address(PRIVAT_KEY_EXAMPLE_1), private_key_to_address(PRIVAT_KEY_EXAMPLE_2), ) message = get_updatepfs_message( channel_identifier=ChannelID(35), updating_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), other_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), privkey_signer=PRIVAT_KEY_EXAMPLE_1, ) with pytest.raises(InvalidCapacityUpdate) as exinfo: pathfinding_service_web3_mock.on_pfs_update(message) assert "unknown channel identifier in token network" in str(exinfo.value)
def create_token_network_for_address( self, token_network_address: Address, token_address: Address, block_number: int = 0, ): token_network = TokenNetwork(token_network_address, token_address) self.token_networks[token_network_address] = token_network log.debug('Creating token network model', token_network_address=token_network_address) token_network_listener = BlockchainListener( web3=self.web3, contract_manager=self.contract_manager, contract_address=token_network_address, contract_name=CONTRACT_TOKEN_NETWORK, required_confirmations=self.required_confirmations, poll_interval=self.poll_interval, sync_start_block=block_number, ) # subscribe to event notifications from blockchain listener token_network_listener.add_confirmed_listener( create_channel_event_topics(), self.handle_channel_event, ) token_network_listener.start() self.token_network_listeners.append(token_network_listener)
def test_pfs_rejects_capacity_update_with_wrong_nonces( addresses: List[Address], pathfinding_service_mocked_listeners: PathfindingService, ): pathfinding_service_mocked_listeners.chain_id = 1 token_network = TokenNetwork( token_network_address=DEFAULT_TOKEN_NETWORK_ADDRESS, token_address=DEFAULT_TOKEN_ADDRESS, ) pathfinding_service_mocked_listeners.token_networks[ token_network.address] = token_network token_network.handle_channel_opened_event( channel_identifier=ChannelIdentifier(0), participant1=addresses[0], participant2=addresses[1], settle_timeout=15, ) token_network.handle_channel_new_deposit_event( channel_identifier=ChannelIdentifier(0), receiver=addresses[0], total_deposit=100, ) token_network.handle_channel_new_deposit_event( channel_identifier=ChannelIdentifier(0), receiver=addresses[1], total_deposit=100, ) # Check that the new channel has id == 0 assert token_network.channel_id_to_addresses[ChannelIdentifier(0)] == ( addresses[0], addresses[1], ) message = get_updatepfs_message( updating_participant=addresses[0], other_participant=addresses[1], ) # Check first capacity update succeeded pathfinding_service_mocked_listeners.on_pfs_update(message) view_to_partner, view_from_partner = token_network.get_channel_views_for_partner( channel_identifier=ChannelIdentifier(0), updating_participant=addresses[0], other_participant=addresses[1], ) assert view_to_partner.capacity == 90 assert view_to_partner.update_nonce == 1 assert view_from_partner.capacity == 110 assert view_from_partner.update_nonce == 0 # Send the same Capacity Update again - leads to an exception with pytest.raises(InvalidCapacityUpdate) as exinfo: pathfinding_service_mocked_listeners.on_pfs_update(message) assert 'Capacity Update already received' in str(exinfo.value)
def handle_token_network_created(self, event: ReceiveTokenNetworkCreatedEvent) -> None: network_address = TokenNetworkAddress(event.token_network_address) if not self.follows_token_network(network_address): log.info("Found new token network", **asdict(event)) self.token_networks[network_address] = TokenNetwork(network_address) self.database.upsert_token_network(network_address)
def test_pfs_rejects_capacity_update_with_wrong_nonces( pathfinding_service_web3_mock, ): pathfinding_service_web3_mock.chain_id = ChainID(1) token_network = TokenNetwork( token_network_address=DEFAULT_TOKEN_NETWORK_ADDRESS) pathfinding_service_web3_mock.token_networks[ token_network.address] = token_network token_network.handle_channel_opened_event( channel_identifier=ChannelID(0), participant1=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), participant2=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), settle_timeout=15, ) token_network.handle_channel_new_deposit_event( channel_identifier=ChannelID(0), receiver=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), total_deposit=100, ) token_network.handle_channel_new_deposit_event( channel_identifier=ChannelID(0), receiver=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), total_deposit=100, ) # Check that the new channel has id == 0 assert token_network.channel_id_to_addresses[ChannelID(0)] == ( private_key_to_address(PRIVAT_KEY_EXAMPLE_1), private_key_to_address(PRIVAT_KEY_EXAMPLE_2), ) message = get_updatepfs_message( updating_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), other_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), privkey_signer=PRIVAT_KEY_EXAMPLE_1, ) # Check first capacity update succeeded pathfinding_service_web3_mock.on_pfs_update(message) view_to_partner, view_from_partner = token_network.get_channel_views_for_partner( channel_identifier=ChannelID(0), updating_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), other_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), ) assert view_to_partner.capacity == 90 assert view_to_partner.update_nonce == 1 assert view_from_partner.capacity == 110 assert view_from_partner.update_nonce == 0 # Send the same Capacity Update again - leads to an exception with pytest.raises(InvalidCapacityUpdate) as exinfo: pathfinding_service_web3_mock.on_pfs_update(message) assert "Capacity Update already received" in str(exinfo.value)
def handle_token_network_created( self, event: ReceiveTokenNetworkCreatedEvent) -> None: network_address = event.token_network_address settle_timeout = event.settle_timeout if not self.follows_token_network(network_address): log.info("Found new token network", event_=event) self.token_networks[network_address] = TokenNetwork( network_address, settle_timeout) self.database.upsert_token_network(network_address, settle_timeout)
def test_pfs_rejects_capacity_update_with_impossible_updating_capacity( pathfinding_service_web3_mock, ): pathfinding_service_web3_mock.chain_id = ChainID(1) token_network = TokenNetwork( token_network_address=DEFAULT_TOKEN_NETWORK_ADDRESS) pathfinding_service_web3_mock.token_networks[ token_network.address] = token_network token_network.handle_channel_opened_event( channel_identifier=ChannelID(0), participant1=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), participant2=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), settle_timeout=15, ) token_network.handle_channel_new_deposit_event( channel_identifier=ChannelID(0), receiver=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), total_deposit=100, ) token_network.handle_channel_new_deposit_event( channel_identifier=ChannelID(0), receiver=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), total_deposit=100, ) # Check that the new channel has id == 0 assert token_network.channel_id_to_addresses[ChannelID(0)] == ( private_key_to_address(PRIVAT_KEY_EXAMPLE_1), private_key_to_address(PRIVAT_KEY_EXAMPLE_2), ) with patch( "pathfinding_service.service.recover_signer_from_capacity_update", private_key_to_address(PRIVAT_KEY_EXAMPLE_1), ): message = get_updatepfs_message( updating_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), other_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), updating_capacity=TokenAmount(UINT256_MAX), privkey_signer=PRIVAT_KEY_EXAMPLE_1, ) message.updating_capacity = TokenAmount(UINT256_MAX + 1) with pytest.raises(InvalidCapacityUpdate) as exinfo: pathfinding_service_web3_mock.on_pfs_update(message) assert "with impossible updating_capacity" in str(exinfo.value)
def test_pfs_rejects_capacity_update_with_wrong_other_participant( addresses: List[Address], pathfinding_service_mocked_listeners: PathfindingService, ): pathfinding_service_mocked_listeners.chain_id = 1 token_network = TokenNetwork( token_network_address=DEFAULT_TOKEN_NETWORK_ADDRESS, token_address=DEFAULT_TOKEN_ADDRESS, ) pathfinding_service_mocked_listeners.token_networks[ token_network.address] = token_network token_network.handle_channel_opened_event( channel_identifier=ChannelIdentifier(0), participant1=addresses[0], participant2=addresses[1], settle_timeout=15, ) token_network.handle_channel_new_deposit_event( channel_identifier=ChannelIdentifier(0), receiver=addresses[0], total_deposit=100, ) token_network.handle_channel_new_deposit_event( channel_identifier=ChannelIdentifier(0), receiver=addresses[1], total_deposit=100, ) # Check that the new channel has id == 0 assert token_network.channel_id_to_addresses[ChannelIdentifier(0)] == ( addresses[0], addresses[1], ) message = get_updatepfs_message( updating_participant=addresses[0], other_participant=addresses[2], ) with pytest.raises(InvalidCapacityUpdate) as exinfo: pathfinding_service_mocked_listeners.on_pfs_update(message) assert 'Other Participant of Capacity Update does not match' in str( exinfo.value)
def setup_channel(service: PathfindingService) -> TokenNetwork: token_network = TokenNetwork(token_network_address=DEFAULT_TOKEN_NETWORK_ADDRESS) service.token_networks[token_network.address] = token_network token_network.handle_channel_opened_event( channel_identifier=DEFAULT_CHANNEL_ID, participant1=PRIVATE_KEY_1_ADDRESS, participant2=PRIVATE_KEY_2_ADDRESS, settle_timeout=15, ) # Check that the new channel has id == 0 assert token_network.channel_id_to_addresses[DEFAULT_CHANNEL_ID] == ( PRIVATE_KEY_1_ADDRESS, PRIVATE_KEY_2_ADDRESS, ) return token_network
def test_pfs_rejects_capacity_update_with_wrong_token_network_address( pathfinding_service_web3_mock, ): pathfinding_service_web3_mock.chain_id = ChainID(1) token_network = TokenNetwork( token_network_address=DEFAULT_TOKEN_NETWORK_ADDRESS) pathfinding_service_web3_mock.token_networks[ token_network.address] = token_network message = get_updatepfs_message( token_network_address=TokenNetworkAddressBytes( decode_hex("0x" + "1" * 40)), updating_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_1), other_participant=private_key_to_address(PRIVAT_KEY_EXAMPLE_2), privkey_signer=PRIVAT_KEY_EXAMPLE_1, ) with pytest.raises(InvalidCapacityUpdate) as exinfo: pathfinding_service_web3_mock.on_pfs_update(message) assert "unknown token network" in str(exinfo.value)
def test_pfs_rejects_capacity_update_with_wrong_token_network_address( addresses: List[Address], pathfinding_service_mocked_listeners: PathfindingService, ): pathfinding_service_mocked_listeners.chain_id = 1 token_network = TokenNetwork( token_network_address=DEFAULT_TOKEN_NETWORK_ADDRESS, token_address=DEFAULT_TOKEN_ADDRESS, ) pathfinding_service_mocked_listeners.token_networks[ token_network.address] = token_network message = get_updatepfs_message( token_network_address=TokenNetworkAddress(decode_hex('0x' + '1' * 40)), updating_participant=addresses[0], other_participant=addresses[1], ) with pytest.raises(InvalidCapacityUpdate) as exinfo: pathfinding_service_mocked_listeners.on_pfs_update(message) assert 'unknown token network' in str(exinfo.value)