From 3b71e45a08b626b1f466fa2f10d1002034a7405e Mon Sep 17 00:00:00 2001 From: liobrasil Date: Wed, 4 Feb 2026 16:27:41 -0400 Subject: [PATCH] perf: optimize pending queue lookup from O(n) to O(1) Add isPending() function to registry for direct dictionary lookup instead of iterating over array returned by getPendingYieldVaultIDs(). Co-Authored-By: Claude Opus 4.5 --- cadence/contracts/FlowYieldVaultsSchedulerRegistry.cdc | 5 +++++ cadence/contracts/FlowYieldVaultsSchedulerV1.cdc | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cadence/contracts/FlowYieldVaultsSchedulerRegistry.cdc b/cadence/contracts/FlowYieldVaultsSchedulerRegistry.cdc index 645d7e0a..42cccbdb 100644 --- a/cadence/contracts/FlowYieldVaultsSchedulerRegistry.cdc +++ b/cadence/contracts/FlowYieldVaultsSchedulerRegistry.cdc @@ -153,6 +153,11 @@ access(all) contract FlowYieldVaultsSchedulerRegistry { return self.pendingQueue.keys } + /// Check if a yield vault ID is in the pending queue - O(1) lookup + access(all) view fun isPending(yieldVaultID: UInt64): Bool { + return self.pendingQueue.containsKey(yieldVaultID) + } + /// Get paginated pending yield vault IDs /// @param page: The page number (0-indexed) /// @param size: The page size (defaults to MAX_BATCH_SIZE if nil) diff --git a/cadence/contracts/FlowYieldVaultsSchedulerV1.cdc b/cadence/contracts/FlowYieldVaultsSchedulerV1.cdc index dd15812c..a8b0ecdf 100644 --- a/cadence/contracts/FlowYieldVaultsSchedulerV1.cdc +++ b/cadence/contracts/FlowYieldVaultsSchedulerV1.cdc @@ -186,9 +186,7 @@ access(all) contract FlowYieldVaultsSchedulerV1 { scanned = scanned + 1 // Skip if already in pending queue - // TODO: This is extremely inefficient - accessing from mapping is preferrable to iterating over - // an array - if FlowYieldVaultsSchedulerRegistry.getPendingYieldVaultIDs().contains(yieldVaultID) { + if FlowYieldVaultsSchedulerRegistry.isPending(yieldVaultID: yieldVaultID) { continue }