From 31c9ead04b30d1608df5241b5eab227fd72c6b99 Mon Sep 17 00:00:00 2001 From: Florian Stecker Date: Tue, 18 Aug 2026 17:22:05 +0200 Subject: [PATCH 1/4] Use GetOpenReputerSubmissionWindows query --- src/allora_sdk/worker/reputer.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/allora_sdk/worker/reputer.py b/src/allora_sdk/worker/reputer.py index e4472ad..51c8fb0 100644 --- a/src/allora_sdk/worker/reputer.py +++ b/src/allora_sdk/worker/reputer.py @@ -10,9 +10,9 @@ CanSubmitReputerPayloadRequest, EventReputerSubmissionWindowOpened, GetNetworkInferencesAtBlockRequest, + GetOpenReputerSubmissionWindowsRequest, GetStakeFromReputerInTopicInSelfRequest, GetTopicRequest, - GetUnfulfilledReputerNoncesRequest, IsReputerRegisteredInTopicIdRequest, NetworkInferenceBundle, LabeledValue, @@ -118,12 +118,14 @@ async def worker_is_whitelisted(self) -> bool: async def get_unfulfilled_nonces(self) -> set[int]: - # GetUnfulfilledReputerNonces gives all epochs in flight, which is not what we want here - # GetOpenReputerSubmissionWindows would be the more appropriate RPC call, but - # it doesn't seem to be implemented in the rpc client - # Returning [] here means we only react to EventReputerSubmissionWindowOpened - return set() + # So we use GetOpenReputerSubmissionWindows instead + resp = await self.client.emissions.query.get_open_reputer_submission_windows( + GetOpenReputerSubmissionWindowsRequest(topic_id=self.topic_id) + ) + if resp.nonces is None: + return set[int]() + return {x.reputer_nonce.block_height for x in resp.nonces.nonces} async def submit(self, nonce: int, account_seq: int) -> WorkerResult[InputValueBundle] | TxError | Exception: From f449202c5872f56c34bfa45f2f99dc39c18e31ca Mon Sep 17 00:00:00 2001 From: Florian Stecker Date: Thu, 20 Aug 2026 09:20:16 -0400 Subject: [PATCH 2/4] update tests --- tests/test_reputer_submit.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/test_reputer_submit.py b/tests/test_reputer_submit.py index 1d74b6d..c9c19ce 100644 --- a/tests/test_reputer_submit.py +++ b/tests/test_reputer_submit.py @@ -97,9 +97,9 @@ async def test_submit_returns_error_when_network_inferences_missing() -> None: @pytest.mark.asyncio -async def test_get_unfulfilled_nonces_uses_reputer_request_nonces() -> None: +async def test_get_unfulfilled_nonces_uses_open_submission_windows() -> None: client = _make_client() - client.emissions.query.get_unfulfilled_reputer_nonces = AsyncMock( + client.emissions.query.get_open_reputer_submission_windows = AsyncMock( return_value=Mock( nonces=Mock( nonces=[ @@ -112,4 +112,16 @@ async def test_get_unfulfilled_nonces_uses_reputer_request_nonces() -> None: reputer = _make_reputer(client) + assert await reputer.get_unfulfilled_nonces() == {101, 202} + + +@pytest.mark.asyncio +async def test_get_unfulfilled_nonces_empty_when_no_windows_open() -> None: + client = _make_client() + client.emissions.query.get_open_reputer_submission_windows = AsyncMock( + return_value=Mock(nonces=None) + ) + + reputer = _make_reputer(client) + assert await reputer.get_unfulfilled_nonces() == set() From a8330115bd056c1f216dc36eeb12f008a7e41702 Mon Sep 17 00:00:00 2001 From: Florian Stecker Date: Mon, 24 Aug 2026 11:50:22 -0400 Subject: [PATCH 3/4] Handle exceptions during get_unfulfilled_nonces --- src/allora_sdk/worker/worker.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/allora_sdk/worker/worker.py b/src/allora_sdk/worker/worker.py index 972401d..80379f7 100644 --- a/src/allora_sdk/worker/worker.py +++ b/src/allora_sdk/worker/worker.py @@ -745,7 +745,11 @@ async def _maybe_submit_impl(self, ctx: Context, nonce: Optional[int] = None): self.stop() return - nonces = await self.use_case.get_unfulfilled_nonces() + # catch errors so that `nonce` is still processed if query fails + try: + nonces = await self.use_case.get_unfulfilled_nonces() + except Exception as err: + nonces = set() new_nonces = { n for n in nonces if n not in self.submitted_nonces } if nonce is not None and nonce not in self.submitted_nonces: From 58009627f7549287f9cd3246e2c9207213ca4cba Mon Sep 17 00:00:00 2001 From: Florian Stecker Date: Tue, 25 Aug 2026 09:22:00 -0400 Subject: [PATCH 4/4] Add message for failed unfulfilled nonces query --- src/allora_sdk/worker/worker.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/allora_sdk/worker/worker.py b/src/allora_sdk/worker/worker.py index 80379f7..a64d83b 100644 --- a/src/allora_sdk/worker/worker.py +++ b/src/allora_sdk/worker/worker.py @@ -749,6 +749,7 @@ async def _maybe_submit_impl(self, ctx: Context, nonce: Optional[int] = None): try: nonces = await self.use_case.get_unfulfilled_nonces() except Exception as err: + logger.warning(f" Failed querying unfulfilled nonces for topic {self.topic_id}: {err}") nonces = set() new_nonces = { n for n in nonces if n not in self.submitted_nonces }