Skip to content

Conversation

@joncinque
Copy link
Contributor

Problem

The BorshIoError variant of InstructionError was changed from a string to a unit variant in the Rust SDK in this PR, but the change hasn't been reflected in Kit yet.

Summary of changes

Change the BorshIoError variant to lop off any string that comes back for compatibility with old and new errors emitted by the runtime.

Add the new variant to the RPC error type list.

#### Problem

The `BorshIoError` variant of `InstructionError` was changed from a
string to a unit variant in the Rust SDK in
[this PR](anza-xyz/solana-sdk#12), but the
change hasn't been reflected in Kit yet.

#### Summary of changes

Change the `BorshIoError` variant to lop off any string that comes back
for compatibility with old and new errors emitted by the runtime.

Add the new variant to the RPC error type list.
@changeset-bot
Copy link

changeset-bot bot commented Oct 23, 2025

🦋 Changeset detected

Latest commit: b90059f

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

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

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

@bundlemon
Copy link

bundlemon bot commented Oct 23, 2025

BundleMon

Files updated (4)
Status Path Size Limits
@solana/kit production bundle
kit/dist/index.production.min.js
36.1KB (-14B -0.04%) -
errors/dist/index.browser.mjs
15.68KB (-45B -0.28%) -
errors/dist/index.native.mjs
15.67KB (-45B -0.28%) -
errors/dist/index.node.mjs
15.7KB (-45B -0.28%) -
Unchanged files (126)
Status Path Size Limits
rpc-graphql/dist/index.browser.mjs
18.82KB -
rpc-graphql/dist/index.native.mjs
18.81KB -
rpc-graphql/dist/index.node.mjs
18.81KB -
transaction-messages/dist/index.browser.mjs
7.29KB -
transaction-messages/dist/index.native.mjs
7.29KB -
transaction-messages/dist/index.node.mjs
7.29KB -
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 -
webcrypto-ed25519-polyfill/dist/index.node.mj
s
3.6KB -
webcrypto-ed25519-polyfill/dist/index.browser
.mjs
3.59KB -
webcrypto-ed25519-polyfill/dist/index.native.
mjs
3.57KB -
instruction-plans/dist/index.browser.mjs
3.42KB -
instruction-plans/dist/index.native.mjs
3.42KB -
instruction-plans/dist/index.node.mjs
3.41KB -
codecs-core/dist/index.browser.mjs
3.41KB -
codecs-core/dist/index.native.mjs
3.41KB -
codecs-core/dist/index.node.mjs
3.41KB -
rpc-subscriptions/dist/index.browser.mjs
3.37KB -
rpc-subscriptions/dist/index.node.mjs
3.34KB -
rpc-subscriptions/dist/index.native.mjs
3.31KB -
addresses/dist/index.browser.mjs
2.93KB -
rpc-transformers/dist/index.browser.mjs
2.93KB -
rpc-transformers/dist/index.native.mjs
2.93KB -
addresses/dist/index.native.mjs
2.93KB -
addresses/dist/index.node.mjs
2.93KB -
rpc-transformers/dist/index.node.mjs
2.93KB -
transactions/dist/index.browser.mjs
2.9KB -
transactions/dist/index.native.mjs
2.9KB -
transactions/dist/index.node.mjs
2.9KB -
signers/dist/index.browser.mjs
2.63KB -
signers/dist/index.native.mjs
2.63KB -
signers/dist/index.node.mjs
2.62KB -
codecs-strings/dist/index.browser.mjs
2.53KB -
codecs-strings/dist/index.node.mjs
2.48KB -
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.31KB -
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.08KB -
keys/dist/index.native.mjs
2.08KB -
keys/dist/index.node.mjs
2.08KB -
codecs-numbers/dist/index.native.mjs
2.01KB -
codecs-numbers/dist/index.browser.mjs
2.01KB -
codecs-numbers/dist/index.node.mjs
2.01KB -
rpc/dist/index.node.mjs
1.95KB -
rpc-transport-http/dist/index.browser.mjs
1.91KB -
rpc-transport-http/dist/index.native.mjs
1.9KB -
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 -
kit/dist/index.browser.mjs
1.68KB -
kit/dist/index.native.mjs
1.68KB -
kit/dist/index.node.mjs
1.67KB -
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
769B -
instructions/dist/index.native.mjs
768B -
instructions/dist/index.node.mjs
767B -
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 -
programs/dist/index.native.mjs
327B -
programs/dist/index.node.mjs
325B -
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 -149B -0.04%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

Copy link
Collaborator

@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.

I can work on fixing this up.

});
it('produces the correct `SolanaError` for a `BorshIoError` error', () => {
it('produces the correct `SolanaError` for a `BorshIoError` error from a string', () => {
const error = getSolanaErrorFromInstructionError(123, { BorshIoError: 'abc' });
Copy link
Collaborator

Choose a reason for hiding this comment

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

This change means that we need to make two tests, right: one that handles the error being { BorshIoError: 'abc' } and a second test that handles it being "BorshIoError"?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I added it on line 54 as part of the generic test -- shouldn't that do what you're suggesting?

Copy link
Collaborator

Choose a reason for hiding this comment

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

I dumb.

@joncinque
Copy link
Contributor Author

joncinque commented Oct 23, 2025

And sorry, how do I change set?

Never mind, seems like that only happens with version bumps, so let me know if you want me to include one

@steveluscher
Copy link
Collaborator

Aagh! I said I'd work on it, and now I can't push because you updated the branch, lol. :)

@joncinque
Copy link
Contributor Author

Aagh! I said I'd work on it, and now I can't push because you updated the branch, lol. :)

Ah sorry, I took a guess and assumed you preferred atomic commits over adding commits to PRs 🙏

@steveluscher
Copy link
Collaborator

OK, ready to review @joncinque! Did I get everything right?

| 'UnsupportedProgramId'
| 'UnsupportedSysvar'
| 'BorshIoError' // SDKv3 has a fieldless `BorshIoError`
| { BorshIoError: string } // SDK pre-v3 has a newtype for `BorshIoError`
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is my lack of knowledge of how this is plumbed throughout the system -- if an old block contains { BorshIoError: "string" }, will that cause an issue? Or will it be properly parsed in the errors package?

Copy link
Collaborator

Choose a reason for hiding this comment

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

I guess it, in fact, depends. Command clicking ‘show references’ on InstructionError eventually leads me to TransactionForAccountsMetaBase which exposes err: TransactionError (which contains InstructionError, sometimes).

I guess the thing that I don't know, is: after the change to the SDK, can RPC methods that return this type (eg. getBlock, blockSubscribe) return the newtype format anymore, or will they always return the unit type of BorshIoError?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

v2 RPCs will always return the newtype, while v3 RPCs will always return the unit.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Yeah, this would require the thing that we don't have yet, which is the ability to build different Kit bundles based on the version of the RPC and/or enabled features (#28). Options are:

  1. Scorched Earth, remove the old type, presume that all RPCs will be replace with v3 before anybody who would be affected upgrades to the next version of Kit
  2. Keep both types, make a plan to eventually remove the old one when v3 is the network.

I figured in this particular case, option one would be fine, but you tell me – how long is it before v3 likely becomes the network?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

v3 currently has the majority of stake (including frankendancer), so maybe scorched earth is ok:

Stake By Version:
3.1.0   -    6 current validators ( 0.15%)
3.0.8   -    1 current validators ( 0.01%)
3.0.7   -   65 current validators ( 4.20%)
3.0.6   -  359 current validators (38.31%)   5 delinquent validators ( 0.00%)
3.0.2   -    1 current validators ( 0.25%)
3.0.1   -    1 current validators ( 0.01%)
2.3.14  -    2 current validators ( 0.03%)
2.3.13  -   25 current validators ( 3.29%)   1 delinquent validators ( 0.02%)
2.3.11  -   63 current validators (16.21%)   2 delinquent validators ( 0.00%)
2.3.10  -   21 current validators ( 2.17%)
2.3.9   -    6 current validators ( 0.10%)   1 delinquent validators ( 0.00%)
2.3.8   -   98 current validators ( 8.51%)   8 delinquent validators ( 0.03%)
2.3.7   -    1 current validators ( 0.04%)
2.3.6   -   59 current validators ( 2.33%)   1 delinquent validators ( 0.00%)
2.3.5   -    2 current validators ( 0.40%)
0.712.30006 -  163 current validators (16.67%)
0.711.30006 -    2 current validators ( 0.19%)
0.709.30000 -    4 current validators ( 0.46%)
0.708.20306 -   50 current validators ( 6.39%)
0.707.20306 -    2 current validators ( 0.23%)
0.1.1   -    0 current validators ( 0.00%)   1 delinquent validators ( 0.00%)
unknown -    0 current validators ( 0.00%)  21 delinquent validators ( 0.01%)

Copy link
Collaborator

Choose a reason for hiding this comment

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

OK. Let's do it. I need a stamp from you since I'm the last pusher.

@steveluscher
Copy link
Collaborator

And sorry, how do I change set?

You can run pnpm changeset on the CLI.

@steveluscher steveluscher self-requested a review October 23, 2025 18:25
@steveluscher steveluscher merged commit 0fed638 into anza-xyz:main Oct 23, 2025
8 of 9 checks passed
@github-actions github-actions bot mentioned this pull request Oct 23, 2025
@joncinque joncinque deleted the borshioerror branch October 23, 2025 18:52
@joncinque
Copy link
Contributor Author

Thanks for the help!

@github-actions
Copy link
Contributor

github-actions bot commented Nov 7, 2025

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 Nov 7, 2025
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.

2 participants