Skip to content

feat(social-controllers): expose perp metadata on Position and Trade types#9094

Open
joaosantos15 wants to merge 2 commits into
mainfrom
core-TSA-hyperliquid
Open

feat(social-controllers): expose perp metadata on Position and Trade types#9094
joaosantos15 wants to merge 2 commits into
mainfrom
core-TSA-hyperliquid

Conversation

@joaosantos15

@joaosantos15 joaosantos15 commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Explanation

The mobile Perps leaderboard/position UX needs typed, validated access to the perp metadata that social-api now returns for Hyperliquid (and other perp) positions. Today @metamask/social-controllers drops those fields on the floor because they aren't declared on the response types or their superstruct schemas.

This PR extends the SocialService response types and validation schemas with the optional perp fields:

  • Trade (and TradeStruct): adds classification ('spot' | 'perp' | 'send' | 'receive' | null), perpPositionType ('long' | 'short' | null), and perpLeverage (number | null).
  • Position (and PositionStruct): adds perpPositionType, perpLeverage, and positionAmountWithLeverage (the leveraged position size / capital at risk — Hyperliquid/perp only).

All fields are optional and nullable, so spot responses validate exactly as before — this is a purely additive, non-breaking change. This is the client-side half of the Hyperliquid perps work; the matching server-side passthrough lives in social-api.

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

Low Risk
Additive optional/nullable fields and stricter validation only when new perp keys are present; spot payloads without those fields behave as before.

Overview
Adds optional, nullable perp/Hyperliquid metadata to social position and trade models so SocialService no longer strips fields the API already returns.

Trade / TradeStruct now include classification (spot | perp | send | receive), perpPositionType, and perpLeverage. Position / PositionStruct add perpPositionType, perpLeverage, and positionAmountWithLeverage (leveraged size / capital at risk). Matching superstruct rules on PositionStruct validate these on open/closed positions and fetchPositionById.

Tests cover passthrough of perp payloads, explicit null for spot, and rejection of invalid enum values (e.g. bad perpPositionType). Changelog documents the additive API surface for consumers (e.g. mobile Perps UI).

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

…ypes

Adds optional Hyperliquid/perp fields to the `SocialService` response
types and their superstruct validation schemas so consumers (mobile)
get typed, validated access to the perp metadata that social-api now
returns:

- `Trade`: `classification`, `perpPositionType`, `perpLeverage`
- `Position`: `perpPositionType`, `perpLeverage`, `positionAmountWithLeverage`

