From e4f1c37f979ace067058ec6c3334a668b4863574 Mon Sep 17 00:00:00 2001 From: Amitabh Aggarwal Date: Mon, 15 Jun 2026 16:37:02 -0500 Subject: [PATCH 1/5] feat(ramps-controller): export Transak API error helpers and codes Co-authored-by: Cursor --- packages/ramps-controller/CHANGELOG.md | 4 ++ .../ramps-controller/src/TransakService.ts | 6 +-- packages/ramps-controller/src/index.ts | 9 ++++ .../src/transakApiErrorUtils.test.ts | 47 +++++++++++++++++++ .../src/transakApiErrorUtils.ts | 26 ++++++++++ .../ramps-controller/src/transakErrorCodes.ts | 13 +++++ 6 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 packages/ramps-controller/src/transakApiErrorUtils.test.ts create mode 100644 packages/ramps-controller/src/transakApiErrorUtils.ts create mode 100644 packages/ramps-controller/src/transakErrorCodes.ts diff --git a/packages/ramps-controller/CHANGELOG.md b/packages/ramps-controller/CHANGELOG.md index 3360cedbca..3f4f167ff6 100644 --- a/packages/ramps-controller/CHANGELOG.md +++ b/packages/ramps-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Export `TRANSAK_ERROR_CODES`, `TransakErrorCode`, and Transak API error helpers (`isTransakApiError`, `getTransakErrorCode`, `getTransakApiMessage`, `isTransakErrorCode`, `isTransakPhoneRegisteredError`) for consumers handling `TransakApiError` + ### Changed - Bump `@metamask/profile-sync-controller` from `^28.1.1` to `^28.2.0` ([#9119](https://github.com/MetaMask/core/pull/9119)) diff --git a/packages/ramps-controller/src/TransakService.ts b/packages/ramps-controller/src/TransakService.ts index a88e5b6c70..67917b7973 100644 --- a/packages/ramps-controller/src/TransakService.ts +++ b/packages/ramps-controller/src/TransakService.ts @@ -7,6 +7,8 @@ import type { Messenger } from '@metamask/messenger'; import type { TransakServiceMethodActions } from './TransakService-method-action-types'; +import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; + // === TYPES === export type TransakAccessToken = { @@ -429,8 +431,6 @@ function getPaymentWidgetBaseUrl(environment: TransakEnvironment): string { // === TRANSAK API ERROR === -const TRANSAK_ORDER_EXISTS_CODE = '4005'; - export class TransakApiError extends HttpError { readonly errorCode: string | undefined; @@ -915,7 +915,7 @@ export class TransakService { if ( error instanceof TransakApiError && error.httpStatus === 409 && - error.errorCode === TRANSAK_ORDER_EXISTS_CODE + error.errorCode === TRANSAK_ERROR_CODES.ORDER_EXISTS ) { await this.cancelAllActiveOrders(); await new Promise((resolve) => diff --git a/packages/ramps-controller/src/index.ts b/packages/ramps-controller/src/index.ts index c1ec4d850c..5a7406cb0a 100644 --- a/packages/ramps-controller/src/index.ts +++ b/packages/ramps-controller/src/index.ts @@ -172,6 +172,15 @@ export { TransakEnvironment, TransakOrderIdTransformer, } from './TransakService'; +export { TRANSAK_ERROR_CODES } from './transakErrorCodes'; +export type { TransakErrorCode } from './transakErrorCodes'; +export { + getTransakApiMessage, + getTransakErrorCode, + isTransakApiError, + isTransakErrorCode, + isTransakPhoneRegisteredError, +} from './transakApiErrorUtils'; export type { TransakServiceMethodActions, TransakServiceSendUserOtpAction, diff --git a/packages/ramps-controller/src/transakApiErrorUtils.test.ts b/packages/ramps-controller/src/transakApiErrorUtils.test.ts new file mode 100644 index 0000000000..a899b603f4 --- /dev/null +++ b/packages/ramps-controller/src/transakApiErrorUtils.test.ts @@ -0,0 +1,47 @@ +import { + getTransakApiMessage, + getTransakErrorCode, + isTransakApiError, + isTransakErrorCode, + isTransakPhoneRegisteredError, +} from './transakApiErrorUtils'; +import { TransakApiError } from './TransakService'; +import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; + +describe('transakApiErrorUtils', () => { + const phoneRegisteredError = new TransakApiError( + 400, + "Fetching 'https://api.transak.com/user' failed with status '400'", + TRANSAK_ERROR_CODES.PHONE_ALREADY_REGISTERED, + 'Phone registered with t***@test.com', + ); + + it('identifies TransakApiError instances', () => { + expect(isTransakApiError(phoneRegisteredError)).toBe(true); + expect(isTransakApiError(new Error('generic'))).toBe(false); + }); + + it('reads errorCode and apiMessage from TransakApiError', () => { + expect(getTransakErrorCode(phoneRegisteredError)).toBe('2020'); + expect(getTransakApiMessage(phoneRegisteredError)).toBe( + 'Phone registered with t***@test.com', + ); + }); + + it('matches known Transak error codes', () => { + expect( + isTransakErrorCode( + phoneRegisteredError, + TRANSAK_ERROR_CODES.PHONE_ALREADY_REGISTERED, + ), + ).toBe(true); + expect(isTransakPhoneRegisteredError(phoneRegisteredError)).toBe(true); + expect(isTransakErrorCode(phoneRegisteredError, '5000')).toBe(false); + }); + + it('returns undefined helpers for non-Transak errors', () => { + expect(getTransakErrorCode(new Error('generic'))).toBeUndefined(); + expect(getTransakApiMessage(new Error('generic'))).toBeUndefined(); + expect(isTransakPhoneRegisteredError(new Error('generic'))).toBe(false); + }); +}); diff --git a/packages/ramps-controller/src/transakApiErrorUtils.ts b/packages/ramps-controller/src/transakApiErrorUtils.ts new file mode 100644 index 0000000000..4b991d5299 --- /dev/null +++ b/packages/ramps-controller/src/transakApiErrorUtils.ts @@ -0,0 +1,26 @@ +import { TransakApiError } from './TransakService'; +import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; + +export function isTransakApiError(error: unknown): error is TransakApiError { + return error instanceof TransakApiError; +} + +export function getTransakErrorCode(error: unknown): string | undefined { + return isTransakApiError(error) ? error.errorCode : undefined; +} + +export function getTransakApiMessage(error: unknown): string | undefined { + return isTransakApiError(error) ? error.apiMessage : undefined; +} + +export function isTransakErrorCode(error: unknown, code: string): boolean { + const errorCode = getTransakErrorCode(error); + return errorCode === code || errorCode === String(code); +} + +export function isTransakPhoneRegisteredError(error: unknown): boolean { + return isTransakErrorCode( + error, + TRANSAK_ERROR_CODES.PHONE_ALREADY_REGISTERED, + ); +} diff --git a/packages/ramps-controller/src/transakErrorCodes.ts b/packages/ramps-controller/src/transakErrorCodes.ts new file mode 100644 index 0000000000..5b8b6d1436 --- /dev/null +++ b/packages/ramps-controller/src/transakErrorCodes.ts @@ -0,0 +1,13 @@ +/** + * Known Transak API error codes surfaced by {@link TransakApiError}. + * + * Values are normalized to strings because TransakService stringifies numeric + * codes when parsing API responses. + */ +export const TRANSAK_ERROR_CODES = { + ORDER_EXISTS: '4005', + PHONE_ALREADY_REGISTERED: '2020', +} as const; + +export type TransakErrorCode = + (typeof TRANSAK_ERROR_CODES)[keyof typeof TRANSAK_ERROR_CODES]; From 69b6829ad1b99d8a194e3fac8f180ca2f0635f55 Mon Sep 17 00:00:00 2001 From: Amitabh Aggarwal Date: Mon, 15 Jun 2026 22:40:31 -0500 Subject: [PATCH 2/5] fix(ramps-controller): satisfy CI formatting and changelog checks 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 --- packages/ramps-controller/CHANGELOG.md | 2 +- packages/ramps-controller/src/TransakService.ts | 3 +-- packages/ramps-controller/src/transakApiErrorUtils.test.ts | 2 +- packages/ramps-controller/src/transakApiErrorUtils.ts | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/ramps-controller/CHANGELOG.md b/packages/ramps-controller/CHANGELOG.md index 3f4f167ff6..5e599ac9bf 100644 --- a/packages/ramps-controller/CHANGELOG.md +++ b/packages/ramps-controller/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Export `TRANSAK_ERROR_CODES`, `TransakErrorCode`, and Transak API error helpers (`isTransakApiError`, `getTransakErrorCode`, `getTransakApiMessage`, `isTransakErrorCode`, `isTransakPhoneRegisteredError`) for consumers handling `TransakApiError` +- Export `TRANSAK_ERROR_CODES`, `TransakErrorCode`, and Transak API error helpers (`isTransakApiError`, `getTransakErrorCode`, `getTransakApiMessage`, `isTransakErrorCode`, `isTransakPhoneRegisteredError`) for consumers handling `TransakApiError` ([#9135](https://github.com/MetaMask/core/pull/9135)) ### Changed diff --git a/packages/ramps-controller/src/TransakService.ts b/packages/ramps-controller/src/TransakService.ts index 67917b7973..515cfb5581 100644 --- a/packages/ramps-controller/src/TransakService.ts +++ b/packages/ramps-controller/src/TransakService.ts @@ -5,9 +5,8 @@ import type { import { createServicePolicy, HttpError } from '@metamask/controller-utils'; import type { Messenger } from '@metamask/messenger'; -import type { TransakServiceMethodActions } from './TransakService-method-action-types'; - import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; +import type { TransakServiceMethodActions } from './TransakService-method-action-types'; // === TYPES === diff --git a/packages/ramps-controller/src/transakApiErrorUtils.test.ts b/packages/ramps-controller/src/transakApiErrorUtils.test.ts index a899b603f4..4ba14cd9af 100644 --- a/packages/ramps-controller/src/transakApiErrorUtils.test.ts +++ b/packages/ramps-controller/src/transakApiErrorUtils.test.ts @@ -5,8 +5,8 @@ import { isTransakErrorCode, isTransakPhoneRegisteredError, } from './transakApiErrorUtils'; -import { TransakApiError } from './TransakService'; import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; +import { TransakApiError } from './TransakService'; describe('transakApiErrorUtils', () => { const phoneRegisteredError = new TransakApiError( diff --git a/packages/ramps-controller/src/transakApiErrorUtils.ts b/packages/ramps-controller/src/transakApiErrorUtils.ts index 4b991d5299..a57b5a3d31 100644 --- a/packages/ramps-controller/src/transakApiErrorUtils.ts +++ b/packages/ramps-controller/src/transakApiErrorUtils.ts @@ -1,5 +1,5 @@ -import { TransakApiError } from './TransakService'; import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; +import { TransakApiError } from './TransakService'; export function isTransakApiError(error: unknown): error is TransakApiError { return error instanceof TransakApiError; From dafe3dfbd56966d243cef5f318ce778d9e731ad6 Mon Sep 17 00:00:00 2001 From: Amitabh Aggarwal Date: Tue, 16 Jun 2026 17:03:37 -0500 Subject: [PATCH 3/5] refactor(ramps-controller): narrow Transak error exports to two helpers 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 --- packages/ramps-controller/CHANGELOG.md | 2 +- .../ramps-controller/src/TransakService.ts | 5 ++-- packages/ramps-controller/src/index.ts | 5 ---- .../src/transakApiErrorUtils.test.ts | 29 +++---------------- .../src/transakApiErrorUtils.ts | 22 ++++---------- .../ramps-controller/src/transakErrorCodes.ts | 13 --------- 6 files changed, 13 insertions(+), 63 deletions(-) delete mode 100644 packages/ramps-controller/src/transakErrorCodes.ts diff --git a/packages/ramps-controller/CHANGELOG.md b/packages/ramps-controller/CHANGELOG.md index 5e599ac9bf..e71162975b 100644 --- a/packages/ramps-controller/CHANGELOG.md +++ b/packages/ramps-controller/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Export `TRANSAK_ERROR_CODES`, `TransakErrorCode`, and Transak API error helpers (`isTransakApiError`, `getTransakErrorCode`, `getTransakApiMessage`, `isTransakErrorCode`, `isTransakPhoneRegisteredError`) for consumers handling `TransakApiError` ([#9135](https://github.com/MetaMask/core/pull/9135)) +- Export `getTransakApiMessage` and `isTransakPhoneRegisteredError` for consumers handling `TransakApiError` ([#9135](https://github.com/MetaMask/core/pull/9135)) ### Changed diff --git a/packages/ramps-controller/src/TransakService.ts b/packages/ramps-controller/src/TransakService.ts index 515cfb5581..a88e5b6c70 100644 --- a/packages/ramps-controller/src/TransakService.ts +++ b/packages/ramps-controller/src/TransakService.ts @@ -5,7 +5,6 @@ import type { import { createServicePolicy, HttpError } from '@metamask/controller-utils'; import type { Messenger } from '@metamask/messenger'; -import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; import type { TransakServiceMethodActions } from './TransakService-method-action-types'; // === TYPES === @@ -430,6 +429,8 @@ function getPaymentWidgetBaseUrl(environment: TransakEnvironment): string { // === TRANSAK API ERROR === +const TRANSAK_ORDER_EXISTS_CODE = '4005'; + export class TransakApiError extends HttpError { readonly errorCode: string | undefined; @@ -914,7 +915,7 @@ export class TransakService { if ( error instanceof TransakApiError && error.httpStatus === 409 && - error.errorCode === TRANSAK_ERROR_CODES.ORDER_EXISTS + error.errorCode === TRANSAK_ORDER_EXISTS_CODE ) { await this.cancelAllActiveOrders(); await new Promise((resolve) => diff --git a/packages/ramps-controller/src/index.ts b/packages/ramps-controller/src/index.ts index 5a7406cb0a..8c933435d0 100644 --- a/packages/ramps-controller/src/index.ts +++ b/packages/ramps-controller/src/index.ts @@ -172,13 +172,8 @@ export { TransakEnvironment, TransakOrderIdTransformer, } from './TransakService'; -export { TRANSAK_ERROR_CODES } from './transakErrorCodes'; -export type { TransakErrorCode } from './transakErrorCodes'; export { getTransakApiMessage, - getTransakErrorCode, - isTransakApiError, - isTransakErrorCode, isTransakPhoneRegisteredError, } from './transakApiErrorUtils'; export type { diff --git a/packages/ramps-controller/src/transakApiErrorUtils.test.ts b/packages/ramps-controller/src/transakApiErrorUtils.test.ts index 4ba14cd9af..e6c08c37db 100644 --- a/packages/ramps-controller/src/transakApiErrorUtils.test.ts +++ b/packages/ramps-controller/src/transakApiErrorUtils.test.ts @@ -1,47 +1,26 @@ import { getTransakApiMessage, - getTransakErrorCode, - isTransakApiError, - isTransakErrorCode, isTransakPhoneRegisteredError, } from './transakApiErrorUtils'; -import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; import { TransakApiError } from './TransakService'; describe('transakApiErrorUtils', () => { const phoneRegisteredError = new TransakApiError( 400, "Fetching 'https://api.transak.com/user' failed with status '400'", - TRANSAK_ERROR_CODES.PHONE_ALREADY_REGISTERED, + '2020', 'Phone registered with t***@test.com', ); - it('identifies TransakApiError instances', () => { - expect(isTransakApiError(phoneRegisteredError)).toBe(true); - expect(isTransakApiError(new Error('generic'))).toBe(false); - }); - - it('reads errorCode and apiMessage from TransakApiError', () => { - expect(getTransakErrorCode(phoneRegisteredError)).toBe('2020'); + it('reads apiMessage from TransakApiError', () => { expect(getTransakApiMessage(phoneRegisteredError)).toBe( 'Phone registered with t***@test.com', ); + expect(getTransakApiMessage(new Error('generic'))).toBeUndefined(); }); - it('matches known Transak error codes', () => { - expect( - isTransakErrorCode( - phoneRegisteredError, - TRANSAK_ERROR_CODES.PHONE_ALREADY_REGISTERED, - ), - ).toBe(true); + it('detects phone already registered errors', () => { expect(isTransakPhoneRegisteredError(phoneRegisteredError)).toBe(true); - expect(isTransakErrorCode(phoneRegisteredError, '5000')).toBe(false); - }); - - it('returns undefined helpers for non-Transak errors', () => { - expect(getTransakErrorCode(new Error('generic'))).toBeUndefined(); - expect(getTransakApiMessage(new Error('generic'))).toBeUndefined(); expect(isTransakPhoneRegisteredError(new Error('generic'))).toBe(false); }); }); diff --git a/packages/ramps-controller/src/transakApiErrorUtils.ts b/packages/ramps-controller/src/transakApiErrorUtils.ts index a57b5a3d31..b5067b6d0d 100644 --- a/packages/ramps-controller/src/transakApiErrorUtils.ts +++ b/packages/ramps-controller/src/transakApiErrorUtils.ts @@ -1,26 +1,14 @@ -import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; import { TransakApiError } from './TransakService'; -export function isTransakApiError(error: unknown): error is TransakApiError { - return error instanceof TransakApiError; -} - -export function getTransakErrorCode(error: unknown): string | undefined { - return isTransakApiError(error) ? error.errorCode : undefined; -} +const PHONE_ALREADY_REGISTERED_ERROR_CODE = '2020'; export function getTransakApiMessage(error: unknown): string | undefined { - return isTransakApiError(error) ? error.apiMessage : undefined; -} - -export function isTransakErrorCode(error: unknown, code: string): boolean { - const errorCode = getTransakErrorCode(error); - return errorCode === code || errorCode === String(code); + return error instanceof TransakApiError ? error.apiMessage : undefined; } export function isTransakPhoneRegisteredError(error: unknown): boolean { - return isTransakErrorCode( - error, - TRANSAK_ERROR_CODES.PHONE_ALREADY_REGISTERED, + return ( + error instanceof TransakApiError && + error.errorCode === PHONE_ALREADY_REGISTERED_ERROR_CODE ); } diff --git a/packages/ramps-controller/src/transakErrorCodes.ts b/packages/ramps-controller/src/transakErrorCodes.ts deleted file mode 100644 index 5b8b6d1436..0000000000 --- a/packages/ramps-controller/src/transakErrorCodes.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Known Transak API error codes surfaced by {@link TransakApiError}. - * - * Values are normalized to strings because TransakService stringifies numeric - * codes when parsing API responses. - */ -export const TRANSAK_ERROR_CODES = { - ORDER_EXISTS: '4005', - PHONE_ALREADY_REGISTERED: '2020', -} as const; - -export type TransakErrorCode = - (typeof TRANSAK_ERROR_CODES)[keyof typeof TRANSAK_ERROR_CODES]; From 2bda2a53e80a91d09f2c8868f73e7b9945ef5fe1 Mon Sep 17 00:00:00 2001 From: Amitabh Aggarwal Date: Tue, 16 Jun 2026 17:15:08 -0500 Subject: [PATCH 4/5] refactor(ramps-controller): centralize Transak error codes 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 --- packages/ramps-controller/CHANGELOG.md | 2 +- packages/ramps-controller/src/TransakService.ts | 5 ++--- .../src/transakApiErrorUtils.test.ts | 3 ++- .../ramps-controller/src/transakApiErrorUtils.ts | 5 ++--- packages/ramps-controller/src/transakErrorCodes.ts | 13 +++++++++++++ 5 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 packages/ramps-controller/src/transakErrorCodes.ts diff --git a/packages/ramps-controller/CHANGELOG.md b/packages/ramps-controller/CHANGELOG.md index e71162975b..17c28e27a2 100644 --- a/packages/ramps-controller/CHANGELOG.md +++ b/packages/ramps-controller/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Export `getTransakApiMessage` and `isTransakPhoneRegisteredError` for consumers handling `TransakApiError` ([#9135](https://github.com/MetaMask/core/pull/9135)) +- Export `getTransakApiMessage` and `isTransakPhoneRegisteredError` for consumers handling `TransakApiError`, and centralize known Transak API error codes in `transakErrorCodes.ts` ([#9135](https://github.com/MetaMask/core/pull/9135)) ### Changed diff --git a/packages/ramps-controller/src/TransakService.ts b/packages/ramps-controller/src/TransakService.ts index a88e5b6c70..7bda20dc93 100644 --- a/packages/ramps-controller/src/TransakService.ts +++ b/packages/ramps-controller/src/TransakService.ts @@ -6,6 +6,7 @@ import { createServicePolicy, HttpError } from '@metamask/controller-utils'; import type { Messenger } from '@metamask/messenger'; import type { TransakServiceMethodActions } from './TransakService-method-action-types'; +import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; // === TYPES === @@ -429,8 +430,6 @@ function getPaymentWidgetBaseUrl(environment: TransakEnvironment): string { // === TRANSAK API ERROR === -const TRANSAK_ORDER_EXISTS_CODE = '4005'; - export class TransakApiError extends HttpError { readonly errorCode: string | undefined; @@ -915,7 +914,7 @@ export class TransakService { if ( error instanceof TransakApiError && error.httpStatus === 409 && - error.errorCode === TRANSAK_ORDER_EXISTS_CODE + error.errorCode === TRANSAK_ERROR_CODES.ORDER_EXISTS ) { await this.cancelAllActiveOrders(); await new Promise((resolve) => diff --git a/packages/ramps-controller/src/transakApiErrorUtils.test.ts b/packages/ramps-controller/src/transakApiErrorUtils.test.ts index e6c08c37db..418b88ea0a 100644 --- a/packages/ramps-controller/src/transakApiErrorUtils.test.ts +++ b/packages/ramps-controller/src/transakApiErrorUtils.test.ts @@ -2,13 +2,14 @@ import { getTransakApiMessage, isTransakPhoneRegisteredError, } from './transakApiErrorUtils'; +import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; import { TransakApiError } from './TransakService'; describe('transakApiErrorUtils', () => { const phoneRegisteredError = new TransakApiError( 400, "Fetching 'https://api.transak.com/user' failed with status '400'", - '2020', + TRANSAK_ERROR_CODES.PHONE_ALREADY_REGISTERED, 'Phone registered with t***@test.com', ); diff --git a/packages/ramps-controller/src/transakApiErrorUtils.ts b/packages/ramps-controller/src/transakApiErrorUtils.ts index b5067b6d0d..dad971fc1e 100644 --- a/packages/ramps-controller/src/transakApiErrorUtils.ts +++ b/packages/ramps-controller/src/transakApiErrorUtils.ts @@ -1,7 +1,6 @@ +import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; import { TransakApiError } from './TransakService'; -const PHONE_ALREADY_REGISTERED_ERROR_CODE = '2020'; - export function getTransakApiMessage(error: unknown): string | undefined { return error instanceof TransakApiError ? error.apiMessage : undefined; } @@ -9,6 +8,6 @@ export function getTransakApiMessage(error: unknown): string | undefined { export function isTransakPhoneRegisteredError(error: unknown): boolean { return ( error instanceof TransakApiError && - error.errorCode === PHONE_ALREADY_REGISTERED_ERROR_CODE + error.errorCode === TRANSAK_ERROR_CODES.PHONE_ALREADY_REGISTERED ); } diff --git a/packages/ramps-controller/src/transakErrorCodes.ts b/packages/ramps-controller/src/transakErrorCodes.ts new file mode 100644 index 0000000000..5b8b6d1436 --- /dev/null +++ b/packages/ramps-controller/src/transakErrorCodes.ts @@ -0,0 +1,13 @@ +/** + * Known Transak API error codes surfaced by {@link TransakApiError}. + * + * Values are normalized to strings because TransakService stringifies numeric + * codes when parsing API responses. + */ +export const TRANSAK_ERROR_CODES = { + ORDER_EXISTS: '4005', + PHONE_ALREADY_REGISTERED: '2020', +} as const; + +export type TransakErrorCode = + (typeof TRANSAK_ERROR_CODES)[keyof typeof TRANSAK_ERROR_CODES]; From b922500615a6808627d3edb2e433ec1c5caa9c74 Mon Sep 17 00:00:00 2001 From: Amitabh Aggarwal Date: Tue, 16 Jun 2026 17:26:02 -0500 Subject: [PATCH 5/5] fix(ramps-controller): fix import order for lint:misc:check Co-authored-by: Cursor --- packages/ramps-controller/src/TransakService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ramps-controller/src/TransakService.ts b/packages/ramps-controller/src/TransakService.ts index 7bda20dc93..515cfb5581 100644 --- a/packages/ramps-controller/src/TransakService.ts +++ b/packages/ramps-controller/src/TransakService.ts @@ -5,8 +5,8 @@ import type { import { createServicePolicy, HttpError } from '@metamask/controller-utils'; import type { Messenger } from '@metamask/messenger'; -import type { TransakServiceMethodActions } from './TransakService-method-action-types'; import { TRANSAK_ERROR_CODES } from './transakErrorCodes'; +import type { TransakServiceMethodActions } from './TransakService-method-action-types'; // === TYPES ===