Skip to content

fix: Enhance subscription controller types and validation for vault share tokens - #10416

Merged
tuna1207 merged 3 commits into
mainfrom
fix/subscription-price-response
Sep 24, 2026
Merged

tuna1207 merged 3 commits into
mainfrom
fix/subscription-price-response

Conversation

@tuna1207

@tuna1207 tuna1207 commented Sep 24, 2026 •

Copy link
Copy Markdown
Member

Explanation

References

getPricing currently treats vault-share settlement tokens as invalid. The Subscription API dropped isVaultShare and now identifies a vault share by accountantAddress (optionally with vault). Superstruct still required the old boolean, so every vault-share token failed the union and the whole pricing response was rejected.

This change:

  • Discriminates TokenPaymentInfo on accountantAddress instead of isVaultShare.
  • Adds optional vault plus VaultName / VAULT_NAMES, with VaultName as an open string so new server vaults do not fail client validation.
  • Adds isVaultShareToken as the type guard consumers should use.
  • Switches pricing payment-method rows and settlement tokens from exact object structs to type, so additive API fields pass through. Mutually exclusive fields are still rejected (optional(never()) for crypto-only fields on card rows and vault-only fields on spot tokens).

BREAKING: TokenPaymentInfo.isVaultShare is removed. Consumers should use isVaultShareToken(token) (or check accountantAddress).

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

Medium Risk
Breaking change to payment token typing plus pricing validation logic; incorrect vault/spot handling could mis-price crypto subscriptions, though the change fixes current getPricing failures for vault-share tokens.

Overview
Fixes getPricing rejecting entire pricing responses when the API sends vault-share settlement tokens without the legacy isVaultShare flag.

Token model: Vault shares are now discriminated by accountantAddress (optional vault / VaultName), with isVaultShareToken exported as the replacement for isVaultShare. VAULT_NAMES documents known vaults while VaultName stays an open string so new server vaults do not fail validation.

Validation: TokenPaymentInfoStruct and PricingPaymentMethodStruct use superstruct type instead of object so additive API fields pass through; optional(never()) still blocks spot tokens from carrying vault fields and card rows from carrying crypto-only fields.

BREAKING: TokenPaymentInfo.isVaultShare is removed — consumers should use isVaultShareToken or check accountantAddress.

Reviewed by Cursor Bugbot for commit d2ea3cc. Bugbot is set up for automated code reviews on this repo. Configure here.

@tuna1207
tuna1207 marked this pull request as ready for review September 24, 2026 07:12
@tuna1207
tuna1207 requested review from a team as code owners September 24, 2026 07:12
@tuna1207
tuna1207 deployed to default-branch September 24, 2026 07:13 — with GitHub Actions Active
@tuna1207

Copy link
Copy Markdown
Member Author

@metamaskbot publish-previews

