Skip to content

Perps collateral gating and price fixes#9530

Merged
gambinish merged 15 commits into
mainfrom
perps/collateral-gating-and-price-fixes
Jul 21, 2026
Merged

Perps collateral gating and price fixes#9530
gambinish merged 15 commits into
mainfrom
perps/collateral-gating-and-price-fixes

Conversation

@gambinish

@gambinish gambinish commented Jul 15, 2026

Copy link
Copy Markdown
Member

Explanation

Closes out three open perps-controller tickets left over from HyperLiquid's public feed changes and USDH sunset:

TAT-3454 — Price update notifications were fanning out to every subscribed symbol on every tick, even when only one symbol's price changed. Now #notifyAllPriceSubscribers takes an optional changedSymbols set so list-view subscribers (watchlists, market overview) stop re-rendering on unrelated symbol ticks.

TAT-3387 — HyperLiquid slowed down the public assetCtxs feed and introduced fastAssetCtxs to keep a fast (~5s) cadence for mark price. We now subscribe to fastAssetCtxs as the primary price source, while assetCtxs keeps handling funding/OI/volume/oracle data as before.

TAT-3304 — Following the USDH sunset, HIP-3 DEXs are now gated to USDC collateral only. Non-USDC DEXs are filtered out of market discovery and orders against them fail fast with a new UNSUPPORTED_COLLATERAL error, instead of attempting the now-defunct USDC→USDH auto-swap. The dead swap machinery and the public USDH_CONFIG export are removed (breaking).

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

Medium Risk
Touches live trading (HIP-3 order rejection), real-time price sourcing, and a breaking public export; behavior is heavily tested but incorrect collateral or price ownership could affect tradability and UI freshness.

Overview
Aligns perps-controller with HyperLiquid’s USDH sunset and slower public assetCtxs feed.

HIP-3 collateral (TAT-3304): HIP-3 DEXs are supported only when collateral resolves to USDC via spot metadata (fail-closed if metadata is missing). Non-USDC DEXs are removed from getMarkets and getMarketDataWithPrices (including stale cache), and placeOrder returns UNSUPPORTED_COLLATERAL instead of the old USDC→USDH auto-swap. The USDH_CONFIG export is removed (breaking), along with all USDH swap/transfer helpers.

Faster prices (TAT-3387): Subscribes to global fastAssetCtxs for mark/mid updates; per-DEX assetCtxs still supplies funding/OI/volume/oracle and no longer overwrites prices for coins covered by fastAssetCtxs (HIP-3 symbols keep using assetCtxs when not on the fast feed). Subscription is restored on reconnect and torn down in clearAll().

Notification efficiency (TAT-3454): #notifyAllPriceSubscribers accepts an optional changedSymbols set so allMids, fastAssetCtxs, and activeAssetCtx only notify subscribers for symbols whose prices actually changed.

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

@gambinish
gambinish marked this pull request as ready for review July 15, 2026 21:08
@gambinish
gambinish requested review from a team as code owners July 15, 2026 21:08
@gambinish

