Skip to content

Conversation

@tuna1207
Copy link
Member

@tuna1207 tuna1207 commented Nov 30, 2025

Explanation

This PR

  • Add minBillingCyclesForBalance to ProductPrice type
  • Add getTokenMinimumBalanceAmount method to SubscriptionController

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Add minBillingCyclesForBalance and getTokenMinimumBalanceAmount to compute minimum token balance, with tests and minor docs updates.

  • Subscription Controller:
    • Add #getSubscriptionBalanceAmount(price) and public getTokenMinimumBalanceAmount(price, tokenPaymentInfo) to compute minimum token balance using conversion rates; throws on missing rate.
    • Clarify approval amount JSDoc for #getSubscriptionPriceAmount.
  • Types:
    • Extend ProductPrice with minBillingCyclesForBalance.
  • Tests:
    • Update mock pricing to include minBillingCyclesForBalance.
    • Add unit tests for getTokenMinimumBalanceAmount, including error on missing conversion rate.
    • Adjust existing tests to pass new pricing field where applicable.

Written by Cursor Bugbot for commit 6e482ee. This will update automatically on new commits. Configure here.

@tuna1207 tuna1207 marked this pull request as ready for review November 30, 2025 07:58
@tuna1207 tuna1207 requested review from a team as code owners November 30, 2025 07:58
@tuna1207
Copy link
Member Author

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.0.0-preview-1104ab5",
  "@metamask-previews/accounts-controller": "35.0.0-preview-1104ab5",
  "@metamask-previews/address-book-controller": "7.0.1-preview-1104ab5",
  "@metamask-previews/analytics-controller": "0.0.0-preview-1104ab5",
  "@metamask-previews/announcement-controller": "8.0.0-preview-1104ab5",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-1104ab5",
  "@metamask-previews/approval-controller": "8.0.0-preview-1104ab5",
  "@metamask-previews/assets-controllers": "92.0.0-preview-1104ab5",
  "@metamask-previews/base-controller": "9.0.0-preview-1104ab5",
  "@metamask-previews/bridge-controller": "63.2.0-preview-1104ab5",
  "@metamask-previews/bridge-status-controller": "63.1.0-preview-1104ab5",
  "@metamask-previews/build-utils": "3.0.4-preview-1104ab5",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-1104ab5",
  "@metamask-previews/claims-controller": "0.2.0-preview-1104ab5",
  "@metamask-previews/composable-controller": "12.0.0-preview-1104ab5",
  "@metamask-previews/controller-utils": "11.16.0-preview-1104ab5",
  "@metamask-previews/core-backend": "5.0.0-preview-1104ab5",
  "@metamask-previews/delegation-controller": "2.0.0-preview-1104ab5",
  "@metamask-previews/earn-controller": "11.0.0-preview-1104ab5",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-1104ab5",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-1104ab5",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-1104ab5",
  "@metamask-previews/ens-controller": "19.0.0-preview-1104ab5",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-1104ab5",
  "@metamask-previews/eth-block-tracker": "15.0.0-preview-1104ab5",
  "@metamask-previews/eth-json-rpc-middleware": "22.0.0-preview-1104ab5",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-1104ab5",
  "@metamask-previews/foundryup": "1.0.1-preview-1104ab5",
  "@metamask-previews/gas-fee-controller": "26.0.0-preview-1104ab5",
  "@metamask-previews/gator-permissions-controller": "0.6.0-preview-1104ab5",
  "@metamask-previews/json-rpc-engine": "10.2.0-preview-1104ab5",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-1104ab5",
  "@metamask-previews/keyring-controller": "25.0.0-preview-1104ab5",
  "@metamask-previews/logging-controller": "7.0.1-preview-1104ab5",
  "@metamask-previews/message-manager": "14.1.0-preview-1104ab5",
  "@metamask-previews/messenger": "0.3.0-preview-1104ab5",
  "@metamask-previews/multichain-account-service": "4.0.0-preview-1104ab5",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-1104ab5",
  "@metamask-previews/multichain-network-controller": "3.0.0-preview-1104ab5",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-1104ab5",
  "@metamask-previews/name-controller": "9.0.0-preview-1104ab5",
  "@metamask-previews/network-controller": "27.0.0-preview-1104ab5",
  "@metamask-previews/network-enablement-controller": "4.0.0-preview-1104ab5",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-1104ab5",
  "@metamask-previews/permission-controller": "12.1.1-preview-1104ab5",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-1104ab5",
  "@metamask-previews/phishing-controller": "16.1.0-preview-1104ab5",
  "@metamask-previews/polling-controller": "16.0.0-preview-1104ab5",
  "@metamask-previews/preferences-controller": "22.0.0-preview-1104ab5",
  "@metamask-previews/profile-metrics-controller": "1.0.0-preview-1104ab5",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-1104ab5",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-1104ab5",
  "@metamask-previews/remote-feature-flag-controller": "2.0.1-preview-1104ab5",
  "@metamask-previews/sample-controllers": "4.0.0-preview-1104ab5",
  "@metamask-previews/seedless-onboarding-controller": "7.0.0-preview-1104ab5",
  "@metamask-previews/selected-network-controller": "26.0.0-preview-1104ab5",
  "@metamask-previews/shield-controller": "3.1.0-preview-1104ab5",
  "@metamask-previews/signature-controller": "37.0.0-preview-1104ab5",
  "@metamask-previews/storage-service": "0.0.0-preview-1104ab5",
  "@metamask-previews/subscription-controller": "5.1.0-preview-1104ab5",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-1104ab5",
  "@metamask-previews/transaction-controller": "62.3.1-preview-1104ab5",
  "@metamask-previews/transaction-pay-controller": "10.2.0-preview-1104ab5",
  "@metamask-previews/user-operation-controller": "41.0.0-preview-1104ab5"
}

this.#getSubscriptionBalanceAmount(price),
);

const tokenDecimal = new BigNumber(10).pow(tokenPaymentInfo.decimals);

Choose a reason for hiding this comment

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

using tokenDecimal name is not correct here, normally tokenDecimal is 6 or 9 or 18

Copy link
Member Author

@tuna1207 tuna1207 Dec 1, 2025

Choose a reason for hiding this comment

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

this one is for calculating token amount so it use token decimal, price unit decimal is used in #getSubscriptionBalanceAmount (same as getTokenApproveAmount)

@tuna1207 tuna1207 requested a review from tanguyenvn December 1, 2025 02:21
@tuna1207 tuna1207 added this pull request to the merge queue Dec 1, 2025
Merged via the queue into main with commit c126887 Dec 1, 2025
283 checks passed
@tuna1207 tuna1207 deleted the feat/subscription-min-billing-cycle-for-balance branch December 1, 2025 07:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-shield Transaction Shield team-shield

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants