feat(multisig): Keystone signing for multisig creation and proposals - #642
Merged
Conversation
Creating a multisig and proposing a transfer only signed locally, so a Keystone (cold) member had no path: submitExtrinsic needs a local keypair. Approve, execute and cancel already routed Keystone signers through the QR flow; this brings the remaining two calls in line. - Add multisig: a Keystone creator skips biometric auth and goes through the shared KeystoneSignScreen; the signed extrinsic is submitted via the same pending-creation record and poller as the local path. The single preflight result (draft + fee) now feeds both paths instead of running the preflight twice. - Propose: MultisigProposeStrategy returns SendNeedsHardwareSignature for a Keystone member, mirroring RegularSendStrategy, and prefetches the sign payload on the review screen (the fee now reaches prefetch so the signed call uses the reviewed expiry block). proposeTransfer shares one submit-and-track path with the new external-signature variant. - SendNeedsHardwareSignature carries terminalForHash so each strategy decides its terminal; proposals keep no explorer link, like the local path. - KeystoneSigningSession gains primaryLabel/secondaryLabel so the sign and verify screens can caption non-transfer calls (ACTION / MULTISIG ADDRESS). - One Account.signsWithHardware helper replaces the two copies in the action sheet and regular send strategy. - Tests: propose strategy hardware outcome; pumpRef helper shared in fakes.
n13
force-pushed
the
n13/return-to-accounts-nav-fix
branch
from
September 8, 2026 03:18
105a56f to
1617545
Compare
n13
force-pushed
the
n13/multisig-keystone-signing
branch
from
September 8, 2026 03:18
50385d7 to
338c27a
Compare
n13
commented
Sep 8, 2026
n13
left a comment
Collaborator
Author
There was a problem hiding this comment.
Reviewer model: GPT-6 Astra
Verdict (advisory): Approve
Reviewed head 338c27ad55926f0467e40f6661e53c12131b48e9 against base b98c1349286599ac51b2ccd3bfc2e8fa49563f12. No blocking findings.
The hardware paths reuse the existing call builders and submit-and-track behavior. The creation draft consistently supplies signing parameters and pending-account details; proposal expiry is carried from the reviewed fee breakdown into both the signing call and cache identity. Proposal success keeps its existing terminal content without adding a transfer explorer link.
Validation:
flutter test --no-pub --reporter expandedinmobile-app: 428 passed.- Four temporary review probes outside the repository passed: proposal call-parameter/cache binding and signed callback forwarding; local/external creation tracking; rollback after external submission rejection. These used mocked submission services.
- Workspace
dart format lib test --line-length=120 --output=none --set-exit-if-changedvia Melos: passed. git diff --check: passed.- Melos analysis was capped at 10 seconds. Cold wallet, miner, and SDK analysis passed; mobile analysis did not finish. GitHub currently reports successful dependency-cooldown checks, with no application CI result.
A physical Keystone round trip and live-chain submission were not exercised during this review.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #641.
Review: multisig calls vs Keystone (cold) signers
submitExtrinsic(creator)needs a local keypairMultisigProposeStrategy.submitsigned locallyMultisigActionConfirmSheet)Fee estimation already worked for Keystone accounts (unsigned dummy extrinsic), so only submission needed a path.
Changes
KeystoneSignScreenwith thecreate_multisigcall. The signed extrinsic goes through the same pending-creation record and poller as the local path, then returns to Accounts with the new multisig highlighted. The preflight result (draft + network fee) now feeds both paths instead of running the preflight twice.MultisigProposeStrategyreturnsSendNeedsHardwareSignaturefor a Keystone member, mirroringRegularSendStrategy, and prefetches the sign payload on the review screen.prefetchSignPayloadnow receives the fee so the signed call uses the expiry block shown on review.proposeTransferand the new external-signature variant share one submit-and-track path.SendNeedsHardwareSignaturecarriesterminalForHash, so the strategy decides the terminal content. Proposals keep no explorer link, same as the local path.KeystoneSigningSessiongainsprimaryLabel/secondaryLabel; the sign and verify screens caption the creation as ACTION / MULTISIG ADDRESS instead of AMOUNT / TO.Account.signsWithHardwarehelper replaces the two copies in the action sheet and the regular send strategy.keystoneSignActionLabel,multisigCreateKeystoneAction(en + id).Test
flutter test: 428 passed, including the newmultisig_propose_strategy_test.