From 1dd5eb854ee4aea1067c91320ed660afa252791e Mon Sep 17 00:00:00 2001
From: Piotr Roslaniec
Date: Fri, 13 Aug 2021 10:17:11 +0200
Subject: [PATCH] Return meaningful error if there are not enough Ursulas
---
nucypher/policy/reservoir.py | 4 +++-
nucypher/utilities/porter/porter.py | 4 ++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/nucypher/policy/reservoir.py b/nucypher/policy/reservoir.py
index cbdb3e717..3a211e58b 100644
--- a/nucypher/policy/reservoir.py
+++ b/nucypher/policy/reservoir.py
@@ -14,7 +14,7 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with nucypher. If not, see .
"""
-from typing import Iterable, Optional, List
+from typing import Iterable, List, Optional
from eth_typing import ChecksumAddress
@@ -86,6 +86,8 @@ class MergedReservoir:
else:
return None
+ def __len__(self):
+ return len(self.values) + len(self.reservoir)
class PrefetchStrategy:
"""
diff --git a/nucypher/utilities/porter/porter.py b/nucypher/utilities/porter/porter.py
index 8271ad299..40f65d3dd 100644
--- a/nucypher/utilities/porter/porter.py
+++ b/nucypher/utilities/porter/porter.py
@@ -112,6 +112,10 @@ the Pipe for nucypher network operations
exclude_ursulas: Optional[Sequence[ChecksumAddress]] = None,
include_ursulas: Optional[Sequence[ChecksumAddress]] = None) -> List[UrsulaInfo]:
reservoir = self._make_staker_reservoir(quantity, duration_periods, exclude_ursulas, include_ursulas)
+
+ if len(reservoir) < quantity:
+ raise ValueError(f"Requested quantity={quantity} Ursulas, but only {len(reservoir)} are available")
+
value_factory = PrefetchStrategy(reservoir, quantity)
def get_ursula_info(ursula_address) -> Porter.UrsulaInfo: