Skip to content

feat(perps-controller): add Memecoin category derived from crypto + tag - #10168

Merged
aganglada merged 2 commits into
mainfrom
feat/perps-add-memecoin-category
Sep 11, 2026
Merged

feat(perps-controller): add Memecoin category derived from crypto + tag#10168
aganglada merged 2 commits into
mainfrom
feat/perps-add-memecoin-category

Conversation

@aganglada

Copy link
Copy Markdown
Contributor

Explanation

Adds a new UI-only Memecoin product category to @metamask/perps-controller. Because a market only has one marketType at a time, memecoins can't be expressed as a distinct marketType — instead, the Memecoin category is derived from the combination marketType === 'crypto' && tags.includes('memecoin'). The 'memecoin' tag is defined on the Terminal backend (companion PR: consensys-vertical-apps/terminal-backend#66) and enriched onto PerpsMarketData via the existing TerminalMarketService.

Per product decision, the existing 'crypto' filter is not modified — memecoins remain in the Crypto pill and also appear under the new Memecoin pill (overlapping by design).

Changes

References

Checklist

  • I've clearly explained what problem this PR is solving and how it is solved.
  • I've linked related issues/discussions.
  • I've updated the changelog.
  • I've included tests: new describe("'memecoin' filter") block in marketUtils.test.ts, and updated the enum/MARKET_CATEGORIES count (7 → 8) assertions in hyperLiquidConfig.test.ts and PerpsController.market-filtering.test.ts.
  • I've documented my code using JSDoc format where noteworthy.
  • Only breaking-change PRs may need a major bump. This PR is purely additive, so a minor bump on next release is appropriate.

Made with Cursor

Adds a new 'Memecoin' UI-only filter category that overlaps with the
existing 'Crypto' filter by design: a memecoin market is any market
where marketType === 'crypto' and tags includes 'memecoin' (the tag is
defined on the Terminal backend).

- Add MarketCategory.Memecoin ('memecoin')
- Extend MarketTypeFilter and MARKET_CATEGORIES (inserted after 'crypto')
- Extend matchesCategory with a 'memecoin' case; leave 'crypto' untouched
  so memecoins appear under both pills

Tests updated for the new enum member (8 total), the ordered pill list,
and the new matchesCategory behaviour.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3f2a14e. Configure here.

Comment thread packages/perps-controller/src/utils/marketUtils.ts
…with unset marketType

Cursor Bugbot flagged that the 'memecoin' branch of matchesCategory
required marketType === 'crypto', but the 'crypto' branch treats
main-DEX markets as crypto even when marketType is unset (the common
provider-sourced shape prior to Terminal enrichment). Tagged main-DEX
memecoins therefore matched 'crypto' but not 'memecoin', so the pill
could appear empty for the typical case.

Align 'memecoin' with 'crypto' semantics: !isHip3Market(market) ||
marketType === 'crypto', combined with the tag check. Add tests for
the unset-marketType shape and for HIP-3 leaks (including
marketSource-only HIP-3 markets).

Also add the PR link to the changelog entry to satisfy Check Changelog.
@aganglada

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@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-b3db565c8
@metamask-previews/accounts-controller@40.0.0-preview-b3db565c8
@metamask-previews/address-book-controller@8.0.0-preview-b3db565c8
@metamask-previews/ai-controllers@2.0.0-preview-b3db565c8
@metamask-previews/analytics-controller@3.0.0-preview-b3db565c8
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-b3db565c8
@metamask-previews/announcement-controller@9.0.0-preview-b3db565c8
@metamask-previews/app-metadata-controller@3.0.0-preview-b3db565c8
@metamask-previews/approval-controller@10.0.0-preview-b3db565c8
@metamask-previews/assets-controller@16.0.0-preview-b3db565c8
@metamask-previews/assets-controllers@112.0.1-preview-b3db565c8
@metamask-previews/authenticated-user-storage@4.0.0-preview-b3db565c8
@metamask-previews/base-controller@10.0.0-preview-b3db565c8
@metamask-previews/base-data-service@2.0.0-preview-b3db565c8
@metamask-previews/bitcoin-regtest-up@2.0.0-preview-b3db565c8
@metamask-previews/bridge-controller@81.1.0-preview-b3db565c8
@metamask-previews/bridge-status-controller@76.1.0-preview-b3db565c8
@metamask-previews/build-utils@4.0.0-preview-b3db565c8
@metamask-previews/chain-agnostic-permission@2.0.0-preview-b3db565c8
@metamask-previews/chomp-api-service@5.0.0-preview-b3db565c8
@metamask-previews/claims-controller@1.0.1-preview-b3db565c8
@metamask-previews/client-controller@2.0.0-preview-b3db565c8
@metamask-previews/client-utils@3.0.0-preview-b3db565c8
@metamask-previews/compliance-controller@3.0.0-preview-b3db565c8
@metamask-previews/composable-controller@13.0.0-preview-b3db565c8
@metamask-previews/config-registry-controller@4.0.0-preview-b3db565c8
@metamask-previews/connectivity-controller@1.0.0-preview-b3db565c8
@metamask-previews/controller-utils@13.0.0-preview-b3db565c8
@metamask-previews/core-backend@10.0.1-preview-b3db565c8
@metamask-previews/cryptography@0.0.0-preview-b3db565c8
@metamask-previews/delegation-controller@4.0.0-preview-b3db565c8
@metamask-previews/earn-controller@13.0.0-preview-b3db565c8
@metamask-previews/eip-5792-middleware@4.0.0-preview-b3db565c8
@metamask-previews/eip-7702-internal-rpc-middleware@1.0.0-preview-b3db565c8
@metamask-previews/eip1193-permission-middleware@3.0.0-preview-b3db565c8
@metamask-previews/eth-block-tracker@16.0.0-preview-b3db565c8
@metamask-previews/eth-json-rpc-middleware@25.0.0-preview-b3db565c8
@metamask-previews/eth-json-rpc-provider@7.0.0-preview-b3db565c8
@metamask-previews/foundryup@2.0.0-preview-b3db565c8
@metamask-previews/gas-fee-controller@27.0.0-preview-b3db565c8
@metamask-previews/gator-permissions-controller@6.0.0-preview-b3db565c8
@metamask-previews/geolocation-controller@2.0.0-preview-b3db565c8
@metamask-previews/java-tron-up@2.0.0-preview-b3db565c8
@metamask-previews/json-rpc-engine@11.0.0-preview-b3db565c8
@metamask-previews/json-rpc-middleware-stream@9.0.0-preview-b3db565c8
@metamask-previews/keyring-controller@28.0.0-preview-b3db565c8
@metamask-previews/kyc-controller@0.2.0-preview-b3db565c8
@metamask-previews/local-node-utils@2.0.0-preview-b3db565c8
@metamask-previews/logging-controller@10.0.0-preview-b3db565c8
@metamask-previews/message-manager@15.0.0-preview-b3db565c8
@metamask-previews/messenger@3.0.0-preview-b3db565c8
@metamask-previews/messenger-cli@1.0.0-preview-b3db565c8
@metamask-previews/money-account-api-data-service@1.0.0-preview-b3db565c8
@metamask-previews/money-account-balance-service@3.0.0-preview-b3db565c8
@metamask-previews/money-account-controller@2.0.0-preview-b3db565c8
@metamask-previews/money-account-upgrade-controller@5.0.0-preview-b3db565c8
@metamask-previews/money-account-utils@2.0.0-preview-b3db565c8
@metamask-previews/multichain-account-service@14.0.0-preview-b3db565c8
@metamask-previews/multichain-api-middleware@5.0.0-preview-b3db565c8
@metamask-previews/multichain-network-controller@4.0.0-preview-b3db565c8
@metamask-previews/multichain-transactions-controller@8.0.0-preview-b3db565c8
@metamask-previews/name-controller@10.0.0-preview-b3db565c8
@metamask-previews/network-connection-banner-controller@1.0.0-preview-b3db565c8
@metamask-previews/network-controller@37.0.0-preview-b3db565c8
@metamask-previews/network-enablement-controller@7.0.0-preview-b3db565c8
@metamask-previews/notification-services-controller@28.0.1-preview-b3db565c8
@metamask-previews/passkey-controller@4.0.0-preview-b3db565c8
@metamask-previews/permission-controller@14.0.0-preview-b3db565c8
@metamask-previews/permission-log-controller@6.0.0-preview-b3db565c8
@metamask-previews/perps-controller@17.0.0-preview-b3db565c8
@metamask-previews/phishing-controller@18.0.0-preview-b3db565c8
@metamask-previews/platform-api-docs@0.2.0-preview-b3db565c8
@metamask-previews/polling-controller@17.0.0-preview-b3db565c8
@metamask-previews/preferences-controller@24.0.0-preview-b3db565c8
@metamask-previews/profile-metrics-controller@5.1.0-preview-b3db565c8
@metamask-previews/profile-sync-controller@32.0.0-preview-b3db565c8
@metamask-previews/ramps-controller@22.0.0-preview-b3db565c8
@metamask-previews/rate-limit-controller@8.0.0-preview-b3db565c8
@metamask-previews/react-data-query@2.0.0-preview-b3db565c8
@metamask-previews/remote-feature-flag-controller@7.0.0-preview-b3db565c8
@metamask-previews/sample-controllers@6.0.0-preview-b3db565c8
@metamask-previews/seedless-onboarding-controller@11.0.0-preview-b3db565c8
@metamask-previews/selected-network-controller@27.0.0-preview-b3db565c8
@metamask-previews/sentinel-api-service@2.0.0-preview-b3db565c8
@metamask-previews/shield-controller@7.0.1-preview-b3db565c8
@metamask-previews/signature-controller@40.0.0-preview-b3db565c8
@metamask-previews/smart-transactions-controller@27.0.1-preview-b3db565c8
@metamask-previews/snap-account-service@3.0.0-preview-b3db565c8
@metamask-previews/social-controllers@3.0.1-preview-b3db565c8
@metamask-previews/solana-test-validator-up@2.0.0-preview-b3db565c8
@metamask-previews/stellar-quickstart-up@0.0.0-preview-b3db565c8
@metamask-previews/storage-service@2.0.0-preview-b3db565c8
@metamask-previews/subscription-controller@9.0.1-preview-b3db565c8
@metamask-previews/transaction-controller@70.0.0-preview-b3db565c8
@metamask-previews/transaction-pay-controller@28.0.1-preview-b3db565c8
@metamask-previews/user-operation-controller@42.0.0-preview-b3db565c8
@metamask-previews/wallet@13.0.0-preview-b3db565c8
@metamask-previews/wallet-cli@0.0.0-preview-b3db565c8