Copy link
Copy Markdown
Member 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@7.5.5-preview-9c0a7053d
@metamask-previews/accounts-controller@39.0.5-preview-9c0a7053d
@metamask-previews/address-book-controller@7.1.2-preview-9c0a7053d
@metamask-previews/ai-controllers@0.8.0-preview-9c0a7053d
@metamask-previews/analytics-controller@1.2.1-preview-9c0a7053d
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-9c0a7053d
@metamask-previews/announcement-controller@8.1.0-preview-9c0a7053d
@metamask-previews/app-metadata-controller@2.0.1-preview-9c0a7053d
@metamask-previews/approval-controller@9.0.2-preview-9c0a7053d
@metamask-previews/assets-controller@11.0.0-preview-9c0a7053d
@metamask-previews/assets-controllers@109.4.1-preview-9c0a7053d
@metamask-previews/authenticated-user-storage@3.0.1-preview-9c0a7053d
@metamask-previews/base-controller@9.1.0-preview-9c0a7053d
@metamask-previews/base-data-service@0.1.3-preview-9c0a7053d
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-9c0a7053d
@metamask-previews/bridge-controller@77.5.0-preview-9c0a7053d
@metamask-previews/bridge-status-controller@74.2.0-preview-9c0a7053d
@metamask-previews/build-utils@3.0.4-preview-9c0a7053d
@metamask-previews/chain-agnostic-permission@1.7.0-preview-9c0a7053d
@metamask-previews/chomp-api-service@3.1.0-preview-9c0a7053d
@metamask-previews/claims-controller@0.5.3-preview-9c0a7053d
@metamask-previews/client-controller@1.0.1-preview-9c0a7053d
@metamask-previews/client-utils@1.1.0-preview-9c0a7053d
@metamask-previews/compliance-controller@2.1.0-preview-9c0a7053d
@metamask-previews/composable-controller@12.0.1-preview-9c0a7053d
@metamask-previews/config-registry-controller@0.4.1-preview-9c0a7053d
@metamask-previews/connectivity-controller@0.3.0-preview-9c0a7053d
@metamask-previews/controller-utils@12.3.0-preview-9c0a7053d
@metamask-previews/core-backend@6.5.0-preview-9c0a7053d
@metamask-previews/delegation-controller@3.0.2-preview-9c0a7053d
@metamask-previews/earn-controller@12.2.2-preview-9c0a7053d
@metamask-previews/eip-5792-middleware@3.0.5-preview-9c0a7053d
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-9c0a7053d
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-9c0a7053d
@metamask-previews/ens-controller@19.1.5-preview-9c0a7053d
@metamask-previews/eth-block-tracker@15.0.1-preview-9c0a7053d
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-9c0a7053d
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-9c0a7053d
@metamask-previews/foundryup@1.0.1-preview-9c0a7053d
@metamask-previews/gas-fee-controller@26.2.4-preview-9c0a7053d
@metamask-previews/gator-permissions-controller@4.2.3-preview-9c0a7053d
@metamask-previews/geolocation-controller@0.1.3-preview-9c0a7053d
@metamask-previews/java-tron-up@1.0.0-preview-9c0a7053d
@metamask-previews/json-rpc-engine@10.5.0-preview-9c0a7053d
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-9c0a7053d
@metamask-previews/keyring-controller@27.1.0-preview-9c0a7053d
@metamask-previews/local-node-utils@1.0.0-preview-9c0a7053d
@metamask-previews/logging-controller@8.0.2-preview-9c0a7053d
@metamask-previews/message-manager@14.1.2-preview-9c0a7053d
@metamask-previews/messenger@2.0.0-preview-9c0a7053d
@metamask-previews/messenger-cli@0.2.0-preview-9c0a7053d
@metamask-previews/money-account-api-data-service@0.1.0-preview-9c0a7053d
@metamask-previews/money-account-balance-service@2.2.0-preview-9c0a7053d
@metamask-previews/money-account-controller@0.3.3-preview-9c0a7053d
@metamask-previews/money-account-upgrade-controller@2.2.1-preview-9c0a7053d
@metamask-previews/multichain-account-service@13.0.0-preview-9c0a7053d
@metamask-previews/multichain-api-middleware@4.0.1-preview-9c0a7053d
@metamask-previews/multichain-network-controller@3.2.1-preview-9c0a7053d
@metamask-previews/multichain-transactions-controller@7.1.1-preview-9c0a7053d
@metamask-previews/name-controller@9.1.2-preview-9c0a7053d
@metamask-previews/network-connection-banner-controller@0.1.0-preview-9c0a7053d
@metamask-previews/network-controller@34.0.0-preview-9c0a7053d
@metamask-previews/network-enablement-controller@5.6.0-preview-9c0a7053d
@metamask-previews/notification-services-controller@25.0.0-preview-9c0a7053d
@metamask-previews/passkey-controller@2.1.0-preview-9c0a7053d
@metamask-previews/permission-controller@13.1.1-preview-9c0a7053d
@metamask-previews/permission-log-controller@5.1.0-preview-9c0a7053d
@metamask-previews/perps-controller@9.2.1-preview-9c0a7053d
@metamask-previews/phishing-controller@17.2.1-preview-9c0a7053d
@metamask-previews/platform-api-docs@0.0.0-preview-9c0a7053d
@metamask-previews/polling-controller@16.0.8-preview-9c0a7053d
@metamask-previews/preferences-controller@23.1.0-preview-9c0a7053d
@metamask-previews/profile-metrics-controller@4.0.2-preview-9c0a7053d
@metamask-previews/profile-sync-controller@28.3.0-preview-9c0a7053d
@metamask-previews/ramps-controller@17.0.0-preview-9c0a7053d
@metamask-previews/rate-limit-controller@7.0.1-preview-9c0a7053d
@metamask-previews/react-data-query@0.2.1-preview-9c0a7053d
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-9c0a7053d
@metamask-previews/sample-controllers@5.0.3-preview-9c0a7053d
@metamask-previews/seedless-onboarding-controller@10.0.3-preview-9c0a7053d
@metamask-previews/selected-network-controller@26.1.5-preview-9c0a7053d
@metamask-previews/sentinel-api-service@1.0.0-preview-9c0a7053d
@metamask-previews/shield-controller@5.1.3-preview-9c0a7053d
@metamask-previews/signature-controller@39.2.7-preview-9c0a7053d
@metamask-previews/smart-transactions-controller@25.0.1-preview-9c0a7053d
@metamask-previews/snap-account-service@2.0.0-preview-9c0a7053d
@metamask-previews/social-controllers@2.5.0-preview-9c0a7053d
@metamask-previews/solana-test-validator-up@1.0.0-preview-9c0a7053d
@metamask-previews/stellar-quickstart-up@0.0.0-preview-9c0a7053d
@metamask-previews/storage-service@1.0.2-preview-9c0a7053d
@metamask-previews/subscription-controller@6.2.1-preview-9c0a7053d
@metamask-previews/transaction-controller@69.0.0-preview-9c0a7053d
@metamask-previews/transaction-pay-controller@25.0.0-preview-9c0a7053d
@metamask-previews/user-operation-controller@41.2.7-preview-9c0a7053d
@metamask-previews/wallet@7.0.1-preview-9c0a7053d
@metamask-previews/wallet-cli@0.0.0-preview-9c0a7053d

