Skip to content

Commit 2271ba2

Browse files
committed
Allow usage of Infura's v3 API
1 parent 0e8dad6 commit 2271ba2

File tree

3 files changed

+59
-21
lines changed

3 files changed

+59
-21
lines changed

Diff for: tests/core/providers/test_auto_provider.py

+44-8
Original file line numberDiff line numberDiff line change
@@ -33,44 +33,74 @@ def test_load_provider_from_env(monkeypatch, uri, expected_type, expected_attrs)
3333
assert getattr(provider, attr) == val
3434

3535

36-
@pytest.mark.parametrize('environ_name', ['INFURA_API_KEY', 'WEB3_INFURA_API_KEY'])
36+
@pytest.mark.parametrize('environ_name', ['WEB3_INFURA_API_KEY', 'WEB3_INFURA_PROJECT_ID'])
3737
def test_web3_auto_infura_empty_key(monkeypatch, caplog, environ_name):
3838
monkeypatch.setenv('WEB3_INFURA_SCHEME', 'https')
3939
monkeypatch.setenv(environ_name, '')
4040

4141
importlib.reload(infura)
4242
assert len(caplog.record_tuples) == 1
4343
logger, level, msg = caplog.record_tuples[0]
44-
assert 'WEB3_INFURA_API_KEY' in msg
44+
assert 'WEB3_INFURA_PROJECT_ID' in msg
4545
assert level == logging.WARNING
4646

4747
w3 = infura.w3
4848
assert isinstance(w3.provider, HTTPProvider)
4949
assert getattr(w3.provider, 'endpoint_uri') == 'https://mainnet.infura.io/'
5050

5151

52-
@pytest.mark.parametrize('environ_name', ['INFURA_API_KEY', 'WEB3_INFURA_API_KEY'])
52+
@pytest.mark.parametrize('environ_name', ['WEB3_INFURA_API_KEY', 'WEB3_INFURA_PROJECT_ID'])
5353
def test_web3_auto_infura_deleted_key(monkeypatch, caplog, environ_name):
5454
monkeypatch.setenv('WEB3_INFURA_SCHEME', 'https')
5555
monkeypatch.delenv(environ_name, raising=False)
5656

5757
importlib.reload(infura)
5858
assert len(caplog.record_tuples) == 1
5959
logger, level, msg = caplog.record_tuples[0]
60-
assert 'WEB3_INFURA_API_KEY' in msg
60+
assert 'WEB3_INFURA_PROJECT_ID' in msg
6161
assert level == logging.WARNING
6262

6363
w3 = infura.w3
6464
assert isinstance(w3.provider, HTTPProvider)
6565
assert getattr(w3.provider, 'endpoint_uri') == 'https://mainnet.infura.io/'
6666

6767

68-
@pytest.mark.parametrize('environ_name', ['INFURA_API_KEY', 'WEB3_INFURA_API_KEY'])
68+
@pytest.mark.parametrize('environ_name', ['WEB3_INFURA_API_KEY', 'WEB3_INFURA_PROJECT_ID'])
69+
def test_web3_auto_infura_websocket_empty_key(monkeypatch, caplog, environ_name):
70+
monkeypatch.setenv(environ_name, '')
71+
72+
importlib.reload(infura)
73+
assert len(caplog.record_tuples) == 1
74+
logger, level, msg = caplog.record_tuples[0]
75+
assert 'WEB3_INFURA_PROJECT_ID' in msg
76+
assert level == logging.WARNING
77+
78+
w3 = infura.w3
79+
assert isinstance(w3.provider, WebsocketProvider)
80+
assert getattr(w3.provider, 'endpoint_uri') == 'wss://mainnet.infura.io/ws/'
81+
82+
83+
@pytest.mark.parametrize('environ_name', ['WEB3_INFURA_API_KEY', 'WEB3_INFURA_PROJECT_ID'])
84+
def test_web3_auto_infura_websocket_deleted_key(monkeypatch, caplog, environ_name):
85+
monkeypatch.delenv(environ_name, raising=False)
86+
87+
importlib.reload(infura)
88+
assert len(caplog.record_tuples) == 1
89+
logger, level, msg = caplog.record_tuples[0]
90+
assert 'WEB3_INFURA_PROJECT_ID' in msg
91+
assert level == logging.WARNING
92+
93+
w3 = infura.w3
94+
assert isinstance(w3.provider, WebsocketProvider)
95+
assert getattr(w3.provider, 'endpoint_uri') == 'wss://mainnet.infura.io/ws/'
96+
97+
98+
@pytest.mark.parametrize('environ_name', ['WEB3_INFURA_API_KEY', 'WEB3_INFURA_PROJECT_ID'])
6999
def test_web3_auto_infura(monkeypatch, caplog, environ_name):
70100
monkeypatch.setenv('WEB3_INFURA_SCHEME', 'https')
71101
API_KEY = 'aoeuhtns'
72102
monkeypatch.setenv(environ_name, API_KEY)
73-
expected_url = 'https://%s/%s' % (infura.INFURA_MAINNET_DOMAIN, API_KEY)
103+
expected_url = 'https://%s/v3/%s' % (infura.INFURA_MAINNET_DOMAIN, API_KEY)
74104

