Skip to content

Commit f1e8e91

Browse files
authored
Merge pull request #1005 from dylanjw/address-to-list-filter-params
Accept list or string for `filter_param` address
2 parents 6ffc959 + 3e8f2e4 commit f1e8e91

File tree

6 files changed

+76
-1
lines changed

6 files changed

+76
-1
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import pytest
2+
3+
from web3 import Web3
4+
from web3.middleware import ( # noqa: F401
5+
construct_result_generator_middleware,
6+
request_parameter_normalizer,
7+
)
8+
from web3.providers.base import (
9+
BaseProvider,
10+
)
11+
12+
13+
@pytest.fixture
14+
def w3_base():
15+
return Web3(providers=[BaseProvider()], middlewares=[])
16+
17+
18+
@pytest.fixture
19+
def result_generator_middleware():
20+
return construct_result_generator_middleware({
21+
'eth_getLogs': lambda _, params: params,
22+
})
23+
24+
25+
@pytest.fixture
26+
def w3(w3_base, result_generator_middleware):
27+
w3_base.middleware_stack.add(result_generator_middleware)
28+
w3_base.middleware_stack.add(request_parameter_normalizer)
29+
return w3_base
30+
31+
32+
def test_eth_getLogs_param_normalization(w3):
33+
result = w3.eth.getLogs({
34+
'from': 'latest', 'address': '0x1111111111111111111111111111111111111111'})
35+
assert isinstance(result[0]['address'], list)

web3/manager.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
name_to_address_middleware,
1717
normalize_errors_middleware,
1818
pythonic_middleware,
19+
request_parameter_normalizer,
1920
validation_middleware,
2021
)
2122
from web3.providers import (
@@ -70,6 +71,7 @@ def default_middlewares(web3):
7071
Leaving ens unspecified will prevent the middleware from resolving names.
7172
'''
7273
return [
74+
(request_parameter_normalizer, 'request_param_normalizer'),
7375
(gas_price_strategy_middleware, 'gas_price_strategy'),
7476
(name_to_address_middleware(web3), 'name_to_address'),
7577
(attrdict_middleware, 'attrdict'),

web3/middleware/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
from .normalize_errors import ( # noqa: F401
3535
normalize_errors_middleware,
3636
)
37+
from .normalize_request_parameters import ( # noqa: F401
38+
request_parameter_normalizer,
39+
)
3740
from .pythonic import ( # noqa: F401
3841
pythonic_middleware,
3942
)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from eth_utils import (
2+
is_string,
3+
)
4+
5+
from web3.utils.formatters import (
6+
apply_formatter_at_index,
7+
apply_formatter_if,
8+
apply_formatters_to_dict,
9+
)
10+
11+
from .formatting import (
12+
construct_formatting_middleware,
13+
)
14+
15+
FILTER_PARAM_NORMALIZERS = apply_formatters_to_dict({
16+
'address': apply_formatter_if(is_string, lambda x: [x])})
17+
18+
METHOD_NORMALIZERS = {
19+
'eth_getLogs': apply_formatter_at_index(FILTER_PARAM_NORMALIZERS, 0),
20+
'eth_newFilter': apply_formatter_at_index(FILTER_PARAM_NORMALIZERS, 0)
21+
}
22+
23+
request_parameter_normalizer = construct_formatting_middleware(
24+
request_formatters=METHOD_NORMALIZERS,
25+
)

web3/utils/module_testing/eth_module.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,16 @@ def test_eth_getLogs_without_logs(self, web3, block_with_txn_with_log):
677677
result = web3.eth.getLogs(filter_params)
678678
assert len(result) == 0
679679

680+
# Test with multiple `address`
681+
682+
# filter with other address
683+
filter_params = {
684+
"fromBlock": 0,
685+
"address": [UNKNOWN_ADDRESS, UNKNOWN_ADDRESS],
686+
}
687+
result = web3.eth.getLogs(filter_params)
688+
assert len(result) == 0
689+
680690
def test_eth_getLogs_with_logs(
681691
self,
682692
web3,

web3/utils/rpc_abi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
FILTER_PARAMS_ABIS = {
2626
'to': 'address',
27-
'address': 'address',
27+
'address': 'address[]',
2828
}
2929

3030
TRACE_PARAMS_ABIS = {

0 commit comments

Comments
 (0)