Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@rajgoesout
Copy link
Contributor

Export plural versions of useSignTransaction and useSignAndSendTransaction.

Problem

Wallet-standard allows requesting a wallet to sign multiple transactions. But we only export a hook capable of signing one, eg useSignTransaction.

The actual implementation of this uses a hook that can accept multiple transactions.

Summary of Changes

  • Exposed useSignTransactions and useSignAndSendTransactions as public React hooks.
  • Expanded unit/type tests to cover multi-transaction, empty-input, and chain-validation cases.
  • Updated docs/examples.

Closes #1104

@changeset-bot
Copy link

changeset-bot bot commented Dec 6, 2025

🦋 Changeset detected

Latest commit: 3fd0e3f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 43 packages
Name Type
@solana/react Minor
@solana/accounts Minor
@solana/addresses Minor
@solana/assertions Minor
@solana/codecs-core Minor
@solana/codecs-data-structures Minor
@solana/codecs-numbers Minor
@solana/codecs-strings Minor
@solana/codecs Minor
@solana/compat Minor
@solana/errors Minor
@solana/fast-stable-stringify Minor
@solana/functional Minor
@solana/instruction-plans Minor
@solana/instructions Minor
@solana/keys Minor
@solana/kit Minor
@solana/nominal-types Minor
@solana/offchain-messages Minor
@solana/options Minor
@solana/plugin-core Minor
@solana/programs Minor
@solana/promises Minor
@solana/rpc-api Minor
@solana/rpc-graphql Minor
@solana/rpc-parsed-types Minor
@solana/rpc-spec-types Minor
@solana/rpc-spec Minor
@solana/rpc-subscriptions-api Minor
@solana/rpc-subscriptions-channel-websocket Minor
@solana/rpc-subscriptions-spec Minor
@solana/rpc-subscriptions Minor
@solana/rpc-transformers Minor
@solana/rpc-transport-http Minor
@solana/rpc-types Minor
@solana/rpc Minor
@solana/signers Minor
@solana/subscribable Minor
@solana/sysvars Minor
@solana/transaction-confirmation Minor
@solana/transaction-messages Minor
@solana/transactions Minor
@solana/webcrypto-ed25519-polyfill Minor

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

@rajgoesout rajgoesout marked this pull request as ready for review December 8, 2025 04:42
Copy link
Contributor

@steveluscher steveluscher left a comment

Choose a reason for hiding this comment

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

Before we move forward, lets think about whether wallets are ready to handle multi-signing workflows from a UI perspective. Right now I don't know of a wallet that has a sensible UI/workflow for multi-transaction signing sessions. #1104 (comment)

@steveluscher steveluscher self-requested a review December 10, 2025 02:04
Copy link
Contributor

Talked to @mcintyre94 about this. I didn't know that some apps were already using the API in this way. I'll review this today.

Copy link
Contributor

OK, maybe today.

@steveluscher
Copy link
Contributor

OK, maybe today, but no guarantees.

Copy link
Contributor

@steveluscher steveluscher left a comment

Choose a reason for hiding this comment

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

Thanks for this work, and sorry it's taken me so long.

I'm really struggling with this API. I understand the need for it now, but I think we should end up with one API and deprecate the old one. I think this looks like:

  • Mark the singular versions with @deprecated Use {plural version}
  • Export the plural versions
  • Rewrite all of the tests and examples to use the plural versions instead
  • Release 5.{y+1}.0
  • Delete the singular implementation
  • Release 6.0.0

Would you be OK with this @mcintyre94?

@mcintyre94
Copy link
Member

I can see the argument for just exporting the plural version, since it covers both use cases and mirrors the wallet-standard feature. It also mirrors the signers APIs which are all multi-transaction.

That said, I think the single transaction use case is going to be used overwhelmingly more common, and it is easier if you don't need to use a plural API and unpack the result from an array. The cost of providing the single API is very small, since it's just a wrapper around the plural one in the current implementation.