@tuna1207
tuna1207 added this pull request to the merge queue Sep 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@10.0.1-preview-d2ea3cc
@metamask-previews/accounts-controller@40.0.0-preview-d2ea3cc
@metamask-previews/address-book-controller@8.0.0-preview-d2ea3cc
@metamask-previews/ai-controllers@2.0.0-preview-d2ea3cc
@metamask-previews/analytics-controller@3.2.0-preview-d2ea3cc
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-d2ea3cc
@metamask-previews/announcement-controller@9.0.0-preview-d2ea3cc
@metamask-previews/app-metadata-controller@3.0.0-preview-d2ea3cc
@metamask-previews/approval-controller@10.0.0-preview-d2ea3cc
@metamask-previews/assets-controller@16.1.0-preview-d2ea3cc
@metamask-previews/assets-controllers@112.0.2-preview-d2ea3cc
@metamask-previews/authenticated-user-storage@4.1.0-preview-d2ea3cc
@metamask-previews/base-controller@10.0.0-preview-d2ea3cc
@metamask-previews/base-data-service@2.0.0-preview-d2ea3cc
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-d2ea3cc
@metamask-previews/bridge-controller@81.3.0-preview-d2ea3cc
@metamask-previews/bridge-status-controller@76.3.0-preview-d2ea3cc
@metamask-previews/build-utils@4.0.0-preview-d2ea3cc
@metamask-previews/chain-agnostic-permission@2.0.0-preview-d2ea3cc
@metamask-previews/chomp-api-service@5.0.0-preview-d2ea3cc
@metamask-previews/claims-controller@1.0.1-preview-d2ea3cc
@metamask-previews/client-controller@2.0.0-preview-d2ea3cc
@metamask-previews/client-utils@3.0.2-preview-d2ea3cc
@metamask-previews/compliance-controller@3.0.0-preview-d2ea3cc
@metamask-previews/composable-controller@13.0.0-preview-d2ea3cc
@metamask-previews/config-registry-controller@4.0.0-preview-d2ea3cc
@metamask-previews/connectivity-controller@1.0.0-preview-d2ea3cc
@metamask-previews/controller-utils@13.0.0-preview-d2ea3cc
@metamask-previews/core-backend@11.0.0-preview-d2ea3cc
@metamask-previews/cryptography@0.0.0-preview-d2ea3cc
@metamask-previews/delegation-controller@4.0.0-preview-d2ea3cc
@metamask-previews/earn-controller@13.0.0-preview-d2ea3cc
@metamask-previews/eip-5792-middleware@4.0.0-preview-d2ea3cc
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-d2ea3cc
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-d2ea3cc
@metamask-previews/eth-block-tracker@16.0.0-preview-d2ea3cc
@metamask-previews/eth-json-rpc-middleware@25.0.0-preview-d2ea3cc
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-d2ea3cc
@metamask-previews/foundryup@2.0.0-preview-d2ea3cc
@metamask-previews/gas-fee-controller@27.0.0-preview-d2ea3cc
@metamask-previews/gator-permissions-controller@6.0.0-preview-d2ea3cc
@metamask-previews/geolocation-controller@2.0.0-preview-d2ea3cc
@metamask-previews/java-tron-up@2.0.0-preview-d2ea3cc
@metamask-previews/json-rpc-engine@11.0.0-preview-d2ea3cc
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-d2ea3cc
@metamask-previews/keyring-controller@28.0.0-preview-d2ea3cc
@metamask-previews/kyc-controller@0.4.0-preview-d2ea3cc
@metamask-previews/local-node-utils@2.0.0-preview-d2ea3cc
@metamask-previews/logging-controller@10.0.0-preview-d2ea3cc
@metamask-previews/message-manager@15.0.0-preview-d2ea3cc
@metamask-previews/messenger@3.0.0-preview-d2ea3cc
@metamask-previews/messenger-cli@1.0.0-preview-d2ea3cc
@metamask-previews/money-account-api-data-service@1.0.0-preview-d2ea3cc
@metamask-previews/money-account-balance-service@3.0.0-preview-d2ea3cc
@metamask-previews/money-account-controller@2.0.0-preview-d2ea3cc
@metamask-previews/money-account-upgrade-controller@5.0.0-preview-d2ea3cc
@metamask-previews/money-account-utils@2.0.0-preview-d2ea3cc
@metamask-previews/multichain-account-service@14.0.0-preview-d2ea3cc
@metamask-previews/multichain-api-middleware@5.0.0-preview-d2ea3cc
@metamask-previews/multichain-network-controller@4.0.0-preview-d2ea3cc
@metamask-previews/multichain-transactions-controller@8.0.0-preview-d2ea3cc
@metamask-previews/name-controller@10.0.0-preview-d2ea3cc
@metamask-previews/network-connection-banner-controller@1.0.0-preview-d2ea3cc
@metamask-previews/network-controller@37.0.0-preview-d2ea3cc
@metamask-previews/network-enablement-controller@7.0.0-preview-d2ea3cc
@metamask-previews/notification-services-controller@29.0.0-preview-d2ea3cc
@metamask-previews/passkey-controller@4.1.0-preview-d2ea3cc
@metamask-previews/permission-controller@14.0.0-preview-d2ea3cc
@metamask-previews/permission-log-controller@6.0.0-preview-d2ea3cc
@metamask-previews/perps-controller@18.0.0-preview-d2ea3cc
@metamask-previews/phishing-controller@18.1.0-preview-d2ea3cc
@metamask-previews/platform-api-docs@0.2.1-preview-d2ea3cc
@metamask-previews/polling-controller@17.0.0-preview-d2ea3cc
@metamask-previews/preferences-controller@24.0.0-preview-d2ea3cc
@metamask-previews/profile-metrics-controller@5.1.0-preview-d2ea3cc
@metamask-previews/profile-sync-controller@32.3.0-preview-d2ea3cc
@metamask-previews/ramps-controller@25.1.0-preview-d2ea3cc
@metamask-previews/rate-limit-controller@8.0.0-preview-d2ea3cc
@metamask-previews/react-data-query@2.0.0-preview-d2ea3cc
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-d2ea3cc
@metamask-previews/sample-controllers@6.0.0-preview-d2ea3cc
@metamask-previews/seedless-onboarding-controller@11.0.0-preview-d2ea3cc
@metamask-previews/selected-network-controller@27.0.0-preview-d2ea3cc
@metamask-previews/sentinel-api-service@2.0.0-preview-d2ea3cc
@metamask-previews/shield-controller@7.0.1-preview-d2ea3cc
@metamask-previews/signature-controller@40.0.0-preview-d2ea3cc
@metamask-previews/smart-transactions-controller@27.0.1-preview-d2ea3cc
@metamask-previews/snap-account-service@3.0.0-preview-d2ea3cc
@metamask-previews/social-controllers@3.1.0-preview-d2ea3cc
@metamask-previews/solana-test-validator-up@2.0.0-preview-d2ea3cc
@metamask-previews/stellar-quickstart-up@0.0.0-preview-d2ea3cc
@metamask-previews/storage-service@2.0.0-preview-d2ea3cc
@metamask-previews/subscription-controller@9.1.0-preview-d2ea3cc
@metamask-previews/transaction-controller@71.0.0-preview-d2ea3cc
@metamask-previews/transaction-pay-controller@29.1.1-preview-d2ea3cc
@metamask-previews/user-operation-controller@42.0.0-preview-d2ea3cc
@metamask-previews/utils@12.0.0-preview-d2ea3cc
@metamask-previews/wallet@14.0.1-preview-d2ea3cc
@metamask-previews/wallet-cli@0.0.0-preview-d2ea3cc

