Skip to content

fix(symbolic-spl): decompose multisig signer pubkeys to avoid SMT timeout#1000

Merged
Stevengre merged 1 commit intofeature/p-tokenfrom
repro/pubkey-list-smt-timeout
Mar 24, 2026
Merged

fix(symbolic-spl): decompose multisig signer pubkeys to avoid SMT timeout#1000
Stevengre merged 1 commit intofeature/p-tokenfrom
repro/pubkey-list-smt-timeout

Conversation

@Stevengre
Copy link
Copy Markdown
Contributor

@Stevengre Stevengre commented Mar 24, 2026

Summary

  • Decompose opaque symbolic List variables (?SplSigner0:List etc.) in cheatcode-is-spl-multisig into concrete Lists of 32 individual symbolic Int byte variables via new #mkSplPubkey / #pubkeyByteBounds helpers
  • Previously, pubkey comparisons (KEY1 ==K KEY2) with a fully symbolic List side were sent to Z3 as opaque List equality, causing SMT timeout when path constraints accumulated to ~600+
  • With decomposed bytes, ==K automatically reduces to element-wise integer equalities (e.g. ?SplSi0B0 ==Int ARG_UINT196 andBool ...), which Z3 solves instantly

Verification

Proof Before After
test_process_burn_multisig SMT timeout crash (377 nodes, 5526s) PASSED (495 nodes, ~4h, 0 errors)

@Stevengre Stevengre force-pushed the repro/pubkey-list-smt-timeout branch 5 times, most recently from 2f7603c to 510e5e4 Compare March 24, 2026 01:10
…eout

Replace opaque symbolic List variables (?SplSigner0:List etc.) in the
cheatcode-is-spl-multisig rule with concrete Lists of 32 individual
symbolic Int byte variables via #mkSplPubkey helper.

Previously, pubkey comparisons via Processor::cmp_pubkeys produced
KEY1 ==K KEY2 where one side was a fully symbolic List. The Haskell
backend sent this to Z3 as opaque List equality, which timed out when
path constraints accumulated to ~600+.

With decomposed byte variables, ==K on two structurally-concrete Lists
automatically reduces to element-wise integer equalities (e.g.
?SplSi0B0 ==Int ARG_UINT196 andBool ...), which Z3 solves instantly.

Verified: test_process_burn_multisig proof changes from SMT timeout
crash (377 nodes) to PASSED (495 nodes, 0 errors).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Stevengre Stevengre force-pushed the repro/pubkey-list-smt-timeout branch from 510e5e4 to 26e9ca6 Compare March 24, 2026 01:12
@Stevengre Stevengre requested review from dkcumming and mariaKt March 24, 2026 01:38
@Stevengre Stevengre self-assigned this Mar 24, 2026
@Stevengre Stevengre marked this pull request as ready for review March 24, 2026 01:38
Copy link
Copy Markdown
Collaborator

@dkcumming dkcumming left a comment

Choose a reason for hiding this comment

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

Nice, glad to see the it is speeding things up. Not sure if this catches all Pubkey instances but we can keep an eye out and see if the proofs are handing on any, and at one point we will do a general clean up I think and see if anything is missed.

@Stevengre Stevengre merged commit 22545a5 into feature/p-token Mar 24, 2026
7 checks passed
@Stevengre Stevengre deleted the repro/pubkey-list-smt-timeout branch March 24, 2026 23:48
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.

2 participants