Error instead of panicking when source account sequence number is at i64::MAX - #2681

Open
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow
Open

Error instead of panicking when source account sequence number is at i64::MAX#2681
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow

Conversation

@Galmanus

Copy link
Copy Markdown

Fixes#2417.

Any account can reach i64::MAX sequence with a single bump_sequence operation. After that, every command that builds a transaction for the account computed sequence + 1, which panics with attempt to add with overflow on debug builds and wraps to i64::MIN on release builds.

The issue reports the tx new path (config::Args::next_sequence_number), but the same unchecked increment exists at 8 more sites.

Fix

Add utils::next_sequence_number (checked add with a descriptive error):

account sequence number is at the maximum value (9223372036854775807); no further transactions can be submitted from this account

and use it at every site that increments an account sequence number:

  • config::Args::next_sequence_number (the issue's repro path)
  • contract invoke (simulation and final tx build)
  • contract upload
  • contract extend
  • contract restore
  • contract deploy (wasm and asset)
  • tx update sequence-number next

Not changed: Assembled::bump_seq_num — it has no in-repo callers and changing it would break its public -> Self signature; it can be handled separately if desired.

Tests

  • test_next_sequence_number — ordinary increments, including i64::MAX - 1 → i64::MAX.
  • test_next_sequence_number_at_max_errors_instead_of_overflowingi64::MAX yields the error instead of overflowing.

CopilotAI balanced review requested due to automatic review settings August 14, 2026 23:01
@github-project-automationgithub-project-automationBot moved this to Backlog (Not Ready) in DevXAug 14, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR prevents integer-overflow panics when incrementing Stellar account sequence numbers by introducing a checked “next sequence number” helper and propagating a dedicated overflow error through CLI commands.

Changes:

  • Added next_sequence_number() helper + SequenceNumberOverflow error and regression tests.
  • Replaced sequence + 1 increments across config/tx/contract commands with checked increment + error propagation.
  • Wired SequenceNumberOverflow into relevant error enums for transparent bubbling.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
cmd/soroban-cli/src/utils.rsAdds checked sequence increment helper, overflow error type, and tests.
cmd/soroban-cli/src/config/mod.rsUses checked increment when deriving the next account sequence number; adds error variant.
cmd/soroban-cli/src/commands/tx/update/sequence_number/next.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/upload.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/restore.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/invoke.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/extend.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/wasm.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/asset.rsSwitches to checked increment and adds overflow error variant.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good instinct on API surface, but SequenceNumberOverflow can't be pub(crate) here. It's the #[from] field type in eight pre-existing pub enum Error variants (contract invoke/upload/extend/restore, deploy wasm + asset, tx update sequence-number next, and config) and the error type of next_sequence_number. Narrowing the struct while those enums stay pub trips the private_interfaces lint, and .cargo/config.toml sets [build] rustflags = ["-Dwarnings", ...], so that fails the build. Downgrading the eight command Error enums to match isn't desirable — they're established public API. So the struct stays pub. I have narrowed next_sequence_number to pub(crate) though — see the other thread.

Comment threadcmd/soroban-cli/src/utils.rs Outdated
/// # Errors
///
/// Returns [`SequenceNumberOverflow`] when `current` is `i64::MAX`.
pub fn next_sequence_number(current: i64) -> Result<i64, SequenceNumberOverflow> {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Done in 4b1dbab — made next_sequence_numberpub(crate); all its callers are in-crate (config, the contract commands, tx::args), verified it still compiles under -D warnings. The SequenceNumberOverflow type has to stay pub (it's the #[from] field in eight pub Error variants — see the sibling comment), but the fn doesn't.

…i64::MAX
Any account can reach `i64::MAX` sequence with a single `bump_sequence`
operation. After that, every command that builds a transaction for the
account computed `sequence + 1`, which panics with "attempt to add with
overflow" on debug builds and wraps to `i64::MIN` on release builds.
Add `utils::next_sequence_number` (checked add with a descriptive error)
and use it at every site that increments an account sequence number:
`config::Args::next_sequence_number`, `contract invoke` (simulation and
final build), `contract upload`, `contract extend`, `contract restore`,
`contract deploy` (wasm and asset), and `tx update sequence-number next`.
`Assembled::bump_seq_num` is left as-is: it has no in-repo callers and
changing it would break its public `-> Self` signature.
Fixesstellar#2417
Copilot review: all callers are in-crate (config, the contract commands, and
tx::args), so the helper doesn't need to be part of the public API. The
SequenceNumberOverflow type stays pub because it is the #[from] field in eight
pub Error variants (see the sibling thread).
@Galmanus
Galmanusforce-pushed the fix/2417-sequence-number-overflow branch from 4b1dbab to f1eafe1CompareSeptember 1, 2026 23:05
CopilotAI review requested due to automatic review settings September 1, 2026 23:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);
+ 1)
.into())
.0;
Ok(crate::utils::next_sequence_number(seq_num)?.into())
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog (Not Ready)

Development

Successfully merging this pull request may close these issues.

CLI panics with "attempt to add with overflow" when building tx for account at INT64_MAX sequence

2 participants

@Galmanus
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Error instead of panicking when source account sequence number is at i64::MAX - #2681