Merged via the queue into main with commit fc74bdf Sep 24, 2026
58 checks passed
@tuna1207
tuna1207 deleted the fix/subscription-price-response branch September 24, 2026 07:26
@pedronfigueiredo pedronfigueiredo mentioned this pull request Sep 24, 2026
2 of 3 tasks
pull Bot pushed a commit to Reality2byte/core that referenced this pull request Sep 24, 2026
## Explanation

Prepare monorepo release **1285.0.0** for
`@metamask/transaction-controller@72.0.0` and all **19 direct workspace
dependents**. `perps-controller` is now included for the consumer-facing
HIP-3 snapshot fix merged in MetaMask#10429, not merely for its development
dependencies; `earn-controller` also has an existing production
dependency bump. This branch incorporates current `main`, including
MetaMask#10429 and MetaMask#10419. No source-code changes are introduced by this PR
relative to current `main`.

### Versions in this release

| Package | Version | Rationale |
| --- | --- | --- |
| `transaction-controller` | **72.0.0** | Breaking revert of
approval-time sponsorship/signing hooks (MetaMask#10420) |
| `subscription-controller` | **10.0.0** | Existing Unreleased breaking
subscription type changes (MetaMask#10305, MetaMask#10416) |
| `wallet` | **15.0.0** | Its exported default instance/state types
expose the breaking subscription and transaction-controller changes |
| `transaction-pay-controller` | **29.2.0** | Additional supported
pay-strategy flows and server-quote behavior (MetaMask#10342) |
| `assets-controller` | 16.1.1 | Dependency updates and previously
merged fixes |
| `assets-controllers` | 112.0.3 | Dependency updates |
| `bridge-controller` | 81.3.1 | Dependency updates |
| `bridge-status-controller` | 76.3.1 | Dependency updates |
| `client-utils` | 3.0.3 | Dependency update |
| `earn-controller` | 13.0.1 | Existing production
`account-tree-controller` bump; transaction-controller is dev-only here
|
| `eip-5792-middleware` | 4.0.1 | Dependency updates |
| `gator-permissions-controller` | 6.0.1 | Dependency updates |
| `money-account-utils` | 2.0.1 | Dependency updates |
| `network-enablement-controller` | 7.0.1 | Dependency updates |
| `perps-controller` | **18.0.1** | Fix Terminal v3 HIP-3 snapshot
validation (MetaMask#10429); patch bump |
| `phishing-controller` | 18.1.1 | Dependency update |
| `profile-metrics-controller` | 5.1.1 | Dependency updates |
| `shield-controller` | 7.0.2 | Dependency updates |
| `smart-transactions-controller` | 27.0.2 | Dependency updates |
| `user-operation-controller` | 42.0.1 | Dependency updates |

Dependent packages have their Unreleased changelog entries moved to
their new release sections. Additional *non-released* transitive
dependents receive compatible workspace ranges
(`money-account-upgrade-controller`,
`network-connection-banner-controller`, `signature-controller`, and
unpublished `wallet-cli`); the three published packages receive
Unreleased dependency changelog entries. `yarn.lock` is synchronized.
Changes to `perps-controller`'s development dependencies are
intentionally omitted from its changelog.

**Coordination before merge:** The transaction-controller hook revert
and the subscription-controller's existing breaking type changes affect
consumers. Confirm Extension and Mobile migrations before publishing
these three major versions. This is a release candidate, not a published
release.

## References

- Breaking revert: MetaMask#10420; original published API: MetaMask#10109.
- EIP-7702 performance change: MetaMask#10397.
- Perps HIP-3 snapshot fix: MetaMask#10429.
- Subscription breaking changes: MetaMask#10305, MetaMask#10416.
- Client adoption PRs to coordinate: [Extension
#46060](MetaMask/metamask-extension#46060),
[Mobile #35754](MetaMask/metamask-mobile#35754).
They adopt the removed hooks; they are **not** migrations for this
revert.

## Validation

- `yarn build`
- `yarn workspace @metamask/transaction-controller run test`
- `yarn workspace @metamask/subscription-controller run test`
- `yarn workspace @metamask/transaction-pay-controller run test`
- `yarn workspace @metamask/wallet run test`
- `yarn workspace @metamask/perps-controller run test` (after
incorporating MetaMask#10429)
- `yarn changelog:validate`, `yarn constraints`, `yarn install
--immutable`, `yarn dedupe --check`
- `yarn lint:dependencies` (after removing stale generated
bridge-controller `dist` output)
- `git diff --check`

## Checklist

- [x] Changelogs describe the breaking changes in
transaction-controller, subscription-controller, and wallet.
- [x] Direct workspace dependents are included, with perps now having a
consumer-facing fix (MetaMask#10429).
- [ ] Extension and Mobile consumers have been coordinated for these
breaking changes before merging this release.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **High Risk**
> Publishes breaking majors for transaction signing/sponsorship and
subscription types that require coordinated Extension/Mobile migrations
before consumers upgrade `@metamask/wallet` or
`@metamask/transaction-controller`.
> 
> **Overview**
> Prepares **monorepo release 1285.0.0** by bumping package versions,
moving Unreleased changelog notes into release sections, aligning
workspace dependency ranges, and refreshing `yarn.lock`. There are **no
application source edits** in this diff—only release metadata for work
already on `main`.
> 
> The release centers on **`@metamask/transaction-controller@72.0.0`**,
which **reverts** the approval-time `isSponsored` / `shouldSign` hooks
in favor of metadata-driven **`isGasFeeSponsored`** and
**`isExternalSign`**, drops related exports and
`isGasFeeSponsoredAvailable`, and again **requires** a `hooks` object
(use `hooks: {}` when empty).
**`@metamask/subscription-controller@10.0.0`** ships existing breaking
subscription/payment-token type changes (optional period fields,
vault-share detection via `isVaultShareToken`, crypto payment failure
types). **`@metamask/wallet@15.0.0`** bumps those majors plus related
dependents.
> 
> Nineteen direct workspace dependents get compatible semver bumps
(mostly patch dependency realignments to
`@metamask/transaction-controller@^72.0.0`). Notable published notes
include **`@metamask/perps-controller@18.0.1`** (HIP-3 Terminal snapshot
validation fix) and **`@metamask/transaction-pay-controller@29.2.0`**
(server pay-strategy quoting/submit fixes). Unpublished/transitive
packages (`wallet-cli`, `money-account-upgrade-controller`, etc.) get
range updates without always cutting new versions.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
6017d49. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Baptiste Marchand <75846779+baptiste-marchand@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

This branch was successfully deployed

1 active deployment
default-branch — d2ea3cc4 Deployed Sep 24, 2026 by tuna1207 via Determine whether this PR is a release PR #4535
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants