Skip to content

feat: Add local rent exemption calculator#1065

Merged
mcintyre94 merged 2 commits into
anza-xyz:mainfrom
rajgoesout:feature/rent-exemption-helper
Jan 7, 2026
Merged

feat: Add local rent exemption calculator#1065
mcintyre94 merged 2 commits into
anza-xyz:mainfrom
rajgoesout:feature/rent-exemption-helper

Conversation

@rajgoesout
Copy link
Copy Markdown
Contributor

Problem

Logic for the getMinimumBalanceForRentExemption function is stateless, so there's no need to make an rpc call.

Summary of Changes

  • New helper packages/kit/src/get-minimum-balance-for-rent-exemption.ts
  • Exported the helper from packages/kit/src/index.ts.

Tests added

  • packages/kit/src/__tests__/get-minimum-balance-for-rent-exemption-test.ts

Closes #777

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Dec 2, 2025

🦋 Changeset detected

Latest commit: 8fa6ff0

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

This PR includes changesets to release 43 packages
Name Type
@solana/kit 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/nominal-types Minor
@solana/offchain-messages Minor
@solana/options Minor
@solana/plugin-core Minor
@solana/programs Minor
@solana/promises Minor
@solana/react 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

@steveluscher steveluscher force-pushed the feature/rent-exemption-helper branch from f6a6044 to 4bc9a37 Compare December 6, 2025 02:14
@bundlemon
Copy link
Copy Markdown

bundlemon Bot commented Dec 6, 2025

BundleMon

Files updated (4)
Status Path Size Limits
kit/dist/index.browser.mjs
1.89KB (+198B +11.41%) -
kit/dist/index.native.mjs
1.89KB (+198B +11.42%) -
kit/dist/index.node.mjs
1.88KB (+198B +11.43%) -
@solana/kit production bundle
kit/dist/index.production.min.js
39.34KB (+110B +0.27%) -
Unchanged files (132)
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 -
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.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.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.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 +704B +0.18%

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 for this! The logic looks good, just a small nitpick on the function signature.

*
* @param space The number of bytes of account data.
*/
export function getMinimumBalanceForRentExemption(space: bigint | number = 0): Lamports {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I'd prefer to just use bigint as input here, to match the rest of the library. We generally leave type conversion to callers to make the library simpler and avoid branching (in cases where that's relevant).

I'd also remove the default, because I think it'll make the calling code clearer.

@mcintyre94
Copy link
Copy Markdown
Member

Re the CI issue, if you run pnpm style:fix in the package it should fix the prettier issues for you!

Re the changeset, as this is new functionality we'd want to release a new version with this. If you do pnpm changeset in the root of the repo it'll guide you through it. We'd want to release a minor version of @solana/kit

@rajgoesout rajgoesout force-pushed the feature/rent-exemption-helper branch 3 times, most recently from 887d405 to 657cb0f Compare December 16, 2025 12:37
@rajgoesout
Copy link
Copy Markdown
Contributor Author

@mcintyre94 Thank you for the review. I've updated the function signature, fixed prettier issues, and included the changeset.

Comment thread packages/kit/src/get-minimum-balance-for-rent-exemption.ts Outdated
Comment thread packages/kit/src/__tests__/get-minimum-balance-for-rent-exemption-test.ts Outdated
@rajgoesout rajgoesout force-pushed the feature/rent-exemption-helper branch from 657cb0f to 153bc9c Compare December 16, 2025 14:19
mcintyre94
mcintyre94 previously approved these changes Dec 18, 2025
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.

Looks good now, thankyou!

@github-actions github-actions Bot added the stale label Jan 2, 2026
@mcintyre94 mcintyre94 force-pushed the feature/rent-exemption-helper branch from 153bc9c to ca916a5 Compare January 7, 2026 11:20
@mcintyre94 mcintyre94 removed the stale label Jan 7, 2026
@mcintyre94 mcintyre94 force-pushed the feature/rent-exemption-helper branch from 8aa358b to 9a831c7 Compare January 7, 2026 16:05
@github-actions github-actions Bot dismissed mcintyre94’s stale review January 7, 2026 16:05

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

@mcintyre94 mcintyre94 force-pushed the feature/rent-exemption-helper branch from 9a831c7 to 914ae56 Compare January 7, 2026 16:57
mcintyre94
mcintyre94 previously approved these changes Jan 7, 2026
@mcintyre94 mcintyre94 force-pushed the feature/rent-exemption-helper branch from 914ae56 to 8fa6ff0 Compare January 7, 2026 17:10
@github-actions github-actions Bot dismissed mcintyre94’s stale review January 7, 2026 17:10

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

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 for this! And thankyou for your patience getting it merged!

@mcintyre94 mcintyre94 enabled auto-merge January 7, 2026 17:48
@mcintyre94 mcintyre94 disabled auto-merge January 7, 2026 18:53
@mcintyre94
Copy link
Copy Markdown
Member

It says merging is blocked with "Code scanning is waiting for results from CodeQL for the commits 05d060c or 8fa6ff0."
I think this is a github bug, so I'm going to merge

@mcintyre94 mcintyre94 merged commit fafa52f into anza-xyz:main Jan 7, 2026
15 of 19 checks passed
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jan 7, 2026

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

@github-actions github-actions Bot mentioned this pull request Jan 7, 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 Jan 22, 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.

Feature idea: a function to calculate minimum rent required without an RPC call

2 participants