Open
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow
Open

Error instead of panicking when source account sequence number is at i64::MAX#2681
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow

Conversation

@Galmanus

Copy link
Copy Markdown

Fixes#2417.

Any account can reach i64::MAX sequence with a single bump_sequence operation. After that, every command that builds a transaction for the account computed sequence + 1, which panics with attempt to add with overflow on debug builds and wraps to i64::MIN on release builds.

The issue reports the tx new path (config::Args::next_sequence_number), but the same unchecked increment exists at 8 more sites.

Fix

Add utils::next_sequence_number (checked add with a descriptive error):

account sequence number is at the maximum value (9223372036854775807); no further transactions can be submitted from this account

and use it at every site that increments an account sequence number:

  • config::Args::next_sequence_number (the issue's repro path)
  • contract invoke (simulation and final tx build)
  • contract upload
  • contract extend
  • contract restore
  • contract deploy (wasm and asset)
  • tx update sequence-number next

Not changed: Assembled::bump_seq_num — it has no in-repo callers and changing it would break its public -> Self signature; it can be handled separately if desired.

Tests

  • test_next_sequence_number — ordinary increments, including i64::MAX - 1 → i64::MAX.
  • test_next_sequence_number_at_max_errors_instead_of_overflowingi64::MAX yields the error instead of overflowing.

CopilotAI balanced review requested due to automatic review settings August 14, 2026 23:01
@github-project-automationgithub-project-automationBot moved this to Backlog (Not Ready) in DevXAug 14, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR prevents integer-overflow panics when incrementing Stellar account sequence numbers by introducing a checked “next sequence number” helper and propagating a dedicated overflow error through CLI commands.

Changes:

  • Added next_sequence_number() helper + SequenceNumberOverflow error and regression tests.
  • Replaced sequence + 1 increments across config/tx/contract commands with checked increment + error propagation.
  • Wired SequenceNumberOverflow into relevant error enums for transparent bubbling.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
cmd/soroban-cli/src/utils.rsAdds checked sequence increment helper, overflow error type, and tests.
cmd/soroban-cli/src/config/mod.rsUses checked increment when deriving the next account sequence number; adds error variant.
cmd/soroban-cli/src/commands/tx/update/sequence_number/next.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/upload.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/restore.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/invoke.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/extend.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/wasm.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/asset.rsSwitches to checked increment and adds overflow error variant.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good instinct on API surface, but SequenceNumberOverflow can't be pub(crate) here. It's the #[from] field type in eight pre-existing pub enum Error variants (contract invoke/upload/extend/restore, deploy wasm + asset, tx update sequence-number next, and config) and the error type of next_sequence_number. Narrowing the struct while those enums stay pub trips the private_interfaces lint, and .cargo/config.toml sets [build] rustflags = ["-Dwarnings", ...], so that fails the build. Downgrading the eight command Error enums to match isn't desirable — they're established public API. So the struct stays pub. I have narrowed next_sequence_number to pub(crate) though — see the other thread.

Comment threadcmd/soroban-cli/src/utils.rs Outdated
/// # Errors
///
/// Returns [`SequenceNumberOverflow`] when `current` is `i64::MAX`.
pub fn next_sequence_number(current: i64) -> Result<i64, SequenceNumberOverflow> {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Done in 4b1dbab — made next_sequence_numberpub(crate); all its callers are in-crate (config, the contract commands, tx::args), verified it still compiles under -D warnings. The SequenceNumberOverflow type has to stay pub (it's the #[from] field in eight pub Error variants — see the sibling comment), but the fn doesn't.

…i64::MAX
Any account can reach `i64::MAX` sequence with a single `bump_sequence`
operation. After that, every command that builds a transaction for the
account computed `sequence + 1`, which panics with "attempt to add with
overflow" on debug builds and wraps to `i64::MIN` on release builds.
Add `utils::next_sequence_number` (checked add with a descriptive error)
and use it at every site that increments an account sequence number:
`config::Args::next_sequence_number`, `contract invoke` (simulation and
final build), `contract upload`, `contract extend`, `contract restore`,
`contract deploy` (wasm and asset), and `tx update sequence-number next`.
`Assembled::bump_seq_num` is left as-is: it has no in-repo callers and
changing it would break its public `-> Self` signature.
Fixesstellar#2417
Copilot review: all callers are in-crate (config, the contract commands, and
tx::args), so the helper doesn't need to be part of the public API. The
SequenceNumberOverflow type stays pub because it is the #[from] field in eight
pub Error variants (see the sibling thread).
@Galmanus
Galmanusforce-pushed the fix/2417-sequence-number-overflow branch from 4b1dbab to f1eafe1CompareSeptember 1, 2026 23:05
CopilotAI review requested due to automatic review settings September 1, 2026 23:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);
+ 1)
.into())
.0;
Ok(crate::utils::next_sequence_number(seq_num)?.into())
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog (Not Ready)

Development

Successfully merging this pull request may close these issues.

CLI panics with "attempt to add with overflow" when building tx for account at INT64_MAX sequence

2 participants

@Galmanus
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Error instead of panicking when source account sequence number is at i64::MAX - #2681

Open
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow
Open