aganglada added a commit to MetaMask/metamask-mobile that referenced this pull request Sep 10, 2026
Point mobile at the perps-controller preview from MetaMask/core#10168 so
we can try the new Memecoin category end-to-end before the upstream
release lands.

- Add a previewBuilds entry (type: breaking) for
  @metamask-previews/perps-controller@17.0.0-preview-b3db565c8. The
  preview is a major bump (16.2.0 → 17.0.0), so we override the workspace
  resolution rather than the version range.
- The 17.x line ships ESM-only under dist/*.js instead of the 16.x dual
  CJS/ESM build, so:
  - jest.config.js resolves the entry to .cjs when it exists (16.x) and
    falls back to .js (17.x), and allow-lists perps-controller and its
    ESM-only peers (@metamask/base-controller, @metamask/controller-utils,
    @metamask/abi-utils, @metamask/messenger, @metamask/superstruct,
    @metamask/utils, lodash-es) in transformIgnorePatterns so babel-jest
    can transform them.
  - babel.config.js adds a matching override that runs
    @babel/plugin-transform-modules-commonjs on the perps-controller
    subtree and lodash-es.

Existing memecoin unit tests (33 in marketCategoryMapping.test.ts, plus
usePerpsCategories/usePerpsMarketListView) pass unchanged against the
preview build.
@aganglada
aganglada added this pull request to the merge queue Sep 11, 2026
Merged via the queue into main with commit 95d86c1 Sep 11, 2026
43 checks passed
@aganglada
aganglada deleted the feat/perps-add-memecoin-category branch September 11, 2026 13:41
@aganglada aganglada mentioned this pull request Sep 11, 2026
4 tasks
pull Bot pushed a commit to Reality2byte/core that referenced this pull request Sep 11, 2026
## Explanation

- Update `@metamask/perps-controller` from `v17.0.0` to `v17.1.0`.
- This is a perps-controller-only release so clients can pick up
`MarketCategory.Memecoin` (`'memecoin'`) without waiting on a broader
monorepo cut.
- Minor bump: new UI-only filter category on `MARKET_CATEGORIES` /
`MarketTypeFilter`. No breaking API changes. The `uuid` `^8.3.2` →
`^9.0.1` bump is included because it was already sitting in Unreleased.

## References

- Ships [MetaMask#10168](MetaMask#10168)
- Consumer:
[MetaMask/metamask-mobile#36047](MetaMask/metamask-mobile#36047)

## Checklist

- [x] I've updated the test suite for new or updated code as appropriate
- [x] I've updated documentation (JSDoc, Markdown, etc.) for new or
updated code as appropriate
- [x] I've communicated my changes to consumers by [updating changelogs
for packages I've
changed](https://github.com/MetaMask/core/tree/main/docs/processes/updating-changelogs.md)
- [ ] I've introduced [breaking
changes](https://github.com/MetaMask/core/tree/main/docs/processes/breaking-changes.md)
in this PR and have prepared draft pull requests for clients and
consumer packages to resolve them


Made with [Cursor](https://cursor.com)

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants