Skip to content

fix(perps): implement the TPSL false failure fix - #9995

Open
geositta wants to merge 3 commits into
mainfrom
fix/TAT-3846-modify-tpsl-failure
Open

fix(perps): implement the TPSL false failure fix#9995
geositta wants to merge 3 commits into
mainfrom
fix/TAT-3846-modify-tpsl-failure

Conversation

@geositta

@geositta geositta commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Explanation

@metamask/perps-controller v13 treated HyperLiquid's valid waitingForTrigger TP/SL acknowledgement as a failure because it has no order ID. The trigger was created, but Mobile displayed TPSL_UPDATE_FAILED.

This change accepts waitingForTrigger and reconciles its order ID only when needed to clean up a mixed-result batch. It reuses existing REST/cache order IDs to avoid an extra happy-path request, while preserving rollback for rejected, unknown, and incomplete responses. No dependencies or other packages changed, and there are no breaking changes.

References

  • Related to TAT-3846

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
Changes failure/rollback paths for updatePositionTPSL and open-order reconciliation; incorrect matching could mis-cancel triggers or mis-report protection loss, though matching requires a single unambiguous candidate.

Overview
Fixes false TPSL_UPDATE_FAILED when HyperLiquid accepts position TP/SL with a bare waitingForTrigger acknowledgement (no order ID in the response).

updatePositionTPSL now classifies TP/SL placement via #readTpslOrderPlacementOutcome, treating waitingForTrigger as success alongside resting and filled. On the happy path it returns success without requiring an order ID for every leg. When a mixed batch fails, #reconcileTpslOrderPlacementOutcomes can match new trigger orders from frontendOpenOrders (size, trigger price, side, TP vs SL) using a pre-placement order ID snapshot so cleanup can cancel reconciled legs; unreconciled waitingForTrigger legs surface TPSL_PROTECTION_LOST instead of a generic update failure. Restoration after partial failure uses the same TP/SL outcome logic. Tests cover combined/mixed statuses, replacement with cancel, reconciliation before mixed-failure cleanup, and restore-on-unknown/incomplete responses.

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

Accepts HyperLiquid’s waitingForTrigger as successful

Reconciles missing order IDs during mixed failure cleanup
restrict reconciliation and cancellation to waitingForTrigger