Error instead of panicking when source account sequence number is at i64::MAX#2681
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow

Conversation

@Galmanus

Copy link
Copy Markdown

Fixes#2417.

Any account can reach i64::MAX sequence with a single bump_sequence operation. After that, every command that builds a transaction for the account computed sequence + 1, which panics with attempt to add with overflow on debug builds and wraps to i64::MIN on release builds.

The issue reports the tx new path (config::Args::next_sequence_number), but the same unchecked increment exists at 8 more sites.

Fix

Add utils::next_sequence_number (checked add with a descriptive error):

account sequence number is at the maximum value (9223372036854775807); no further transactions can be submitted from this account

and use it at every site that increments an account sequence number:

  • config::Args::next_sequence_number (the issue's repro path)
  • contract invoke (simulation and final tx build)
  • contract upload
  • contract extend
  • contract restore
  • contract deploy (wasm and asset)
  • tx update sequence-number next

Not changed: Assembled::bump_seq_num — it has no in-repo callers and changing it would break its public -> Self signature; it can be handled separately if desired.

Tests

  • test_next_sequence_number — ordinary increments, including i64::MAX - 1 → i64::MAX.
  • test_next_sequence_number_at_max_errors_instead_of_overflowingi64::MAX yields the error instead of overflowing.

CopilotAI balanced review requested due to automatic review settings August 14, 2026 23:01
@github-project-automationgithub-project-automationBot moved this to Backlog (Not Ready) in DevXAug 14, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR prevents integer-overflow panics when incrementing Stellar account sequence numbers by introducing a checked “next sequence number” helper and propagating a dedicated overflow error through CLI commands.

Changes:

  • Added next_sequence_number() helper + SequenceNumberOverflow error and regression tests.
  • Replaced sequence + 1 increments across config/tx/contract commands with checked increment + error propagation.
  • Wired SequenceNumberOverflow into relevant error enums for transparent bubbling.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
cmd/soroban-cli/src/utils.rsAdds checked sequence increment helper, overflow error type, and tests.
cmd/soroban-cli/src/config/mod.rsUses checked increment when deriving the next account sequence number; adds error variant.
cmd/soroban-cli/src/commands/tx/update/sequence_number/next.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/upload.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/restore.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/invoke.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/extend.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/wasm.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/asset.rsSwitches to checked increment and adds overflow error variant.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good instinct on API surface, but SequenceNumberOverflow can't be pub(crate) here. It's the #[from] field type in eight pre-existing pub enum Error variants (contract invoke/upload/extend/restore, deploy wasm + asset, tx update sequence-number next, and config) and the error type of next_sequence_number. Narrowing the struct while those enums stay pub trips the private_interfaces lint, and .cargo/config.toml sets [build] rustflags = ["-Dwarnings", ...], so that fails the build. Downgrading the eight command Error enums to match isn't desirable — they're established public API. So the struct stays pub. I have narrowed next_sequence_number to pub(crate) though — see the other thread.

Comment threadcmd/soroban-cli/src/utils.rs Outdated
/// # Errors
///
/// Returns [`SequenceNumberOverflow`] when `current` is `i64::MAX`.
pub fn next_sequence_number(current: i64) -> Result<i64, SequenceNumberOverflow> {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Done in 4b1dbab — made next_sequence_numberpub(crate); all its callers are in-crate (config, the contract commands, tx::args), verified it still compiles under -D warnings. The SequenceNumberOverflow type has to stay pub (it's the #[from] field in eight pub Error variants — see the sibling comment), but the fn doesn't.

…i64::MAX
Any account can reach `i64::MAX` sequence with a single `bump_sequence`
operation. After that, every command that builds a transaction for the
account computed `sequence + 1`, which panics with "attempt to add with
overflow" on debug builds and wraps to `i64::MIN` on release builds.
Add `utils::next_sequence_number` (checked add with a descriptive error)
and use it at every site that increments an account sequence number:
`config::Args::next_sequence_number`, `contract invoke` (simulation and
final build), `contract upload`, `contract extend`, `contract restore`,
`contract deploy` (wasm and asset), and `tx update sequence-number next`.
`Assembled::bump_seq_num` is left as-is: it has no in-repo callers and
changing it would break its public `-> Self` signature.
Fixesstellar#2417
Copilot review: all callers are in-crate (config, the contract commands, and
tx::args), so the helper doesn't need to be part of the public API. The
SequenceNumberOverflow type stays pub because it is the #[from] field in eight
pub Error variants (see the sibling thread).
@Galmanus
Galmanusforce-pushed the fix/2417-sequence-number-overflow branch from 4b1dbab to f1eafe1CompareSeptember 1, 2026 23:05
CopilotAI review requested due to automatic review settings September 1, 2026 23:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);
+ 1)
.into())
.0;
Ok(crate::utils::next_sequence_number(seq_num)?.into())
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog (Not Ready)

Development

Successfully merging this pull request may close these issues.

CLI panics with "attempt to add with overflow" when building tx for account at INT64_MAX sequence

2 participants

@Galmanus
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Error instead of panicking when source account sequence number is at i64::MAX - #2681

Open
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow
Open

Error instead of panicking when source account sequence number is at i64::MAX#2681
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow

