Skip to content

Enforce 64-instruction transaction limit across kit#1157

Closed
rajgoesout wants to merge 1 commit intoanza-xyz:mainfrom
rajgoesout:feat/tx-instruction-limit-64
Closed

Enforce 64-instruction transaction limit across kit#1157
rajgoesout wants to merge 1 commit intoanza-xyz:mainfrom
rajgoesout:feat/tx-instruction-limit-64

Conversation

@rajgoesout
Copy link
Copy Markdown
Contributor

Problem

SIMD‑0296 raises the transaction byte limit to 4096, but the instruction count cap stays at 64.
Kit currently enforces size, not instruction count, so transactions could exceed 64 instructions once the size limit increases.

We need to enforce the 64‑instruction limit when building/compiling messages and when planning transactions.

Summary of Changes

  • add instruction-limit types/constants and new error code/message/context
  • enforce limit in message append/prepend, compilation, and instruction planning
  • propagate instruction-limit typing through transactions, signers, and react
  • add unit/typetests for message/transaction limits and sendable checks

Closes #1102

- add instruction-limit types/constants and new error code/message/context
- enforce limit in message append/prepend, compilation, and instruction planning
- propagate instruction-limit typing through transactions, signers, and react
- add unit/typetests for message/transaction limits and sendable checks

Closes anza-xyz#1102
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Dec 29, 2025

🦋 Changeset detected

Latest commit: 12dcf84

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

This PR includes changesets to release 43 packages
Name Type
@solana/transaction-messages Major
@solana/transactions Major
@solana/signers Major
@solana/react Major
@solana/instruction-plans Major
@solana/errors Major
@solana/kit Major
@solana/programs Major
@solana/rpc-api Major
@solana/rpc-subscriptions-api Major
@solana/transaction-confirmation Major
@solana/compat Major
@solana/rpc-graphql Major
@solana/accounts 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/instructions Major
@solana/keys Major
@solana/offchain-messages Major
@solana/options Major
@solana/rpc-spec Major
@solana/rpc-subscriptions-channel-websocket Major
@solana/rpc-subscriptions-spec Major
@solana/rpc-subscriptions Major
@solana/rpc-transformers Major
@solana/rpc-transport-http Major
@solana/rpc-types Major
@solana/rpc Major
@solana/subscribable Major
@solana/sysvars Major
@solana/rpc-parsed-types Major
@solana/codecs Major
@solana/fast-stable-stringify Major
@solana/functional Major
@solana/nominal-types Major
@solana/plugin-core 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
Copy Markdown

bundlemon Bot commented Jan 5, 2026

BundleMon

Files updated (19)
Status Path Size Limits
@solana/kit production bundle
kit/dist/index.production.min.js
39.53KB (+302B +0.75%) -
transactions/dist/index.browser.mjs
3.04KB (+178B +6.07%) -
transactions/dist/index.native.mjs
3.04KB (+178B +6.07%) -
transactions/dist/index.node.mjs
3.04KB (+177B +6.04%) -
transaction-messages/dist/index.node.mjs
7.45KB (+161B +2.16%) -
transaction-messages/dist/index.browser.mjs
7.45KB (+160B +2.14%) -
transaction-messages/dist/index.native.mjs
7.45KB (+160B +2.14%) -
instruction-plans/dist/index.browser.mjs
3.94KB (+125B +3.2%) -
instruction-plans/dist/index.native.mjs
3.93KB (+125B +3.2%) -
instruction-plans/dist/index.node.mjs
3.93KB (+124B +3.18%) -
errors/dist/index.browser.mjs
17.27KB (+72B +0.41%) -
errors/dist/index.native.mjs
17.27KB (+72B +0.41%) -
errors/dist/index.node.mjs
17.29KB (+72B +0.41%) -
signers/dist/index.browser.mjs
2.94KB (+38B +1.28%) -
signers/dist/index.native.mjs
2.94KB (+37B +1.25%) -
signers/dist/index.node.mjs
2.94KB (+37B +1.25%) -
react/dist/index.browser.mjs
2.33KB (+17B +0.72%) -
react/dist/index.native.mjs
2.32KB (+17B +0.72%) -
react/dist/index.node.mjs
2.32KB (+16B +0.68%) -
Unchanged files (117)
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 -
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 -
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 -
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 -
rpc/dist/index.native.mjs
1.81KB -
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.69KB -
kit/dist/index.native.mjs
1.69KB -
kit/dist/index.node.mjs
1.69KB -
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.02KB +0.52%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

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.

Thanks a lot for picking this up and working on it! I wasn't expecting this to be picked up so quickly after I created the issue, and I need to think a bit more about the design and complexity here. We don't need to rush this because it isn't critical until we have v1 transactions with the larger size limit. And as-is this would be a major bump which I don't want to take lightly.

I'm going to put this PR in draft so we don't accidentally merge it for now.

@mcintyre94 mcintyre94 marked this pull request as draft January 8, 2026 17:53
@mcintyre94 mcintyre94 added the do-not-close Add this tag to exempt an issue/PR from being closed by the stalebot label Jan 13, 2026
@mcintyre94
Copy link
Copy Markdown
Member

Superseded by #1496 - so I'll close this, but thankyou!

@mcintyre94 mcintyre94 closed this Apr 3, 2026
@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 Apr 17, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

do-not-close Add this tag to exempt an issue/PR from being closed by the stalebot

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Limit transactions to 64 instructions

2 participants