75105
importlib.reload(infura)
76106
assert len(caplog.record_tuples) == 0
@@ -80,10 +110,16 @@ def test_web3_auto_infura(monkeypatch, caplog, environ_name):
80110
assert getattr(w3.provider, 'endpoint_uri') == expected_url
81111

82112

83-
def test_web3_auto_infura_websocket_default(caplog):
113+
@pytest.mark.parametrize('environ_name', ['WEB3_INFURA_API_KEY', 'WEB3_INFURA_PROJECT_ID'])
114+
def test_web3_auto_infura_websocket_default(monkeypatch, caplog, environ_name):
115+
monkeypatch.setenv('WEB3_INFURA_SCHEME', 'wss')
116+
API_KEY = 'aoeuhtns'
117+
monkeypatch.setenv(environ_name, API_KEY)
118+
expected_url = 'wss://%s/ws/v3/%s' % (infura.INFURA_MAINNET_DOMAIN, API_KEY)
119+
84120
importlib.reload(infura)
85121
assert len(caplog.record_tuples) == 0
86122

87123
w3 = infura.w3
88124
assert isinstance(w3.provider, WebsocketProvider)
89-
assert getattr(w3.provider, 'endpoint_uri') == 'wss://mainnet.infura.io/ws'
125+
assert getattr(w3.provider, 'endpoint_uri') == expected_url

Diff for: web3/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
if sys.version_info < (3, 5):
1212
raise EnvironmentError(
1313
"Python 3.5 or above is required. "
14-
"Note that support for Python 3.5 will be remove in web3.py v5")
14+
"Note that support for Python 3.5 will be removed in web3.py v5")
1515

1616
from eth_account import Account # noqa: E402
1717
from web3.main import Web3 # noqa: E402

Diff for: web3/auto/infura/endpoints.py

+14-12
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,29 @@
1515

1616

1717
def load_api_key():
18-
# at web3py v5, drop old variable name INFURA_API_KEY
19-
key = os.environ.get(
20-
'WEB3_INFURA_API_KEY',
21-
os.environ.get('INFURA_API_KEY', '')
22-
)
18+
# in web3py v6 remove outdated WEB3_INFURA_API_KEY
19+
key = os.environ.get('WEB3_INFURA_PROJECT_ID',
20+
os.environ.get('WEB3_INFURA_API_KEY', ''))
2321
if key == '':
2422
logging.getLogger('web3.auto.infura').warning(
25-
"No Infura API Key found. Add environment variable WEB3_INFURA_API_KEY to ensure "
26-
"continued API access. New keys are available at https://infura.io/register"
23+
"No Infura Project ID found. Add environment variable WEB3_INFURA_PROJECT_ID to "
24+
" ensure continued API access after March 27th. "
25+
"New keys are available at https://infura.io/register"
2726
)
2827
return key
2928

3029

3130
def build_infura_url(domain):
3231
scheme = os.environ.get('WEB3_INFURA_SCHEME', WEBSOCKET_SCHEME)
33-
34-
if scheme == WEBSOCKET_SCHEME:
35-
# websockets doesn't use the API key (yet?)
36-
return "%s://%s/ws" % (scheme, domain)
32+
key = load_api_key()
33+
34+
if key and scheme == WEBSOCKET_SCHEME:
35+
return "%s://%s/ws/v3/%s" % (scheme, domain, key)
36+
elif key and scheme == HTTP_SCHEME:
37+
return "%s://%s/v3/%s" % (scheme, domain, key)
38+
elif scheme == WEBSOCKET_SCHEME:
39+
return "%s://%s/ws/" % (scheme, domain)
3740
elif scheme == HTTP_SCHEME:
38-
key = load_api_key()
3941
return "%s://%s/%s" % (scheme, domain, key)
4042
else:
4143
raise ValidationError("Cannot connect to Infura with scheme %r" % scheme)

0 commit comments

Comments
 (0)