Conversation

@Galmanus

Copy link
Copy Markdown

Fixes#2417.

Any account can reach i64::MAX sequence with a single bump_sequence operation. After that, every command that builds a transaction for the account computed sequence + 1, which panics with attempt to add with overflow on debug builds and wraps to i64::MIN on release builds.

The issue reports the tx new path (config::Args::next_sequence_number), but the same unchecked increment exists at 8 more sites.

Fix

Add utils::next_sequence_number (checked add with a descriptive error):

account sequence number is at the maximum value (9223372036854775807); no further transactions can be submitted from this account

and use it at every site that increments an account sequence number:

  • config::Args::next_sequence_number (the issue's repro path)
  • contract invoke (simulation and final tx build)
  • contract upload
  • contract extend
  • contract restore
  • contract deploy (wasm and asset)
  • tx update sequence-number next

Not changed: Assembled::bump_seq_num — it has no in-repo callers and changing it would break its public -> Self signature; it can be handled separately if desired.

Tests

  • test_next_sequence_number — ordinary increments, including i64::MAX - 1 → i64::MAX.
  • test_next_sequence_number_at_max_errors_instead_of_overflowingi64::MAX yields the error instead of overflowing.

CopilotAI balanced review requested due to automatic review settings August 14, 2026 23:01
@github-project-automationgithub-project-automationBot moved this to Backlog (Not Ready) in DevXAug 14, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR prevents integer-overflow panics when incrementing Stellar account sequence numbers by introducing a checked “next sequence number” helper and propagating a dedicated overflow error through CLI commands.

Changes:

  • Added next_sequence_number() helper + SequenceNumberOverflow error and regression tests.
  • Replaced sequence + 1 increments across config/tx/contract commands with checked increment + error propagation.
  • Wired SequenceNumberOverflow into relevant error enums for transparent bubbling.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
cmd/soroban-cli/src/utils.rsAdds checked sequence increment helper, overflow error type, and tests.
cmd/soroban-cli/src/config/mod.rsUses checked increment when deriving the next account sequence number; adds error variant.
cmd/soroban-cli/src/commands/tx/update/sequence_number/next.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/upload.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/restore.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/invoke.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/extend.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/wasm.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/asset.rsSwitches to checked increment and adds overflow error variant.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good instinct on API surface, but SequenceNumberOverflow can't be pub(crate) here. It's the #[from] field type in eight pre-existing pub enum Error variants (contract invoke/upload/extend/restore, deploy wasm + asset, tx update sequence-number next, and config) and the error type of next_sequence_number. Narrowing the struct while those enums stay pub trips the private_interfaces lint, and .cargo/config.toml sets [build] rustflags = ["-Dwarnings", ...], so that fails the build. Downgrading the eight command Error enums to match isn't desirable — they're established public API. So the struct stays pub. I have narrowed next_sequence_number to pub(crate) though — see the other thread.

Comment threadcmd/soroban-cli/src/utils.rs Outdated
/// # Errors
///
/// Returns [`SequenceNumberOverflow`] when `current` is `i64::MAX`.
pub fn next_sequence_number(current: i64) -> Result<i64, SequenceNumberOverflow> {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Done in 4b1dbab — made next_sequence_numberpub(crate); all its callers are in-crate (config, the contract commands, tx::args), verified it still compiles under -D warnings. The SequenceNumberOverflow type has to stay pub (it's the #[from] field in eight pub Error variants — see the sibling comment), but the fn doesn't.

…i64::MAX
Any account can reach `i64::MAX` sequence with a single `bump_sequence`
operation. After that, every command that builds a transaction for the
account computed `sequence + 1`, which panics with "attempt to add with
overflow" on debug builds and wraps to `i64::MIN` on release builds.
Add `utils::next_sequence_number` (checked add with a descriptive error)
and use it at every site that increments an account sequence number:
`config::Args::next_sequence_number`, `contract invoke` (simulation and
final build), `contract upload`, `contract extend`, `contract restore`,
`contract deploy` (wasm and asset), and `tx update sequence-number next`.
`Assembled::bump_seq_num` is left as-is: it has no in-repo callers and
changing it would break its public `-> Self` signature.
Fixesstellar#2417
Copilot review: all callers are in-crate (config, the contract commands, and
tx::args), so the helper doesn't need to be part of the public API. The
SequenceNumberOverflow type stays pub because it is the #[from] field in eight
pub Error variants (see the sibling thread).
@Galmanus
Galmanusforce-pushed the fix/2417-sequence-number-overflow branch from 4b1dbab to f1eafe1CompareSeptember 1, 2026 23:05
CopilotAI review requested due to automatic review settings September 1, 2026 23:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);
+ 1)
.into())
.0;
Ok(crate::utils::next_sequence_number(seq_num)?.into())
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog (Not Ready)

Development

Successfully merging this pull request may close these issues.

CLI panics with "attempt to add with overflow" when building tx for account at INT64_MAX sequence

2 participants

@Galmanus
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Error instead of panicking when source account sequence number is at i64::MAX - #2681

Open
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow
Open

Error instead of panicking when source account sequence number is at i64::MAX#2681
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow

Conversation

@Galmanus

Copy link
Copy Markdown

