Skip to content

fix(multisig): reserve one codec depth for execute's boxed call - #676

Merged
n13 merged 3 commits into
mainfrom
n13/multisig-execute-decode-depth
Aug 31, 2026
Merged

fix(multisig): reserve one codec depth for execute's boxed call#676
n13 merged 3 commits into
mainfrom
n13/multisig-execute-decode-depth

Conversation

@n13

@n13 n13 commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

Purpose

Multisig::execute now carries the inner call (Box<RuntimeCall>). propose still decoded stored calls at MAX_EXTRINSIC_DEPTH. Executive decodes the complete execute extrinsic at that same ceiling, so a proposal accepted at the boundary could not be encoded as a valid execute.

This is not in public main (no inner depth cap) and not in chain-private main (execute did not carry the call, so the full ceiling was correct). It only appears on the merge of those two. Kept off #675 so that PR stays the merge.

Change

  • MAX_MULTISIG_CALL_DEPTH = MAX_EXTRINSIC_DEPTH - 1
  • proposal_depth_boundary_remains_executable: a call at the new ceiling proposes, encodes as execute, and decodes under MAX_EXTRINSIC_DEPTH; one level deeper is rejected at propose

Verification

SKIP_WASM_BUILD=1 cargo test --locked -p pallet-multisig --lib — 61 passed

propose accepted inner calls at MAX_EXTRINSIC_DEPTH, but execute wraps
that call in Box<RuntimeCall>. FRAME decodes the whole extrinsic at the
same ceiling, so a boundary proposal could not be submitted as execute.
Drop the stored-call limit by one and pin the acceptance/rejection
boundary with an encode-and-decode test.
Base automatically changed from n13/merge-chain-private to main August 31, 2026 03:51
@n13
n13 merged commit 3e02fa9 into main Aug 31, 2026
5 checks passed
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