Skip to content

feat(ramps-controller): export Transak API error helpers and codes - #9135

Merged
amitabh94 merged 6 commits into
mainfrom
feat/transak-api-error-utils
Jun 16, 2026
Merged

feat(ramps-controller): export Transak API error helpers and codes#9135
amitabh94 merged 6 commits into
mainfrom
feat/transak-api-error-utils

Conversation

@amitabh94

@amitabh94 amitabh94 commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Explanation

Unified Buy v2 (and other @metamask/ramps-controller consumers) need to detect specific Transak API failures from TransakApiError — for example error code 2020 when a phone number is already registered to a different email. Today, mobile duplicated string literals and ad-hoc instanceof / Axios-shaped parsing because ramps-controller only exported TransakApiError itself, not reusable helpers or known codes.

This PR adds shared Transak error codes and small type guards/helpers so consumers can branch on errorCode and read apiMessage consistently:

  • TRANSAK_ERROR_CODES (ORDER_EXISTS: '4005', PHONE_ALREADY_REGISTERED: '2020') and TransakErrorCode
  • isTransakApiError, getTransakErrorCode, getTransakApiMessage, isTransakErrorCode, isTransakPhoneRegisteredError

TransakService now uses TRANSAK_ERROR_CODES.ORDER_EXISTS instead of a private '4005' constant so order-exists retry logic and public exports stay aligned.

No breaking changes. Changelog updated under @metamask/ramps-controller Unreleased.

References

  • TRAM-3654 — Unified Buy v2: show login-with-email action for Transak phone-already-registered error
  • Mobile consumer: MetaMask/metamask-mobile#31580 — depends on this release before dropping local error parsing

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 (N/A — additive exports only)

Co-authored-by: Cursor <cursoragent@cursor.com>
@amitabh94
amitabh94 requested review from a team as code owners June 15, 2026 21:52
@amitabh94

amitabh94 commented Jun 15, 2026

Copy link
Copy Markdown
Contributor Author

Coordination

  • Jira: TRAM-3654
  • Mobile consumer: MetaMask/metamask-mobile#31580 — mobile needs this released/bumped before it can drop local parseTransakApiError and use controller exports (TRANSAK_ERROR_CODES, isTransakPhoneRegisteredError, etc.).

@amitabh94

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

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

Link the Transak API error helper changelog entry to #9135 and apply
lint:misc import-order formatting for the new ramps-controller files.

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

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

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

Export only getTransakApiMessage and isTransakPhoneRegisteredError for mobile
consumers. Drop shared error code constants and generic helpers from the public
API and leave TransakService order-retry logic unchanged.

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

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@amitabh94

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

Re-publishing after dafe3dfbd (trimmed exports: only getTransakApiMessage + isTransakPhoneRegisteredError). Previous preview request was sent before the commit was pushed.

Keep getTransakApiMessage and isTransakPhoneRegisteredError as the only
public helpers while sharing ORDER_EXISTS and PHONE_ALREADY_REGISTERED in
transakErrorCodes.ts for TransakService and error utils.

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

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

After 2bda2a53e — centralized Transak error codes in transakErrorCodes.ts (public API unchanged: getTransakApiMessage, isTransakPhoneRegisteredError only).

@amitabh94

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

After b92250061 (lint fix on top of centralized Transak error codes).

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

@amitabh94
amitabh94 enabled auto-merge June 16, 2026 22:57
@amitabh94
amitabh94 added this pull request to the merge queue Jun 16, 2026
Merged via the queue into main with commit 4126310 Jun 16, 2026
379 checks passed
@amitabh94
amitabh94 deleted the feat/transak-api-error-utils branch June 16, 2026 23:45
@amitabh94 amitabh94 mentioned this pull request Jun 18, 2026
4 tasks
pull Bot pushed a commit to Reality2byte/core that referenced this pull request Jun 19, 2026
## Explanation

**Current state:** `@metamask/ramps-controller@14.2.0` is the latest
publish on npm. Since then, two consumer-facing changes merged to `main`
but are not yet published:

- **MetaMask#9159 (TRAM-3539)** — `RampsController` now merges orders on the
internal MetaMask order code (from canonical `order.id`, e.g.
`c-{guid}`) instead of `providerOrderId`. Without this, Moonpay redirect
buys can produce duplicate Activity rows (precreate stub + provider
callback row).
- **MetaMask#9135** — exports `getTransakApiMessage`,
`isTransakPhoneRegisteredError`, and centralized Transak API error codes
for client-side error handling.

Mobile QA is currently blocked on a **preview build**
(`@metamask-previews/ramps-controller`) for TestFlight; we need a real
npm release to drop preview/resolution pins.

**Solution:** Release **1055.0.0** publishes
**`@metamask/ramps-controller@14.3.0`**. This PR only versions and ships
what is already on `main` — no new feature work in the diff.

**What's in 14.3.0:**