All fields are optional and nullable, so spot responses remain backward
compatible. Part of the Hyperliquid perps leaderboard/positions work
(TSA-629).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@joaosantos15 joaosantos15 requested review from a team as code owners June 11, 2026 12:35
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@joaosantos15

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@7.5.2-preview-a3e0ef7eb
@metamask-previews/accounts-controller@39.0.1-preview-a3e0ef7eb
@metamask-previews/address-book-controller@7.1.2-preview-a3e0ef7eb
@metamask-previews/ai-controllers@0.7.0-preview-a3e0ef7eb
@metamask-previews/analytics-controller@1.1.1-preview-a3e0ef7eb
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-a3e0ef7eb
@metamask-previews/announcement-controller@8.1.0-preview-a3e0ef7eb
@metamask-previews/app-metadata-controller@2.0.1-preview-a3e0ef7eb
@metamask-previews/approval-controller@9.0.2-preview-a3e0ef7eb
@metamask-previews/assets-controller@9.0.1-preview-a3e0ef7eb
@metamask-previews/assets-controllers@109.0.0-preview-a3e0ef7eb
@metamask-previews/authenticated-user-storage@2.0.0-preview-a3e0ef7eb
@metamask-previews/base-controller@9.1.0-preview-a3e0ef7eb
@metamask-previews/base-data-service@0.1.3-preview-a3e0ef7eb
@metamask-previews/bridge-controller@75.1.1-preview-a3e0ef7eb
@metamask-previews/bridge-status-controller@72.1.0-preview-a3e0ef7eb
@metamask-previews/build-utils@3.0.4-preview-a3e0ef7eb
@metamask-previews/chain-agnostic-permission@1.6.1-preview-a3e0ef7eb
@metamask-previews/chomp-api-service@3.1.0-preview-a3e0ef7eb
@metamask-previews/claims-controller@0.5.3-preview-a3e0ef7eb
@metamask-previews/client-controller@1.0.1-preview-a3e0ef7eb
@metamask-previews/compliance-controller@2.1.0-preview-a3e0ef7eb
@metamask-previews/composable-controller@12.0.1-preview-a3e0ef7eb
@metamask-previews/config-registry-controller@0.4.1-preview-a3e0ef7eb
@metamask-previews/connectivity-controller@0.2.0-preview-a3e0ef7eb
@metamask-previews/controller-utils@12.2.0-preview-a3e0ef7eb
@metamask-previews/core-backend@6.3.3-preview-a3e0ef7eb
@metamask-previews/delegation-controller@3.0.2-preview-a3e0ef7eb
@metamask-previews/earn-controller@12.2.0-preview-a3e0ef7eb
@metamask-previews/eip-5792-middleware@3.0.4-preview-a3e0ef7eb
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-a3e0ef7eb
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-a3e0ef7eb
@metamask-previews/ens-controller@19.1.3-preview-a3e0ef7eb
@metamask-previews/eth-block-tracker@15.0.1-preview-a3e0ef7eb
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-a3e0ef7eb
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-a3e0ef7eb
@metamask-previews/foundryup@1.0.1-preview-a3e0ef7eb
@metamask-previews/gas-fee-controller@26.2.2-preview-a3e0ef7eb
@metamask-previews/gator-permissions-controller@4.2.0-preview-a3e0ef7eb
@metamask-previews/geolocation-controller@0.1.3-preview-a3e0ef7eb
@metamask-previews/json-rpc-engine@10.5.0-preview-a3e0ef7eb
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-a3e0ef7eb
@metamask-previews/keyring-controller@27.0.0-preview-a3e0ef7eb
@metamask-previews/logging-controller@8.0.2-preview-a3e0ef7eb
@metamask-previews/message-manager@14.1.2-preview-a3e0ef7eb
@metamask-previews/messenger@1.2.0-preview-a3e0ef7eb
@metamask-previews/messenger-cli@0.2.0-preview-a3e0ef7eb
@metamask-previews/money-account-balance-service@1.0.2-preview-a3e0ef7eb
@metamask-previews/money-account-controller@0.3.3-preview-a3e0ef7eb
@metamask-previews/money-account-upgrade-controller@2.0.5-preview-a3e0ef7eb
@metamask-previews/multichain-account-service@10.0.3-preview-a3e0ef7eb
@metamask-previews/multichain-api-middleware@3.1.3-preview-a3e0ef7eb
@metamask-previews/multichain-network-controller@3.1.3-preview-a3e0ef7eb
@metamask-previews/multichain-transactions-controller@7.1.1-preview-a3e0ef7eb
@metamask-previews/name-controller@9.1.2-preview-a3e0ef7eb
@metamask-previews/network-controller@32.0.0-preview-a3e0ef7eb
@metamask-previews/network-enablement-controller@5.3.0-preview-a3e0ef7eb
@metamask-previews/notification-services-controller@24.1.3-preview-a3e0ef7eb
@metamask-previews/passkey-controller@2.0.1-preview-a3e0ef7eb
@metamask-previews/permission-controller@13.1.1-preview-a3e0ef7eb
@metamask-previews/permission-log-controller@5.1.0-preview-a3e0ef7eb
@metamask-previews/perps-controller@8.1.0-preview-a3e0ef7eb
@metamask-previews/phishing-controller@17.2.0-preview-a3e0ef7eb
@metamask-previews/polling-controller@16.0.6-preview-a3e0ef7eb
@metamask-previews/preferences-controller@23.1.0-preview-a3e0ef7eb
@metamask-previews/profile-metrics-controller@3.2.0-preview-a3e0ef7eb
@metamask-previews/profile-sync-controller@28.1.1-preview-a3e0ef7eb
@metamask-previews/ramps-controller@14.1.1-preview-a3e0ef7eb
@metamask-previews/rate-limit-controller@7.0.1-preview-a3e0ef7eb
@metamask-previews/react-data-query@0.2.1-preview-a3e0ef7eb
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-a3e0ef7eb
@metamask-previews/sample-controllers@5.0.1-preview-a3e0ef7eb
@metamask-previews/seedless-onboarding-controller@10.0.2-preview-a3e0ef7eb
@metamask-previews/selected-network-controller@26.1.3-preview-a3e0ef7eb
@metamask-previews/shield-controller@5.1.2-preview-a3e0ef7eb
@metamask-previews/signature-controller@39.2.5-preview-a3e0ef7eb
@metamask-previews/snap-account-service@0.3.1-preview-a3e0ef7eb
@metamask-previews/social-controllers@2.2.1-preview-a3e0ef7eb
@metamask-previews/storage-service@1.0.2-preview-a3e0ef7eb
@metamask-previews/subscription-controller@6.2.0-preview-a3e0ef7eb
@metamask-previews/transaction-controller@68.0.0-preview-a3e0ef7eb
@metamask-previews/transaction-pay-controller@23.5.1-preview-a3e0ef7eb
@metamask-previews/user-operation-controller@41.2.4-preview-a3e0ef7eb
@metamask-previews/wallet@3.0.0-preview-a3e0ef7eb

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