From a4b3d4d4e2c4c6e1d4a79f24b85a3ee731d21589 Mon Sep 17 00:00:00 2001
From: Ulrich Petri <ulo@ulo.pe>
Date: Wed, 5 Aug 2020 10:46:48 +0200
Subject: [PATCH] Upgrade Synapse to 1.19.1

This upgrades the Synapse requirement to 1.19.1 and fixes all backwards
incompatibilities that have been introduced.

This is mainly related to the [alias semantics change (MSC2432)](https://github.com/matrix-org/matrix-doc/pull/2432).

(cherry picked from commit 14164ecb3f0ba53de5dee51893d49258d6430827)
---
 raiden/network/transport/matrix/client.py     | 54 +++++++----
 raiden/network/transport/matrix/transport.py  | 20 ++--
 raiden/network/transport/matrix/utils.py      |  2 +-
 raiden/network/transport/utils.py             |  2 +-
 .../test_matrix_transport_assumptions.py      |  8 +-
 raiden/tests/utils/transport.py               | 93 ++++++++++---------
 requirements/requirements-ci.txt              | 72 +++++++-------
 requirements/requirements-dev.in              |  2 +-
 requirements/requirements-dev.txt             | 84 +++++++++--------
 requirements/requirements.txt                 | 47 +++++-----
 10 files changed, 210 insertions(+), 174 deletions(-)

diff --git a/raiden/network/transport/matrix/client.py b/raiden/network/transport/matrix/client.py
index 9a4deb1e32..d12e363599 100644
--- a/raiden/network/transport/matrix/client.py
+++ b/raiden/network/transport/matrix/client.py
@@ -4,7 +4,7 @@
 from functools import wraps
 from itertools import repeat
 from typing import Any, Callable, Container, Dict, Iterable, Iterator, List, Optional, Tuple
-from urllib.parse import quote, urlparse
+from urllib.parse import quote
 from uuid import UUID, uuid4
 
 import gevent
@@ -54,6 +54,7 @@ def __init__(self, client: "GMatrixClient", room_id: str) -> None:
         super().__init__(client, room_id)
         self._members: Dict[str, User] = {}
         self.aliases: List[str]
+        self.canonical_alias: str
 
     def get_joined_members(self, force_resync: bool = False) -> List[User]:
         """ Return a list of members of this room. """
@@ -81,38 +82,39 @@ def _rmmembers(self, user_id: str) -> None:
         self._members.pop(user_id, None)
 
     def __repr__(self) -> str:
-        return f"<Room id={self.room_id!r} aliases={self.aliases!r}>"
+        return f"<Room id={self.room_id!r} canonical_alias={self.canonical_alias!r}>"
 
-    def update_local_aliases(self) -> bool:
-        """ Fetch server local aliases for the room.
+    def update_local_alias(self) -> bool:
+        """ Fetch the server local canonical alias for the room.
 
         This is an optimization over the general `update_aliases()` method which fetches the
         entire room state (which can be large in Raiden) and then discards all non-alias events.
 
-        Unfortunately due to a limitation in the Matrix API it's not possible to query for all
-        aliases of a room. Only aliases for a specific server can be fetched, see:
-        https://github.com/matrix-org/synapse/issues/6908
+        With MSC2432[1] implemented only ``m.room.canonical_alias`` events exist.
+        They represent the server local canonical_alias.
 
-        Since in Raiden we always have server local aliases set, this method is sufficient for our
-        use case.
+        Since in Raiden broadcast rooms always have a server local alias set, this method is
+        sufficient for our use case.
+
+        [1] https://github.com/matrix-org/matrix-doc/pull/2432
 
         Returns:
-            boolean: True if the aliases changed, False if not
+            boolean: True if the canonical_alias changed, False if not
         """
-        server_name = urlparse(self.client.api.base_url).netloc
         changed = False
 
         try:
             response = self.client.api.get_room_state_type(
-                self.room_id, "m.room.aliases", server_name
+                self.room_id, "m.room.canonical_alias", ""
             )
         except MatrixRequestError:
             return False
 
-        if "aliases" in response:
-            if self.aliases != response["aliases"]:
-                self.aliases = response["aliases"]
-                changed = True
+        server_sent_alias = response.get("alias")
+        if server_sent_alias is not None and self.canonical_alias != server_sent_alias:
+            self.canonical_alias = server_sent_alias
+            changed = True
+
         return changed
 
 
@@ -227,6 +229,22 @@ def create_room(
     def get_presence(self, user_id: str) -> Dict[str, Any]:
         return self._send("GET", f"/presence/{quote(user_id)}/status")
 
+    def get_aliases(self, room_id: str) -> Dict[str, Any]:
+        """
+        Perform GET /rooms/{room_id}/aliases.
+
+        Requires Synapse >= 1.11.0 which implements the (as of yet) unstable MSC2432 room alias
+        semantics change.
+        """
+        return self._send(
+            "GET",
+            f"/rooms/{room_id}/aliases",
+            api_path="/_matrix/client/unstable/org.matrix.msc2432",
+        )
+
+    def __repr__(self) -> str:
+        return f"<GMatrixHttpApi base_url={self.base_url}>"
+
 
 class GMatrixClient(MatrixClient):
     """ Gevent-compliant MatrixClient subclass """
@@ -527,8 +545,8 @@ def _mkroom(self, room_id: str) -> Room:
         if room_id not in self.rooms:
             self.rooms[room_id] = Room(self, room_id)
         room = self.rooms[room_id]
-        if not room.aliases:
-            room.update_local_aliases()
+        if not room.canonical_alias:
+            room.update_local_alias()
         return room
 
     def get_user_presence(self, user_id: str) -> Optional[str]:
diff --git a/raiden/network/transport/matrix/transport.py b/raiden/network/transport/matrix/transport.py
index 19e319c73d..904e1af559 100644
--- a/raiden/network/transport/matrix/transport.py
+++ b/raiden/network/transport/matrix/transport.py
@@ -810,7 +810,10 @@ def _initialize_first_sync(self) -> None:
                 self._set_room_id_for_address(partner_address[0], room.room_id)
 
             self.log.debug(
-                "Found room", room=room, aliases=room.aliases, members=room.get_joined_members()
+                "Found room",
+                room=room,
+                canonical_alias=room.canonical_alias,
+                members=room.get_joined_members(),
             )
 
     def _leave_unexpected_rooms(
@@ -829,7 +832,7 @@ def to_string_representation(partner: Optional[Address]) -> str:
             self.log.warning(
                 "Leaving Room",
                 reason=reason,
-                room_aliases=room.aliases,
+                canonical_alias=room.canonical_alias,
                 room_id=room.room_id,
                 partners=[to_string_representation(partner) for partner in partners],
             )
@@ -1046,7 +1049,7 @@ def _handle_invite(self, room_id: RoomID, state: dict) -> None:
         self.log.debug(
             "Joined from invite",
             room_id=room_id,
-            aliases=room.aliases,
+            canonical_alias=room.canonical_alias,
             inviting_address=to_checksum_address(peer_address),
         )
 
@@ -1057,7 +1060,7 @@ def _handle_invite(self, room_id: RoomID, state: dict) -> None:
     def _handle_member_join(self, room: Room) -> None:
         if self._is_broadcast_room(room):
             raise AssertionError(
-                f"Broadcast room events should be filtered in syncs: {room.aliases}."
+                f"Broadcast room events should be filtered in syncs: {room.canonical_alias}."
                 f"Joined Broadcast Rooms: {list(self._broadcast_rooms.keys())}"
                 f"Should be joined to: {self._config.broadcast_rooms}"
             )
@@ -1104,7 +1107,7 @@ def _handle_text(self, room: Room, message: MatrixMessage) -> List[Message]:
         if self._is_broadcast_room(room):
             # This must not happen. Nodes must not listen on broadcast rooms.
             raise RuntimeError(
-                f"Received message in broadcast room {room.aliases[0]}. Sending user: {user}"
+                f"Received message in broadcast room {room.canonical_alias}. Sending user: {user}"
             )
 
         if not self._address_mgr.is_address_known(peer_address):
@@ -1366,10 +1369,9 @@ def partner_joined(fetched_members: Optional[List[User]]) -> bool:
             return room
 
     def _is_broadcast_room(self, room: Room) -> bool:
-        return any(
-            suffix in room_alias
-            for suffix in self._config.broadcast_rooms
-            for room_alias in room.aliases
+        has_alias = room.canonical_alias is not None
+        return has_alias and any(
+            suffix in room.canonical_alias for suffix in self._config.broadcast_rooms
         )
 
     def _user_presence_changed(self, user: User, _presence: UserPresence) -> None:
diff --git a/raiden/network/transport/matrix/utils.py b/raiden/network/transport/matrix/utils.py
index 7945e86d89..28d58b7193 100644
--- a/raiden/network/transport/matrix/utils.py
+++ b/raiden/network/transport/matrix/utils.py
@@ -648,7 +648,7 @@ def first_login(client: GMatrixClient, signer: Signer, username: str, cap_str: s
 
     # Disabling sync because login is done before the transport is fully
     # initialized, i.e. the inventory rooms don't have the callbacks installed.
-    client.login(username, password, sync=False)
+    client.login(username, password, sync=False, device_id="raiden")
 
     # Because this is the first login, the display name has to be set, this
     # prevents the impersonation metioned above. subsequent calls will reuse
diff --git a/raiden/network/transport/utils.py b/raiden/network/transport/utils.py
index 84777978df..fe5548b081 100644
--- a/raiden/network/transport/utils.py
+++ b/raiden/network/transport/utils.py
@@ -1,4 +1,4 @@
-from raiden.utils.typing import Iterator
+from typing import Iterator
 
 
 def timeout_exponential_backoff(retries: int, timeout: float, maximum: float) -> Iterator[float]:
diff --git a/raiden/tests/integration/network/transport/test_matrix_transport_assumptions.py b/raiden/tests/integration/network/transport/test_matrix_transport_assumptions.py
index b692ffa1ea..50b51bdda3 100644
--- a/raiden/tests/integration/network/transport/test_matrix_transport_assumptions.py
+++ b/raiden/tests/integration/network/transport/test_matrix_transport_assumptions.py
@@ -170,8 +170,8 @@ def test_assumption_user_goes_offline_if_sync_is_not_called_within_35s(local_mat
     assert len(tracker3.address_presence) == 0, msg_no_sync
 
     room: Room = client1.create_room("test", is_public=True)
-    client2.join_room(room.aliases[0])
-    client3.join_room(room.aliases[0])
+    client2.join_room(room.canonical_alias)
+    client3.join_room(room.canonical_alias)
 
     client1.blocking_sync(timeout_ms=SHORT_TIMEOUT_MS, latency_ms=SHORT_TIMEOUT_MS)
     client2.blocking_sync(timeout_ms=SHORT_TIMEOUT_MS, latency_ms=SHORT_TIMEOUT_MS)
@@ -224,7 +224,7 @@ def test_assumption_user_is_online_while_sync_is_blocking(local_matrix_servers):
     client2.add_presence_listener(tracker2.presence_listener)
 
     room: Room = client1.create_room("test", is_public=True)
-    client2.join_room(room.aliases[0])
+    client2.join_room(room.canonical_alias)
 
     client2.blocking_sync(timeout_ms=SHORT_TIMEOUT_MS, latency_ms=SHORT_TIMEOUT_MS)
     client1.blocking_sync(timeout_ms=SHORT_TIMEOUT_MS, latency_ms=SHORT_TIMEOUT_MS)
@@ -312,7 +312,7 @@ def test_assumption_cannot_override_room_alias(local_matrix_servers):
     for local_server in local_matrix_servers[1:]:
         client = new_client(ignore_messages, ignore_member_join, local_server)
         assert public_room.room_id not in client.rooms
-        client.join_room(public_room.aliases[0])
+        client.join_room(public_room.canonical_alias)
         assert public_room.room_id in client.rooms
 
         alias_on_current_server = f"#{room_alias_prefix}:{local_server.netloc}"
diff --git a/raiden/tests/utils/transport.py b/raiden/tests/utils/transport.py
index 92e7a87c34..61b1857015 100644
--- a/raiden/tests/utils/transport.py
+++ b/raiden/tests/utils/transport.py
@@ -1,3 +1,4 @@
+import json
 import logging
 import os
 import re
@@ -6,7 +7,7 @@
 from collections import defaultdict
 from contextlib import ExitStack, contextmanager
 from datetime import datetime
-from itertools import chain
+from json.decoder import JSONDecodeError
 from pathlib import Path
 from subprocess import DEVNULL, STDOUT
 from tempfile import mkdtemp
@@ -20,7 +21,6 @@
 from requests.packages.urllib3.exceptions import InsecureRequestWarning
 from structlog import get_logger
 from synapse.handlers.auth import AuthHandler
-from twisted.internet import defer
 
 from raiden.constants import Environment
 from raiden.messages.abstract import Message
@@ -31,7 +31,8 @@
 from raiden.transfer.identifiers import QueueIdentifier
 from raiden.utils.http import EXECUTOR_IO, HTTPExecutor
 from raiden.utils.signer import recover
-from raiden.utils.typing import Iterable, Port, Signature
+from raiden.utils.typing import Iterable, Port
+from raiden_contracts.utils.type_aliases import Signature
 
 log = get_logger(__name__)
 
@@ -94,22 +95,15 @@ def setup_broadcast_room(servers: List["ParsedURL"], broadcast_room_name: str) -
         client = new_client(ignore_messages, ignore_member_join, server)
 
         # A user must join the room to create the room in the federated server
-        room = client.join_room(room.aliases[0])
+        room = client.join_room(room.canonical_alias)
 
-        # Since #5892 `join_room()` only populates server-local aliases but we need all here
-        room.update_aliases()
         server_name = server.netloc
         alias = f"#{broadcast_room_name}:{server_name}"
 
         msg = "Setting up the room alias must not fail, otherwise the test can not run."
         assert room.add_room_alias(alias), msg
 
-        room_state = client.api.get_room_state(room.room_id)
-        all_aliases = chain.from_iterable(
-            event["content"]["aliases"]
-            for event in room_state
-            if event["type"] == "m.room.aliases"
-        )
+        all_aliases = client.api.get_aliases(room.room_id).get("aliases", [])
 
         msg = "The new alias must be added, otherwise the Raiden node won't be able to find it."
         assert alias in all_aliases, msg
@@ -145,59 +139,68 @@ def __getattr__(self, item):
 class AdminUserAuthProvider:
     __version__ = "0.1"
 
-    def __init__(self, config, account_handler):
+    def __init__(self, config, account_handler) -> None:  # type: ignore
         self.account_handler = account_handler
         self.log = logging.getLogger(__name__)
-        self.credentials = config["admin_credentials"]
+        if "credentials_file" in config:
+            credentials_file = Path(config["credentials_file"])
+            if not credentials_file.exists():
+                raise AssertionError(f"Credentials file '{credentials_file}' is missing.")
+            try:
+                self.credentials = json.loads(credentials_file.read_text())
+            except (JSONDecodeError, UnicodeDecodeError, OSError) as ex:
+                raise AssertionError(
+                    f"Could not read credentials file '{credentials_file}': {ex}"
+                ) from ex
+        elif "admin_credentials" in config:
+            self.credentials = config["admin_credentials"]
+        else:
+            raise AssertionError(
+                "Either 'credentials_file' or 'admin_credentials' must be specified in "
+                "auth provider config."
+            )
 
         msg = "Keys 'username' and 'password' expected in credentials."
         assert "username" in self.credentials, msg
         assert "password" in self.credentials, msg
 
-    @defer.inlineCallbacks
-    def check_password(self, user_id: str, password: str):
+    async def check_password(self, user_id: str, password: str) -> bool:
         if not password:
             self.log.error("No password provided, user=%r", user_id)
-            defer.returnValue(False)
+            return False
 
         username = user_id.partition(":")[0].strip("@")
         if username == self.credentials["username"] and password == self.credentials["password"]:
             self.log.info("Logging in well known admin user")
-            user_exists = yield self.account_handler.check_user_exists(user_id)
+            user_exists = await self.account_handler.check_user_exists(user_id)
             if not user_exists:
                 self.log.info("First well known admin user login, registering: user=%r", user_id)
-                user_id = yield self.account_handler._hs.get_registration_handler().register_user(
+                await self.account_handler._hs.get_registration_handler().register_user(
                     localpart=username, admin=True
                 )
-                _, access_token = yield self.account_handler.register_device(user_id)
-                yield user_id, access_token
-            defer.returnValue(True)
-
-        self.log.error("Unknown user '%s', ignoring.", user_id)
-        defer.returnValue(False)
+            return True
+        return False
 
     @staticmethod
-    def parse_config(config):
+    def parse_config(config: Any) -> Any:
         return config
 
 
-# Used from within synapse during tests
 class EthAuthProvider:
     __version__ = "0.1"
     _user_re = re.compile(r"^@(0x[0-9a-f]{40}):(.+)$")
     _password_re = re.compile(r"^0x[0-9a-f]{130}$")
 
-    def __init__(self, config, account_handler):
+    def __init__(self, config, account_handler) -> None:  # type: ignore
         self.account_handler = account_handler
         self.config = config
         self.hs_hostname = self.account_handler._hs.hostname
         self.log = logging.getLogger(__name__)
 
-    @defer.inlineCallbacks
-    def check_password(self, user_id, password):
+    async def check_password(self, user_id: str, password: str) -> bool:
         if not password:
             self.log.error("no password provided, user=%r", user_id)
-            defer.returnValue(False)
+            return False
 
         if not self._password_re.match(password):
             self.log.error(
@@ -205,7 +208,7 @@ def check_password(self, user_id, password):
                 "lowercase, 65-bytes hash. user=%r",
                 user_id,
             )
-            defer.returnValue(False)
+            return False
 
         signature = Signature(unhexlify(password[2:]))
 
@@ -216,7 +219,7 @@ def check_password(self, user_id, password):
                 "lowercase address. user=%r",
                 user_id,
             )
-            defer.returnValue(False)
+            return False
 
         user_addr_hex = user_match.group(1)
         user_addr = unhexlify(user_addr_hex[2:])
@@ -226,19 +229,20 @@ def check_password(self, user_id, password):
             self.log.error(
                 "invalid account password/signature. user=%r, signer=%r", user_id, rec_addr
             )
-            defer.returnValue(False)
+            return False
 
         localpart = user_id.split(":", 1)[0][1:]
         self.log.info("eth login! valid signature. user=%r", user_id)
 
-        if not (yield self.account_handler.check_user_exists(user_id)):
-            self.log.info("first user login, registering: user=%r", user_id)
-            yield self.account_handler.register(localpart=localpart)
+        if not (await self.account_handler.check_user_exists(user_id)):
+            self.log.info("First login, creating new user: user=%r", user_id)
+            registered_user_id = await self.account_handler.register_user(localpart=localpart)
+            await self.account_handler.register_device(registered_user_id, device_id="raiden")
 
-        defer.returnValue(True)
+        return True
 
     @staticmethod
-    def parse_config(config):
+    def parse_config(config: Any) -> Any:
         return config
 
 
@@ -248,10 +252,11 @@ class NoTLSFederationMonkeyPatchProvider:
 
     This is used by the integration tests to avoid the need for tls certificates.
     It's implemented as an auth provider since that's a handy way to inject code into the
-    synapse process.
+    Synapse process.
 
-    It works by replacing ``synapse.crypto.context_factory.ClientTLSOptionsFactory`` with an
-    object that returns ``None`` when instantiated.
+    It works by replacing ``synapse.crypto.context_factory.FederationPolicyForHTTPS`` with an
+    object that returns ``None`` when instantiated which causes a non-TLS socket to be used
+    inside the Synapse federation machinery.
     """
 
     __version__ = "0.1"
@@ -267,7 +272,7 @@ def __init__(  # pylint: disable=unused-argument
     ) -> None:
         pass
 
-    def check_password(  # pylint: disable=unused-argument,no-self-use
+    async def check_password(  # pylint: disable=unused-argument,no-self-use
         self, user_id: str, password: str
     ) -> bool:
         return False
@@ -276,7 +281,7 @@ def check_password(  # pylint: disable=unused-argument,no-self-use
     def parse_config(config: Dict[str, Any]) -> Dict[str, Any]:
         from synapse.crypto import context_factory
 
-        context_factory.ClientTLSOptionsFactory = NoTLSFederationMonkeyPatchProvider.NoTLSFactory
+        context_factory.FederationPolicyForHTTPS = NoTLSFederationMonkeyPatchProvider.NoTLSFactory
         return config
 
 
diff --git a/requirements/requirements-ci.txt b/requirements/requirements-ci.txt
index cf04088422..eff8948890 100644
--- a/requirements/requirements-ci.txt
+++ b/requirements/requirements-ci.txt
@@ -4,16 +4,20 @@
 #
 #    'requirements/deps compile' (for details see requirements/README)
 #
+aioice==0.6.18            # via -r requirements-dev.txt, aiortc
+aiortc==0.9.28            # via -r requirements-dev.txt
 alabaster==0.7.12         # via -r requirements-dev.txt, sphinx
 altgraph==0.16.1          # via macholib, pyinstaller
 aniso8601==7.0.0          # via -r requirements-dev.txt, flask-restful
 apipkg==1.5               # via -r requirements-dev.txt, execnet
 appdirs==1.4.3            # via -r requirements-dev.txt, black
+appnope==0.1.0            # via -r requirements-dev.txt, ipython
 asn1crypto==1.3.0         # via -r requirements-dev.txt, coincurve
 astroid==2.4.2            # via -r requirements-dev.txt, pylint
 astunparse==1.6.2         # via -r requirements-dev.txt, sphinxcontrib-httpexample
 attrs==19.3.0             # via -r requirements-dev.txt, automat, black, flake8-bugbear, hypothesis, jsonschema, matrix-synapse, pytest, service-identity, treq, twisted
 automat==0.7.0            # via -r requirements-dev.txt, twisted
+av==8.0.2                 # via -r requirements-dev.txt, aiortc
 babel==2.7.0              # via -r requirements-dev.txt, sphinx
 backcall==0.1.0           # via -r requirements-dev.txt, ipython
 base58==2.0.0             # via -r requirements-dev.txt, multiaddr
@@ -23,29 +27,29 @@ black==19.10b0            # via -r requirements-dev.txt
 bleach==3.1.4             # via -r requirements-dev.txt, matrix-synapse, readme-renderer
 bump2version==1.0.0       # via -r requirements-dev.txt
 cachetools==4.1.1         # via -r requirements-dev.txt
-canonicaljson==1.1.4      # via -r requirements-dev.txt, matrix-synapse, signedjson
+canonicaljson==1.4.0      # via -r requirements-dev.txt, matrix-synapse, signedjson
 certifi==2019.3.9         # via -r requirements-dev.txt, requests
-cffi==1.12.3              # via -r requirements-dev.txt, bcrypt, coincurve, cryptography, pynacl
+cffi==1.12.3              # via -r requirements-dev.txt, aiortc, bcrypt, coincurve, cryptography, pylibsrtp, pynacl
 chardet==3.0.4            # via -r requirements-dev.txt, requests
 click==7.0                # via -r requirements-dev.txt, black, flask, pip-tools, raiden-contracts
 coincurve==13.0.0         # via -r requirements-dev.txt, raiden-contracts
 colorama==0.4.3           # via -r requirements-dev.txt
 colour==0.1.5             # via -r requirements-dev.txt
 constantly==15.1.0        # via -r requirements-dev.txt, twisted
-coverage==5.2             # via -r requirements-dev.txt
-cryptography==2.8         # via -r requirements-dev.txt, pyopenssl, service-identity
+coverage==5.3             # via -r requirements-dev.txt
+crc32c==2.0               # via -r requirements-dev.txt, aiortc
+cryptography==2.9.2       # via -r requirements-dev.txt, aiortc, pyopenssl, service-identity
 cytoolz==0.10.1           # via -r requirements-dev.txt, eth-keyfile, eth-utils
-daemonize==2.5.0          # via -r requirements-dev.txt, matrix-synapse
 decorator==4.4.0          # via -r requirements-dev.txt, ipython, networkx, traitlets
 docutils==0.14            # via -r requirements-dev.txt, readme-renderer, sphinx, sphinxcontrib-httpexample
 eth-abi==2.1.0            # via -r requirements-dev.txt, eth-account, raiden-contracts, web3
-eth-account==0.5.2        # via -r requirements-dev.txt, web3
+eth-account==0.5.3        # via -r requirements-dev.txt, web3
 eth-hash[pycryptodome]==0.2.0  # via -r requirements-dev.txt, eth-utils, web3
 eth-keyfile==0.5.1        # via -r requirements-dev.txt, eth-account
 eth-keys==0.3.3           # via -r requirements-dev.txt, eth-account, eth-keyfile
 eth-rlp==0.1.2            # via -r requirements-dev.txt, eth-account
 eth-typing==2.2.1         # via -r requirements-dev.txt, eth-abi, eth-keys, eth-utils, raiden-contracts, web3
-eth-utils==1.9.0          # via -r requirements-dev.txt, eth-abi, eth-account, eth-keyfile, eth-keys, eth-rlp, hexbytes, raiden-contracts, rlp, web3
+eth-utils==1.9.5          # via -r requirements-dev.txt, eth-abi, eth-account, eth-keyfile, eth-keys, eth-rlp, hexbytes, raiden-contracts, rlp, web3
 execnet==1.6.0            # via -r requirements-dev.txt, pytest-xdist
 fancycompleter==0.8       # via -r requirements-dev.txt, pdbpp
 filelock==3.0.12          # via -r requirements-dev.txt
@@ -54,7 +58,7 @@ flake8-comprehensions==3.2.3  # via -r requirements-dev.txt
 flake8-tuple==0.4.1       # via -r requirements-dev.txt
 flake8==3.8.3             # via -r requirements-dev.txt, flake8-bugbear, flake8-comprehensions, flake8-tuple
 flaky==3.7.0              # via -r requirements-dev.txt
-flask-cors==3.0.8         # via -r requirements-dev.txt
+flask-cors==3.0.9         # via -r requirements-dev.txt
 flask-restful==0.3.8      # via -r requirements-dev.txt
 flask==1.1.2              # via -r requirements-dev.txt, flask-cors, flask-restful
 frozendict==1.2           # via -r requirements-dev.txt, canonicaljson, matrix-synapse
@@ -65,29 +69,30 @@ grequests==0.6.0          # via -r requirements-dev.txt
 guppy3==3.0.10.post1      # via -r requirements-dev.txt
 hexbytes==0.2.0           # via -r requirements-dev.txt, eth-account, eth-rlp, web3
 hyperlink==19.0.0         # via -r requirements-dev.txt, twisted
-hypothesis==5.19.2        # via -r requirements-dev.txt
+hypothesis==5.35.2        # via -r requirements-dev.txt
 idna==2.8                 # via -r requirements-dev.txt, hyperlink, matrix-synapse, requests, twisted
 imagesize==1.1.0          # via -r requirements-dev.txt, sphinx
-importlib-metadata==1.6.1  # via -r requirements-dev.txt, pluggy
+importlib-metadata==1.7.0  # via -r requirements-dev.txt, flake8, flake8-comprehensions, jsonschema, pluggy, pytest
 incremental==17.5.0       # via -r requirements-dev.txt, treq, twisted
-ipfshttpclient==0.4.12    # via -r requirements-dev.txt, web3
+iniconfig==1.0.1          # via -r requirements-dev.txt, pytest
+ipfshttpclient==0.6.0.post1  # via -r requirements-dev.txt, web3
 ipython-genutils==0.2.0   # via -r requirements-dev.txt, traitlets
-ipython==7.16.1           # via -r requirements-dev.txt
-isort==4.3.21             # via -r requirements-dev.txt, pylint
+ipython==7.18.1           # via -r requirements-dev.txt
+isort==5.5.3              # via -r requirements-dev.txt, pylint
 itsdangerous==1.1.0       # via -r requirements-dev.txt, flask
 jedi==0.17.0              # via -r requirements-dev.txt, ipython
 jinja2==2.10.1            # via -r requirements-dev.txt, flask, matrix-synapse, sphinx
 jsonschema==3.2.0         # via -r requirements-dev.txt, matrix-synapse, web3
 lazy-object-proxy==1.4.1  # via -r requirements-dev.txt, astroid
 lru-dict==1.1.6           # via -r requirements-dev.txt, web3
-macholib==1.14            # via -r requirements-ci.in
+macholib==1.14            # via -r requirements-ci.in, pyinstaller
 markupsafe==1.1.1         # via -r requirements-dev.txt, jinja2
 marshmallow-dataclass==6.0.0  # via -r requirements-dev.txt
 marshmallow-enum==1.5.1   # via -r requirements-dev.txt
 marshmallow-polyfield==5.9  # via -r requirements-dev.txt
-marshmallow==3.7.0        # via -r requirements-dev.txt, marshmallow-dataclass, marshmallow-enum, marshmallow-polyfield
+marshmallow==3.8.0        # via -r requirements-dev.txt, marshmallow-dataclass, marshmallow-enum, marshmallow-polyfield
 matrix-client==0.3.2      # via -r requirements-dev.txt
-matrix-synapse==1.10.1    # via -r requirements-dev.txt
+matrix-synapse==1.19.1    # via -r requirements-dev.txt
 mccabe==0.6.1             # via -r requirements-dev.txt, flake8, pylint
 mirakuru==2.1.2           # via -r requirements-dev.txt
 more-itertools==7.0.0     # via -r requirements-dev.txt, pytest
@@ -96,8 +101,8 @@ multiaddr==0.0.9          # via -r requirements-dev.txt, ipfshttpclient
 mypy-extensions==0.4.3    # via -r requirements-dev.txt, mypy, raiden-contracts, typing-inspect
 mypy==0.782               # via -r requirements-dev.txt
 netaddr==0.7.19           # via -r requirements-dev.txt, matrix-synapse, multiaddr
-netifaces==0.10.9         # via -r requirements-dev.txt
-networkx==2.4             # via -r requirements-dev.txt
+netifaces==0.10.9         # via -r requirements-dev.txt, aioice
+networkx==2.5             # via -r requirements-dev.txt
 objgraph==3.4.1           # via -r requirements-dev.txt
 packaging==19.0           # via -r requirements-dev.txt, pytest, sphinx
 parsimonious==0.8.1       # via -r requirements-dev.txt, eth-abi
@@ -108,27 +113,30 @@ pexpect==4.8.0            # via -r requirements-dev.txt, ipython
 phonenumbers==8.10.13     # via -r requirements-dev.txt, matrix-synapse
 pickleshare==0.7.5        # via -r requirements-dev.txt, ipython
 pillow==6.2.0             # via -r requirements-dev.txt, matrix-synapse
-pip-tools==5.2.1          # via -r requirements-dev.txt
+pip-tools==5.3.1          # via -r requirements-dev.txt
 pluggy==0.12.0            # via -r requirements-dev.txt, pytest
 prometheus-client==0.3.1  # via -r requirements-dev.txt, matrix-synapse
 prompt-toolkit==3.0.5     # via -r requirements-dev.txt, ipython
 protobuf==3.11.3          # via -r requirements-dev.txt, web3
-psutil==5.7.0             # via -r requirements-dev.txt, mirakuru
+psutil==5.7.2             # via -r requirements-dev.txt, mirakuru
 ptyprocess==0.6.0         # via -r requirements-dev.txt, pexpect
 py-ecc==1.4.7             # via -r requirements-dev.txt, raiden-contracts
 py-solc==3.2.0            # via -r requirements-dev.txt, raiden-contracts
 py-spy==0.3.3             # via -r requirements-dev.txt
-py==1.8.0                 # via -r requirements-dev.txt, pytest
+py==1.9.0                 # via -r requirements-dev.txt, pytest
 pyasn1-modules==0.2.5     # via -r requirements-dev.txt, matrix-synapse, service-identity
 pyasn1==0.4.5             # via -r requirements-dev.txt, matrix-synapse, pyasn1-modules, service-identity
 pycodestyle==2.6.0        # via -r requirements-dev.txt, flake8
 pycparser==2.19           # via -r requirements-dev.txt, cffi
 pycryptodome==3.8.2       # via -r requirements-dev.txt, eth-hash, eth-keyfile
+pyee==7.0.2               # via -r requirements-dev.txt, aiortc
 pyflakes==2.2.0           # via -r requirements-dev.txt, flake8
 pygments==2.6.1           # via -r requirements-dev.txt, ipython, pdbpp, readme-renderer, sphinx
 pyhamcrest==1.9.0         # via -r requirements-dev.txt, twisted
-pyinstaller==3.6          # via -r requirements-ci.in
-pylint==2.5.3             # via -r requirements-dev.txt
+pyinstaller-hooks-contrib==2020.7  # via pyinstaller
+pyinstaller==4.0          # via -r requirements-ci.in
+pylibsrtp==0.6.6          # via -r requirements-dev.txt, aiortc
+pylint==2.6.0             # via -r requirements-dev.txt
 pymacaroons==0.13.0       # via -r requirements-dev.txt, matrix-synapse
 pynacl==1.3.0             # via -r requirements-dev.txt, matrix-synapse, pymacaroons, signedjson
 pyopenssl==19.0.0         # via -r requirements-dev.txt, matrix-synapse, twisted
@@ -138,8 +146,8 @@ pysha3==1.0.2             # via -r requirements-dev.txt
 pytest-forked==1.1.3      # via -r requirements-dev.txt, pytest-xdist
 pytest-random==0.2        # via -r requirements-dev.txt
 pytest-select==0.1.2      # via -r requirements-dev.txt
-pytest-xdist==1.33.0      # via -r requirements-dev.txt
-pytest==5.4.3             # via -r requirements-dev.txt, pytest-forked, pytest-random, pytest-select, pytest-xdist
+pytest-xdist==2.1.0       # via -r requirements-dev.txt
+pytest==6.0.2             # via -r requirements-dev.txt, pytest-forked, pytest-random, pytest-select, pytest-xdist
 python-dateutil==2.8.0    # via s3cmd
 python-magic==0.4.15      # via s3cmd
 pytz==2019.1              # via -r requirements-dev.txt, babel, flask-restful
@@ -158,11 +166,11 @@ semver==2.8.1             # via -r requirements-dev.txt, raiden-contracts
 service-identity==18.1.0  # via -r requirements-dev.txt, matrix-synapse, twisted
 signedjson==1.1           # via -r requirements-dev.txt, matrix-synapse
 simplejson==3.16.0        # via -r requirements-dev.txt, canonicaljson
-six==1.12.0               # via -r requirements-dev.txt, astroid, astunparse, automat, bcrypt, bleach, canonicaljson, cryptography, flake8-tuple, flask-cors, flask-restful, ipfshttpclient, jsonschema, matrix-synapse, multiaddr, packaging, parsimonious, pip-tools, protobuf, pyhamcrest, pymacaroons, pynacl, pyopenssl, pyrsistent, pytest-xdist, python-dateutil, readme-renderer, responses, sphinxcontrib-httpdomain, structlog, traitlets, treq
+six==1.12.0               # via -r requirements-dev.txt, astroid, astunparse, automat, bcrypt, bleach, cryptography, flake8-tuple, flask-cors, flask-restful, jsonschema, multiaddr, packaging, parsimonious, pip-tools, protobuf, pyhamcrest, pymacaroons, pynacl, pyopenssl, pyrsistent, python-dateutil, readme-renderer, responses, sphinxcontrib-httpdomain, structlog, traitlets, treq
 snowballstemmer==1.2.1    # via -r requirements-dev.txt, sphinx
 sortedcontainers==2.1.0   # via -r requirements-dev.txt, hypothesis, matrix-synapse
 sphinx-rtd-theme==0.5.0   # via -r requirements-dev.txt
-sphinx==3.1.2             # via -r requirements-dev.txt, releases, sphinx-rtd-theme, sphinxcontrib-httpdomain, sphinxcontrib-httpexample, sphinxcontrib-images
+sphinx==3.2.1             # via -r requirements-dev.txt, releases, sphinx-rtd-theme, sphinxcontrib-httpdomain, sphinxcontrib-httpexample, sphinxcontrib-images
 sphinxcontrib-applehelp==1.0.2  # via -r requirements-dev.txt, sphinx
 sphinxcontrib-devhelp==1.0.2  # via -r requirements-dev.txt, sphinx
 sphinxcontrib-htmlhelp==1.0.3  # via -r requirements-dev.txt, sphinx
@@ -173,19 +181,19 @@ sphinxcontrib-jsmath==1.0.1  # via -r requirements-dev.txt, sphinx
 sphinxcontrib-qthelp==1.0.3  # via -r requirements-dev.txt, sphinx
 sphinxcontrib-serializinghtml==1.1.4  # via -r requirements-dev.txt, sphinx
 structlog==20.1.0         # via -r requirements-dev.txt
-toml==0.10.1              # via -r requirements-dev.txt, black, pylint
+toml==0.10.1              # via -r requirements-dev.txt, black, pylint, pytest
 toolz==0.9.0              # via -r requirements-dev.txt, cytoolz
 traitlets==4.3.2          # via -r requirements-dev.txt, ipython
 treq==18.6.0              # via -r requirements-dev.txt, matrix-synapse
 twisted[tls]==20.3.0      # via -r requirements-dev.txt, matrix-synapse, treq
-typed-ast==1.4.0          # via -r requirements-dev.txt, black, mypy
-typing-extensions==3.7.4.2  # via -r requirements-dev.txt, matrix-synapse, mypy, signedjson
+typed-ast==1.4.0          # via -r requirements-dev.txt, astroid, black, mypy
+typing-extensions==3.7.4.3  # via -r requirements-dev.txt, matrix-synapse, mypy, signedjson, web3
 typing-inspect==0.4.0     # via -r requirements-dev.txt, marshmallow-dataclass
 unpaddedbase64==1.1.0     # via -r requirements-dev.txt, matrix-synapse, signedjson
 urllib3==1.25.3           # via -r requirements-dev.txt, requests
 varint==1.0.2             # via -r requirements-dev.txt, multiaddr
-wcwidth==0.1.9            # via -r requirements-dev.txt, prompt-toolkit, pytest
-web3==5.11.1              # via -r requirements-dev.txt, raiden-contracts
+wcwidth==0.1.9            # via -r requirements-dev.txt, prompt-toolkit
+web3==5.12.1              # via -r requirements-dev.txt, raiden-contracts
 webencodings==0.5.1       # via -r requirements-dev.txt, bleach
 websockets==8.1           # via -r requirements-dev.txt, web3
 werkzeug==1.0.1           # via -r requirements-dev.txt, flask
diff --git a/requirements/requirements-dev.in b/requirements/requirements-dev.in
index 6c00f96eb2..c72297b046 100644
--- a/requirements/requirements-dev.in
+++ b/requirements/requirements-dev.in
@@ -43,4 +43,4 @@ coverage
 bump2version
 
 # Test support
-matrix-synapse<1.11
+matrix-synapse==1.19.1
diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt
index b0e772ae0a..743ebeba0f 100644
--- a/requirements/requirements-dev.txt
+++ b/requirements/requirements-dev.txt
@@ -4,6 +4,8 @@
 #
 #    'requirements/deps compile' (for details see requirements/README)
 #
+aioice==0.6.18            # via -r requirements.txt, aiortc
+aiortc==0.9.28            # via -r requirements.txt
 alabaster==0.7.12         # via -r requirements-docs.txt, sphinx
 aniso8601==7.0.0          # via -r requirements.txt, flask-restful
 apipkg==1.5               # via execnet
@@ -13,6 +15,7 @@ astroid==2.4.2            # via pylint
 astunparse==1.6.2         # via -r requirements-docs.txt, sphinxcontrib-httpexample
 attrs==19.3.0             # via -r requirements.txt, automat, black, flake8-bugbear, hypothesis, jsonschema, matrix-synapse, pytest, service-identity, treq, twisted
 automat==0.7.0            # via twisted
+av==8.0.2                 # via -r requirements.txt, aiortc
 babel==2.7.0              # via -r requirements-docs.txt, sphinx
 backcall==0.1.0           # via -r requirements.txt, ipython
 base58==2.0.0             # via -r requirements.txt, multiaddr
@@ -22,29 +25,29 @@ black==19.10b0            # via -r requirements-dev.in
 bleach==3.1.4             # via matrix-synapse, readme-renderer
 bump2version==1.0.0       # via -r requirements-dev.in
 cachetools==4.1.1         # via -r requirements.txt
-canonicaljson==1.1.4      # via matrix-synapse, signedjson
+canonicaljson==1.4.0      # via matrix-synapse, signedjson
 certifi==2019.3.9         # via -r requirements-docs.txt, -r requirements.txt, requests
-cffi==1.12.3              # via -r requirements.txt, bcrypt, coincurve, cryptography, pynacl
+cffi==1.12.3              # via -r requirements.txt, aiortc, bcrypt, coincurve, cryptography, pylibsrtp, pynacl
 chardet==3.0.4            # via -r requirements-docs.txt, -r requirements.txt, requests
 click==7.0                # via -r requirements.txt, black, flask, pip-tools, raiden-contracts
 coincurve==13.0.0         # via -r requirements.txt, raiden-contracts
 colorama==0.4.3           # via -r requirements.txt
 colour==0.1.5             # via -r requirements-dev.in
 constantly==15.1.0        # via twisted
-coverage==5.2             # via -r requirements-dev.in
-cryptography==2.8         # via pyopenssl, service-identity
+coverage==5.3             # via -r requirements-dev.in
+crc32c==2.0               # via -r requirements.txt, aiortc
+cryptography==2.9.2       # via -r requirements.txt, aiortc, pyopenssl, service-identity
 cytoolz==0.10.1           # via -r requirements.txt, eth-keyfile, eth-utils
-daemonize==2.5.0          # via matrix-synapse
 decorator==4.4.0          # via -r requirements.txt, ipython, networkx, traitlets
 docutils==0.14            # via -r requirements-docs.txt, readme-renderer, sphinx, sphinxcontrib-httpexample
 eth-abi==2.1.0            # via -r requirements.txt, eth-account, raiden-contracts, web3
-eth-account==0.5.2        # via -r requirements.txt, web3
+eth-account==0.5.3        # via -r requirements.txt, web3
 eth-hash[pycryptodome]==0.2.0  # via -r requirements.txt, eth-utils, web3
 eth-keyfile==0.5.1        # via -r requirements.txt, eth-account
 eth-keys==0.3.3           # via -r requirements.txt, eth-account, eth-keyfile
 eth-rlp==0.1.2            # via -r requirements.txt, eth-account
 eth-typing==2.2.1         # via -r requirements.txt, eth-abi, eth-keys, eth-utils, raiden-contracts, web3
-eth-utils==1.9.0          # via -r requirements.txt, eth-abi, eth-account, eth-keyfile, eth-keys, eth-rlp, hexbytes, raiden-contracts, rlp, web3
+eth-utils==1.9.5          # via -r requirements.txt, eth-abi, eth-account, eth-keyfile, eth-keys, eth-rlp, hexbytes, raiden-contracts, rlp, web3
 execnet==1.6.0            # via pytest-xdist
 fancycompleter==0.8       # via pdbpp
 filelock==3.0.12          # via -r requirements.txt
@@ -53,7 +56,7 @@ flake8-comprehensions==3.2.3  # via -r requirements-dev.in
 flake8-tuple==0.4.1       # via -r requirements-dev.in
 flake8==3.8.3             # via -r requirements-dev.in, flake8-bugbear, flake8-comprehensions, flake8-tuple
 flaky==3.7.0              # via -r requirements-dev.in
-flask-cors==3.0.8         # via -r requirements.txt
+flask-cors==3.0.9         # via -r requirements.txt
 flask-restful==0.3.8      # via -r requirements.txt
 flask==1.1.2              # via -r requirements.txt, flask-cors, flask-restful
 frozendict==1.2           # via canonicaljson, matrix-synapse
@@ -64,17 +67,18 @@ grequests==0.6.0          # via -r requirements-dev.in
 guppy3==3.0.10.post1      # via -r requirements.txt
 hexbytes==0.2.0           # via -r requirements.txt, eth-account, eth-rlp, web3
 hyperlink==19.0.0         # via twisted
-hypothesis==5.19.2        # via -r requirements-dev.in
+hypothesis==5.35.2        # via -r requirements-dev.in
 idna==2.8                 # via -r requirements-docs.txt, -r requirements.txt, hyperlink, matrix-synapse, requests, twisted
 imagesize==1.1.0          # via -r requirements-docs.txt, sphinx
-importlib-metadata==1.6.1  # via pluggy
+importlib-metadata==1.7.0  # via -r requirements.txt, flake8, flake8-comprehensions, jsonschema, pluggy, pytest
 incremental==17.5.0       # via treq, twisted
-ipfshttpclient==0.4.12    # via -r requirements.txt, web3
-ipython-genutils==0.2.0   # via -r requirements.txt, traitlets
-ipython==7.16.1           # via -r requirements.txt
-isort==4.3.21             # via -r requirements-dev.in, pylint
+iniconfig==1.0.1          # via pytest
+ipfshttpclient==0.6.0.post1  # via -r requirements.txt, web3
+ipython-genutils==0.2.0   # via traitlets
+ipython==7.18.1           # via -r requirements-dev.in
+isort==5.5.3              # via -r requirements-dev.in, pylint
 itsdangerous==1.1.0       # via -r requirements.txt, flask
-jedi==0.17.0              # via -r requirements.txt, ipython
+jedi==0.17.0              # via ipython
 jinja2==2.10.1            # via -r requirements-docs.txt, -r requirements.txt, flask, matrix-synapse, sphinx
 jsonschema==3.2.0         # via -r requirements.txt, matrix-synapse, web3
 lazy-object-proxy==1.4.1  # via astroid
@@ -83,9 +87,9 @@ markupsafe==1.1.1         # via -r requirements-docs.txt, -r requirements.txt, j
 marshmallow-dataclass==6.0.0  # via -r requirements.txt
 marshmallow-enum==1.5.1   # via -r requirements.txt
 marshmallow-polyfield==5.9  # via -r requirements.txt
-marshmallow==3.7.0        # via -r requirements.txt, marshmallow-dataclass, marshmallow-enum, marshmallow-polyfield
+marshmallow==3.8.0        # via -r requirements.txt, marshmallow-dataclass, marshmallow-enum, marshmallow-polyfield
 matrix-client==0.3.2      # via -r requirements.txt
-matrix-synapse==1.10.1    # via -r requirements-dev.in
+matrix-synapse==1.19.1    # via -r requirements-dev.in
 mccabe==0.6.1             # via flake8, pylint
 mirakuru==2.1.2           # via -r requirements.txt
 more-itertools==7.0.0     # via pytest
@@ -94,38 +98,40 @@ multiaddr==0.0.9          # via -r requirements.txt, ipfshttpclient
 mypy-extensions==0.4.3    # via -r requirements.txt, mypy, raiden-contracts, typing-inspect
 mypy==0.782               # via -r requirements-dev.in
 netaddr==0.7.19           # via -r requirements.txt, matrix-synapse, multiaddr
-netifaces==0.10.9         # via -r requirements.txt
-networkx==2.4             # via -r requirements.txt
+netifaces==0.10.9         # via -r requirements.txt, aioice
+networkx==2.5             # via -r requirements.txt
 objgraph==3.4.1           # via -r requirements.txt
 packaging==19.0           # via -r requirements-docs.txt, pytest, sphinx
 parsimonious==0.8.1       # via -r requirements.txt, eth-abi
-parso==0.7.0              # via -r requirements.txt, jedi
+parso==0.7.0              # via jedi
 pathspec==0.8.0           # via black
 pdbpp==0.10.2             # via -r requirements-dev.in
-pexpect==4.8.0            # via -r requirements-dev.in, -r requirements.txt, ipython
+pexpect==4.8.0            # via -r requirements-dev.in, ipython
 phonenumbers==8.10.13     # via matrix-synapse
-pickleshare==0.7.5        # via -r requirements.txt, ipython
+pickleshare==0.7.5        # via ipython
 pillow==6.2.0             # via matrix-synapse
-pip-tools==5.2.1          # via -r requirements-dev.in
+pip-tools==5.3.1          # via -r requirements-dev.in
 pluggy==0.12.0            # via pytest
 prometheus-client==0.3.1  # via matrix-synapse
-prompt-toolkit==3.0.5     # via -r requirements.txt, ipython
+prompt-toolkit==3.0.5     # via ipython
 protobuf==3.11.3          # via -r requirements.txt, web3
-psutil==5.7.0             # via -r requirements.txt, mirakuru
-ptyprocess==0.6.0         # via -r requirements.txt, pexpect
+psutil==5.7.2             # via -r requirements.txt, mirakuru
+ptyprocess==0.6.0         # via pexpect
 py-ecc==1.4.7             # via -r requirements.txt, raiden-contracts
 py-solc==3.2.0            # via -r requirements.txt, raiden-contracts
 py-spy==0.3.3             # via -r requirements-dev.in
-py==1.8.0                 # via pytest
+py==1.9.0                 # via pytest
 pyasn1-modules==0.2.5     # via matrix-synapse, service-identity
 pyasn1==0.4.5             # via matrix-synapse, pyasn1-modules, service-identity
 pycodestyle==2.6.0        # via flake8
 pycparser==2.19           # via -r requirements.txt, cffi
 pycryptodome==3.8.2       # via -r requirements.txt, eth-hash, eth-keyfile
+pyee==7.0.2               # via -r requirements.txt, aiortc
 pyflakes==2.2.0           # via flake8
 pygments==2.6.1           # via -r requirements-docs.txt, -r requirements.txt, ipython, pdbpp, readme-renderer, sphinx
 pyhamcrest==1.9.0         # via twisted
-pylint==2.5.3             # via -r requirements-dev.in
+pylibsrtp==0.6.6          # via -r requirements.txt, aiortc
+pylint==2.6.0             # via -r requirements-dev.in
 pymacaroons==0.13.0       # via matrix-synapse
 pynacl==1.3.0             # via matrix-synapse, pymacaroons, signedjson
 pyopenssl==19.0.0         # via matrix-synapse, twisted
@@ -135,8 +141,8 @@ pysha3==1.0.2             # via -r requirements.txt
 pytest-forked==1.1.3      # via pytest-xdist
 pytest-random==0.2        # via -r requirements-dev.in
 pytest-select==0.1.2      # via -r requirements-dev.in
-pytest-xdist==1.33.0      # via -r requirements-dev.in
-pytest==5.4.3             # via -r requirements-dev.in, pytest-forked, pytest-random, pytest-select, pytest-xdist
+pytest-xdist==2.1.0       # via -r requirements-dev.in
+pytest==6.0.2             # via -r requirements-dev.in, pytest-forked, pytest-random, pytest-select, pytest-xdist
 pytz==2019.1              # via -r requirements-docs.txt, -r requirements.txt, babel, flask-restful
 pyyaml==5.1.1             # via matrix-synapse
 raiden-contracts==0.37.1  # via -r requirements.txt
@@ -152,11 +158,11 @@ semver==2.8.1             # via -r requirements.txt, raiden-contracts
 service-identity==18.1.0  # via matrix-synapse, twisted
 signedjson==1.1           # via matrix-synapse
 simplejson==3.16.0        # via canonicaljson
-six==1.12.0               # via -r requirements-docs.txt, -r requirements.txt, astroid, astunparse, automat, bcrypt, bleach, canonicaljson, cryptography, flake8-tuple, flask-cors, flask-restful, ipfshttpclient, jsonschema, matrix-synapse, multiaddr, packaging, parsimonious, pip-tools, protobuf, pyhamcrest, pymacaroons, pynacl, pyopenssl, pyrsistent, pytest-xdist, readme-renderer, responses, sphinxcontrib-httpdomain, structlog, traitlets, treq
+six==1.12.0               # via -r requirements-docs.txt, -r requirements.txt, astroid, astunparse, automat, bcrypt, bleach, cryptography, flake8-tuple, flask-cors, flask-restful, jsonschema, multiaddr, packaging, parsimonious, pip-tools, protobuf, pyhamcrest, pymacaroons, pynacl, pyopenssl, pyrsistent, readme-renderer, responses, sphinxcontrib-httpdomain, structlog, traitlets, treq
 snowballstemmer==1.2.1    # via -r requirements-docs.txt, sphinx
 sortedcontainers==2.1.0   # via hypothesis, matrix-synapse
 sphinx-rtd-theme==0.5.0   # via -r requirements-docs.txt
-sphinx==3.1.2             # via -r requirements-docs.txt, releases, sphinx-rtd-theme, sphinxcontrib-httpdomain, sphinxcontrib-httpexample, sphinxcontrib-images
+sphinx==3.2.1             # via -r requirements-docs.txt, releases, sphinx-rtd-theme, sphinxcontrib-httpdomain, sphinxcontrib-httpexample, sphinxcontrib-images
 sphinxcontrib-applehelp==1.0.2  # via -r requirements-docs.txt, sphinx
 sphinxcontrib-devhelp==1.0.2  # via -r requirements-docs.txt, sphinx
 sphinxcontrib-htmlhelp==1.0.3  # via -r requirements-docs.txt, sphinx
@@ -167,26 +173,26 @@ sphinxcontrib-jsmath==1.0.1  # via -r requirements-docs.txt, sphinx
 sphinxcontrib-qthelp==1.0.3  # via -r requirements-docs.txt, sphinx
 sphinxcontrib-serializinghtml==1.1.4  # via -r requirements-docs.txt, sphinx
 structlog==20.1.0         # via -r requirements.txt
-toml==0.10.1              # via -r requirements.txt, black, pylint
+toml==0.10.1              # via -r requirements.txt, black, pylint, pytest
 toolz==0.9.0              # via -r requirements.txt, cytoolz
-traitlets==4.3.2          # via -r requirements.txt, ipython
+traitlets==4.3.2          # via ipython
 treq==18.6.0              # via matrix-synapse
 twisted[tls]==20.3.0      # via matrix-synapse, treq
-typed-ast==1.4.0          # via black, mypy
-typing-extensions==3.7.4.2  # via -r requirements.txt, matrix-synapse, mypy, signedjson
+typed-ast==1.4.0          # via astroid, black, mypy
+typing-extensions==3.7.4.3  # via -r requirements.txt, matrix-synapse, mypy, signedjson, web3
 typing-inspect==0.4.0     # via -r requirements.txt, marshmallow-dataclass
 unpaddedbase64==1.1.0     # via matrix-synapse, signedjson
 urllib3==1.25.3           # via -r requirements-docs.txt, -r requirements.txt, requests
 varint==1.0.2             # via -r requirements.txt, multiaddr
-wcwidth==0.1.9            # via -r requirements.txt, prompt-toolkit, pytest
-web3==5.11.1              # via -r requirements.txt, raiden-contracts
+wcwidth==0.1.9            # via prompt-toolkit
+web3==5.12.1              # via -r requirements.txt, raiden-contracts
 webencodings==0.5.1       # via bleach
 websockets==8.1           # via -r requirements.txt, web3
 werkzeug==1.0.1           # via -r requirements.txt, flask
 wheel==0.33.4             # via -r requirements-docs.txt, astunparse
 wmctrl==0.3               # via pdbpp
 wrapt==1.11.1             # via astroid
-zipp==3.1.0               # via importlib-metadata
+zipp==3.1.0               # via -r requirements.txt, importlib-metadata
 zope.event==4.4           # via -r requirements.txt, gevent
 zope.interface==5.1.0     # via -r requirements.txt, gevent, twisted
 
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index fa8b4b2477..c586e3f6e8 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -4,31 +4,35 @@
 #
 #    'requirements/deps compile' (for details see requirements/README)
 #
+aioice==0.6.18            # via aiortc
+aiortc==0.9.28            # via -r requirements.in
 aniso8601==7.0.0          # via flask-restful
 asn1crypto==1.3.0         # via coincurve
 attrs==19.3.0             # via jsonschema
-backcall==0.1.0           # via ipython
+av==8.0.2                 # via aiortc
 base58==2.0.0             # via multiaddr
 bitarray==1.2.1           # via eth-account
 cachetools==4.1.1         # via -r requirements.in
 certifi==2019.3.9         # via requests
-cffi==1.12.3              # via coincurve
+cffi==1.12.3              # via aiortc, coincurve, cryptography, pylibsrtp
 chardet==3.0.4            # via requests
 click==7.0                # via flask, raiden-contracts
 coincurve==13.0.0         # via -r requirements.in, raiden-contracts
 colorama==0.4.3           # via -r requirements.in
+crc32c==2.0               # via aiortc
+cryptography==2.9.2       # via aiortc
 cytoolz==0.10.1           # via eth-keyfile, eth-utils
-decorator==4.4.0          # via ipython, networkx, traitlets
+decorator==4.4.0          # via networkx
 eth-abi==2.1.0            # via eth-account, raiden-contracts, web3
-eth-account==0.5.2        # via web3
+eth-account==0.5.3        # via web3
 eth-hash[pycryptodome]==0.2.0  # via eth-utils, web3
 eth-keyfile==0.5.1        # via -r requirements.in, eth-account
 eth-keys==0.3.3           # via -r requirements.in, eth-account, eth-keyfile
 eth-rlp==0.1.2            # via eth-account
 eth-typing==2.2.1         # via eth-abi, eth-keys, eth-utils, raiden-contracts, web3
-eth-utils==1.9.0          # via -r requirements.in, eth-abi, eth-account, eth-keyfile, eth-keys, eth-rlp, hexbytes, raiden-contracts, rlp, web3
+eth-utils==1.9.5          # via -r requirements.in, eth-abi, eth-account, eth-keyfile, eth-keys, eth-rlp, hexbytes, raiden-contracts, rlp, web3
 filelock==3.0.12          # via -r requirements.in
-flask-cors==3.0.8         # via -r requirements.in
+flask-cors==3.0.9         # via -r requirements.in
 flask-restful==0.3.8      # via -r requirements.in
 flask==1.1.2              # via -r requirements.in, flask-cors, flask-restful
 gevent==20.6.2            # via -r requirements.in
@@ -37,11 +41,9 @@ greenlet==0.4.16          # via gevent
 guppy3==3.0.10.post1      # via -r requirements.in
 hexbytes==0.2.0           # via eth-account, eth-rlp, web3
 idna==2.8                 # via requests
-ipfshttpclient==0.4.12    # via web3
-ipython-genutils==0.2.0   # via traitlets
-ipython==7.16.1           # via -r requirements.in
+importlib-metadata==1.7.0  # via jsonschema
+ipfshttpclient==0.6.0.post1  # via web3
 itsdangerous==1.1.0       # via flask
-jedi==0.17.0              # via ipython
 jinja2==2.10.1            # via flask
 jsonschema==3.2.0         # via web3
 lru-dict==1.1.6           # via web3
@@ -49,28 +51,24 @@ markupsafe==1.1.1         # via jinja2
 marshmallow-dataclass==6.0.0  # via -r requirements.in
 marshmallow-enum==1.5.1   # via -r requirements.in
 marshmallow-polyfield==5.9  # via -r requirements.in
-marshmallow==3.7.0        # via -r requirements.in, marshmallow-dataclass, marshmallow-enum, marshmallow-polyfield
+marshmallow==3.8.0        # via -r requirements.in, marshmallow-dataclass, marshmallow-enum, marshmallow-polyfield
 matrix-client==0.3.2      # via -r requirements.in
 mirakuru==2.1.2           # via -r requirements.in
 multiaddr==0.0.9          # via ipfshttpclient
 mypy-extensions==0.4.3    # via raiden-contracts, typing-inspect
 netaddr==0.7.19           # via multiaddr
-netifaces==0.10.9         # via -r requirements.in
-networkx==2.4             # via -r requirements.in
+netifaces==0.10.9         # via -r requirements.in, aioice
+networkx==2.5             # via -r requirements.in
 objgraph==3.4.1           # via -r requirements.in
 parsimonious==0.8.1       # via eth-abi
-parso==0.7.0              # via jedi
-pexpect==4.8.0            # via ipython
-pickleshare==0.7.5        # via ipython
-prompt-toolkit==3.0.5     # via ipython
 protobuf==3.11.3          # via web3
-psutil==5.7.0             # via -r requirements.in, mirakuru
-ptyprocess==0.6.0         # via pexpect
+psutil==5.7.2             # via -r requirements.in, mirakuru
 py-ecc==1.4.7             # via raiden-contracts
 py-solc==3.2.0            # via raiden-contracts
 pycparser==2.19           # via cffi
 pycryptodome==3.8.2       # via eth-hash, eth-keyfile
-pygments==2.6.1           # via ipython
+pyee==7.0.2               # via aiortc
+pylibsrtp==0.6.6          # via aiortc
 pyrsistent==0.15.7        # via jsonschema
 pysha3==1.0.2             # via -r requirements.in
 pytz==2019.1              # via flask-restful
@@ -80,19 +78,18 @@ requests==2.24.0          # via -r requirements.in, ipfshttpclient, matrix-clien
 rlp==1.1.0                # via eth-account, eth-rlp, raiden-contracts
 semantic-version==2.6.0   # via py-solc
 semver==2.8.1             # via raiden-contracts
-six==1.12.0               # via flask-cors, flask-restful, ipfshttpclient, jsonschema, multiaddr, parsimonious, protobuf, pyrsistent, structlog, traitlets
+six==1.12.0               # via cryptography, flask-cors, flask-restful, jsonschema, multiaddr, parsimonious, protobuf, pyrsistent, structlog
 structlog==20.1.0         # via -r requirements.in
 toml==0.10.1              # via -r requirements.in
 toolz==0.9.0              # via cytoolz
-traitlets==4.3.2          # via ipython
-typing-extensions==3.7.4.2  # via -r requirements.in
+typing-extensions==3.7.4.3  # via -r requirements.in, web3
 typing-inspect==0.4.0     # via marshmallow-dataclass
 urllib3==1.25.3           # via requests
 varint==1.0.2             # via multiaddr
-wcwidth==0.1.9            # via prompt-toolkit
-web3==5.11.1              # via -r requirements.in, raiden-contracts
+web3==5.12.1              # via -r requirements.in, raiden-contracts
 websockets==8.1           # via web3
 werkzeug==1.0.1           # via flask
+zipp==3.1.0               # via importlib-metadata
 zope.event==4.4           # via gevent
 zope.interface==5.1.0     # via gevent