Skip to content

Feat: Persistent selected wallet account context provider#1154

Merged
mcintyre94 merged 17 commits intoanza-xyz:mainfrom
ningthoujamSwamikumar:feat-persistent-selected-wallet-provider
Jan 8, 2026
Merged

Feat: Persistent selected wallet account context provider#1154
mcintyre94 merged 17 commits intoanza-xyz:mainfrom
ningthoujamSwamikumar:feat-persistent-selected-wallet-provider

Conversation

@ningthoujamSwamikumar
Copy link
Copy Markdown
Contributor

@ningthoujamSwamikumar ningthoujamSwamikumar commented Dec 27, 2025

Problem

The biggest piece of complexity in the example react-app is about persisting the selected wallet. And while wallet-standard allows an app to be connected to multiple wallets/accounts per wallet, in practice most apps will want to have some context about the currently active account, ie the UiWalletAccount to pass to hooks like useSignAndSendTransaction.

Summary of Changes

  • Created react context and context provider for selected wallet accounts.
  • Expose the context as a hook with valid Value.
  • Generalize the provider by taking functions to store, delete, and retrieve persistent account keys.
  • User's selection/choice of wallet account precedes auto-restore of persisted wallet account, using a per provider instance flag.

Fixes #1148

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Dec 27, 2025

🦋 Changeset detected

Latest commit: 7745d9f

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

@ningthoujamSwamikumar ningthoujamSwamikumar marked this pull request as draft December 27, 2025 04:52
@ningthoujamSwamikumar
Copy link
Copy Markdown
Contributor Author

Hi @mcintyre94 I have done the selected wallet context provider. And I am trying to unit test for that but I find the existing tests are being written using react-test-renderer which is deprecated. Should I write the test for this using react-test-renderer or react-testing-library? I think its better to start writing in react-testing-library as its gonna be migrated to this at some point.

@mcintyre94
Copy link
Copy Markdown
Member

mcintyre94 commented Dec 28, 2025

Thanks @ningthoujamSwamikumar, I'll try to review this soon. In terms of testing I'm happy to use react-testing-library as this is what react-test-renderer seems to be recommending. Don't worry about updating the existing tests but I'll open an issue for that. Thanks for flagging!

BTW a useful validation check for this would be using it in the react app :)

@bundlemon
Copy link
Copy Markdown

bundlemon Bot commented Dec 28, 2025

BundleMon

Files updated (3)
Status Path Size Limits
react/dist/index.browser.mjs
3.07KB (+777B +32.77%) -
react/dist/index.native.mjs
3.07KB (+777B +32.78%) -
react/dist/index.node.mjs
3.07KB (+777B +32.81%) -
Unchanged files (133)
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 -
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 +2.28KB +0.59%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@ningthoujamSwamikumar ningthoujamSwamikumar marked this pull request as ready for review January 4, 2026 04:00
@ningthoujamSwamikumar
Copy link
Copy Markdown
Contributor Author

@mcintyre94 Hi. Can you please review this PR. I have ensured all test pass except for node unit test because of pattern matching issue in test-config/jest-unit.config.node.ts .

testPathIgnorePatterns: [...(commonConfig.testPathIgnorePatterns ?? []), '-test.browser.ts$'],

the ignore path pattern (above permalink) doesn't match with tsx file. Similar issue in test-config/jest-unit.config.browser.ts .
We need to update the ignore path patterns to match '.tsx' files as well. It is matching only '.ts' files now. And I think since we now have two types of environment to run test on namely browser and node, we need to name the test files appropriately to match ignore path pattern in these test configs.
i.e.
A test file name should match the pattern '-test.browser.tsx?$', or '-test.node.tsx?$' respectively for browser, and node tests. This way browser test will ignore node files, and node test will ignore browser test files. Hence we won't get test failures due to wrong environment which I am current having while running test for node. Because the filename ending with browser.tsx does not match the ignore path pattern of node test. But the file name should have extensin tsx as it has jsx syntax.

Let me know of any feedbacks and comments on my thoughts and the changes made in this PR.

Copy link
Copy Markdown
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.

Thankyou, this is looking really good! Great tests too :)

On the Node test issue, I agree with you that we should change that pattern for Node. '-test.browser.tsx?$' works for me locally in the jest-unit.config.node.ts file and makes sense. Feel free to add that to this PR or I can. Don't worry about the browser equivalent, we're unlikely to use JSX in a test that can't run in the browser.

Comment thread packages/react/src/SelectedWalletAccountContextProvider.tsx Outdated
Comment thread packages/react/src/selectedWalletAccountContext.ts Outdated
Comment thread packages/react/src/selectedWalletAccountContext.ts
Comment thread packages/react/src/selectedWalletAccountContext.ts
@ningthoujamSwamikumar
Copy link
Copy Markdown
Contributor Author

Thankyou, this is looking really good! Great tests too :)

On the Node test issue, I agree with you that we should change that pattern for Node. '-test.browser.tsx?$' works for me locally in the jest-unit.config.node.ts file and makes sense. Feel free to add that to this PR or I can. Don't worry about the browser equivalent, we're unlikely to use JSX in a test that can't run in the browser.

I have updated test-config/jest-unit.config.node.ts to reflect the same. And all test are passed, atleast in my local.

Thanks for all the feedback.

Copy link
Copy Markdown
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 now! I've tested locally and it works well in the example app. Thankyou for all your work on this!

I'm going to make a few small changes to the docs and then will get this merged :)

Comment thread packages/react/src/SelectedWalletAccountContextProvider.tsx Outdated
Comment thread packages/react/src/__typetests__/selectedWalletAccountContextProvider-typetest.ts Outdated
@mcintyre94 mcintyre94 force-pushed the feat-persistent-selected-wallet-provider branch from 7d27c55 to c72df49 Compare January 8, 2026 13:14
@mcintyre94 mcintyre94 force-pushed the feat-persistent-selected-wallet-provider branch 2 times, most recently from e67a257 to e3cf0eb Compare January 8, 2026 16:32
mcintyre94
mcintyre94 previously approved these changes Jan 8, 2026
@mcintyre94 mcintyre94 force-pushed the feat-persistent-selected-wallet-provider branch from e3cf0eb to a6b5425 Compare January 8, 2026 16:43
@github-actions github-actions Bot dismissed mcintyre94’s stale review January 8, 2026 16:44

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/20824418634

@mcintyre94 mcintyre94 enabled auto-merge January 8, 2026 17:54
@mcintyre94 mcintyre94 disabled auto-merge January 8, 2026 17:55
@mcintyre94 mcintyre94 merged commit fec04ae into anza-xyz:main Jan 8, 2026
13 of 15 checks passed
@github-actions
Copy link
Copy Markdown
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
Copy Markdown
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.

Feat: A React context provider to persist the selected wallet

2 participants