Repository navigation
feat(wallets): a quorum acting signer returns the created transaction unsigned, as prepareOnly does (quorum foundation 5/5) - #2268
Open
daniil-dovgal wants to merge 6 commits into
Conversation
… unsigned, as prepareOnly does
send and EVM / Solana / Stellar sendTransaction resolve the signer once; when it is a quorum: locator the
call returns { transactionId } with hash and explorerLink undefined instead of signing and waiting (EDD 007
§7 "A quorum forces prepareOnly"). Types are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n over the early return, real server derivation Checker round 1: a client holding one of the quorum's member keys signs nothing; a creation error with a quorum signer throws as with any other signer; the server signer row derives its locator instead of stubbing it. The changeset names both errors the old call threw. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…action and the signature calls did EVM / Solana / Stellar sendTransaction and signMessage / signTypedData treated any truthy prepareOnly as set; only send required `=== true`. The shared helper now follows the majority, so an untyped caller passing a non-boolean never gets a signing call it did not expect. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… send covered on a Stellar wallet Checker round 2: approve still throws for quorum members until E1, so the JSDoc and changeset no longer promise it; Solana's API rejects a quorum signer at creation, so its JSDoc drops the note and the changeset scopes to EVM and Stellar. The spec runs send on a Stellar wallet too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
🦋 Changeset detectedLatest commit: 7ce2207 The changes in this PR will be included in the next version bump. This PR includes changesets to release 10 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
daniil-dovgal
marked this pull request as ready for review
November 3, 2026 20:20
Contributor
[Medium impact] The PR appears safe to merge. Reviews (1) · Last reviewed commit: "docs(wallets): quorum prepareOnly notes ..." · Reviewed by Greptile |
…nly as truthy Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e-only Brings the foundation audit fixes from m0a–m0d into m0f. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Nov 5, 2026
Open
This branch has not been deployed
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.
Description
High level implementation overview
Last foundation PR of the TS SDK quorum stack, stacked on #2225. The earlier PRs:
signer: "quorum:<id>"on creating calls, quorum API errors at every call site.Before:
send/sendTransactionwithsigner: "quorum:<id>"created the transaction, then failed on the approvalpath. A non-api-key active signer threw
QuorumSignerNotSupportedError; an api-key one polled and threwTransactionAwaitingApprovalError. Either way the created request was left behind.After: per EDD 007 §7 "A quorum forces
prepareOnly" (crossbit-main #33357), the call returns the created requestunsigned, without signing or waiting. Members approve it later with
approve. No public type changes.Details
wallets/wallet.tsisPrepareOnly(options, signerLocator): a truthyprepareOnly, or aquorum:locator(
hasQuorumLocatorPrefix). One protected helper; E2 (member-only keys, signature calls) and E3 (signer-changeapprover) reuse it. Truthy, as
sendTransactionand the signature calls already read it; onlysendchecked=== true, so an untypedsendcaller passing a non-boolean now gets the early return, which never signs.createTransactionnow take{ signer }instead of resolving it. This matters from E2 on, where resolution readsthe wallet config.
prepareOnly: false, the type sayshash: stringwhile a quorum call returnsundefined.TransactionInputOptionsalready requiresprepareOnly, so callers passtrueto get the matchingtype; the JSDoc on
send/sendTransactionsays so. EDD use case 5 ({ signer: treasury }alone) does notcompile for that reason; the EDD snippet gets
prepareOnly: truerather than the types changing.approveis unchanged. At this point no client signs a quorum entry, so it never reaches "threshold not met". TheEDD thread's proposal for that case (a quorum-only wait returns
{ transactionId },hashundefined) lands with E1.upgrade/migrate(the EDD lists neither), and a malformedquorum:locator,which still reaches the API and gets its 400 mapped as today. Solana runs the same code, but its API rejects a
quorum signer at creation, so the changeset and JSDoc describe EVM and Stellar only.
Next Steps
Merge this into E1 (#2255), E2 (#2256) and E3 (#2261), one adaptation commit each: E1's quorum sends stop signing held
members, E2's inferred quorum and signature calls return early unsigned, E3's quorum-approved signer changes return early.
Test plan
wallets/wallet.quorum-prepare-only.test.ts(new, 80 cases), forsend(EVM and Stellar wallets)and EVM / Solana / Stellar
sendTransaction:prepareOnlytrue / false / omitted: the exactresult, the
signersent, no transaction read, no approval;onSignis never called;truthy non-boolean
prepareOnlyreturns early.TransactionAwaitingApprovalError,external-wallet rows
QuorumSignerNotSupportedError. Rows added later were checked by mutation: dropping the quorumcheck fails the member rows, and
=== truefails the truthy rows.packages/wallets:pnpm exec vitest run src/wallets src/quorum src/utils src/chains src/signers: 36 files,1068 tests passed.
tsconsrc/clean; the new spec type-checks under a test tsconfig; biome reports no new warnings.Ready. Round 1 added the member, creation-error and real-server-secret rows. Round 2scoped the changeset and JSDoc to what this PR does: no promise of
approvebefore E1, no Solana claim.preAuthIfNeededruns before creation for an email orphone signer. The order is unchanged.