Comment thread packages/perps-controller/src/services/HyperLiquidSubscriptionService.ts Outdated

@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 5dbe70c. Configure here.

Comment thread packages/perps-controller/CHANGELOG.md Outdated

@geositta geositta left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Requesting changes for two correctness gaps in the new collateral and price source gates. Collateral must be positively identified as USDC before discovery or trading proceeds, and fast feed ownership must not suppress assetCtxs until a usable price is cached. The notification scoping, API removal, and supporting coverage otherwise look good. Please address these cases with tests if you agree?

Comment thread packages/perps-controller/src/providers/HyperLiquidProvider.ts Outdated
Comment thread packages/perps-controller/src/services/HyperLiquidSubscriptionService.ts Outdated

@geositta geositta left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks for addressing the collateral fail open behavior and fast feed bootstrap handling.

I am requesting one remaining change so every market discovery path enforces the same USDC-only policy. Once getMarketDataWithPrices excludes unsupported HIP-3 DEXs from fresh and cached results, this should be ready for approval.

Comment thread packages/perps-controller/src/providers/HyperLiquidProvider.ts
gambinish and others added 4 commits July 21, 2026 08:25
Merging main pulled in the 9.3.0 release, which moved prior Unreleased
content into a 9.3.0 section and left Unreleased empty. The merge
commit left this branch's new entries attached to the now-released
9.3.0 section instead of the fresh Unreleased section, which the
merge-queue changelog check flags. Move them back under Unreleased.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gambinish

