Skip to main content
Technical proposal SIMD-0339 Review

Increase CPI Account Infos Limit

  1. Idea
  2. Draft
  3. Review
  4. Accept
  5. Implement
  6. Active

Decision brief

Why this proposal matters

Increase the maximum number of account info's for cross-program invoked (CPI) instructions from 64 to 255 and consume compute units for serialized account info's and instruction account meta's.

Source-backed reading aid · source language: EN

Proposal at a glance

What changes

  • Account Info: The serialized information for each account referenced in a CPI instruction used to read account info from the caller program.
  • 32 bytes for account address
  • 32 bytes for owner address

Stakeholder map

Who is affected

Builders & client teams Medium impact

CPI's will consume compute units proportional to the number of account info's and instruction accounts. This gives an extra incentive to onchain programs to decrease the number of accounts passed to CPI's.

Action requirement unknown
Validators & operators Impact unknown

No proposal-specific evidence was found for this group.

Action requirement unknown
Users & stakers Impact unknown

No proposal-specific evidence was found for this group.

Action requirement unknown
Governance & ecosystem Impact unknown

No proposal-specific evidence was found for this group.

Action requirement unknown

Exact source revision

Full proposal document

Source-language document. Technical identifiers and evidence remain unchanged. f1f6c8b05dc2

Summary

Increase the maximum number of account info's for cross-program invoked (CPI) instructions from 64 to 255 and consume compute units for serialized account info's and instruction account meta's.

Motivation

CPI's are restricted to a limit of 64 account info's passed to the syscall. This limit is burdensome for onchain programs which themselves were invoked with more than 64 accounts because it means they cannot simply pass through the same list of account info's that they were invoked with to another CPI syscall. They are faced with the burden of first deduplicating the account info's and constructing a new list before making the syscall.

This problem arises when onchain programs wrap another program (such as Jupiter) that composes many other programs and are invoked with over 64 accounts (including duplicates).

Along with the increasing the account info limit, start charging for both serialized account info's and instruction account meta's to avoid abuse of resources in CPI calls.

New Terminology

  • Account Info: The serialized information for each account referenced in a CPI instruction used to read account info from the caller program.

Detailed Design

Maximum Account Info Length

Increase the maximum account info length imposed on CPI syscalls from 64 to 255. The maximum is inclusive, meaning that a list of account info's with a length of 255 is valid.

Account Info Cost

Consume 1 compute unit (CU) for every cpi_bytes_per_unit (currently 250) bytes of account info.

Fixed size of 80 bytes for each account_info broken down as

  • 32 bytes for account address
  • 32 bytes for owner address
  • 8 bytes for lamport balance
  • 8 bytes for data length

The total cost of account info's can be computed with (account_info_size * account_infos_len) / cpi_bytes_per_unit rounded down to the nearest CU.

Note that the SVM can skip duplicate or unused account info's but for simpler CU accounting, each account info has the same effect on cost regardless of whether it's actually used by the invoked instruction.

Instruction Account Metadata Cost

Consume 1 compute unit (CU) for every cpi_bytes_per_unit (currently 250) bytes of instruction account metadata.

Fixed size of 34 bytes for each ix_account_metadata broken down as

  • 32 bytes for account address
  • 1 byte for signer flag
  • 1 byte for writable flag

The total cost of instruction account metadata can be computed with (ix_account_metadata_size * ix.accounts.len()) / cpi_bytes_per_unit rounded down to the nearest CU.

Reduce base CPI cost

The base cost of CPI syscalls is currently set to 1000 compute units. In order to avoid charging more CU's for existing onchain program behavior after the activation of this feature, the base cost of CPI syscalls will decreased by 54 compute units to 946 compute units to offset the new costs.

Before this SIMD, up to 255 instruction account metadata's could be passed to a CPI syscall. The base cost offset is therefore 255 * 34 / 250 = 34 CU's.

Before this SIMD, up to 64 account info's could be passed to a CPI syscall. The base cost offset is therefore 64 * 80 / 250 = 20 CU's.