Fixes#2417.

Any account can reach i64::MAX sequence with a single bump_sequence operation. After that, every command that builds a transaction for the account computed sequence + 1, which panics with attempt to add with overflow on debug builds and wraps to i64::MIN on release builds.

The issue reports the tx new path (config::Args::next_sequence_number), but the same unchecked increment exists at 8 more sites.

Fix

Add utils::next_sequence_number (checked add with a descriptive error):

account sequence number is at the maximum value (9223372036854775807); no further transactions can be submitted from this account

and use it at every site that increments an account sequence number:

  • config::Args::next_sequence_number (the issue's repro path)
  • contract invoke (simulation and final tx build)
  • contract upload
  • contract extend
  • contract restore
  • contract deploy (wasm and asset)
  • tx update sequence-number next

Not changed: Assembled::bump_seq_num — it has no in-repo callers and changing it would break its public -> Self signature; it can be handled separately if desired.

Tests

  • test_next_sequence_number — ordinary increments, including i64::MAX - 1 → i64::MAX.
  • test_next_sequence_number_at_max_errors_instead_of_overflowingi64::MAX yields the error instead of overflowing.

CopilotAI balanced review requested due to automatic review settings August 14, 2026 23:01
@github-project-automationgithub-project-automationBot moved this to Backlog (Not Ready) in DevXAug 14, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR prevents integer-overflow panics when incrementing Stellar account sequence numbers by introducing a checked “next sequence number” helper and propagating a dedicated overflow error through CLI commands.

Changes:

  • Added next_sequence_number() helper + SequenceNumberOverflow error and regression tests.
  • Replaced sequence + 1 increments across config/tx/contract commands with checked increment + error propagation.
  • Wired SequenceNumberOverflow into relevant error enums for transparent bubbling.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
cmd/soroban-cli/src/utils.rsAdds checked sequence increment helper, overflow error type, and tests.
cmd/soroban-cli/src/config/mod.rsUses checked increment when deriving the next account sequence number; adds error variant.
cmd/soroban-cli/src/commands/tx/update/sequence_number/next.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/upload.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/restore.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/invoke.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/extend.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/wasm.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/asset.rsSwitches to checked increment and adds overflow error variant.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good instinct on API surface, but SequenceNumberOverflow can't be pub(crate) here. It's the #[from] field type in eight pre-existing pub enum Error variants (contract invoke/upload/extend/restore, deploy wasm + asset, tx update sequence-number next, and config) and the error type of next_sequence_number. Narrowing the struct while those enums stay pub trips the private_interfaces lint, and .cargo/config.toml sets [build] rustflags = ["-Dwarnings", ...], so that fails the build. Downgrading the eight command Error enums to match isn't desirable — they're established public API. So the struct stays pub. I have narrowed next_sequence_number to pub(crate) though — see the other thread.

Comment threadcmd/soroban-cli/src/utils.rs Outdated
/// # Errors
///
/// Returns [`SequenceNumberOverflow`] when `current` is `i64::MAX`.
pub fn next_sequence_number(current: i64) -> Result<i64, SequenceNumberOverflow> {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Done in 4b1dbab — made next_sequence_numberpub(crate); all its callers are in-crate (config, the contract commands, tx::args), verified it still compiles under -D warnings. The SequenceNumberOverflow type has to stay pub (it's the #[from] field in eight pub Error variants — see the sibling comment), but the fn doesn't.

…i64::MAX
Any account can reach `i64::MAX` sequence with a single `bump_sequence`
operation. After that, every command that builds a transaction for the
account computed `sequence + 1`, which panics with "attempt to add with
overflow" on debug builds and wraps to `i64::MIN` on release builds.
Add `utils::next_sequence_number` (checked add with a descriptive error)
and use it at every site that increments an account sequence number:
`config::Args::next_sequence_number`, `contract invoke` (simulation and
final build), `contract upload`, `contract extend`, `contract restore`,
`contract deploy` (wasm and asset), and `tx update sequence-number next`.
`Assembled::bump_seq_num` is left as-is: it has no in-repo callers and
changing it would break its public `-> Self` signature.
Fixesstellar#2417
Copilot review: all callers are in-crate (config, the contract commands, and
tx::args), so the helper doesn't need to be part of the public API. The
SequenceNumberOverflow type stays pub because it is the #[from] field in eight
pub Error variants (see the sibling thread).
@Galmanus
Galmanusforce-pushed the fix/2417-sequence-number-overflow branch from 4b1dbab to f1eafe1CompareSeptember 1, 2026 23:05
CopilotAI review requested due to automatic review settings September 1, 2026 23:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);
+ 1)
.into())
.0;
Ok(crate::utils::next_sequence_number(seq_num)?.into())
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog (Not Ready)

Development

Successfully merging this pull request may close these issues.

CLI panics with "attempt to add with overflow" when building tx for account at INT64_MAX sequence

2 participants

@Galmanus
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Error instead of panicking when source account sequence number is at i64::MAX - #2681

Open
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow
Open

Error instead of panicking when source account sequence number is at i64::MAX#2681
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow

Conversation

@Galmanus

Copy link
Copy Markdown

Fixes#2417.