Most importantly though, given the limitations with error handling for multiple transactions, there is a semantic difference (in practice) between sending one transaction and sending multiple. If you're dealing with one then you can understand its success/error status, if you send multiple then an error means some might have landed. Apps that do send multiple will need to treat these cases as meaningfully different. So I think it might be worth keeping the single transaction versions, with their more predictable behaviour, for the typical case of an app sending only one transaction. And then we have a clear place to document the issues with multiple transactions on the plural API.

@rajgoesout rajgoesout force-pushed the feat/export-plural-sign-hooks branch from 1f6f571 to fc1c718 Compare December 23, 2025 05:52
@rajgoesout
Copy link
Contributor Author

@steveluscher @mcintyre94 Thank you for the review. I've removed the unrelated changes (will create separate PR for those). Let me know if we should keep the singular version or deprecate it.

@github-actions github-actions bot added the stale label Jan 6, 2026
@mcintyre94 mcintyre94 removed the stale label Jan 7, 2026
@bundlemon
Copy link

bundlemon bot commented Jan 7, 2026

BundleMon

Unchanged files (136)
Status Path Size Limits
@solana/kit production bundle
kit/dist/index.production.min.js
39.35KB -
rpc-graphql/dist/index.browser.mjs
18.82KB -
rpc-graphql/dist/index.native.mjs
18.81KB -
rpc-graphql/dist/index.node.mjs
18.81KB -
errors/dist/index.node.mjs
17.22KB -
errors/dist/index.browser.mjs
17.2KB -
errors/dist/index.native.mjs
17.2KB -
transaction-messages/dist/index.browser.mjs
7.29KB -
transaction-messages/dist/index.native.mjs
7.29KB -
transaction-messages/dist/index.node.mjs
7.29KB -
offchain-messages/dist/index.browser.mjs
4.89KB -
offchain-messages/dist/index.native.mjs
4.89KB -
offchain-messages/dist/index.node.mjs
4.89KB -
codecs-data-structures/dist/index.browser.mjs
4.69KB -
codecs-data-structures/dist/index.native.mjs
4.69KB -
codecs-data-structures/dist/index.node.mjs
4.69KB -
instruction-plans/dist/index.browser.mjs
3.81KB -
instruction-plans/dist/index.native.mjs
3.81KB -
instruction-plans/dist/index.node.mjs
3.81KB -
codecs-core/dist/index.browser.mjs
3.61KB -
codecs-core/dist/index.native.mjs
3.61KB -
codecs-core/dist/index.node.mjs
3.61KB -
webcrypto-ed25519-polyfill/dist/index.node.mj
s
3.61KB -
webcrypto-ed25519-polyfill/dist/index.browser
.mjs
3.59KB -
webcrypto-ed25519-polyfill/dist/index.native.
mjs
3.57KB -
rpc-subscriptions/dist/index.browser.mjs
3.37KB -
rpc-subscriptions/dist/index.node.mjs
3.34KB -
rpc-subscriptions/dist/index.native.mjs
3.31KB -
rpc-transformers/dist/index.browser.mjs
2.93KB -
rpc-transformers/dist/index.native.mjs
2.93KB -
rpc-transformers/dist/index.node.mjs
2.93KB -
addresses/dist/index.browser.mjs
2.93KB -
addresses/dist/index.native.mjs
2.92KB -
addresses/dist/index.node.mjs
2.92KB -
signers/dist/index.browser.mjs
2.9KB -
signers/dist/index.native.mjs
2.9KB -
signers/dist/index.node.mjs
2.9KB -
transactions/dist/index.browser.mjs
2.87KB -
transactions/dist/index.native.mjs
2.86KB -
transactions/dist/index.node.mjs
2.86KB -
codecs-strings/dist/index.browser.mjs
2.53KB -
codecs-strings/dist/index.node.mjs
2.49KB -
codecs-strings/dist/index.native.mjs
2.45KB -
transaction-confirmation/dist/index.node.mjs
2.41KB -
transaction-confirmation/dist/index.native.mj
s
2.36KB -
transaction-confirmation/dist/index.browser.m
js
2.35KB -
sysvars/dist/index.browser.mjs
2.35KB -
sysvars/dist/index.native.mjs
2.34KB -
sysvars/dist/index.node.mjs
2.34KB -
react/dist/index.browser.mjs
2.32KB -
react/dist/index.native.mjs
2.31KB -
react/dist/index.node.mjs
2.31KB -
rpc-subscriptions-spec/dist/index.node.mjs
2.18KB -
rpc-subscriptions-spec/dist/index.native.mjs
2.13KB -
rpc-subscriptions-spec/dist/index.browser.mjs
2.13KB -
keys/dist/index.browser.mjs
2.1KB -
keys/dist/index.native.mjs
2.1KB -
keys/dist/index.node.mjs
2.1KB -
rpc/dist/index.node.mjs
1.95KB -
codecs-numbers/dist/index.browser.mjs
1.95KB -
codecs-numbers/dist/index.native.mjs
1.95KB -
codecs-numbers/dist/index.node.mjs
1.94KB -
rpc-transport-http/dist/index.browser.mjs
1.91KB -
rpc-transport-http/dist/index.native.mjs
1.9KB -
kit/dist/index.browser.mjs
1.89KB -
kit/dist/index.native.mjs
1.89KB -
kit/dist/index.node.mjs
1.88KB -
rpc/dist/index.native.mjs
1.8KB -
rpc/dist/index.browser.mjs
1.8KB -
subscribable/dist/index.node.mjs
1.8KB -
subscribable/dist/index.native.mjs
1.75KB -
subscribable/dist/index.browser.mjs
1.74KB -
rpc-transport-http/dist/index.node.mjs
1.72KB -
rpc-types/dist/index.browser.mjs
1.53KB -
rpc-types/dist/index.native.mjs
1.53KB -
rpc-types/dist/index.node.mjs
1.53KB -
rpc-subscriptions-channel-websocket/dist/inde
x.node.mjs
1.33KB -
rpc-subscriptions-channel-websocket/dist/inde
x.native.mjs
1.27KB -
rpc-subscriptions-channel-websocket/dist/inde
x.browser.mjs
1.26KB -
options/dist/index.browser.mjs
1.18KB -
options/dist/index.native.mjs
1.18KB -
options/dist/index.node.mjs
1.17KB -
accounts/dist/index.browser.mjs
1.13KB -
accounts/dist/index.native.mjs
1.12KB -
accounts/dist/index.node.mjs
1.12KB -
rpc-api/dist/index.browser.mjs
976B -
rpc-api/dist/index.native.mjs
975B -
rpc-api/dist/index.node.mjs
973B -
compat/dist/index.browser.mjs
969B -
compat/dist/index.native.mjs
968B -
compat/dist/index.node.mjs
966B -
rpc-spec-types/dist/index.browser.mjs
962B -
rpc-spec-types/dist/index.native.mjs
961B -
rpc-spec-types/dist/index.node.mjs
959B -
rpc-subscriptions-api/dist/index.native.mjs
870B -
rpc-subscriptions-api/dist/index.node.mjs
869B -
rpc-subscriptions-api/dist/index.browser.mjs
868B -
rpc-spec/dist/index.browser.mjs
852B -
rpc-spec/dist/index.native.mjs
851B -
rpc-spec/dist/index.node.mjs
850B -
promises/dist/index.browser.mjs
799B -
promises/dist/index.native.mjs
798B -
promises/dist/index.node.mjs
797B -
assertions/dist/index.browser.mjs
783B -
instructions/dist/index.browser.mjs
771B -
instructions/dist/index.native.mjs
770B -
instructions/dist/index.node.mjs
768B -
fast-stable-stringify/dist/index.browser.mjs
726B -
fast-stable-stringify/dist/index.native.mjs
725B -
assertions/dist/index.native.mjs
724B -
fast-stable-stringify/dist/index.node.mjs
724B -
assertions/dist/index.node.mjs
723B -
programs/dist/index.browser.mjs
329B -
plugin-core/dist/index.browser.mjs
328B -
programs/dist/index.native.mjs
327B -
plugin-core/dist/index.native.mjs
326B -
programs/dist/index.node.mjs
325B -
plugin-core/dist/index.node.mjs
324B -
event-target-impl/dist/index.node.mjs
230B -
functional/dist/index.browser.mjs
154B -
functional/dist/index.native.mjs
152B -
text-encoding-impl/dist/index.native.mjs
152B -
functional/dist/index.node.mjs
151B -
codecs/dist/index.browser.mjs
137B -
codecs/dist/index.native.mjs
136B -
codecs/dist/index.node.mjs
134B -
event-target-impl/dist/index.browser.mjs
133B -
ws-impl/dist/index.node.mjs
131B -
text-encoding-impl/dist/index.browser.mjs
122B -
text-encoding-impl/dist/index.node.mjs
119B -
ws-impl/dist/index.browser.mjs
113B -
crypto-impl/dist/index.node.mjs
111B -
crypto-impl/dist/index.browser.mjs
109B -
rpc-parsed-types/dist/index.browser.mjs
66B -
rpc-parsed-types/dist/index.native.mjs
65B -
rpc-parsed-types/dist/index.node.mjs
63B -

