Remove problematic gas feed for now, and make gas feeds more robust against errors.

Ensure median returns an int.
pull/2771/head
derekpierre 2021-08-12 09:26:08 -04:00
parent b8a21ae542
commit 9487979fae
2 changed files with 31 additions and 32 deletions

View File

@ -65,14 +65,15 @@ def max_price_gas_strategy_wrapper(gas_strategy: Callable, max_gas_price_wei: in
def construct_datafeed_median_strategy(speed: Optional[str] = None) -> Callable:
def datafeed_median_gas_price_strategy(web3: Web3, transaction_params: TxParams = None) -> Wei:
feeds = (UpvestGasPriceDatafeed, EtherchainGasPriceDatafeed, ZoltuGasPriceDatafeed)
feeds = (UpvestGasPriceDatafeed, ZoltuGasPriceDatafeed) # removed EtherchainGasPriceDatafeed due to EIP-1559
prices = []
for gas_price_feed_class in feeds:
try:
gas_strategy = gas_price_feed_class.construct_gas_strategy(speed=speed)
gas_price = gas_strategy(web3, transaction_params)
except Datafeed.DatafeedError:
except Exception:
# some problem; onward and upward
continue
else:
prices.append(gas_price)

View File

@ -232,44 +232,42 @@ def test_datafeed_median_gas_price_strategy():
# In normal circumstances, all datafeeds in the strategy work, and the median is returned
with patch('nucypher.utilities.datafeeds.UpvestGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_upvest_gas_price)):
with patch('nucypher.utilities.datafeeds.EtherchainGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_etherchain_gas_price)):
with patch('nucypher.utilities.datafeeds.ZoltuGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_zoltu_gas_price)):
datafeed_median_gas_price_strategy = construct_datafeed_median_strategy()
assert datafeed_median_gas_price_strategy("web3", "tx") == median([mock_etherchain_gas_price,
mock_upvest_gas_price,
mock_zoltu_gas_price])
# with patch('nucypher.utilities.datafeeds.EtherchainGasPriceDatafeed.construct_gas_strategy',
# return_value=construct_mock_gas_strategy(mock_etherchain_gas_price)):
with patch('nucypher.utilities.datafeeds.ZoltuGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_zoltu_gas_price)):
datafeed_median_gas_price_strategy = construct_datafeed_median_strategy()
assert datafeed_median_gas_price_strategy("web3", "tx") == median([mock_upvest_gas_price,
mock_zoltu_gas_price])
# If, for example, Upvest fails, the median is computed using the other two feeds
with patch('nucypher.utilities.datafeeds.UpvestGasPriceDatafeed._probe_feed',
side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.datafeeds.EtherchainGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_etherchain_gas_price)):
with patch('nucypher.utilities.datafeeds.ZoltuGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_zoltu_gas_price)):
datafeed_median_gas_price_strategy = construct_datafeed_median_strategy()
assert datafeed_median_gas_price_strategy("web3", "tx") == median([mock_etherchain_gas_price,
mock_zoltu_gas_price])
# with patch('nucypher.utilities.datafeeds.EtherchainGasPriceDatafeed.construct_gas_strategy',
# return_value=construct_mock_gas_strategy(mock_etherchain_gas_price)):
with patch('nucypher.utilities.datafeeds.ZoltuGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_zoltu_gas_price)):
datafeed_median_gas_price_strategy = construct_datafeed_median_strategy()
assert datafeed_median_gas_price_strategy("web3", "tx") == median([mock_zoltu_gas_price])
# If only one feed works, then the return value corresponds to this feed
with patch('nucypher.utilities.datafeeds.UpvestGasPriceDatafeed._probe_feed',
side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.datafeeds.EtherchainGasPriceDatafeed._probe_feed',
side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.datafeeds.ZoltuGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_zoltu_gas_price)):
datafeed_median_gas_price_strategy = construct_datafeed_median_strategy()
assert datafeed_median_gas_price_strategy("web3", "tx") == mock_zoltu_gas_price
# with patch('nucypher.utilities.datafeeds.EtherchainGasPriceDatafeed._probe_feed',
# side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.datafeeds.ZoltuGasPriceDatafeed.construct_gas_strategy',
return_value=construct_mock_gas_strategy(mock_zoltu_gas_price)):
datafeed_median_gas_price_strategy = construct_datafeed_median_strategy()
assert datafeed_median_gas_price_strategy("web3", "tx") == mock_zoltu_gas_price
# If all feeds fail, we fallback to the rpc_gas_price_strategy
with patch('nucypher.utilities.datafeeds.EtherchainGasPriceDatafeed._probe_feed',
# with patch('nucypher.utilities.datafeeds.EtherchainGasPriceDatafeed._probe_feed',
# side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.datafeeds.UpvestGasPriceDatafeed._probe_feed',
side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.datafeeds.UpvestGasPriceDatafeed._probe_feed',
side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.datafeeds.ZoltuGasPriceDatafeed._probe_feed',
side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.gas_strategies.rpc_gas_price_strategy',
side_effect=construct_mock_gas_strategy(mock_rpc_gas_price)):
datafeed_median_gas_price_strategy = construct_datafeed_median_strategy()
assert datafeed_median_gas_price_strategy("web3", "tx") == mock_rpc_gas_price
with patch('nucypher.utilities.datafeeds.ZoltuGasPriceDatafeed._probe_feed',
side_effect=Datafeed.DatafeedError):
with patch('nucypher.utilities.gas_strategies.rpc_gas_price_strategy',
side_effect=construct_mock_gas_strategy(mock_rpc_gas_price)):
datafeed_median_gas_price_strategy = construct_datafeed_median_strategy()
assert datafeed_median_gas_price_strategy("web3", "tx") == mock_rpc_gas_price