Any account can reach i64::MAX sequence with a single bump_sequence operation. After that, every command that builds a transaction for the account computed sequence + 1, which panics with attempt to add with overflow on debug builds and wraps to i64::MIN on release builds.

The issue reports the tx new path (config::Args::next_sequence_number), but the same unchecked increment exists at 8 more sites.

Fix

Add utils::next_sequence_number (checked add with a descriptive error):

account sequence number is at the maximum value (9223372036854775807); no further transactions can be submitted from this account

and use it at every site that increments an account sequence number:

  • config::Args::next_sequence_number (the issue's repro path)
  • contract invoke (simulation and final tx build)
  • contract upload
  • contract extend
  • contract restore
  • contract deploy (wasm and asset)
  • tx update sequence-number next

Not changed: Assembled::bump_seq_num — it has no in-repo callers and changing it would break its public -> Self signature; it can be handled separately if desired.

Tests

  • test_next_sequence_number — ordinary increments, including i64::MAX - 1 → i64::MAX.
  • test_next_sequence_number_at_max_errors_instead_of_overflowingi64::MAX yields the error instead of overflowing.

CopilotAI balanced review requested due to automatic review settings August 14, 2026 23:01
@github-project-automationgithub-project-automationBot moved this to Backlog (Not Ready) in DevXAug 14, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR prevents integer-overflow panics when incrementing Stellar account sequence numbers by introducing a checked “next sequence number” helper and propagating a dedicated overflow error through CLI commands.

Changes:

  • Added next_sequence_number() helper + SequenceNumberOverflow error and regression tests.
  • Replaced sequence + 1 increments across config/tx/contract commands with checked increment + error propagation.
  • Wired SequenceNumberOverflow into relevant error enums for transparent bubbling.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
cmd/soroban-cli/src/utils.rsAdds checked sequence increment helper, overflow error type, and tests.
cmd/soroban-cli/src/config/mod.rsUses checked increment when deriving the next account sequence number; adds error variant.
cmd/soroban-cli/src/commands/tx/update/sequence_number/next.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/upload.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/restore.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/invoke.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/extend.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/wasm.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/asset.rsSwitches to checked increment and adds overflow error variant.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good instinct on API surface, but SequenceNumberOverflow can't be pub(crate) here. It's the #[from] field type in eight pre-existing pub enum Error variants (contract invoke/upload/extend/restore, deploy wasm + asset, tx update sequence-number next, and config) and the error type of next_sequence_number. Narrowing the struct while those enums stay pub trips the private_interfaces lint, and .cargo/config.toml sets [build] rustflags = ["-Dwarnings", ...], so that fails the build. Downgrading the eight command Error enums to match isn't desirable — they're established public API. So the struct stays pub. I have narrowed next_sequence_number to pub(crate) though — see the other thread.

Comment threadcmd/soroban-cli/src/utils.rs Outdated
/// # Errors
///
/// Returns [`SequenceNumberOverflow`] when `current` is `i64::MAX`.
pub fn next_sequence_number(current: i64) -> Result<i64, SequenceNumberOverflow> {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Done in 4b1dbab — made next_sequence_numberpub(crate); all its callers are in-crate (config, the contract commands, tx::args), verified it still compiles under -D warnings. The SequenceNumberOverflow type has to stay pub (it's the #[from] field in eight pub Error variants — see the sibling comment), but the fn doesn't.

…i64::MAX
Any account can reach `i64::MAX` sequence with a single `bump_sequence`
operation. After that, every command that builds a transaction for the
account computed `sequence + 1`, which panics with "attempt to add with
overflow" on debug builds and wraps to `i64::MIN` on release builds.
Add `utils::next_sequence_number` (checked add with a descriptive error)
and use it at every site that increments an account sequence number:
`config::Args::next_sequence_number`, `contract invoke` (simulation and
final build), `contract upload`, `contract extend`, `contract restore`,
`contract deploy` (wasm and asset), and `tx update sequence-number next`.
`Assembled::bump_seq_num` is left as-is: it has no in-repo callers and
changing it would break its public `-> Self` signature.
Fixesstellar#2417
Copilot review: all callers are in-crate (config, the contract commands, and
tx::args), so the helper doesn't need to be part of the public API. The
SequenceNumberOverflow type stays pub because it is the #[from] field in eight
pub Error variants (see the sibling thread).
@Galmanus
Galmanusforce-pushed the fix/2417-sequence-number-overflow branch from 4b1dbab to f1eafe1CompareSeptember 1, 2026 23:05
CopilotAI review requested due to automatic review settings September 1, 2026 23:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);
+ 1)
.into())
.0;
Ok(crate::utils::next_sequence_number(seq_num)?.into())
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog (Not Ready)

Development

Successfully merging this pull request may close these issues.

CLI panics with "attempt to add with overflow" when building tx for account at INT64_MAX sequence

2 participants

@Galmanus
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Error instead of panicking when source account sequence number is at i64::MAX - #2681

Open
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow
Open

Error instead of panicking when source account sequence number is at i64::MAX#2681
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow

Conversation

@Galmanus

Copy link
Copy Markdown

Fixes#2417.