Copy link
Copy Markdown
Member 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@7.5.5-preview-2721cb096
@metamask-previews/accounts-controller@39.0.5-preview-2721cb096
@metamask-previews/address-book-controller@7.1.2-preview-2721cb096
@metamask-previews/ai-controllers@0.8.0-preview-2721cb096
@metamask-previews/analytics-controller@1.2.1-preview-2721cb096
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-2721cb096
@metamask-previews/announcement-controller@8.1.0-preview-2721cb096
@metamask-previews/app-metadata-controller@2.0.1-preview-2721cb096
@metamask-previews/approval-controller@9.0.2-preview-2721cb096
@metamask-previews/assets-controller@11.1.0-preview-2721cb096
@metamask-previews/assets-controllers@109.4.1-preview-2721cb096
@metamask-previews/authenticated-user-storage@3.0.1-preview-2721cb096
@metamask-previews/base-controller@9.1.0-preview-2721cb096
@metamask-previews/base-data-service@0.1.3-preview-2721cb096
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-2721cb096
@metamask-previews/bridge-controller@77.6.0-preview-2721cb096
@metamask-previews/bridge-status-controller@74.3.0-preview-2721cb096
@metamask-previews/build-utils@3.0.4-preview-2721cb096
@metamask-previews/chain-agnostic-permission@1.7.0-preview-2721cb096
@metamask-previews/chomp-api-service@3.1.0-preview-2721cb096
@metamask-previews/claims-controller@0.5.3-preview-2721cb096
@metamask-previews/client-controller@1.0.1-preview-2721cb096
@metamask-previews/client-utils@1.2.0-preview-2721cb096
@metamask-previews/compliance-controller@2.1.0-preview-2721cb096
@metamask-previews/composable-controller@12.0.1-preview-2721cb096
@metamask-previews/config-registry-controller@0.4.1-preview-2721cb096
@metamask-previews/connectivity-controller@0.3.0-preview-2721cb096
@metamask-previews/controller-utils@12.3.0-preview-2721cb096
@metamask-previews/core-backend@6.5.0-preview-2721cb096
@metamask-previews/delegation-controller@3.0.2-preview-2721cb096
@metamask-previews/earn-controller@12.2.2-preview-2721cb096
@metamask-previews/eip-5792-middleware@3.0.5-preview-2721cb096
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-2721cb096
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-2721cb096
@metamask-previews/ens-controller@19.1.5-preview-2721cb096
@metamask-previews/eth-block-tracker@15.0.1-preview-2721cb096
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-2721cb096
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-2721cb096
@metamask-previews/foundryup@1.0.1-preview-2721cb096
@metamask-previews/gas-fee-controller@26.2.4-preview-2721cb096
@metamask-previews/gator-permissions-controller@4.2.3-preview-2721cb096
@metamask-previews/geolocation-controller@0.1.3-preview-2721cb096
@metamask-previews/java-tron-up@1.0.0-preview-2721cb096
@metamask-previews/json-rpc-engine@10.5.0-preview-2721cb096
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-2721cb096
@metamask-previews/keyring-controller@27.1.0-preview-2721cb096
@metamask-previews/local-node-utils@1.0.0-preview-2721cb096
@metamask-previews/logging-controller@8.0.2-preview-2721cb096
@metamask-previews/message-manager@14.1.2-preview-2721cb096
@metamask-previews/messenger@2.0.0-preview-2721cb096
@metamask-previews/messenger-cli@0.2.0-preview-2721cb096
@metamask-previews/money-account-api-data-service@0.2.0-preview-2721cb096
@metamask-previews/money-account-balance-service@2.3.0-preview-2721cb096
@metamask-previews/money-account-controller@0.3.3-preview-2721cb096
@metamask-previews/money-account-upgrade-controller@2.2.1-preview-2721cb096
@metamask-previews/multichain-account-service@13.0.0-preview-2721cb096
@metamask-previews/multichain-api-middleware@4.0.1-preview-2721cb096
@metamask-previews/multichain-network-controller@3.2.1-preview-2721cb096
@metamask-previews/multichain-transactions-controller@7.1.1-preview-2721cb096
@metamask-previews/name-controller@9.1.2-preview-2721cb096
@metamask-previews/network-connection-banner-controller@0.1.0-preview-2721cb096
@metamask-previews/network-controller@34.0.0-preview-2721cb096
@metamask-previews/network-enablement-controller@5.6.0-preview-2721cb096
@metamask-previews/notification-services-controller@26.0.0-preview-2721cb096
@metamask-previews/passkey-controller@3.0.0-preview-2721cb096
@metamask-previews/permission-controller@13.1.1-preview-2721cb096
@metamask-previews/permission-log-controller@5.1.0-preview-2721cb096
@metamask-previews/perps-controller@9.3.0-preview-2721cb096
@metamask-previews/phishing-controller@17.3.0-preview-2721cb096
@metamask-previews/platform-api-docs@0.0.0-preview-2721cb096
@metamask-previews/polling-controller@16.0.8-preview-2721cb096
@metamask-previews/preferences-controller@23.1.0-preview-2721cb096
@metamask-previews/profile-metrics-controller@4.0.2-preview-2721cb096
@metamask-previews/profile-sync-controller@28.3.0-preview-2721cb096
@metamask-previews/ramps-controller@17.0.0-preview-2721cb096
@metamask-previews/rate-limit-controller@7.0.1-preview-2721cb096
@metamask-previews/react-data-query@0.2.2-preview-2721cb096
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-2721cb096
@metamask-previews/sample-controllers@5.0.3-preview-2721cb096
@metamask-previews/seedless-onboarding-controller@10.0.3-preview-2721cb096
@metamask-previews/selected-network-controller@26.1.5-preview-2721cb096
@metamask-previews/sentinel-api-service@1.0.0-preview-2721cb096
@metamask-previews/shield-controller@5.1.3-preview-2721cb096
@metamask-previews/signature-controller@39.2.7-preview-2721cb096
@metamask-previews/smart-transactions-controller@25.0.1-preview-2721cb096
@metamask-previews/snap-account-service@2.0.0-preview-2721cb096
@metamask-previews/social-controllers@2.5.0-preview-2721cb096
@metamask-previews/solana-test-validator-up@1.0.0-preview-2721cb096
@metamask-previews/stellar-quickstart-up@0.0.0-preview-2721cb096
@metamask-previews/storage-service@1.0.2-preview-2721cb096
@metamask-previews/subscription-controller@6.2.1-preview-2721cb096
@metamask-previews/transaction-controller@69.1.0-preview-2721cb096
@metamask-previews/transaction-pay-controller@25.0.0-preview-2721cb096
@metamask-previews/user-operation-controller@41.2.7-preview-2721cb096
@metamask-previews/wallet@7.0.1-preview-2721cb096
@metamask-previews/wallet-cli@0.0.0-preview-2721cb096

@gambinish
gambinish added this pull request to the merge queue Jul 21, 2026
Merged via the queue into main with commit f3b3fd5 Jul 21, 2026
427 checks passed
@gambinish
gambinish deleted the perps/collateral-gating-and-price-fixes branch July 21, 2026 19:08
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