| Category | Change |
|----------|--------|
| **Fixed** | Compare internal order codes in `addOrder` / `getOrder` /
`addPrecreatedOrder`
([MetaMask#9159](MetaMask#9159)) |
| **Added** | Transak API error helpers (`getTransakApiMessage`,
`isTransakPhoneRegisteredError`, `transakErrorCodes.ts`)
([MetaMask#9135](MetaMask#9135)) |
| **Changed** | Bump `@metamask/profile-sync-controller` to `^28.2.0`
([MetaMask#9119](MetaMask#9119)) |

**SemVer:** Minor bump (14.2.0 → 14.3.0) — includes new exports plus a
bug fix. No breaking API changes.

**Other packages / deps:** Only `@metamask/ramps-controller` is
published in this release. Dependency bumps listed above were already
merged separately and are included because they landed after 14.2.0.

**Worth noting for reviewers:** The fix normalizes stored
`providerOrderId` to the internal order code for polling/lookup
consistency. Order Details “copy id” may show the MetaMask `c-…` code
rather than the provider-native UUID — support should use provider link
/ tx hash for native references.

## References

- TRAM-3539 — duplicate Moonpay Activity rows on redirect buys
- [MetaMask#9159](MetaMask#9159) — internal order
id merge fix
- [MetaMask#9135](MetaMask#9135) — Transak API
error helpers
- [MetaMask#9119](MetaMask#9119) —
profile-sync-controller dep bump
-
[MetaMask/metamask-mobile#31837](MetaMask/metamask-mobile#31837)
— mobile QA PR (preview pin; update to `^14.3.0` after this release)

**Mobile follow-up after merge + npm publish:**
1. Bump `@metamask/ramps-controller` to `^14.3.0`
2. Remove preview alias / `resolutions` / `previewBuilds`
3. Re-run TestFlight QA for Moonpay redirect buy (single Activity row)

## 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 _(N/A — no breaking changes)_

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Release-only version, changelog, and lockfile updates with no runtime
code changes in this diff.
> 
> **Overview**
> Release **1055.0.0** publishes **`@metamask/ramps-controller@14.3.0`**
to npm. The PR diff is versioning and dependency wiring only—no new
feature code.
> 
> **`@metamask/ramps-controller`** goes **14.2.0 → 14.3.0** with
changelog section **14.3.0** (content already on `main`): Transak error
helpers (`getTransakApiMessage`, `isTransakPhoneRegisteredError`,
`transakErrorCodes.ts`), bump to `@metamask/profile-sync-controller`
^28.2.0, and the documented order-id merge fix for duplicate Moonpay
Activity rows.
> 
> Root **`package.json`** is bumped **1054.0.0 → 1055.0.0**.
**`@metamask/transaction-pay-controller`** updates its dependency to
**`@metamask/ramps-controller` ^14.3.0** and records that in its
changelog; **`yarn.lock`** is updated accordingly.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
4685db4. 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: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
pull Bot pushed a commit to Reality2byte/metamask-mobile that referenced this pull request Jun 22, 2026
…etaMask#31580)

## **Description**

Unified Buy v2 (`NativeFlow/BasicInfo`) submits personal details via
`@metamask/ramps-controller`, which throws `TransakApiError` with
top-level `errorCode` and `apiMessage`. The screen was still checking a
legacy Axios response shape, so Transak error code `2020` (phone already
registered) was never detected and the **Log in with email** logout CTA
stayed hidden.

This PR:
1. Detects phone-already-registered errors with
`isTransakPhoneRegisteredError` and reads the user-facing message via
`getTransakApiMessage` from `@metamask/ramps-controller`
([MetaMask/core#9135](MetaMask/core#9135)).
2. Preserves quote context when routing back to Enter Email after logout
so re-auth can resume the buy flow.
3. Bumps `@metamask/ramps-controller` to `^14.3.0` (core MetaMask#9135 shipped
in 14.3.0).

Deposit v1 already handled `2020` via the legacy SDK/Axios path
([MetaMask#22183](MetaMask#22183)); this
aligns UB2 with the controller error model.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:
[TRAM-3654](https://consensyssoftware.atlassian.net/browse/TRAM-3654)

## **Manual testing steps**

```gherkin
Feature: Unified Buy v2 phone already registered logout

  Scenario: user sees login-with-email when phone is registered to another account
    Given unified buy v2 is enabled and user is authenticated with email A
    And user reaches NativeFlow BasicInfo with a valid buy quote

    When user submits BasicInfo with a phone number already registered to email B
    Then an error banner is shown with localized phone-already-registered copy
    And a "Log in with email" action is visible

    When user taps "Log in with email"
    Then user is logged out of the Transak session
    And user is navigated to Enter Email with quote context preserved
    And user can authenticate with email B and continue the buy flow
```

**Unit tests:** `yarn jest
app/components/UI/Ramp/Views/NativeFlow/BasicInfo.test.tsx`

**RC QA:** TestFlight build **5530** from
`fix/ub2-transak-phone-registered-logout` (RC workflow run
[27652822118](https://github.com/MetaMask/metamask-mobile/actions/runs/27652822118)).

## **Screenshots/Recordings**

N/A — pending QA on RC TestFlight build 5530. Will attach before/after
recordings once verified.

### **Before**


https://github.com/user-attachments/assets/78047789-fdd9-4a2d-a2cb-519853deae65


N/A

### **After**


https://github.com/user-attachments/assets/c51913f8-42ca-48b9-bba1-de287cfcde9c


N/A

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

[TRAM-3654]:
https://consensyssoftware.atlassian.net/browse/TRAM-3654?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches buy/KYC error handling and post-logout navigation in the ramps
native flow; changes are localized and aligned with the controller error
model, with unit test coverage.
> 
> **Overview**
> Unified Buy v2 **BasicInfo** now treats Transak failures from
`@metamask/ramps-controller` correctly, so **phone already registered**
(error `2020`) shows the error banner and **Log in with email** instead
of being missed when the screen only read a legacy Axios
`response.data.error` shape.
> 
> Submission errors use **`isTransakPhoneRegisteredError`** and
**`getTransakApiMessage`** (with existing `parseUserFacingError` as
fallback). After logout, navigation always goes through
**`createV2EnterEmailNavDetails`** with quote fields (`amount`,
`currency`, `assetId`, optional `headlessSessionId`) so users can
re-auth and continue the buy.
> 
> **`@metamask/ramps-controller`** is bumped to **`^14.3.0`**; unit
tests mock **`TransakApiError`** and assert the logout CTA and
post-logout navigation.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
af1cac5. 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: Cursor <cursoragent@cursor.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.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.

3 participants