Any account can reach i64::MAX sequence with a single bump_sequence operation. After that, every command that builds a transaction for the account computed sequence + 1, which panics with attempt to add with overflow on debug builds and wraps to i64::MIN on release builds.

The issue reports the tx new path (config::Args::next_sequence_number), but the same unchecked increment exists at 8 more sites.

Fix

Add utils::next_sequence_number (checked add with a descriptive error):

account sequence number is at the maximum value (9223372036854775807); no further transactions can be submitted from this account

and use it at every site that increments an account sequence number:

  • config::Args::next_sequence_number (the issue's repro path)
  • contract invoke (simulation and final tx build)
  • contract upload
  • contract extend
  • contract restore
  • contract deploy (wasm and asset)
  • tx update sequence-number next

Not changed: Assembled::bump_seq_num — it has no in-repo callers and changing it would break its public -> Self signature; it can be handled separately if desired.

Tests

  • test_next_sequence_number — ordinary increments, including i64::MAX - 1 → i64::MAX.
  • test_next_sequence_number_at_max_errors_instead_of_overflowingi64::MAX yields the error instead of overflowing.

CopilotAI balanced review requested due to automatic review settings August 14, 2026 23:01
@github-project-automationgithub-project-automationBot moved this to Backlog (Not Ready) in DevXAug 14, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR prevents integer-overflow panics when incrementing Stellar account sequence numbers by introducing a checked “next sequence number” helper and propagating a dedicated overflow error through CLI commands.

Changes:

  • Added next_sequence_number() helper + SequenceNumberOverflow error and regression tests.
  • Replaced sequence + 1 increments across config/tx/contract commands with checked increment + error propagation.
  • Wired SequenceNumberOverflow into relevant error enums for transparent bubbling.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
cmd/soroban-cli/src/utils.rsAdds checked sequence increment helper, overflow error type, and tests.
cmd/soroban-cli/src/config/mod.rsUses checked increment when deriving the next account sequence number; adds error variant.
cmd/soroban-cli/src/commands/tx/update/sequence_number/next.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/upload.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/restore.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/invoke.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/extend.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/wasm.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/asset.rsSwitches to checked increment and adds overflow error variant.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good instinct on API surface, but SequenceNumberOverflow can't be pub(crate) here. It's the #[from] field type in eight pre-existing pub enum Error variants (contract invoke/upload/extend/restore, deploy wasm + asset, tx update sequence-number next, and config) and the error type of next_sequence_number. Narrowing the struct while those enums stay pub trips the private_interfaces lint, and .cargo/config.toml sets [build] rustflags = ["-Dwarnings", ...], so that fails the build. Downgrading the eight command Error enums to match isn't desirable — they're established public API. So the struct stays pub. I have narrowed next_sequence_number to pub(crate) though — see the other thread.

Comment threadcmd/soroban-cli/src/utils.rs Outdated
/// # Errors
///
/// Returns [`SequenceNumberOverflow`] when `current` is `i64::MAX`.
pub fn next_sequence_number(current: i64) -> Result<i64, SequenceNumberOverflow> {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Done in 4b1dbab — made next_sequence_numberpub(crate); all its callers are in-crate (config, the contract commands, tx::args), verified it still compiles under -D warnings. The SequenceNumberOverflow type has to stay pub (it's the #[from] field in eight pub Error variants — see the sibling comment), but the fn doesn't.

…i64::MAX
Any account can reach `i64::MAX` sequence with a single `bump_sequence`
operation. After that, every command that builds a transaction for the
account computed `sequence + 1`, which panics with "attempt to add with
overflow" on debug builds and wraps to `i64::MIN` on release builds.
Add `utils::next_sequence_number` (checked add with a descriptive error)
and use it at every site that increments an account sequence number:
`config::Args::next_sequence_number`, `contract invoke` (simulation and
final build), `contract upload`, `contract extend`, `contract restore`,
`contract deploy` (wasm and asset), and `tx update sequence-number next`.
`Assembled::bump_seq_num` is left as-is: it has no in-repo callers and
changing it would break its public `-> Self` signature.
Fixesstellar#2417
Copilot review: all callers are in-crate (config, the contract commands, and
tx::args), so the helper doesn't need to be part of the public API. The
SequenceNumberOverflow type stays pub because it is the #[from] field in eight
pub Error variants (see the sibling thread).
@Galmanus
Galmanusforce-pushed the fix/2417-sequence-number-overflow branch from 4b1dbab to f1eafe1CompareSeptember 1, 2026 23:05
CopilotAI review requested due to automatic review settings September 1, 2026 23:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);
+ 1)
.into())
.0;
Ok(crate::utils::next_sequence_number(seq_num)?.into())
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog (Not Ready)

Development

Successfully merging this pull request may close these issues.

CLI panics with "attempt to add with overflow" when building tx for account at INT64_MAX sequence

2 participants

@Galmanus
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Error instead of panicking when source account sequence number is at i64::MAX - #2681

Open
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow
Open

Error instead of panicking when source account sequence number is at i64::MAX#2681
Galmanus wants to merge 2 commits into
stellar:mainfrom
Galmanus:fix/2417-sequence-number-overflow

Conversation

@Galmanus

Copy link
Copy Markdown

Fixes#2417.

