magicblock-labs / magicblock-labs/magicblock-validator

Oversized committor transactions leave accounts stuck undelegating

Open
#1,693 0 comments 0 reactions 1 assignee View on GitHub

@GabrielePicco is already working on this.

Since Sep 18, 2026.

bug
Dominant language
Rust
Stars
58
Forks
58
Avg merge
22h 1m
Merged PRs (30d)
53

Description

## Problem

A buffered commit-and-undelegate intent for 10 accounts failed after three attempts (~6.5 minutes) with `CannotConfirmTransactionSignatureStatus`, leaving all accounts undelegating. Buffer preparation and ALT updates landed; the commit transactions did not. Restart recovery retried the same failing intent, with `stuck_accounts=None` in the recovered-intent warning.

The reported commit transaction referenced 66 distinct account keys (six per account plus six shared), exceeding the deployment’s 64-account lock limit. The original investigation reported devnet simulations succeeding at 64 keys and returning `TooManyAccountLocks` at 65. ALTs reduce wire size, not the number of locked accounts.

`TaskStrategist` and `IntentSizeValidator` check serialized size but not account count. With `skip_preflight: true`, the rejection surfaced as repeated confirmation timeouts. The report also identifies oversized finalize and restart-recovery variants.

## Reproduction

1. Delegate 10 accounts whose commits use the buffer path.
2. Schedule one commit-and-undelegate intent covering all 10 on a base-layer deployment with the 64-account lock limit.
3. Observe repeated confirmation timeouts and accounts remaining undelegating, including after restart.

## Expected

- Transaction fit checks account for both the 64-account lock limit and wire size across commit, finalize, and recovery paths. Oversized intents are split into valid transactions rather than stranded.
- Simulation after the first confirmation timeout exposes deterministic rejection errors instead of repeating doomed attempts.
- Recovered-intent diagnostics identify stuck accounts, with regression coverage for the 10-account buffered case.

## Context

Reported on v0.15.3 (`e0dd09e`), Linux x86_64, using devnet as the base layer. Intent `1262434` took 389.46 seconds to fail.

[ER failure transaction](https://explorer.solana.com/tx/3MzaokuZMwzdnC5cCpAssthMa491Xwf7z1MvvXrzLuQ3yWbfFxnoSbptoBghvQwaJXQiKXPCGiu62zr2a7JzmLwQ?cluster=custom&customUrl=https%3A%2F%2Fdevnet-as.magicblock.app%2F) · [Agave account-lock limit](https://github.com/anza-xyz/agave/blob/v4.2.2/runtime/src/bank.rs#L3621-L3629)

Final unconfirmed base-layer signature: `4moeZBGYbR4F2hQeG3scnxPbfB6iK8XkFbTt85qVJhS8hrHY7PEnUEh3PJRirpr1HWKFapZRJRWKw82ReeWpHo6a`.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.