restore old protection for unknown/incomplete responses
@geositta geositta changed the title fix: implement the TPSL false failure fix fix(perps): implement the TPSL false failure fix Aug 28, 2026
@geositta
geositta marked this pull request as ready for review August 28, 2026 02:52
@geositta
geositta requested review from a team as code owners August 28, 2026 02:52
@geositta

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@geositta
geositta deployed to default-branch August 28, 2026 02:52 — with GitHub Actions Active
@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@8.0.0-preview-8c2a2eeb2
@metamask-previews/accounts-controller@39.1.1-preview-8c2a2eeb2
@metamask-previews/address-book-controller@7.1.2-preview-8c2a2eeb2
@metamask-previews/ai-controllers@0.8.0-preview-8c2a2eeb2
@metamask-previews/analytics-controller@2.0.0-preview-8c2a2eeb2
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-8c2a2eeb2
@metamask-previews/announcement-controller@8.1.0-preview-8c2a2eeb2
@metamask-previews/app-metadata-controller@2.0.1-preview-8c2a2eeb2
@metamask-previews/approval-controller@9.0.2-preview-8c2a2eeb2
@metamask-previews/assets-controller@14.0.2-preview-8c2a2eeb2
@metamask-previews/assets-controllers@111.1.3-preview-8c2a2eeb2
@metamask-previews/authenticated-user-storage@3.0.2-preview-8c2a2eeb2
@metamask-previews/base-controller@9.1.0-preview-8c2a2eeb2
@metamask-previews/base-data-service@1.0.0-preview-8c2a2eeb2
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-8c2a2eeb2
@metamask-previews/bridge-controller@80.0.0-preview-8c2a2eeb2
@metamask-previews/bridge-status-controller@75.3.0-preview-8c2a2eeb2
@metamask-previews/build-utils@3.0.4-preview-8c2a2eeb2
@metamask-previews/chain-agnostic-permission@1.7.0-preview-8c2a2eeb2
@metamask-previews/chomp-api-service@4.0.1-preview-8c2a2eeb2
@metamask-previews/claims-controller@0.6.1-preview-8c2a2eeb2
@metamask-previews/client-controller@1.0.1-preview-8c2a2eeb2
@metamask-previews/client-utils@2.1.1-preview-8c2a2eeb2
@metamask-previews/compliance-controller@2.1.0-preview-8c2a2eeb2
@metamask-previews/composable-controller@12.0.1-preview-8c2a2eeb2
@metamask-previews/config-registry-controller@3.1.0-preview-8c2a2eeb2
@metamask-previews/connectivity-controller@0.3.0-preview-8c2a2eeb2
@metamask-previews/controller-utils@12.3.0-preview-8c2a2eeb2
@metamask-previews/core-backend@9.0.0-preview-8c2a2eeb2
@metamask-previews/delegation-controller@3.0.2-preview-8c2a2eeb2
@metamask-previews/earn-controller@12.2.6-preview-8c2a2eeb2
@metamask-previews/eip-5792-middleware@3.0.5-preview-8c2a2eeb2
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-8c2a2eeb2
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-8c2a2eeb2
@metamask-previews/eth-block-tracker@15.0.1-preview-8c2a2eeb2
@metamask-previews/eth-json-rpc-middleware@24.0.1-preview-8c2a2eeb2
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-8c2a2eeb2
@metamask-previews/foundryup@1.0.1-preview-8c2a2eeb2
@metamask-previews/gas-fee-controller@26.3.2-preview-8c2a2eeb2
@metamask-previews/gator-permissions-controller@5.0.2-preview-8c2a2eeb2
@metamask-previews/geolocation-controller@1.0.0-preview-8c2a2eeb2
@metamask-previews/java-tron-up@1.0.0-preview-8c2a2eeb2
@metamask-previews/json-rpc-engine@10.5.0-preview-8c2a2eeb2
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-8c2a2eeb2
@metamask-previews/keyring-controller@27.1.1-preview-8c2a2eeb2
@metamask-previews/kyc-controller@0.0.0-preview-8c2a2eeb2
@metamask-previews/local-node-utils@1.0.0-preview-8c2a2eeb2
@metamask-previews/logging-controller@9.0.0-preview-8c2a2eeb2
@metamask-previews/message-manager@14.1.2-preview-8c2a2eeb2
@metamask-previews/messenger@2.0.0-preview-8c2a2eeb2
@metamask-previews/messenger-cli@0.2.0-preview-8c2a2eeb2
@metamask-previews/money-account-api-data-service@0.4.1-preview-8c2a2eeb2
@metamask-previews/money-account-balance-service@2.4.3-preview-8c2a2eeb2
@metamask-previews/money-account-controller@1.0.0-preview-8c2a2eeb2
@metamask-previews/money-account-upgrade-controller@3.0.2-preview-8c2a2eeb2
@metamask-previews/money-account-utils@1.1.0-preview-8c2a2eeb2
@metamask-previews/multichain-account-service@13.0.2-preview-8c2a2eeb2
@metamask-previews/multichain-api-middleware@4.0.3-preview-8c2a2eeb2
@metamask-previews/multichain-network-controller@3.2.4-preview-8c2a2eeb2
@metamask-previews/multichain-transactions-controller@7.1.2-preview-8c2a2eeb2
@metamask-previews/name-controller@9.1.2-preview-8c2a2eeb2
@metamask-previews/network-connection-banner-controller@0.2.1-preview-8c2a2eeb2
@metamask-previews/network-controller@36.0.0-preview-8c2a2eeb2
@metamask-previews/network-enablement-controller@6.0.5-preview-8c2a2eeb2
@metamask-previews/notification-services-controller@26.0.1-preview-8c2a2eeb2
@metamask-previews/passkey-controller@3.1.0-preview-8c2a2eeb2
@metamask-previews/permission-controller@13.1.1-preview-8c2a2eeb2
@metamask-previews/permission-log-controller@5.1.0-preview-8c2a2eeb2
@metamask-previews/perps-controller@13.1.0-preview-8c2a2eeb2
@metamask-previews/phishing-controller@17.4.0-preview-8c2a2eeb2
@metamask-previews/platform-api-docs@0.0.0-preview-8c2a2eeb2
@metamask-previews/polling-controller@16.0.9-preview-8c2a2eeb2
@metamask-previews/preferences-controller@23.1.0-preview-8c2a2eeb2
@metamask-previews/profile-metrics-controller@4.0.3-preview-8c2a2eeb2
@metamask-previews/profile-sync-controller@29.0.0-preview-8c2a2eeb2
@metamask-previews/ramps-controller@20.0.0-preview-8c2a2eeb2
@metamask-previews/rate-limit-controller@7.0.1-preview-8c2a2eeb2
@metamask-previews/react-data-query@1.0.0-preview-8c2a2eeb2
@metamask-previews/remote-feature-flag-controller@6.1.0-preview-8c2a2eeb2
@metamask-previews/sample-controllers@5.0.6-preview-8c2a2eeb2
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-8c2a2eeb2
@metamask-previews/selected-network-controller@26.1.7-preview-8c2a2eeb2
@metamask-previews/sentinel-api-service@1.0.1-preview-8c2a2eeb2
@metamask-previews/shield-controller@6.0.1-preview-8c2a2eeb2
@metamask-previews/signature-controller@39.2.10-preview-8c2a2eeb2
@metamask-previews/smart-transactions-controller@25.1.1-preview-8c2a2eeb2
@metamask-previews/snap-account-service@2.1.2-preview-8c2a2eeb2
@metamask-previews/social-controllers@2.8.0-preview-8c2a2eeb2
@metamask-previews/solana-test-validator-up@1.0.0-preview-8c2a2eeb2
@metamask-previews/stellar-quickstart-up@0.0.0-preview-8c2a2eeb2
@metamask-previews/storage-service@1.0.2-preview-8c2a2eeb2
@metamask-previews/subscription-controller@8.0.1-preview-8c2a2eeb2
@metamask-previews/transaction-controller@69.6.1-preview-8c2a2eeb2
@metamask-previews/transaction-pay-controller@27.0.0-preview-8c2a2eeb2
@metamask-previews/user-operation-controller@41.2.9-preview-8c2a2eeb2
@metamask-previews/wallet@12.0.2-preview-8c2a2eeb2
@metamask-previews/wallet-cli@0.0.0-preview-8c2a2eeb2

Associate the unreleased TPSL changelog entry with its pull request so automated changelog checks can verify it.

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.

1 participant