From df9b16ae8567f6b5cc6df49ebde72d6bbc9a1572 Mon Sep 17 00:00:00 2001 From: glorysr1209-png Date: Sun, 31 May 2026 21:55:54 -0400 Subject: [PATCH] fix: cache swap direction when tracker resolves before terminal event --- allways/validator/event_watcher.py | 6 +++--- allways/validator/swap_tracker.py | 5 +++++ tests/test_swap_tracker.py | 9 +++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/allways/validator/event_watcher.py b/allways/validator/event_watcher.py index eb3dd447..6c17b3c0 100644 --- a/allways/validator/event_watcher.py +++ b/allways/validator/event_watcher.py @@ -694,9 +694,9 @@ def _lookup_swap_direction(self, swap_id: int) -> Tuple[str, str]: if self.swap_tracker is None: return '', '' swap = self.swap_tracker.active.get(swap_id) - if swap is None: - return '', '' - return (swap.from_chain or '').lower(), (swap.to_chain or '').lower() + if swap is not None: + return (swap.from_chain or '').lower(), (swap.to_chain or '').lower() + return self.swap_tracker.resolved_directions.get(swap_id, ('', '')) def record_reservation_pin(self, block_num: int, miner: str, reserved_until: int) -> None: """Pin the miner's commitment as of the reservation block ``block_num``. diff --git a/allways/validator/swap_tracker.py b/allways/validator/swap_tracker.py index 8be32533..b1299cd1 100644 --- a/allways/validator/swap_tracker.py +++ b/allways/validator/swap_tracker.py @@ -38,6 +38,7 @@ def __init__(self, client: AllwaysContractClient, metagraph: Optional[Any] = Non self.last_scanned_id = 0 self.active: Dict[int, Swap] = {} self.voted_ids: Set[int] = set() + self.resolved_directions: Dict[int, tuple[str, str]] = {} def _label(self, swap: Swap) -> str: return _swap_label_with_uid(swap, self.metagraph) @@ -82,6 +83,10 @@ def resolve(self, swap_id: int, status: SwapStatus, block: int): swap = self.active.pop(swap_id, None) if swap is None: return + self.resolved_directions[swap_id] = ( + (swap.from_chain or '').lower(), + (swap.to_chain or '').lower(), + ) swap.status = status swap.completed_block = block self.voted_ids.discard(swap_id) diff --git a/tests/test_swap_tracker.py b/tests/test_swap_tracker.py index 50260fa1..fce77320 100644 --- a/tests/test_swap_tracker.py +++ b/tests/test_swap_tracker.py @@ -160,6 +160,15 @@ def test_event_driven_resolve_drops_swap(self): assert 51 not in tracker.active + def test_resolve_caches_direction_for_late_terminal_events(self): + tracker = make_tracker() + swap = make_swap(swap_id=52, from_chain='btc', to_chain='tao') + tracker.active[swap.id] = swap + + tracker.resolve(swap_id=52, status=SwapStatus.COMPLETED, block=600) + + assert tracker.resolved_directions[52] == ('btc', 'tao') + def test_terminal_status_drops_without_retry(self): tracker = make_tracker() swap = make_swap(swap_id=53)