Any account can reach i64::MAX sequence with a single bump_sequence operation. After that, every command that builds a transaction for the account computed sequence + 1, which panics with attempt to add with overflow on debug builds and wraps to i64::MIN on release builds.

The issue reports the tx new path (config::Args::next_sequence_number), but the same unchecked increment exists at 8 more sites.

Fix

Add utils::next_sequence_number (checked add with a descriptive error):

account sequence number is at the maximum value (9223372036854775807); no further transactions can be submitted from this account

and use it at every site that increments an account sequence number:

  • config::Args::next_sequence_number (the issue's repro path)
  • contract invoke (simulation and final tx build)
  • contract upload
  • contract extend
  • contract restore
  • contract deploy (wasm and asset)
  • tx update sequence-number next

Not changed: Assembled::bump_seq_num — it has no in-repo callers and changing it would break its public -> Self signature; it can be handled separately if desired.

Tests

  • test_next_sequence_number — ordinary increments, including i64::MAX - 1 → i64::MAX.
  • test_next_sequence_number_at_max_errors_instead_of_overflowingi64::MAX yields the error instead of overflowing.

CopilotAI balanced review requested due to automatic review settings August 14, 2026 23:01
@github-project-automationgithub-project-automationBot moved this to Backlog (Not Ready) in DevXAug 14, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR prevents integer-overflow panics when incrementing Stellar account sequence numbers by introducing a checked “next sequence number” helper and propagating a dedicated overflow error through CLI commands.

Changes:

  • Added next_sequence_number() helper + SequenceNumberOverflow error and regression tests.
  • Replaced sequence + 1 increments across config/tx/contract commands with checked increment + error propagation.
  • Wired SequenceNumberOverflow into relevant error enums for transparent bubbling.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
cmd/soroban-cli/src/utils.rsAdds checked sequence increment helper, overflow error type, and tests.
cmd/soroban-cli/src/config/mod.rsUses checked increment when deriving the next account sequence number; adds error variant.
cmd/soroban-cli/src/commands/tx/update/sequence_number/next.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/upload.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/restore.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/invoke.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/extend.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/wasm.rsSwitches to checked increment and adds overflow error variant.
cmd/soroban-cli/src/commands/contract/deploy/asset.rsSwitches to checked increment and adds overflow error variant.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good instinct on API surface, but SequenceNumberOverflow can't be pub(crate) here. It's the #[from] field type in eight pre-existing pub enum Error variants (contract invoke/upload/extend/restore, deploy wasm + asset, tx update sequence-number next, and config) and the error type of next_sequence_number. Narrowing the struct while those enums stay pub trips the private_interfaces lint, and .cargo/config.toml sets [build] rustflags = ["-Dwarnings", ...], so that fails the build. Downgrading the eight command Error enums to match isn't desirable — they're established public API. So the struct stays pub. I have narrowed next_sequence_number to pub(crate) though — see the other thread.

Comment threadcmd/soroban-cli/src/utils.rs Outdated
/// # Errors
///
/// Returns [`SequenceNumberOverflow`] when `current` is `i64::MAX`.
pub fn next_sequence_number(current: i64) -> Result<i64, SequenceNumberOverflow> {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Done in 4b1dbab — made next_sequence_numberpub(crate); all its callers are in-crate (config, the contract commands, tx::args), verified it still compiles under -D warnings. The SequenceNumberOverflow type has to stay pub (it's the #[from] field in eight pub Error variants — see the sibling comment), but the fn doesn't.

…i64::MAX
Any account can reach `i64::MAX` sequence with a single `bump_sequence`
operation. After that, every command that builds a transaction for the
account computed `sequence + 1`, which panics with "attempt to add with
overflow" on debug builds and wraps to `i64::MIN` on release builds.
Add `utils::next_sequence_number` (checked add with a descriptive error)
and use it at every site that increments an account sequence number:
`config::Args::next_sequence_number`, `contract invoke` (simulation and
final build), `contract upload`, `contract extend`, `contract restore`,
`contract deploy` (wasm and asset), and `tx update sequence-number next`.
`Assembled::bump_seq_num` is left as-is: it has no in-repo callers and
changing it would break its public `-> Self` signature.
Fixesstellar#2417
Copilot review: all callers are in-crate (config, the contract commands, and
tx::args), so the helper doesn't need to be part of the public API. The
SequenceNumberOverflow type stays pub because it is the #[from] field in eight
pub Error variants (see the sibling thread).
@Galmanus
Galmanusforce-pushed the fix/2417-sequence-number-overflow branch from 4b1dbab to f1eafe1CompareSeptember 1, 2026 23:05
CopilotAI review requested due to automatic review settings September 1, 2026 23:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

/// point must surface as an error instead of an integer-overflow panic.
#[derive(thiserror::Error, Debug)]
#[error("account sequence number is at the maximum value ({0}); no further transactions can be submitted from this account")]
pub struct SequenceNumberOverflow(pub i64);
+ 1)
.into())
.0;
Ok(crate::utils::next_sequence_number(seq_num)?.into())
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog (Not Ready)

Development

Successfully merging this pull request may close these issues.

CLI panics with "attempt to add with overflow" when building tx for account at INT64_MAX sequence

2 participants

@Galmanus