Skip to content

Fix supervisor: report vault execution so stuck-scan order isn't fixed#187

Open
holyfuchs wants to merge 3 commits intomainfrom
holyfuchs/supervisor-fix
Open

Fix supervisor: report vault execution so stuck-scan order isn't fixed#187
holyfuchs wants to merge 3 commits intomainfrom
holyfuchs/supervisor-fix

Conversation

@holyfuchs
Copy link
Member

@holyfuchs holyfuchs commented Feb 25, 2026

Closes: #177

Description

The supervisor “check the first N vaults” logic was fixed: vault executions are now reported to the registry, which keeps an ordered list of “least recently executed” vaults. The supervisor then scans only those first N (e.g. 5) and recovers the ones that are actually stuck, instead of always the same fixed set.

What was implemented

  • Execution callback
    Each AutoBalancer now has an execution callback that runs after a scheduled rebalance. The callback calls the registry with that vault’s id so the registry can update its internal order (remove id from the list, append to the end).

  • Shared callback resource
    In FlowYieldVaultsAutoBalancers, a single RegistryReportCallback resource per account implements DeFiActions.AutoBalancerExecutionCallback. Its onExecuted(balancerUUID) calls the registry so the vault that just ran is reported by id. Every new AutoBalancer gets a capability to this shared callback and passes it to setExecutionCallback(cap).

Context (from discussion)

The supervisor was limited to processing a small batch (e.g. first 5 vaults) per run. The agreed short-term approach was to order the vault list by “last executed” so the supervisor always checks the oldest / least recently executed vaults first (most likely stuck).

added autobalancer callback to find potentially stuck vaults
@holyfuchs holyfuchs force-pushed the holyfuchs/supervisor-fix branch from a6cce3f to b2af175 Compare February 25, 2026 20:16
@holyfuchs holyfuchs changed the title feat(scheduler): FlowAutoBalancer + stuck-scan order for Supervisor Fix supervisor: report vault execution so stuck-scan order isn't fixed Feb 25, 2026
@holyfuchs holyfuchs self-assigned this Mar 2, 2026
@holyfuchs holyfuchs marked this pull request as ready for review March 3, 2026 19:44
@holyfuchs holyfuchs requested a review from a team as a code owner March 3, 2026 19:44
@holyfuchs
Copy link
Member Author

holyfuchs commented Mar 4, 2026

Failing tests are due to rounding issues and should be fixed with:
onflow/FlowALP#188

Just for info:
This PR required changes in FlowActions.
FlowYieldVaults has FlowALP as submodule which has FlowActions as submodule, hence the need to update FlowALP.
But since FlowALP main contains changes currently not compatible with FlowYieldVaults, we are using a different branch.

return
}
var i = 0
while i < self.stuckScanOrder.length {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can use firstIndex(of: T): Int? to find the element here
https://cadence-lang.org/docs/language/values-and-types/arrays#array-fields-and-functions

let pending = self.pendingQueue.remove(key: yieldVaultID)
var i = 0
while i < self.stuckScanOrder.length {
if self.stuckScanOrder[i] == yieldVaultID {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

Comment on lines +190 to +191
access(all) view fun getPendingYieldVaultIDsPaginated(page: Int, size: UInt?): [UInt64] {
let pageSize = size ?? Int(self.MAX_BATCH_SIZE)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
access(all) view fun getPendingYieldVaultIDsPaginated(page: Int, size: UInt?): [UInt64] {
let pageSize = size ?? Int(self.MAX_BATCH_SIZE)
access(all) view fun getPendingYieldVaultIDsPaginated(page: Int, size: UInt): [UInt64] {
let pageSize = size == 0 ? Int(self.MAX_BATCH_SIZE) : Int(size)

main no longer replaces 0 with nil, so the behaviour of defaulting to MAX_BATCH_SIZE on 0 should either be moved here (and its other occurrence updated, and the doc comment above) or added back to main

let pageSize: Int? = size > 0 ? size : nil
return FlowYieldVaultsSchedulerRegistry.getPendingYieldVaultIDsPaginated(page: page, size: pageSize)
access(all) fun main(page: Int, size: UInt): [UInt64] {
return FlowYieldVaultsSchedulerRegistry.getPendingYieldVaultIDsPaginated(page: page, size: size)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Either update getPendingYieldVaultIDsPaginated or add back the default check here

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Supervisor is only supervising 5 vaults

3 participants