Total files change +20B +0.01%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

mcintyre94
mcintyre94 previously approved these changes Jan 8, 2026
Copy link
Member

@mcintyre94 mcintyre94 left a comment

Choose a reason for hiding this comment

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

This is looking great, thankyou!

We will need a changeset for this, we can do a minor version with a message like: "Add useSignTransactions and useSignAndSendTransactions hooks that you can use to send multiple transactions to a connected wallet."

Also looks like we need a pnpm style:fix to tidy up the lint CI error.

LMK if you want me to pick up these last few changes to get it over the line :)

Discussed with @lorisleiva and we're going to keep shipping both the single and plural APIs, so no need to deprecate the single ones.

}
```

### `useSignAndSendTransactions(uiWalletAccount, chain)`
Copy link
Member

Choose a reason for hiding this comment

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

Can we move this to the end of the README? Below where you added useSignTransactions

@rajgoesout rajgoesout force-pushed the feat/export-plural-sign-hooks branch from c863029 to eebc4fa Compare January 8, 2026 10:18
@github-actions github-actions bot dismissed mcintyre94’s stale review January 8, 2026 10:19

Your organization requires reapproval when changes are made, so Graphite has dismissed approvals. See the output of git range-diff at https://github.com/anza-xyz/kit/actions/runs/20813439388

@rajgoesout rajgoesout force-pushed the feat/export-plural-sign-hooks branch from 81a328a to a00d986 Compare January 8, 2026 10:24
Export plural versions of useSignTransaction and useSignAndSendTransaction.

Closes anza-xyz#1104
@rajgoesout rajgoesout force-pushed the feat/export-plural-sign-hooks branch from a00d986 to 90764b0 Compare January 8, 2026 10:30
@rajgoesout
Copy link
Contributor Author

@mcintyre94 thanks for the review. I've made the changes

mcintyre94
mcintyre94 previously approved these changes Jan 8, 2026
Copy link
Member

@mcintyre94 mcintyre94 left a comment

Choose a reason for hiding this comment

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

Awesome, thankyou!

@mcintyre94 mcintyre94 enabled auto-merge January 8, 2026 11:15
@mcintyre94 mcintyre94 dismissed steveluscher’s stale review January 8, 2026 11:16

These changes have been addressed

@github-actions github-actions bot dismissed mcintyre94’s stale review January 8, 2026 12:18

Your organization requires reapproval when changes are made, so Graphite has dismissed approvals. See the output of git range-diff at https://github.com/anza-xyz/kit/actions/runs/20816553115

@mcintyre94
Copy link
Member

Github saying "Code scanning is waiting for results from CodeQL for the commits 51a853f or 3fd0e3f." - seems to be a github bug
Merging manually

@mcintyre94 mcintyre94 disabled auto-merge January 8, 2026 12:55
@mcintyre94 mcintyre94 merged commit a301da8 into anza-xyz:main Jan 8, 2026
11 checks passed
@github-actions
Copy link
Contributor

github-actions bot commented Jan 8, 2026

🔎💬 Inkeep AI search and chat service is syncing content for source 'Solana Kit Docs'

@github-actions
Copy link
Contributor

Because there has been no activity on this PR for 14 days since it was merged, it has been automatically locked. Please open a new issue if it requires a follow up.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jan 23, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Export plural versions of useSignTransaction and useSignAndSendTransaction

3 participants