mirror of https://github.com/nucypher/nucypher.git
Remove problematic gas feed for now, and make gas feeds more robust against errors.
Ensure median returns an int.pull/2771/head
parent
b8a21ae542
commit
9487979fae
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue