codecov[bot]: # [Codecov](https://codecov.io/gh/raiden-network/raiden-services/pull/795?src=pr&el=h1) Report
> Merging [#795](https://codecov.io/gh/raiden-network/raiden-services/pull/795?src=pr&el=desc) into [master](https://codecov.io/gh/raiden-network/raiden-services/commit/5e7bca16564ee3194357534209ad39a4a0597bb9&el=desc) will **increase** coverage by `0.06%`.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/raiden-network/raiden-services/pull/795/graphs/tree.svg?width=650&height=150&src=pr&token=H07qtpFA6p)](https://codecov.io/gh/raiden-network/raiden-services/pull/795?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #795      +/-   ##
==========================================
+ Coverage   89.98%   90.04%   +0.06%     
==========================================
  Files          35       35              
  Lines        2626     2633       +7     
  Branches      333      334       +1     
==========================================
+ Hits         2363     2371       +8     
+ Misses        189      188       -1     
  Partials       74       74              
```


| [Impacted Files](https://codecov.io/gh/raiden-network/raiden-services/pull/795?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/raiden\_libs/blockchain.py](https://codecov.io/gh/raiden-network/raiden-services/pull/795/diff?src=pr&el=tree#diff-c3JjL3JhaWRlbl9saWJzL2Jsb2NrY2hhaW4ucHk=) | `86.60% <100.00%> (+1.84%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/raiden-network/raiden-services/pull/795?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/raiden-network/raiden-services/pull/795?src=pr&el=footer). Last update [5e7bca1...b80ab6a](https://codecov.io/gh/raiden-network/raiden-services/pull/795?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

diff --git a/src/raiden_libs/blockchain.py b/src/raiden_libs/blockchain.py
index e38e715..92573d4 100644
--- a/src/raiden_libs/blockchain.py
+++ b/src/raiden_libs/blockchain.py
@@ -28,7 +28,6 @@ from raiden_contracts.constants import (
     ChannelEvent,
     MonitoringServiceEvent,
 )
-from raiden_contracts.contract_manager import ContractManager
 from raiden_libs.contract_info import CONTRACT_MANAGER
 from raiden_libs.events import (
     Event,
@@ -46,6 +45,27 @@ from raiden_libs.states import BlockchainState
 log = structlog.get_logger(__name__)
 
 
+def create_event_topic_to_abi_dict() -> Dict[bytes, ABIEvent]:
+    contract_names = [
+        CONTRACT_TOKEN_NETWORK_REGISTRY,
+        CONTRACT_TOKEN_NETWORK,
+        CONTRACT_MONITORING_SERVICE,
+    ]
+
+    event_abis = {}
+    for contract_name in contract_names:
+        events = filter_by_type("event", CONTRACT_MANAGER.get_contract_abi(contract_name))
+
+        for event_abi in events:
+            event_topic = event_abi_to_log_topic(event_abi)  # type: ignore
+            event_abis[event_topic] = event_abi
+
+    return event_abis  # type: ignore
+
+
+EVENT_TOPIC_TO_ABI = create_event_topic_to_abi_dict()
+
+
 def get_web3_provider_info(web3: Web3) -> str:
     """ Returns information about the provider
 
@@ -63,43 +83,27 @@ def get_web3_provider_info(web3: Web3) -> str:
     raise RuntimeError(f"Unsupported web3 provider {provider!r}")
 
 
-def decode_event(
-    abi_codec: ABICodec, topic_to_event_abi: Dict[bytes, ABIEvent], log_entry: LogReceipt
-) -> Dict:
+def decode_event(abi_codec: ABICodec, log_entry: LogReceipt) -> Dict:
     topic = log_entry["topics"][0]
-    event_abi = topic_to_event_abi[topic]
+    event_abi = EVENT_TOPIC_TO_ABI[topic]
 
     return get_event_data(abi_codec=abi_codec, event_abi=event_abi, log_entry=log_entry)
 
 
 def query_blockchain_events(
-    web3: Web3,
-    contract_manager: ContractManager,
-    contract_addresses: List[Address],
-    contract_name: str,
-    from_block: BlockNumber,
-    to_block: BlockNumber,
+    web3: Web3, contract_addresses: List[Address], from_block: BlockNumber, to_block: BlockNumber
 ) -> List[Dict]:
     """Returns events emmitted by a contract for a given event name, within a certain range.
 
     Args:
         web3: A Web3 instance
-        contract_manager: A contract manager
         contract_addresses: The address(es) of the contract(s) to be filtered
-        contract_name: The name of the contract
         from_block: The block to start search events
         to_block: The block to stop searching for events
 
     Returns:
         All matching events
     """
-    events_abi = filter_by_type("event", contract_manager.get_contract_abi(contract_name))
-
-    # eth-utils doesn't have strict ABI types yet
-    topic_to_event_abi: Dict[bytes, ABIEvent] = {
-        event_abi_to_log_topic(event_abi): event_abi for event_abi in events_abi  # type: ignore
-    }
-
     filter_params = FilterParams(
         {
             "fromBlock": from_block,
@@ -110,7 +114,7 @@ def query_blockchain_events(
 
     events = web3.eth.getLogs(filter_params)
 
-    return [decode_event(web3.codec, topic_to_event_abi, log_entry) for log_entry in events]
+    return [decode_event(web3.codec, log_entry) for log_entry in events]
 
 
 def parse_token_network_event(event: dict) -> Optional[Event]:
@@ -155,7 +159,6 @@ def parse_token_network_event(event: dict) -> Optional[Event]:
 
 def get_blockchain_events(
     web3: Web3,
-    contract_manager: ContractManager,
     token_network_addresses: List[TokenNetworkAddress],
     chain_state: BlockchainState,
     from_block: BlockNumber,
@@ -176,9 +179,7 @@ def get_blockchain_events(
     # first check for new token networks and add to state
     registry_events = query_blockchain_events(
         web3=web3,
-        contract_manager=contract_manager,
         contract_addresses=[chain_state.token_network_registry_address],
-        contract_name=CONTRACT_TOKEN_NETWORK_REGISTRY,
         from_block=from_block,
         to_block=to_block,
     )
@@ -202,9 +203,7 @@ def get_blockchain_events(
     # then check all token networks
     network_events = query_blockchain_events(
         web3=web3,
-        contract_manager=contract_manager,
         contract_addresses=token_network_addresses,  # type: ignore
-        contract_name=CONTRACT_TOKEN_NETWORK,
         from_block=from_block,
         to_block=to_block,
     )
@@ -218,7 +217,6 @@ def get_blockchain_events(
     # if the monitor contract address is set in chain_state
     monitoring_events = get_monitoring_blockchain_events(
         web3=web3,
-        contract_manager=contract_manager,
         monitor_contract_address=chain_state.monitor_contract_address,
         from_block=from_block,
         to_block=to_block,
@@ -233,7 +231,6 @@ def get_blockchain_events(
 
 def get_monitoring_blockchain_events(
     web3: Web3,
-    contract_manager: ContractManager,
     monitor_contract_address: Optional[Address],
     from_block: BlockNumber,
     to_block: BlockNumber,
@@ -243,9 +240,7 @@ def get_monitoring_blockchain_events(
 
     monitoring_service_events = query_blockchain_events(
         web3=web3,
-        contract_manager=contract_manager,
         contract_addresses=[monitor_contract_address],
-        contract_name=CONTRACT_MONITORING_SERVICE,
         from_block=from_block,
         to_block=to_block,
     )
@@ -330,7 +325,6 @@ def get_blockchain_events_adaptive(
         before_query = time.monotonic()
         events = get_blockchain_events(
             web3=web3,
-            contract_manager=CONTRACT_MANAGER,
             token_network_addresses=token_network_addresses,
             chain_state=blockchain_state,
             from_block=from_block,

Optimize usage of `event_abi_to_log_topic`
Optimize usage of `event_abi_to_log_topic` because 5.77% of the time is spent here.

We currently recreate the log topic(s) each time we filter the blockchain for events. This could be cached instead.

Taken out of https://github.com/raiden-network/raiden-services/issues/672
diff --git a/tests/libs/test_blockchain.py b/tests/libs/test_blockchain.py
index b6511f1..6b4d1f6 100644
--- a/tests/libs/test_blockchain.py
+++ b/tests/libs/test_blockchain.py
@@ -9,8 +9,7 @@ from web3.contract import Contract
 
 from monitoring_service.constants import DEFAULT_FILTER_INTERVAL
 from raiden.utils.typing import Address, BlockNumber, ChainID
-from raiden_contracts.constants import CONTRACT_TOKEN_NETWORK_REGISTRY, EVENT_TOKEN_NETWORK_CREATED
-from raiden_contracts.contract_manager import ContractManager
+from raiden_contracts.constants import EVENT_TOKEN_NETWORK_CREATED
 from raiden_libs.blockchain import (
     get_blockchain_events,
     get_blockchain_events_adaptive,
@@ -20,15 +19,11 @@ from raiden_libs.blockchain import (
 from raiden_libs.states import BlockchainState
 
 
-def create_tnr_contract_events_query(
-    web3: Web3, contract_manager: ContractManager, contract_address: Address
-):
+def create_tnr_contract_events_query(web3: Web3, contract_address: Address):
     def query_callback():
         return query_blockchain_events(
             web3=web3,
-            contract_manager=contract_manager,
             contract_addresses=[contract_address],
-            contract_name=CONTRACT_TOKEN_NETWORK_REGISTRY,
             from_block=BlockNumber(0),
             to_block=web3.eth.blockNumber,
         )
@@ -38,14 +33,9 @@ def create_tnr_contract_events_query(
 
 @pytest.mark.usefixtures("token_network")
 def test_limit_inclusivity_in_query_blockchain_events(
-    web3: Web3,
-    wait_for_blocks,
-    contracts_manager: ContractManager,
-    token_network_registry_contract,
+    web3: Web3, wait_for_blocks, token_network_registry_contract,
 ):
-    query = create_tnr_contract_events_query(
-        web3, contracts_manager, token_network_registry_contract.address
-    )
+    query = create_tnr_contract_events_query(web3, token_network_registry_contract.address)
 
     # A new token network has been registered by the `token_network_registry_contract` fixture
     events = query()
@@ -57,9 +47,7 @@ def test_limit_inclusivity_in_query_blockchain_events(
     # test to_block is inclusive
     events = query_blockchain_events(
         web3=web3,
-        contract_manager=contracts_manager,
         contract_addresses=[token_network_registry_contract.address],
-        contract_name=CONTRACT_TOKEN_NETWORK_REGISTRY,
         from_block=BlockNumber(0),
         to_block=BlockNumber(registry_event_block - 1),
     )
@@ -67,9 +55,7 @@ def test_limit_inclusivity_in_query_blockchain_events(
 
     events = query_blockchain_events(
         web3=web3,
-        contract_manager=contracts_manager,
         contract_addresses=[token_network_registry_contract.address],
-        contract_name=CONTRACT_TOKEN_NETWORK_REGISTRY,
         from_block=BlockNumber(0),
         to_block=registry_event_block,
     )
@@ -83,9 +69,7 @@ def test_limit_inclusivity_in_query_blockchain_events(
     # test to_block is inclusive
     events = query_blockchain_events(
         web3=web3,
-        contract_manager=contracts_manager,
         contract_addresses=[token_network_registry_contract.address],
-        contract_name=CONTRACT_TOKEN_NETWORK_REGISTRY,
         from_block=BlockNumber(registry_event_block + 1),
         to_block=current_block_number,
     )
@@ -93,9 +77,7 @@ def test_limit_inclusivity_in_query_blockchain_events(
 
     events = query_blockchain_events(
         web3=web3,
-        contract_manager=contracts_manager,
         contract_addresses=[token_network_registry_contract.address],
-        contract_name=CONTRACT_TOKEN_NETWORK_REGISTRY,
         from_block=registry_event_block,
         to_block=current_block_number,
     )
@@ -104,9 +86,7 @@ def test_limit_inclusivity_in_query_blockchain_events(
     # test that querying just one block works
     events = query_blockchain_events(
         web3=web3,
-        contract_manager=contracts_manager,
         contract_addresses=[token_network_registry_contract.address],
-        contract_name=CONTRACT_TOKEN_NETWORK_REGISTRY,
         from_block=registry_event_block,
         to_block=registry_event_block,
     )
@@ -146,11 +126,10 @@ def test_get_pessimistic_udc_balance(user_deposit_contract, web3, deposit_to_udc
 
 
 def test_get_blockchain_events_returns_early_for_invalid_interval(
-    web3: Web3, contracts_manager: ContractManager, token_network_registry_contract: Contract
+    web3: Web3, token_network_registry_contract: Contract
 ):
     events = get_blockchain_events(
         web3=web3,
-        contract_manager=contracts_manager,
         token_network_addresses=[],
         chain_state=BlockchainState(
             chain_id=ChainID(1),
diff --git a/tests/monitoring/monitoring_service/test_end_to_end.py b/tests/monitoring/monitoring_service/test_end_to_end.py
index 3c633c9..9450570 100644
--- a/tests/monitoring/monitoring_service/test_end_to_end.py
+++ b/tests/monitoring/monitoring_service/test_end_to_end.py
@@ -15,24 +15,15 @@ from raiden.utils.typing import (
     TokenAmount,
     TokenNetworkAddress,
 )
-from raiden_contracts.constants import (
-    CONTRACT_MONITORING_SERVICE,
-    LOCKSROOT_OF_NO_LOCKS,
-    MonitoringServiceEvent,
-)
-from raiden_contracts.contract_manager import ContractManager
+from raiden_contracts.constants import LOCKSROOT_OF_NO_LOCKS, MonitoringServiceEvent
 from raiden_libs.blockchain import query_blockchain_events
 
 
-def create_ms_contract_events_query(
-    web3: Web3, contract_manager: ContractManager, contract_address: Address
-) -> Callable:
+def create_ms_contract_events_query(web3: Web3, contract_address: Address) -> Callable:
     def f():
         return query_blockchain_events(
             web3=web3,
-            contract_manager=contract_manager,
             contract_addresses=[contract_address],
-            contract_name=CONTRACT_MONITORING_SERVICE,
             from_block=BlockNumber(0),
             to_block=web3.eth.blockNumber,
         )
@@ -47,7 +38,6 @@ def test_first_allowed_monitoring(
     service_registry,
     monitoring_service: MonitoringService,
     request_collector: RequestCollector,
-    contracts_manager: ContractManager,
     deposit_to_udc,
     create_channel,
     token_network,
@@ -55,9 +45,7 @@ def test_first_allowed_monitoring(
     get_private_key,
 ):
     # pylint: disable=too-many-arguments,too-many-locals,protected-access
-    query = create_ms_contract_events_query(
-        web3, contracts_manager, monitoring_service_contract.address
-    )
+    query = create_ms_contract_events_query(web3, monitoring_service_contract.address)
     c1, c2 = get_accounts(2)
 
     # add deposit for c1
@@ -158,7 +146,6 @@ def test_e2e(  # pylint: disable=too-many-arguments,too-many-locals
     service_registry,
     monitoring_service: MonitoringService,
     request_collector: RequestCollector,
-    contracts_manager: ContractManager,
     deposit_to_udc,
     create_channel,
     token_network,
@@ -173,9 +160,7 @@ def test_e2e(  # pylint: disable=too-many-arguments,too-many-locals
         5) wait for channel settle
         6) MS claims the reward
     """
-    query = create_ms_contract_events_query(
-        web3, contracts_manager, monitoring_service_contract.address
-    )
+    query = create_ms_contract_events_query(web3, monitoring_service_contract.address)
     initial_balance = user_deposit_contract.functions.balances(monitoring_service.address).call()
     c1, c2 = get_accounts(2)
 

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
3.7
requirements.txt requirements-dev.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
aniso8601==7.0.0
appdirs==1.4.4
asn1crypto==1.3.0
astroid==2.3.3
attrs==19.3.0
Babel==2.14.0
base58==2.0.0
bitarray==1.2.1
black==19.10b0
blake2b-py==0.1.4
bleach==6.0.0
blinker==1.6.3
bump2version==1.0.1
cached-property==1.5.2
cachetools==3.1.1
certifi==2019.3.9
cffi==1.12.3
chardet==3.0.4
Click==7.0
coincurve==13.0.0
colorama==0.4.1
coverage==7.2.7
cryptography==44.0.2
cytoolz==0.10.1
decorator==4.4.0
docutils==0.20.1
entrypoints==0.3
eth-abi==2.1.0
eth-account==0.5.2
eth-bloom==1.0.3
eth-hash==0.2.0
eth-keyfile==0.5.1
eth-keys==0.2.4
eth-rlp==0.1.2
eth-tester==0.4.0b2
eth-typing==2.2.1
eth-utils==1.8.4
exceptiongroup==1.2.2
execnet==2.0.2
fancycompleter==0.9.1
filelock==3.0.12
flake8==3.7.9
flake8-bugbear==20.1.2
flake8-tuple==0.4.1
Flask==1.0.3
Flask-Cors==3.0.8
Flask-RESTful==0.3.7
gevent==1.5a3
graphviz==0.13.2
greenlet==0.4.15
guppy3==3.0.9
hexbytes==0.2.0
idna==2.8
imagesize==1.4.1
importlib-metadata==1.5.0
iniconfig==2.0.0
ipfshttpclient==0.4.12
ipython==4.2.1
ipython-genutils==0.2.0
isort==4.3.21
itsdangerous==1.1.0
jeepney==0.9.0
Jinja2==2.10.1
jsonschema==3.2.0
keyring==22.3.0
lazy-object-proxy==1.4.3
lru-dict==1.1.6
MarkupSafe==1.1.1
marshmallow==3.4.0
marshmallow-dataclass==6.0.0
marshmallow-enum==1.5.1
marshmallow-polyfield==5.8
matrix-client==0.3.2
mccabe==0.6.1
mirakuru==2.1.2
multiaddr==0.0.9
mypy==0.770
mypy-extensions==0.4.3
netaddr==0.7.19
netifaces==0.10.9
networkx==2.3
objgraph==3.4.1
packaging==24.0
parsimonious==0.8.1
pathspec==0.11.2
pdbpp==0.10.3
pexpect==4.7.0
pickleshare==0.7.5
pkginfo==1.10.0
pluggy==1.2.0
protobuf==3.11.3
psutil==5.6.6
ptyprocess==0.6.0
py-ecc==1.4.7
py-evm==0.3.0a15
py-geth==2.1.0
py-solc==3.2.0
pycodestyle==2.5.0
pycparser==2.19
pycryptodome==3.8.2
pyethash==0.1.27
pyflakes==2.1.1
Pygments==2.17.2
pylint==2.4.4
pyrepl==0.9.0
pyrsistent==0.15.7
pysha3==1.0.2
pytest==7.4.4
pytest-cov==4.1.0
pytest-gevent==1.1.0
pytest-runner==6.0.1
pytest-structlog==0.2
pytest-xdist==3.5.0
pytoml==0.1.20
pytz==2019.1
raiden==0.200.0rc9
raiden-contracts==0.37.0
-e git+https://github.com/raiden-network/raiden-services.git@5e7bca16564ee3194357534209ad39a4a0597bb9#egg=raiden_services
raiden-webui==0.11.0
readme-renderer==37.3
regex==2024.4.16
requests==2.22.0
requests-toolbelt==1.0.0
rlp==1.1.0
SecretStorage==3.3.3
semantic-version==2.6.0
semver==2.8.1
sentry-sdk==0.14.1
simplegeneric==0.8.1
six==1.12.0
snowballstemmer==2.2.0
Sphinx==1.8.4
sphinx-rtd-theme==0.4.2
sphinxcontrib-serializinghtml==1.1.5
sphinxcontrib-websupport==1.2.4
structlog==20.1.0
toml==0.10.2
tomli==2.0.1
toolz==0.9.0
tqdm==4.67.1
traitlets==4.3.2
trie==1.4.0
twine==3.1.1
typed-ast==1.4.3
typing-extensions==3.7.4.1
typing-inspect==0.4.0
urllib3==1.25.3
varint==1.0.2
watchdog==3.0.0
web3==5.9.0
webargs==5.3.1
webencodings==0.5.1
websockets==8.1
Werkzeug==0.15.4
wmctrl==0.5
wrapt==1.11.2
zipp==3.1.0

name: raiden-services
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - aniso8601==7.0.0
      - appdirs==1.4.4
      - asn1crypto==1.3.0
      - astroid==2.3.3
      - attrs==19.3.0
      - babel==2.14.0
      - base58==2.0.0
      - bitarray==1.2.1
      - black==19.10b0
      - blake2b-py==0.1.4
      - bleach==6.0.0
      - blinker==1.6.3
      - bump2version==1.0.1
      - cached-property==1.5.2
      - cachetools==3.1.1
      - certifi==2019.3.9
      - cffi==1.12.3
      - chardet==3.0.4
      - click==7.0
      - coincurve==13.0.0
      - colorama==0.4.1
      - coverage==7.2.7
      - cryptography==44.0.2
      - cytoolz==0.10.1
      - decorator==4.4.0
      - docutils==0.20.1
      - entrypoints==0.3
      - eth-abi==2.1.0
      - eth-account==0.5.2
      - eth-bloom==1.0.3
      - eth-hash==0.2.0
      - eth-keyfile==0.5.1
      - eth-keys==0.2.4
      - eth-rlp==0.1.2
      - eth-tester==0.4.0b2
      - eth-typing==2.2.1
      - eth-utils==1.8.4
      - exceptiongroup==1.2.2
      - execnet==2.0.2
      - fancycompleter==0.9.1
      - filelock==3.0.12
      - flake8==3.7.9
      - flake8-bugbear==20.1.2
      - flake8-tuple==0.4.1
      - flask==1.0.3
      - flask-cors==3.0.8
      - flask-restful==0.3.7
      - gevent==1.5a3
      - graphviz==0.13.2
      - greenlet==0.4.15
      - guppy3==3.0.9
      - hexbytes==0.2.0
      - idna==2.8
      - imagesize==1.4.1
      - importlib-metadata==1.5.0
      - iniconfig==2.0.0
      - ipfshttpclient==0.4.12
      - ipython==4.2.1
      - ipython-genutils==0.2.0
      - isort==4.3.21
      - itsdangerous==1.1.0
      - jeepney==0.9.0
      - jinja2==2.10.1
      - jsonschema==3.2.0
      - keyring==22.3.0
      - lazy-object-proxy==1.4.3
      - lru-dict==1.1.6
      - markupsafe==1.1.1
      - marshmallow==3.4.0
      - marshmallow-dataclass==6.0.0
      - marshmallow-enum==1.5.1
      - marshmallow-polyfield==5.8
      - matrix-client==0.3.2
      - mccabe==0.6.1
      - mirakuru==2.1.2
      - multiaddr==0.0.9
      - mypy==0.770
      - mypy-extensions==0.4.3
      - netaddr==0.7.19
      - netifaces==0.10.9
      - networkx==2.3
      - objgraph==3.4.1
      - packaging==24.0
      - parsimonious==0.8.1
      - pathspec==0.11.2
      - pdbpp==0.10.3
      - pexpect==4.7.0
      - pickleshare==0.7.5
      - pkginfo==1.10.0
      - pluggy==1.2.0
      - protobuf==3.11.3
      - psutil==5.6.6
      - ptyprocess==0.6.0
      - py-ecc==1.4.7
      - py-evm==0.3.0a15
      - py-geth==2.1.0
      - py-solc==3.2.0
      - pycodestyle==2.5.0
      - pycparser==2.19
      - pycryptodome==3.8.2
      - pyethash==0.1.27
      - pyflakes==2.1.1
      - pygments==2.17.2
      - pylint==2.4.4
      - pyrepl==0.9.0
      - pyrsistent==0.15.7
      - pysha3==1.0.2
      - pytest==7.4.4
      - pytest-cov==4.1.0
      - pytest-gevent==1.1.0
      - pytest-runner==6.0.1
      - pytest-structlog==0.2
      - pytest-xdist==3.5.0
      - pytoml==0.1.20
      - pytz==2019.1
      - raiden==0.200.0rc9
      - raiden-contracts==0.37.0
      - raiden-webui==0.11.0
      - readme-renderer==37.3
      - regex==2024.4.16
      - requests==2.22.0
      - requests-toolbelt==1.0.0
      - rlp==1.1.0
      - secretstorage==3.3.3
      - semantic-version==2.6.0
      - semver==2.8.1
      - sentry-sdk==0.14.1
      - simplegeneric==0.8.1
      - six==1.12.0
      - snowballstemmer==2.2.0
      - sphinx==1.8.4
      - sphinx-rtd-theme==0.4.2
      - sphinxcontrib-serializinghtml==1.1.5
      - sphinxcontrib-websupport==1.2.4
      - structlog==20.1.0
      - toml==0.10.2
      - tomli==2.0.1
      - toolz==0.9.0
      - tqdm==4.67.1
      - traitlets==4.3.2
      - trie==1.4.0
      - twine==3.1.1
      - typed-ast==1.4.3
      - typing-extensions==3.7.4.1
      - typing-inspect==0.4.0
      - urllib3==1.25.3
      - varint==1.0.2
      - watchdog==3.0.0
      - web3==5.9.0
      - webargs==5.3.1
      - webencodings==0.5.1
      - websockets==8.1
      - werkzeug==0.15.4
      - wmctrl==0.5
      - wrapt==1.11.2
      - zipp==3.1.0
prefix: /opt/conda/envs/raiden-services

tests/libs/test_blockchain.py::test_limit_inclusivity_in_query_blockchain_events tests/libs/test_blockchain.py::test_get_blockchain_events_returns_early_for_invalid_interval tests/monitoring/monitoring_service/test_end_to_end.py::test_first_allowed_monitoring tests/monitoring/monitoring_service/test_end_to_end.py::test_e2e
tests/libs/test_blockchain.py::test_get_pessimistic_udc_balance tests/libs/test_blockchain.py::test_get_blockchain_events_adaptive_reduces_block_interval_after_timeout
src/raiden_libs/blockchain.py
src/raiden_libs/blockchain.py