Alternatives Considered

What alternative designs were considered and what pros/cons does this feature have relative to them?

Impact

Since the list of account info's passed to a CPI can now be ~4 times longer, there will be more overhead in the SVM to map each instruction account address to one of the account info's.

The number of allowed unique account info's remains unchanged so the maximum amount of accounts that need to be translated for a CPI syscall has not increased.

CPI's will consume compute units proportional to the number of account info's and instruction accounts. This gives an extra incentive to onchain programs to decrease the number of accounts passed to CPI's.

Security Considerations

NA

Drawbacks (Optional)

Why should we not do this?

Backwards Compatibility (Optional)

The max account info length increase for CPI's and new costs will be feature gated. Since the limit is being increased, existing behavior will not be restricted.

Evidence graph

Related proposals and rollout

One or more sources are unavailable.

Upstream review record

Upstream discussion & review

GitHub review is editorial context, not evidence of on-chain support, voting, or outcome.

PR #339 · merged SIMD-0339: Increase CPI Account Info Limit 22 comments and reviews · Jan 12, 2026
@jstarry

After discussion with @Lichtso we decided it was better to offset the base cost of CPI's by the maximum account cost of existing allowed behavior. So consumed CU's for existing behavior will only be decreased, if at all.

GitHub ↗
@jstarry

We would have to either only charge CUs for things going over the current limit or offset CUs in the CPI base cost, not to break existing dApps. Yeah, agreed. Just updated the SIMD to reflect an offset to the CPI base cost. Also, this SIMD should probably depend on https://github.com/solana-foundation/solana-improvement-documents/pull/219 for direct mapping as this will reduce some overhead of instruction accounts. Do you mean the overhead of instruction account info's? Can you explain what overhead you mean? I don't think the overhead actually changes in this SIMD because the number of translated account's is still capped at 64 because we only translate unique instances of each account, we

GitHub ↗
@Lichtso

Sorry, I meant the overhead of instruction accounts. How is that still limited after this SIMD? If you can pass in 255 AccountInfos and 255 AccountMetas, wouldn't they translate into 255 instruction accounts (which are possibly all unique)?

GitHub ↗
@jstarry

Sorry, I meant the overhead of instruction accounts. How is that still limited after this SIMD? If you can pass in 255 AccountInfos and 255 AccountMetas, wouldn't they translate into 255 instruction accounts (which are possibly all unique)? Transactions can only have 64 unique accounts right now and it's not possible to reference other accounts besides those 64 in a CPI. Also, you can already pass 255 instruction account metas. Allowing 255 account info's in this SIMD just makes it easier for an onchain program invoked with 255 instruction account metas to pass many or all of those accounts to another onchain program CPI

GitHub ↗
@febo

Yeah, that reads better.

GitHub ↗
@Lichtso

It currently does not make sense to pass in that many, so it probably does not happen. Realistically this should maybe assume 64 as well?

GitHub ↗
@jstarry

It is already over 64 in the wild (see here: https://explorer.solana.com/tx/69BYATGo3SrSPBKbF5PBs36DvJUssxrFBJtXhfRkmDBrLvLapGevr3NzpKPcBTPr52tYHCkdRNbCyXpuWjMrb4n). I think it's safer to assume 255 since it's only 34 CU's

GitHub ↗

simd.watch community discussion · SIMD-0339

Powered by Giscus · Sign in with GitHub to comment

Community comments load when this section approaches the viewport.

Provenance

Evidence & technical details

Rollout or chain data, source revisions, freshness and integrity.
2

SIMD

Deployment Status

Document lifecycleReview
CategoryCore protocol

Feature Gate not yet created

Exact source revision

Sources & integrity

  • Proposal document pinned_commit_blob
    f1f6c8b05dc205552d3c290a854a438392701107
  • simd-document document · stale · Oct 17, 2026
    f1f6c8b05dc205552d3c290a854a438392701107

One or more sources are unavailable.