= T extends (...args: infer P) => any
- ? NullifyOrPartial
- : never;
-
-/**
- * Determines if the provided method and parameters are valid for the NativeRampsSdk interface.
- * @param method - The method to check the parameters against.
- * @param params - The parameters to check against the NativeRampsSdk interface.
- * @returns A boolean indicating whether or not the provided parameters are valid for the specified method.
- */
-function validMethodParams(
- method: T,
- params: PartialParameters | [],
-): params is Parameters {
- const parameters: {
- required: boolean;
- }[] = ServicesSignatures.NativeRampsSdk[method].parameters;
- return parameters.every(({ required }, index) => {
- if (!required) return true;
-
- return params[index] != null;
- });
-}
-
-/**
- * Determines if the provided method is called with all its parameters.
- * @param method - The method to check the parameters against.
- * @param params - The parameters to check against the NativeRampsSdk interface.
- * @returns A boolean indicating whether or not the provided parameters are all the parameters of the specified method.
- */
-function hasAllParams(
- method: T,
- params: PartialParameters | [],
-): boolean {
- const parameters = ServicesSignatures.NativeRampsSdk[method].parameters;
- return parameters.length === params.length;
-}
-
-interface config {
- method: T;
- onMount?: boolean;
- throws?: boolean;
-}
-
-/**
- * Represents the state data returned by the useDepositSdkMethod hook.
- */
-export interface DepositSdkMethodState {
- data: Awaited> | null;
- error: string | null;
- isFetching: boolean;
-}
-
-/**
- * Represents the query function returned by the useDepositSdkMethod hook.
- */
-export type DepositSdkMethodQuery = (
- ...customParams: PartialParameters | []
-) => Promise | undefined>;
-
-/**
- * The tuple type returned by the useDepositSdkMethod hook.
- */
-export type DepositSdkMethodResult = [
- DepositSdkMethodState,
- DepositSdkMethodQuery,
-];
-
-/**
- * useSDKMethod is a hook to conveniently call OnRampSdk.regions methods.
- *
- * @param config The method name or an object with the method name and a boolean onMount flag.
- * @param params The parameters to pass to the method.
- * @returns An array with an object with data, an error and a loading flag, and a function to call the method.
- *
- * @example
- * // Calling `getDefaultFiatCurrency` method
- * const [{ isFetching, error, data }] = useSDKMethod('getDefaultFiatCurrency', '/regions/cl');
- *
- * @example
- * // Calling `getDefaultFiatCurrency` method and get the function
- * const [{ isFetching, error, data }, getDefaultFiatCurrency] = useSDKMethod('getDefaultFiatCurrency', '/regions/cl');
- * // `getDefaultFiatCurrency` will be called with the same parameters
- * // by default (`/regions/cl` in this case)
- * const defaultCLFiatCurrency = await getDefaultFiatCurrency();
- * // Parameters can be overridden
- * const defaultARFiatCurrency = await getDefaultFiatCurrency('/regions/ar');
- * // The return and error of these calls will be reflected in the returned object of the hook
- */
-export function useDepositSdkMethod(
- config: T | config,
- ...params: PartialParameters
-): DepositSdkMethodResult {
- const method = typeof config === 'string' ? config : config.method;
- const onMount = typeof config === 'string' ? true : (config.onMount ?? true);
- const throws = typeof config === 'string' ? false : (config.throws ?? false);
-
- const { sdk } = useDepositSDK();
- const [data, setData] = useState
- > | null>(null);
- const [error, setError] = useState(null);
- const [isFetching, setIsFetching] = useState(onMount);
- const stringifiedParams = useMemo(() => JSON.stringify(params), [params]);
- const abortControllerRef = useRef(undefined);
-
- const query = useCallback(
- async (...customParams: PartialParameters | []) => {
- const hasCustomParams = customParams.length > 0;
- const queryParams = hasCustomParams ? customParams : params;
-
- if (!validMethodParams(method, queryParams)) {
- return;
- }
-
- const hasEveryParameter = hasAllParams(method, queryParams);
- let abortController;
-
- try {
- abortControllerRef?.current?.abort();
-
- if (!hasEveryParameter) {
- abortController = new AbortController();
- abortControllerRef.current = abortController;
- }
-
- setIsFetching(true);
- setError(null);
- setData(null);
-
- if (sdk) {
- const methodParams = abortController
- ? [...queryParams, abortController]
- : queryParams;
- // @ts-expect-error spreading params error
- const response = (await sdk[method](...methodParams)) as Awaited<
- ReturnType
- >;
- setData(response);
- setIsFetching(false);
-
- return response;
- }
- } catch (responseError) {
- if (abortController?.signal.aborted) {
- return;
- }
-
- Logger.error(responseError as Error, `useSDKMethod::${method} failed`);
- setError((responseError as Error).message);
- setIsFetching(false);
- if (throws) {
- throw responseError;
- }
- }
- },
- // eslint-disable-next-line react-hooks/exhaustive-deps
- [method, throws, stringifiedParams, sdk],
- );
-
- useEffect(() => {
- if (onMount) {
- query();
- }
- return () => {
- abortControllerRef.current?.abort();
- };
- }, [query, onMount]);
-
- return [{ data, error, isFetching }, query];
-}
diff --git a/app/components/UI/Ramp/Deposit/hooks/useDepositTokenExchange.test.ts b/app/components/UI/Ramp/Deposit/hooks/useDepositTokenExchange.test.ts
deleted file mode 100644
index 12445f4b4c9c..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useDepositTokenExchange.test.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-import { renderHook } from '@testing-library/react-hooks';
-import useDepositTokenExchange from './useDepositTokenExchange';
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
-
-import { useFetchTokenRatesMulti } from './useTokenRates';
-
-jest.mock('./useTokenRates', () => ({
- useFetchTokenRatesMulti: jest.fn(),
-}));
-
-describe('useDepositTokenExchange', () => {
- const mockToken: DepositCryptoCurrency = {
- assetId: 'eip155:1/erc20:0x123',
- chainId: 'eip155:1',
- name: 'USD Coin',
- symbol: 'USDC',
- decimals: 6,
- iconUrl: 'https://example.com/usdc.png',
- };
-
- const mockTokens: DepositCryptoCurrency[] = [mockToken];
-
- it('should calculate token amount correctly when rate is available', () => {
- const mockRates = {
- 'eip155:1/erc20:0x123': 0.99978,
- };
-
- (useFetchTokenRatesMulti as jest.Mock).mockReturnValue({
- rates: mockRates,
- isLoading: false,
- error: null,
- });
-
- const { result } = renderHook(() =>
- useDepositTokenExchange({
- fiatCurrency: 'USD',
- fiatAmount: '100',
- token: mockToken,
- tokens: mockTokens,
- }),
- );
-
- expect(result.current.rate).toBe(0.99978);
- expect(result.current.tokenAmount).toBe('100.022005');
- expect(result.current.isLoading).toBe(false);
- expect(result.current.error).toBe(null);
-
- const mockRates2 = {
- 'eip155:1/erc20:0x123': 200, // this token costs 200 USD
- };
-
- (useFetchTokenRatesMulti as jest.Mock).mockReturnValue({
- rates: mockRates2,
- isLoading: false,
- error: null,
- });
-
- const { result: result2 } = renderHook(() =>
- useDepositTokenExchange({
- fiatCurrency: 'USD',
- fiatAmount: '100', // 100 USD should give 0.5 token at rate 200 USD/token
- token: mockToken,
- tokens: mockTokens,
- }),
- );
-
- expect(result2.current.rate).toBe(200);
- expect(result2.current.tokenAmount).toBe('0.500000');
- expect(result2.current.isLoading).toBe(false);
- expect(result2.current.error).toBe(null);
- });
-
- it('should return zero token amount when rate is not available', () => {
- (useFetchTokenRatesMulti as jest.Mock).mockReturnValue({
- rates: {},
- isLoading: false,
- error: null,
- });
-
- const { result } = renderHook(() =>
- useDepositTokenExchange({
- fiatCurrency: 'USD',
- fiatAmount: '1000',
- token: mockToken,
- tokens: mockTokens,
- }),
- );
-
- expect(result.current.rate).toBe(null);
- expect(result.current.tokenAmount).toBe('0');
- expect(result.current.isLoading).toBe(false);
- expect(result.current.error).toBe(null);
- });
-
- it('should handle loading state', () => {
- (useFetchTokenRatesMulti as jest.Mock).mockReturnValue({
- rates: {},
- isLoading: true,
- error: null,
- });
-
- const { result } = renderHook(() =>
- useDepositTokenExchange({
- fiatCurrency: 'USD',
- fiatAmount: '1000',
- token: mockToken,
- tokens: mockTokens,
- }),
- );
-
- expect(result.current.isLoading).toBe(true);
- expect(result.current.tokenAmount).toBe('0');
- });
-
- it('should handle error state', () => {
- const mockError = new Error('Failed to fetch rates');
- (useFetchTokenRatesMulti as jest.Mock).mockReturnValue({
- rates: {},
- isLoading: false,
- error: mockError,
- });
-
- const { result } = renderHook(() =>
- useDepositTokenExchange({
- fiatCurrency: 'USD',
- fiatAmount: '1000',
- token: mockToken,
- tokens: mockTokens,
- }),
- );
-
- expect(result.current.error).toBe(mockError);
- expect(result.current.tokenAmount).toBe('0');
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/hooks/useDepositTokenExchange.ts b/app/components/UI/Ramp/Deposit/hooks/useDepositTokenExchange.ts
deleted file mode 100644
index 0c113f79e67f..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useDepositTokenExchange.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { useFetchTokenRatesMulti } from './useTokenRates';
-import Logger from '../../../../../util/Logger';
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
-
-interface UseTokenExchangeParams {
- fiatCurrency: string | null;
- fiatAmount: string;
- token: DepositCryptoCurrency | null;
- tokens: DepositCryptoCurrency[] | null;
-}
-
-interface UseTokenExchangeResult {
- tokenAmount: string;
- rate: number | null;
- isLoading: boolean;
- error: Error | null;
-}
-
-const useDepositTokenExchange = ({
- fiatCurrency,
- fiatAmount,
- token,
- tokens,
-}: UseTokenExchangeParams): UseTokenExchangeResult => {
- const { rates, isLoading, error } = useFetchTokenRatesMulti({
- tokens,
- fiatCurrency,
- });
-
- if (!tokens || !token) {
- return {
- tokenAmount: '0',
- rate: null,
- isLoading,
- error,
- };
- }
-
- const currentToken = tokens.find(({ assetId }) => assetId === token?.assetId);
-
- const rate = currentToken ? (rates[currentToken.assetId] ?? null) : null;
-
- let tokenAmount = '0';
-
- try {
- if (rate) {
- tokenAmount = (parseFloat(fiatAmount || '0') / rate).toFixed(
- token.decimals,
- );
- }
- } catch (e) {
- Logger.error(
- e as Error,
- `Error calculating token amount with fiat amount ${fiatAmount} and rate ${rate}`,
- );
- }
-
- return {
- tokenAmount,
- rate,
- isLoading,
- error,
- };
-};
-
-export default useDepositTokenExchange;
diff --git a/app/components/UI/Ramp/Deposit/hooks/useDepositUser.test.ts b/app/components/UI/Ramp/Deposit/hooks/useDepositUser.test.ts
deleted file mode 100644
index cc4b552da3a4..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useDepositUser.test.ts
+++ /dev/null
@@ -1,422 +0,0 @@
-import { renderHook } from '@testing-library/react-native';
-import { useDepositUser } from './useDepositUser';
-import { createMockSDKReturn, MOCK_US_REGION } from '../testUtils/constants';
-import { DepositSdkMethodQuery } from '../hooks/useDepositSdkMethod';
-import { NativeRampsSdk } from '@consensys/native-ramps-sdk';
-import type { AxiosError } from 'axios';
-
-const mockUseDepositSdkMethod = jest.fn();
-jest.mock('./useDepositSdkMethod', () => ({
- useDepositSdkMethod: (config: DepositSdkMethodQuery) =>
- mockUseDepositSdkMethod(config),
-}));
-
-const mockLogoutFromProvider = jest.fn();
-const mockUseDepositSDK = jest.fn();
-jest.mock('../sdk', () => ({
- useDepositSDK: () => mockUseDepositSDK(),
-}));
-
-const mockTrackEvent = jest.fn();
-jest.mock('../../hooks/useAnalytics', () => () => mockTrackEvent);
-
-describe('useDepositUser', () => {
- const mockFetchUserDetails = jest.fn();
- const mockUserDetails = {
- firstName: 'John',
- lastName: 'Doe',
- mobileNumber: '+1234567890',
- dob: '1990-01-01',
- address: {
- addressLine1: '123 Main St',
- addressLine2: 'Apt 1',
- city: 'New York',
- state: 'NY',
- postCode: '10001',
- countryCode: 'US',
- },
- };
-
- const setupMockSdkMethod = (overrides?: {
- data?: unknown;
- error?: string | null;
- isFetching?: boolean;
- }) => {
- mockUseDepositSdkMethod.mockImplementation(() => [
- {
- data: overrides?.data ?? null,
- error: overrides?.error ?? null,
- isFetching: overrides?.isFetching ?? false,
- },
- mockFetchUserDetails,
- ]);
- };
-
- beforeEach(() => {
- jest.clearAllMocks();
-
- mockLogoutFromProvider.mockResolvedValue(undefined);
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: false,
- logoutFromProvider: mockLogoutFromProvider,
- selectedRegion: MOCK_US_REGION,
- }),
- );
-
- setupMockSdkMethod();
- });
-
- describe('basic functionality', () => {
- it('returns user details when authenticated', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod({ data: mockUserDetails });
-
- const { result } = renderHook(() => useDepositUser());
-
- expect(result.current.userDetails).toEqual(mockUserDetails);
- expect(result.current.error).toBeNull();
- expect(result.current.isFetching).toBe(false);
- });
-
- it('returns null user details when not authenticated', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: false,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod({ data: mockUserDetails });
-
- const { result } = renderHook(() => useDepositUser());
-
- expect(result.current.userDetails).toBeNull();
- });
-
- it('calls useDepositSdkMethod with correct parameters', () => {
- renderHook(() => useDepositUser());
-
- expect(mockUseDepositSdkMethod).toHaveBeenCalledWith({
- method: 'getUserDetails',
- onMount: false,
- throws: true,
- });
- });
-
- it('returns fetchUserDetails function', () => {
- const { result } = renderHook(() => useDepositUser());
-
- expect(result.current.fetchUserDetails).toBeDefined();
- expect(typeof result.current.fetchUserDetails).toBe('function');
- });
- });
- describe('authentication-based fetching', () => {
- it('fetches user details when authenticated and no user details exist', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod();
-
- renderHook(() => useDepositUser({ fetchOnMount: true }));
-
- expect(mockFetchUserDetails).toHaveBeenCalled();
- });
-
- it('does not fetch user details when not authenticated', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: false,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod({ data: mockUserDetails });
-
- renderHook(() => useDepositUser());
-
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
- });
-
- it('does not fetch user details when already exists', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- logoutFromProvider: mockLogoutFromProvider,
- }),
- );
- setupMockSdkMethod({ data: mockUserDetails });
-
- renderHook(() => useDepositUser());
-
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
- });
-
- it('does not fetch user details when already fetching', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- logoutFromProvider: mockLogoutFromProvider,
- }),
- );
- setupMockSdkMethod({ isFetching: true });
-
- renderHook(() => useDepositUser());
-
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
- });
-
- it('does not fetch user details when there is an error', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- logoutFromProvider: mockLogoutFromProvider,
- }),
- );
- setupMockSdkMethod({ error: 'Some error' });
-
- renderHook(() => useDepositUser());
-
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
- });
- });
-
- describe('loading and error states', () => {
- it('returns loading state when fetching', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod({ isFetching: true });
-
- const { result } = renderHook(() => useDepositUser());
-
- expect(result.current.userDetails).toBeNull();
- expect(result.current.isFetching).toBe(true);
- expect(result.current.error).toBeNull();
- });
-
- it('returns error state when API fails', () => {
- const mockError = 'Failed to fetch user details';
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod({ error: mockError });
-
- const { result } = renderHook(() => useDepositUser());
-
- expect(result.current.userDetails).toBeNull();
- expect(result.current.error).toBe(mockError);
- expect(result.current.isFetching).toBe(false);
- });
-
- it('handles multiple hook renders correctly', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- logoutFromProvider: mockLogoutFromProvider,
- }),
- );
- setupMockSdkMethod();
-
- const { rerender } = renderHook(() =>
- useDepositUser({ fetchOnMount: true }),
- );
- rerender({});
- rerender({});
-
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
- });
- });
-
- describe('config options', () => {
- it('fetches user details on mount when fetchOnMount is enabled', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod();
-
- renderHook(() => useDepositUser({ fetchOnMount: true }));
-
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
- });
-
- it('does not fetch on mount when fetchOnMount is disabled', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod();
-
- renderHook(() => useDepositUser({ fetchOnMount: false }));
-
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
- });
-
- it('does not fetch on mount when not authenticated', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: false,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- setupMockSdkMethod();
-
- renderHook(() => useDepositUser({ fetchOnMount: true }));
-
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
- });
- });
-
- describe('analytics tracking', () => {
- it('tracks RAMPS_USER_DETAILS_FETCHED when shouldTrackFetch is enabled', async () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- mockFetchUserDetails.mockResolvedValue(mockUserDetails);
- setupMockSdkMethod({ data: mockUserDetails });
-
- const { result } = renderHook(() =>
- useDepositUser({
- shouldTrackFetch: true,
- screenLocation: 'TestScreen',
- }),
- );
-
- await result.current.fetchUserDetails();
-
- expect(mockTrackEvent).toHaveBeenCalledWith(
- 'RAMPS_USER_DETAILS_FETCHED',
- {
- logged_in: true,
- region: 'US',
- location: 'TestScreen',
- },
- );
- });
-
- it('does not track analytics when shouldTrackFetch is disabled', async () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- mockFetchUserDetails.mockResolvedValue(mockUserDetails);
- setupMockSdkMethod();
-
- const { result } = renderHook(() =>
- useDepositUser({
- shouldTrackFetch: false,
- }),
- );
-
- await result.current.fetchUserDetails();
-
- expect(mockTrackEvent).not.toHaveBeenCalled();
- });
-
- it('uses selectedRegion isoCode when userDetails has no country', async () => {
- const userDetailsWithoutAddress = {
- firstName: 'John',
- lastName: 'Doe',
- };
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- mockFetchUserDetails.mockResolvedValue(userDetailsWithoutAddress);
- setupMockSdkMethod({ data: userDetailsWithoutAddress });
-
- const { result } = renderHook(() =>
- useDepositUser({
- shouldTrackFetch: true,
- screenLocation: 'TestScreen',
- }),
- );
-
- await result.current.fetchUserDetails();
-
- expect(mockTrackEvent).toHaveBeenCalledWith(
- 'RAMPS_USER_DETAILS_FETCHED',
- {
- logged_in: true,
- region: 'US',
- location: 'TestScreen',
- },
- );
- });
- });
-
- describe('error handling', () => {
- it('logs out when receiving 401 error', async () => {
- const error401 = Object.assign(new Error('Unauthorized'), {
- status: 401,
- }) as AxiosError;
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- logoutFromProvider: mockLogoutFromProvider,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- mockFetchUserDetails.mockRejectedValue(error401);
- setupMockSdkMethod();
-
- const { result } = renderHook(() => useDepositUser());
-
- await result.current.fetchUserDetails();
-
- expect(mockLogoutFromProvider).toHaveBeenCalledWith(false);
- });
-
- it('throws error without logging out for non-401 errors', async () => {
- const networkError = Object.assign(new Error('Network error'), {
- status: 500,
- }) as AxiosError;
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- isAuthenticated: true,
- logoutFromProvider: mockLogoutFromProvider,
- selectedRegion: MOCK_US_REGION,
- }),
- );
- mockFetchUserDetails.mockRejectedValue(networkError);
- setupMockSdkMethod({ data: mockUserDetails });
-
- const { result } = renderHook(() => useDepositUser());
-
- await expect(result.current.fetchUserDetails()).rejects.toThrow(
- 'Network error',
- );
-
- expect(mockLogoutFromProvider).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/hooks/useDepositUser.ts b/app/components/UI/Ramp/Deposit/hooks/useDepositUser.ts
deleted file mode 100644
index cf601345bc14..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useDepositUser.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { useCallback, useEffect } from 'react';
-import { useDepositSdkMethod } from './useDepositSdkMethod';
-import { useDepositSDK } from '../sdk';
-import type { AxiosError } from 'axios';
-import Logger from '../../../../../util/Logger';
-import useAnalytics from '../../hooks/useAnalytics';
-
-export interface UseDepositUserConfig {
- screenLocation?: string;
- shouldTrackFetch?: boolean;
- fetchOnMount?: boolean;
-}
-
-export function useDepositUser(config?: UseDepositUserConfig) {
- const {
- screenLocation = '',
- shouldTrackFetch = false,
- fetchOnMount = false,
- } = config || {};
- const { isAuthenticated, logoutFromProvider, selectedRegion } =
- useDepositSDK();
-
- const [{ data: userDetails, error, isFetching }, fetchUserDetails] =
- useDepositSdkMethod({
- method: 'getUserDetails',
- onMount: false,
- throws: true,
- });
-
- const trackEvent = useAnalytics();
-
- const fetchUserDetailsCallback = useCallback(async () => {
- try {
- const result = await fetchUserDetails();
- if (shouldTrackFetch) {
- trackEvent('RAMPS_USER_DETAILS_FETCHED', {
- logged_in: true,
- region: result?.address?.countryCode || selectedRegion?.isoCode || '',
- location: screenLocation,
- });
- }
- return result;
- } catch (error) {
- if ((error as AxiosError).status === 401) {
- if (shouldTrackFetch) {
- trackEvent('RAMPS_USER_DETAILS_FETCHED', {
- logged_in: false,
- region: selectedRegion?.isoCode || '',
- location: screenLocation,
- });
- }
- Logger.log('useDepositUser: 401 error, clearing authentication');
- await logoutFromProvider(false);
- } else {
- throw error;
- }
- }
- }, [
- trackEvent,
- fetchUserDetails,
- logoutFromProvider,
- shouldTrackFetch,
- selectedRegion,
- screenLocation,
- ]);
-
- useEffect(() => {
- if (
- fetchOnMount &&
- isAuthenticated &&
- !userDetails &&
- !isFetching &&
- !error
- ) {
- fetchUserDetailsCallback();
- }
- }, [
- isAuthenticated,
- userDetails,
- fetchUserDetailsCallback,
- isFetching,
- error,
- fetchOnMount,
- ]);
-
- return {
- userDetails: isAuthenticated ? userDetails : null,
- error,
- isFetching,
- fetchUserDetails: fetchUserDetailsCallback,
- };
-}
diff --git a/app/components/UI/Ramp/Deposit/hooks/useHandleNewOrder.ts b/app/components/UI/Ramp/Deposit/hooks/useHandleNewOrder.ts
deleted file mode 100644
index 154a4df8d149..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useHandleNewOrder.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useCallback } from 'react';
-import { InteractionManager } from 'react-native';
-import stateHasOrder from '../../utils/stateHasOrder';
-import { addFiatOrder, FiatOrder } from '../../../../../reducers/fiatOrders';
-import NotificationManager from '../../../../../core/NotificationManager';
-import useThunkDispatch from '../../../../hooks/useThunkDispatch';
-import { getNotificationDetails } from '../utils';
-import { RampsOrderStatus } from '@metamask/ramps-controller';
-import useRampsUnifiedV2Enabled from '../../hooks/useRampsUnifiedV2Enabled';
-import { showV2OrderToast } from '../../utils/v2OrderToast';
-
-function useHandleNewOrder() {
- const dispatchThunk = useThunkDispatch();
- const isV2Enabled = useRampsUnifiedV2Enabled();
-
- return useCallback(
- async (order: FiatOrder) => {
- dispatchThunk((_dispatch, getState) => {
- const state = getState();
- if (stateHasOrder(state, order)) {
- return;
- }
- _dispatch(addFiatOrder(order));
- InteractionManager.runAfterInteractions(() => {
- if (isV2Enabled) {
- showV2OrderToast({
- orderId: order.id,
- cryptocurrency: order.cryptocurrency,
- cryptoAmount: order.cryptoAmount,
- status: order.state as unknown as RampsOrderStatus,
- });
- } else {
- const notificationDetails = getNotificationDetails(order);
- if (notificationDetails) {
- NotificationManager.showSimpleNotification(notificationDetails);
- }
- }
- });
- });
- },
- [dispatchThunk, isV2Enabled],
- );
-}
-
-export default useHandleNewOrder;
diff --git a/app/components/UI/Ramp/Deposit/hooks/useIdProofPolling.test.ts b/app/components/UI/Ramp/Deposit/hooks/useIdProofPolling.test.ts
deleted file mode 100644
index e6d59e7c13b4..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useIdProofPolling.test.ts
+++ /dev/null
@@ -1,230 +0,0 @@
-import { renderHook, act } from '@testing-library/react-hooks';
-import useIdProofPolling from './useIdProofPolling';
-import {
- DepositSdkMethodState,
- useDepositSdkMethod,
-} from './useDepositSdkMethod';
-import { useDepositSDK } from '../sdk';
-import {
- NativeRampsSdk,
- NativeTransakAccessToken,
-} from '@consensys/native-ramps-sdk';
-import {
- MOCK_USDC_TOKEN,
- MOCK_CREDIT_DEBIT_CARD,
- MOCK_US_REGION,
-} from '../testUtils/constants';
-
-jest.mock('./useDepositSdkMethod');
-jest.mock('../sdk');
-
-const mockUseDepositSdkMethod = useDepositSdkMethod as jest.MockedFunction<
- typeof useDepositSdkMethod
->;
-
-const mockUseDepositSDK = useDepositSDK as jest.MockedFunction<
- typeof useDepositSDK
->;
-
-const mockGetIdProofStatus = jest.fn();
-const mockSdkResponse: DepositSdkMethodState<'getIdProofStatus'> = {
- data: null,
- error: null,
- isFetching: false,
-};
-
-const mockTestWorkflowId = 'test-workflow-id';
-
-jest.useFakeTimers();
-
-describe('useIdProofPolling', () => {
- beforeEach(() => {
- jest.clearAllMocks();
- mockSdkResponse.data = null;
- mockSdkResponse.error = null;
- mockSdkResponse.isFetching = false;
- mockUseDepositSdkMethod.mockReturnValue([
- mockSdkResponse,
- mockGetIdProofStatus,
- ]);
- mockUseDepositSDK.mockReturnValue({
- sdk: {} as NativeRampsSdk,
- sdkError: undefined,
- providerApiKey: 'test-key',
- isAuthenticated: true,
- authToken: {
- accessToken: 'test-token',
- ttl: 3600,
- created: new Date(),
- } as NativeTransakAccessToken,
- setAuthToken: jest.fn(),
- checkExistingToken: jest.fn(),
- logoutFromProvider: jest.fn(),
- selectedRegion: MOCK_US_REGION,
- setSelectedRegion: jest.fn(),
- selectedPaymentMethod: MOCK_CREDIT_DEBIT_CARD,
- setSelectedPaymentMethod: jest.fn(),
- selectedCryptoCurrency: MOCK_USDC_TOKEN,
- setSelectedCryptoCurrency: jest.fn(),
- selectedWalletAddress: '0x1234567890123456789012345678901234567890',
- intent: undefined,
- setIntent: jest.fn(),
- });
- });
-
- afterEach(() => {
- jest.clearAllTimers();
- });
-
- it('should start polling automatically by default', () => {
- renderHook(() => useIdProofPolling(mockTestWorkflowId, 10000, true, 30));
-
- // Should call immediately
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
-
- // Should call again after interval
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(2);
- });
-
- it('should not start polling when autoStart is false', () => {
- renderHook(() => useIdProofPolling(mockTestWorkflowId, 10000, false, 30));
-
- expect(mockGetIdProofStatus).not.toHaveBeenCalled();
-
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockGetIdProofStatus).not.toHaveBeenCalled();
- });
-
- it('should use custom polling interval', () => {
- renderHook(() => useIdProofPolling(mockTestWorkflowId, 2000, true, 30));
-
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
-
- // Should call after custom interval
- act(() => {
- jest.advanceTimersByTime(2000);
- });
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(2);
- });
-
- it('should return current idProofStatus submitted status', () => {
- mockSdkResponse.data = {
- status: 'SUBMITTED',
- } as DepositSdkMethodState<'getIdProofStatus'>['data'];
-
- const { result } = renderHook(() =>
- useIdProofPolling(mockTestWorkflowId, 10000, true, 30),
- );
-
- expect(result.current.idProofStatus).toBe('SUBMITTED');
- });
-
- it('should return current idProofStatus not submitted status', () => {
- mockSdkResponse.data = {
- status: 'NOT_SUBMITTED',
- } as DepositSdkMethodState<'getIdProofStatus'>['data'];
-
- const { result } = renderHook(() =>
- useIdProofPolling(mockTestWorkflowId, 10000, true, 30),
- );
-
- expect(result.current.idProofStatus).toBe('NOT_SUBMITTED');
- });
-
- it('should stop polling when idProofStatus is submitted', () => {
- const { rerender } = renderHook(() =>
- useIdProofPolling(mockTestWorkflowId, 10000, true, 30),
- );
-
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
-
- mockSdkResponse.data = {
- status: 'SUBMITTED',
- } as DepositSdkMethodState<'getIdProofStatus'>['data'];
- rerender();
-
- // Should not continue polling
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
- });
-
- it('should allow manual start and stop of polling', () => {
- const { result } = renderHook(() =>
- useIdProofPolling(mockTestWorkflowId, 10000, false, 30),
- );
-
- expect(mockGetIdProofStatus).not.toHaveBeenCalled();
-
- act(() => {
- result.current.startPolling();
- });
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
-
- act(() => {
- result.current.stopPolling();
- });
-
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
- });
-
- it('should cleanup polling on unmount', () => {
- const { unmount } = renderHook(() =>
- useIdProofPolling(mockTestWorkflowId, 10000, true, 30),
- );
-
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
-
- unmount();
-
- // Should not continue polling after unmount
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
- });
-
- it('should pass through loading and error states', () => {
- mockSdkResponse.isFetching = true;
- mockSdkResponse.error = 'Network error';
-
- const { result } = renderHook(() =>
- useIdProofPolling(mockTestWorkflowId, 10000, true, 30),
- );
-
- expect(result.current.loading).toBe(true);
- expect(result.current.error).toBe('Network error');
- });
-
- it('should stop polling after max attempts', () => {
- const { result } = renderHook(() =>
- useIdProofPolling(mockTestWorkflowId, 1000, true, 2),
- );
-
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(1);
-
- // First interval call
- act(() => {
- jest.advanceTimersByTime(1000);
- });
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(2);
-
- // Second interval call should stop and set error without calling fetchKycForms
- act(() => {
- jest.advanceTimersByTime(1000);
- });
- expect(mockGetIdProofStatus).toHaveBeenCalledTimes(2);
- expect(result.current.error).toContain(
- 'Kyc workflow polling reached maximum attempts. Please try again later.',
- );
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/hooks/useIdProofPolling.ts b/app/components/UI/Ramp/Deposit/hooks/useIdProofPolling.ts
deleted file mode 100644
index cb0ae1eb2a16..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useIdProofPolling.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { useEffect, useRef, useCallback, useState } from 'react';
-import { useDepositSdkMethod } from './useDepositSdkMethod';
-
-export interface IdProofPollingResult {
- idProofStatus: 'SUBMITTED' | 'NOT_SUBMITTED' | null;
- loading: boolean;
- error: string | null;
- startPolling: () => void;
- stopPolling: () => void;
-}
-
-/**
- * Hook to poll for user details from the SDK
- *
- * @param workFlowRunId - The ID of the KYC workflow run to poll for
- * @param pollingInterval - The interval in milliseconds to poll for user details
- * @param autoStart - Whether to automatically start polling
- * @param maxPollingAttempts - The maximum number of polling attempts before stopping. Set to 0 to poll indefinitely.
- */
-const useIdProofPolling = (
- workFlowRunId: string,
- pollingInterval: number = 10000,
- autoStart: boolean = true,
- maxPollingAttempts: number = 30,
-): IdProofPollingResult => {
- const intervalRef = useRef(null);
- const pollCountRef = useRef(0);
- const [pollingError, setPollingError] = useState(null);
-
- const [
- { data: response, error: sdkError, isFetching: loading },
- getIdProofStatus,
- ] = useDepositSdkMethod(
- {
- method: 'getIdProofStatus',
- onMount: false,
- },
- workFlowRunId,
- );
-
- const stopPolling = useCallback(() => {
- if (intervalRef.current) {
- clearInterval(intervalRef.current);
- intervalRef.current = null;
- }
- }, []);
-
- const startPolling = useCallback(() => {
- stopPolling();
- pollCountRef.current = 0;
- setPollingError(null);
-
- // Call immediately
- getIdProofStatus();
- pollCountRef.current += 1;
-
- // Set up interval
- intervalRef.current = setInterval(() => {
- pollCountRef.current += 1;
-
- if (maxPollingAttempts > 0 && pollCountRef.current > maxPollingAttempts) {
- setPollingError(
- 'Kyc workflow polling reached maximum attempts. Please try again later.',
- );
- stopPolling();
- return;
- }
-
- getIdProofStatus();
- }, pollingInterval);
- }, [getIdProofStatus, maxPollingAttempts, pollingInterval, stopPolling]);
-
- const idProofStatus = response?.status ?? null;
-
- useEffect(() => {
- if (idProofStatus === 'SUBMITTED') {
- stopPolling();
- }
- }, [idProofStatus, stopPolling]);
-
- useEffect(() => {
- if (autoStart) {
- startPolling();
- }
-
- return () => {
- stopPolling();
- };
- }, [autoStart, startPolling, stopPolling]);
-
- return {
- idProofStatus,
- loading,
- error: pollingError || sdkError,
- startPolling,
- stopPolling,
- };
-};
-
-export default useIdProofPolling;
diff --git a/app/components/UI/Ramp/Deposit/hooks/useKycPolling.test.ts b/app/components/UI/Ramp/Deposit/hooks/useKycPolling.test.ts
deleted file mode 100644
index fc067f12ea16..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useKycPolling.test.ts
+++ /dev/null
@@ -1,232 +0,0 @@
-import { renderHook, act } from '@testing-library/react-hooks';
-import useKycPolling from './useKycPolling';
-import {
- DepositSdkMethodState,
- useDepositSdkMethod,
-} from './useDepositSdkMethod';
-import { useDepositSDK } from '../sdk';
-import {
- BuyQuote,
- NativeRampsSdk,
- NativeTransakAccessToken,
-} from '@consensys/native-ramps-sdk';
-import {
- MOCK_USDC_TOKEN,
- MOCK_CREDIT_DEBIT_CARD,
- MOCK_US_REGION,
- MOCK_BUY_QUOTE,
-} from '../testUtils/constants';
-
-jest.mock('./useDepositSdkMethod');
-jest.mock('../sdk');
-
-const mockUseDepositSdkMethod = useDepositSdkMethod as jest.MockedFunction<
- typeof useDepositSdkMethod
->;
-
-const mockUseDepositSDK = useDepositSDK as jest.MockedFunction<
- typeof useDepositSDK
->;
-
-const mockFetchKycRequirement = jest.fn();
-const mockSdkResponse: DepositSdkMethodState<'getKycRequirement'> = {
- data: null,
- error: null,
- isFetching: false,
-};
-
-const mockQuote: BuyQuote = MOCK_BUY_QUOTE;
-
-jest.useFakeTimers();
-
-describe('useKycPolling', () => {
- beforeEach(() => {
- jest.clearAllMocks();
- mockSdkResponse.data = null;
- mockSdkResponse.error = null;
- mockSdkResponse.isFetching = false;
- mockUseDepositSdkMethod.mockReturnValue([
- mockSdkResponse,
- mockFetchKycRequirement,
- ]);
- mockUseDepositSDK.mockReturnValue({
- sdk: {} as NativeRampsSdk,
- sdkError: undefined,
- providerApiKey: 'test-key',
- isAuthenticated: true,
- authToken: {
- accessToken: 'test-token',
- ttl: 3600,
- created: new Date(),
- } as NativeTransakAccessToken,
- setAuthToken: jest.fn(),
- checkExistingToken: jest.fn(),
- logoutFromProvider: jest.fn(),
- selectedRegion: MOCK_US_REGION,
- setSelectedRegion: jest.fn(),
- selectedPaymentMethod: MOCK_CREDIT_DEBIT_CARD,
- setSelectedPaymentMethod: jest.fn(),
- selectedCryptoCurrency: MOCK_USDC_TOKEN,
- setSelectedCryptoCurrency: jest.fn(),
- selectedWalletAddress: '0x1234567890123456789012345678901234567890',
- intent: undefined,
- setIntent: jest.fn(),
- });
- });
-
- afterEach(() => {
- jest.clearAllTimers();
- });
-
- it('should start polling automatically by default', () => {
- renderHook(() => useKycPolling(mockQuote, 10000, true, 30));
-
- // Should call immediately
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
-
- // Should call again after interval
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(2);
- });
-
- it('should not start polling when autoStart is false', () => {
- renderHook(() => useKycPolling(mockQuote, 10000, false, 30));
-
- expect(mockFetchKycRequirement).not.toHaveBeenCalled();
-
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchKycRequirement).not.toHaveBeenCalled();
- });
-
- it('should use custom polling interval', () => {
- renderHook(() => useKycPolling(mockQuote, 2000, true, 30));
-
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
-
- // Should call after custom interval
- act(() => {
- jest.advanceTimersByTime(2000);
- });
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(2);
- });
-
- it('should return current KYC approval status', () => {
- mockSdkResponse.data = {
- isAllowedToPlaceOrder: true,
- } as DepositSdkMethodState<'getKycRequirement'>['data'];
-
- const { result } = renderHook(() =>
- useKycPolling(mockQuote, 10000, true, 30),
- );
-
- expect(result.current.kycApproved).toBe(true);
- });
-
- it('should return false when KYC is not approved', () => {
- mockSdkResponse.data = {
- isAllowedToPlaceOrder: false,
- } as DepositSdkMethodState<'getKycRequirement'>['data'];
-
- const { result } = renderHook(() =>
- useKycPolling(mockQuote, 10000, true, 30),
- );
-
- expect(result.current.kycApproved).toBe(false);
- });
-
- it('should stop polling when KYC is approved', () => {
- const { rerender } = renderHook(() =>
- useKycPolling(mockQuote, 10000, true, 30),
- );
-
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
-
- mockSdkResponse.data = {
- isAllowedToPlaceOrder: true,
- } as DepositSdkMethodState<'getKycRequirement'>['data'];
- rerender();
-
- // Should not continue polling
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
- });
-
- it('should allow manual start and stop of polling', () => {
- const { result } = renderHook(() =>
- useKycPolling(mockQuote, 10000, false, 30),
- );
-
- expect(mockFetchKycRequirement).not.toHaveBeenCalled();
-
- act(() => {
- result.current.startPolling();
- });
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
-
- act(() => {
- result.current.stopPolling();
- });
-
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
- });
-
- it('should cleanup polling on unmount', () => {
- const { unmount } = renderHook(() =>
- useKycPolling(mockQuote, 10000, true, 30),
- );
-
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
-
- unmount();
-
- // Should not continue polling after unmount
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
- });
-
- it('should pass through loading and error states', () => {
- mockSdkResponse.isFetching = true;
- mockSdkResponse.error = 'Network error';
-
- const { result } = renderHook(() =>
- useKycPolling(mockQuote, 10000, true, 30),
- );
-
- expect(result.current.loading).toBe(true);
- expect(result.current.error).toBe('Network error');
- });
-
- it('should stop polling after max attempts', () => {
- const { result } = renderHook(() =>
- useKycPolling(mockQuote, 1000, true, 2),
- );
-
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(1);
-
- // First interval call
- act(() => {
- jest.advanceTimersByTime(1000);
- });
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(2);
-
- // Second interval call should stop and set error without calling fetchKycForms
- act(() => {
- jest.advanceTimersByTime(1000);
- });
- expect(mockFetchKycRequirement).toHaveBeenCalledTimes(2);
- expect(result.current.error).toContain(
- 'KYC polling reached maximum attempts',
- );
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/hooks/useKycPolling.ts b/app/components/UI/Ramp/Deposit/hooks/useKycPolling.ts
deleted file mode 100644
index 965dbb07f233..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useKycPolling.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { useEffect, useRef, useCallback, useState } from 'react';
-import { useDepositSdkMethod } from './useDepositSdkMethod';
-import { BuyQuote } from '@consensys/native-ramps-sdk';
-
-export interface KycPollingResult {
- kycApproved: boolean;
- loading: boolean;
- error: string | null;
- startPolling: () => void;
- stopPolling: () => void;
-}
-
-const useKycPolling = (
- quote: BuyQuote,
- pollingInterval: number = 10000,
- autoStart: boolean = true,
- maxPollingAttempts: number = 30,
-): KycPollingResult => {
- const intervalRef = useRef(null);
- const pollCountRef = useRef(0);
- const [pollingError, setPollingError] = useState(null);
-
- const [
- { data: kycForms, error: sdkError, isFetching: loading },
- fetchKycForms,
- ] = useDepositSdkMethod(
- {
- method: 'getKycRequirement',
- onMount: false,
- },
- quote.quoteId,
- );
-
- const stopPolling = useCallback(() => {
- if (intervalRef.current) {
- clearInterval(intervalRef.current);
- intervalRef.current = null;
- }
- }, []);
-
- const startPolling = useCallback(() => {
- stopPolling();
- pollCountRef.current = 0;
- setPollingError(null);
-
- // Call immediately
- fetchKycForms();
- pollCountRef.current += 1;
-
- // Set up interval
- intervalRef.current = setInterval(() => {
- pollCountRef.current += 1;
-
- if (pollCountRef.current > maxPollingAttempts) {
- setPollingError(
- 'KYC polling reached maximum attempts. Please try again later.',
- );
- stopPolling();
- return;
- }
-
- fetchKycForms();
- }, pollingInterval);
- }, [fetchKycForms, pollingInterval, stopPolling, maxPollingAttempts]);
-
- useEffect(() => {
- if (kycForms?.isAllowedToPlaceOrder) {
- stopPolling();
- }
- }, [kycForms?.isAllowedToPlaceOrder, stopPolling]);
-
- useEffect(() => {
- if (autoStart) {
- startPolling();
- }
-
- return () => {
- stopPolling();
- };
- }, [autoStart, startPolling, stopPolling]);
-
- return {
- kycApproved: kycForms?.isAllowedToPlaceOrder ?? false,
- loading,
- error: pollingError || sdkError,
- startPolling,
- stopPolling,
- };
-};
-
-export default useKycPolling;
diff --git a/app/components/UI/Ramp/Deposit/hooks/usePaymentMethods.test.ts b/app/components/UI/Ramp/Deposit/hooks/usePaymentMethods.test.ts
deleted file mode 100644
index 25a50d966393..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/usePaymentMethods.test.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-import { renderHook } from '@testing-library/react-native';
-import { usePaymentMethods } from './usePaymentMethods';
-import {
- MOCK_PAYMENT_METHODS,
- MOCK_US_REGION,
- MOCK_USDC_TOKEN,
- MOCK_APPLE_PAY,
- MOCK_SEPA_BANK_TRANSFER_PAYMENT_METHOD,
- createMockSDKReturn,
-} from '../testUtils/constants';
-
-const mockUseDepositSdkMethod = jest.fn();
-jest.mock('./useDepositSdkMethod', () => ({
- useDepositSdkMethod: () => mockUseDepositSdkMethod(),
-}));
-
-const mockUseDepositSDK = jest.fn();
-jest.mock('../sdk', () => ({
- useDepositSDK: () => mockUseDepositSDK(),
-}));
-
-describe('usePaymentMethods', () => {
- const mockSetSelectedPaymentMethod = jest.fn();
-
- beforeEach(() => {
- jest.clearAllMocks();
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_US_REGION,
- selectedCryptoCurrency: MOCK_USDC_TOKEN,
- setSelectedPaymentMethod: mockSetSelectedPaymentMethod,
- selectedPaymentMethod: null,
- }),
- );
-
- mockUseDepositSdkMethod.mockReturnValue([
- { data: MOCK_PAYMENT_METHODS, error: null, isFetching: false },
- jest.fn(),
- ]);
- });
-
- it('returns payment methods from API', () => {
- const { result } = renderHook(() => usePaymentMethods());
- expect(result.current.paymentMethods).toEqual(MOCK_PAYMENT_METHODS);
- expect(result.current.error).toBeNull();
- expect(result.current.isFetching).toBe(false);
- });
-
- it('returns loading state when fetching', () => {
- mockUseDepositSdkMethod.mockReturnValue([
- { data: null, error: null, isFetching: true },
- jest.fn(),
- ]);
-
- const { result } = renderHook(() => usePaymentMethods());
- expect(result.current.paymentMethods).toBeNull();
- expect(result.current.isFetching).toBe(true);
- });
-
- it('returns error state when API fails', () => {
- const mockError = 'API Error';
- mockUseDepositSdkMethod.mockReturnValue([
- { data: null, error: mockError, isFetching: false },
- jest.fn(),
- ]);
-
- const { result } = renderHook(() => usePaymentMethods());
- expect(result.current.paymentMethods).toBeNull();
- expect(result.current.error).toBe(mockError);
- });
-
- describe('payment method auto-selection', () => {
- it('auto-selects first payment method when none is currently selected', () => {
- renderHook(() => usePaymentMethods());
-
- expect(mockSetSelectedPaymentMethod).toHaveBeenCalledWith(
- MOCK_PAYMENT_METHODS[0],
- );
- });
-
- it('re-selects the same payment method when it is still available after refresh', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_US_REGION,
- selectedCryptoCurrency: MOCK_USDC_TOKEN,
- setSelectedPaymentMethod: mockSetSelectedPaymentMethod,
- selectedPaymentMethod: MOCK_APPLE_PAY,
- }),
- );
-
- renderHook(() => usePaymentMethods());
-
- expect(mockSetSelectedPaymentMethod).toHaveBeenCalledWith(MOCK_APPLE_PAY);
- });
-
- it('falls back to first payment method when previously selected method is no longer available', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_US_REGION,
- selectedCryptoCurrency: MOCK_USDC_TOKEN,
- setSelectedPaymentMethod: mockSetSelectedPaymentMethod,
- selectedPaymentMethod: MOCK_SEPA_BANK_TRANSFER_PAYMENT_METHOD,
- }),
- );
-
- renderHook(() => usePaymentMethods());
-
- expect(mockSetSelectedPaymentMethod).toHaveBeenCalledWith(
- MOCK_PAYMENT_METHODS[0],
- );
- });
-
- it('does not call setSelectedPaymentMethod when paymentMethods is null', () => {
- mockUseDepositSdkMethod.mockReturnValue([
- { data: null, error: null, isFetching: false },
- jest.fn(),
- ]);
-
- renderHook(() => usePaymentMethods());
-
- expect(mockSetSelectedPaymentMethod).not.toHaveBeenCalled();
- });
-
- it('does not call setSelectedPaymentMethod when paymentMethods is empty', () => {
- mockUseDepositSdkMethod.mockReturnValue([
- { data: [], error: null, isFetching: false },
- jest.fn(),
- ]);
-
- renderHook(() => usePaymentMethods());
-
- expect(mockSetSelectedPaymentMethod).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/hooks/usePaymentMethods.ts b/app/components/UI/Ramp/Deposit/hooks/usePaymentMethods.ts
deleted file mode 100644
index deef09324fd4..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/usePaymentMethods.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { useEffect } from 'react';
-import { useDepositSDK } from '../sdk';
-import { useDepositSdkMethod } from './useDepositSdkMethod';
-import type { DepositPaymentMethod } from '@consensys/native-ramps-sdk';
-
-export function usePaymentMethods() {
- const {
- selectedRegion,
- selectedCryptoCurrency,
- setSelectedPaymentMethod,
- selectedPaymentMethod,
- } = useDepositSDK();
-
- const [
- { data: paymentMethods, error, isFetching },
- retryFetchPaymentMethods,
- ] = useDepositSdkMethod(
- 'getPaymentMethods',
- selectedRegion?.isoCode,
- selectedCryptoCurrency?.assetId,
- selectedRegion?.currency,
- );
-
- useEffect(() => {
- if (paymentMethods && paymentMethods.length > 0) {
- let newSelectedPaymentMethod: DepositPaymentMethod | null = null;
-
- if (selectedPaymentMethod) {
- newSelectedPaymentMethod =
- paymentMethods.find(
- (method) => method.id === selectedPaymentMethod.id,
- ) || null;
- }
-
- if (!newSelectedPaymentMethod) {
- newSelectedPaymentMethod = paymentMethods[0];
- }
-
- if (newSelectedPaymentMethod) {
- setSelectedPaymentMethod(newSelectedPaymentMethod);
- }
- }
- }, [paymentMethods, selectedPaymentMethod, setSelectedPaymentMethod]);
-
- return {
- paymentMethods,
- error,
- isFetching,
- retryFetchPaymentMethods,
- };
-}
diff --git a/app/components/UI/Ramp/Deposit/hooks/useRegions.test.ts b/app/components/UI/Ramp/Deposit/hooks/useRegions.test.ts
deleted file mode 100644
index 498b1f7c6cc7..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useRegions.test.ts
+++ /dev/null
@@ -1,638 +0,0 @@
-import { renderHook } from '@testing-library/react-native';
-import { useRegions } from './useRegions';
-import {
- MOCK_REGIONS,
- MOCK_US_REGION,
- MOCK_EUR_REGION,
- MOCK_CA_REGION,
- MOCK_FR_REGION,
- createMockSDKReturn,
-} from '../testUtils/constants';
-
-const mockUseDepositSdkMethod = jest.fn();
-jest.mock('./useDepositSdkMethod', () => ({
- useDepositSdkMethod: (method: string) => mockUseDepositSdkMethod(method),
-}));
-
-const mockUseDepositSDK = jest.fn();
-jest.mock('../sdk', () => ({
- useDepositSDK: () => mockUseDepositSDK(),
-}));
-
-const mockUseDepositUser = jest.fn();
-jest.mock('./useDepositUser', () => ({
- useDepositUser: () => mockUseDepositUser(),
-}));
-
-describe('useRegions', () => {
- const mockSetSelectedRegion = jest.fn();
- const mockRetryFetchRegions = jest.fn();
-
- beforeEach(() => {
- jest.clearAllMocks();
-
- // Default SDK state
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: false,
- }),
- );
-
- // Default useDepositSdkMethod state
- mockUseDepositSdkMethod.mockReturnValue([
- { data: MOCK_REGIONS, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- mockUseDepositUser.mockReturnValue({
- userDetails: null,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
- });
-
- describe('basic functionality', () => {
- it('returns regions from API', () => {
- // Act
- const { result } = renderHook(() => useRegions());
-
- // Assert
- expect(result.current.regions).toEqual(MOCK_REGIONS);
- expect(result.current.error).toBeNull();
- expect(result.current.isFetching).toBe(false);
- expect(result.current.retryFetchRegions).toBe(mockRetryFetchRegions);
- expect(result.current.userRegionLocked).toBe(false);
- });
-
- it('calls useDepositSdkMethod with correct parameters', () => {
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockUseDepositSdkMethod).toHaveBeenCalledWith('getCountries');
- });
- });
-
- describe('loading states', () => {
- it('returns loading state when fetching', () => {
- // Arrange
- mockUseDepositSdkMethod.mockReturnValue([
- { data: null, error: null, isFetching: true },
- mockRetryFetchRegions,
- ]);
-
- // Act
- const { result } = renderHook(() => useRegions());
-
- // Assert
- expect(result.current.regions).toBeNull();
- expect(result.current.isFetching).toBe(true);
- expect(result.current.error).toBeNull();
- });
-
- it('returns error state when API fails', () => {
- // Arrange
- const mockError = 'Failed to fetch regions';
- mockUseDepositSdkMethod.mockReturnValue([
- { data: null, error: mockError, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- const { result } = renderHook(() => useRegions());
-
- // Assert
- expect(result.current.regions).toBeNull();
- expect(result.current.error).toBe(mockError);
- expect(result.current.isFetching).toBe(false);
- });
- });
-
- describe('region selection logic', () => {
- it('selects geolocated region when available', () => {
- // Arrange
- const geolocatedRegion = { ...MOCK_EUR_REGION, geolocated: true };
- const regionsWithGeolocated = [
- MOCK_US_REGION,
- geolocatedRegion,
- MOCK_CA_REGION,
- ];
-
- mockUseDepositSdkMethod.mockReturnValue([
- { data: regionsWithGeolocated, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(geolocatedRegion);
- });
-
- it('selects US region when no geolocated region available', () => {
- // Arrange
- const regionsWithUS = [MOCK_EUR_REGION, MOCK_US_REGION, MOCK_CA_REGION];
-
- mockUseDepositSdkMethod.mockReturnValue([
- { data: regionsWithUS, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_US_REGION);
- });
-
- it('selects first region when no geolocated or US region available', () => {
- // Arrange
- const regionsWithoutUS = [
- MOCK_EUR_REGION,
- MOCK_CA_REGION,
- MOCK_FR_REGION,
- ];
-
- mockUseDepositSdkMethod.mockReturnValue([
- { data: regionsWithoutUS, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_EUR_REGION);
- });
-
- it('maintains existing selection when region is still available', () => {
- // Arrange
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_EUR_REGION,
- setSelectedRegion: mockSetSelectedRegion,
- }),
- );
-
- const regionsWithSelected = [
- MOCK_US_REGION,
- MOCK_EUR_REGION,
- MOCK_CA_REGION,
- ];
- mockUseDepositSdkMethod.mockReturnValue([
- { data: regionsWithSelected, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_EUR_REGION);
- });
-
- it('resets to fallback when current selection is no longer available', () => {
- // Arrange
- const unavailableRegion = {
- isoCode: 'XX',
- flag: '🏳️',
- name: 'Unavailable Country',
- currency: 'USD',
- supported: false,
- phone: {
- prefix: '+1',
- placeholder: '(555) 123-4567',
- template: '(###) ###-####',
- },
- };
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: unavailableRegion,
- setSelectedRegion: mockSetSelectedRegion,
- }),
- );
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_US_REGION);
- });
-
- it('finds and maintains existing region by isoCode', () => {
- // Arrange
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_CA_REGION,
- setSelectedRegion: mockSetSelectedRegion,
- }),
- );
-
- const regionsWithCanada = [
- MOCK_US_REGION,
- MOCK_EUR_REGION,
- MOCK_CA_REGION,
- ];
- mockUseDepositSdkMethod.mockReturnValue([
- { data: regionsWithCanada, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_CA_REGION);
- });
-
- it('prioritizes geolocated over existing selection', () => {
- // Arrange
- const geolocatedRegion = { ...MOCK_FR_REGION, geolocated: true };
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_EUR_REGION,
- setSelectedRegion: mockSetSelectedRegion,
- }),
- );
-
- const regionsWithGeolocated = [
- MOCK_US_REGION,
- MOCK_EUR_REGION,
- geolocatedRegion,
- ];
- mockUseDepositSdkMethod.mockReturnValue([
- { data: regionsWithGeolocated, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_EUR_REGION);
- });
- });
-
- describe('edge cases', () => {
- it('does not update selection when regions array is empty', () => {
- // Arrange
- mockUseDepositSdkMethod.mockReturnValue([
- { data: [], error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).not.toHaveBeenCalled();
- });
-
- it('does not update selection when regions is null', () => {
- // Arrange
- mockUseDepositSdkMethod.mockReturnValue([
- { data: null, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- renderHook(() => useRegions());
-
- // Assert
- expect(mockSetSelectedRegion).not.toHaveBeenCalled();
- });
-
- it('handles multiple hook renders correctly', () => {
- // Arrange
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- }),
- );
-
- // Act
- const { rerender } = renderHook(() => useRegions());
- rerender({});
- rerender({});
-
- // Assert - should only be called once due to useEffect dependencies
- expect(mockSetSelectedRegion).toHaveBeenCalledTimes(1);
- });
- });
-
- describe('dependency changes', () => {
- it('updates selection when regions data changes', () => {
- // Arrange
- const { rerender } = renderHook(() => useRegions());
-
- // Clear initial call
- mockSetSelectedRegion.mockClear();
-
- // Change the data
- const newRegions = [MOCK_FR_REGION];
- mockUseDepositSdkMethod.mockReturnValue([
- { data: newRegions, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- rerender({});
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_FR_REGION);
- });
-
- it('updates selection when selectedRegion changes', () => {
- // Arrange
- const { rerender } = renderHook(() => useRegions());
-
- // Clear initial call
- mockSetSelectedRegion.mockClear();
-
- // Change the selected region
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_CA_REGION,
- setSelectedRegion: mockSetSelectedRegion,
- }),
- );
-
- const regionsWithCanada = [
- MOCK_US_REGION,
- MOCK_EUR_REGION,
- MOCK_CA_REGION,
- ];
- mockUseDepositSdkMethod.mockReturnValue([
- { data: regionsWithCanada, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- // Act
- rerender({});
-
- // Assert
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_CA_REGION);
- });
- });
-
- describe('selection priority order', () => {
- it('follows correct priority: geolocated > existing > US > first', () => {
- // Test case 1: When there's a geolocated region, it should win
- const geolocatedEUR = { ...MOCK_EUR_REGION, geolocated: true };
- const regionsCase1 = [MOCK_US_REGION, geolocatedEUR, MOCK_CA_REGION];
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_CA_REGION, // existing selection
- setSelectedRegion: mockSetSelectedRegion,
- }),
- );
-
- mockUseDepositSdkMethod.mockReturnValue([
- { data: regionsCase1, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- const { rerender } = renderHook(() => useRegions());
-
- // Should select existing (CA) since geolocated logic doesn't override existing when existing is found
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_CA_REGION);
-
- // Clear and test with no existing selection
- mockSetSelectedRegion.mockClear();
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- }),
- );
-
- rerender({});
-
- // Now should select geolocated
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(geolocatedEUR);
- });
- });
-
- describe('user region locking', () => {
- const mockUserDetails = {
- firstName: 'John',
- lastName: 'Doe',
- mobileNumber: '+1234567890',
- dob: '1990-01-01',
- address: {
- addressLine1: '123 Main St',
- addressLine2: 'Apt 1',
- city: 'New York',
- state: 'NY',
- postCode: '10001',
- countryCode: 'US',
- },
- };
-
- it('locks region when user is authenticated with matching country code', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: true,
- }),
- );
-
- mockUseDepositUser.mockReturnValue({
- userDetails: mockUserDetails,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
-
- const { result } = renderHook(() => useRegions());
-
- expect(result.current.userRegionLocked).toBe(true);
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_US_REGION);
- });
-
- it('does not lock region when user is not authenticated', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: false,
- }),
- );
-
- mockUseDepositUser.mockReturnValue({
- userDetails: mockUserDetails,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
-
- const { result } = renderHook(() => useRegions());
-
- expect(result.current.userRegionLocked).toBe(false);
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_US_REGION);
- });
-
- it('does not lock region when user details are null', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: true,
- }),
- );
-
- mockUseDepositUser.mockReturnValue({
- userDetails: null,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
-
- const { result } = renderHook(() => useRegions());
-
- expect(result.current.userRegionLocked).toBe(false);
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_US_REGION);
- });
-
- it('does not lock region when user country code does not match any available region', () => {
- const userDetailsWithUnknownCountry = {
- ...mockUserDetails,
- address: {
- ...mockUserDetails.address,
- countryCode: 'XX',
- },
- };
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: true,
- }),
- );
-
- mockUseDepositUser.mockReturnValue({
- userDetails: userDetailsWithUnknownCountry,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
-
- const { result } = renderHook(() => useRegions());
-
- expect(result.current.userRegionLocked).toBe(false);
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_US_REGION);
- });
-
- it('unlocks region when user logs out', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: true,
- }),
- );
-
- mockUseDepositUser.mockReturnValue({
- userDetails: mockUserDetails,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
-
- const { result, rerender } = renderHook(() => useRegions());
-
- expect(result.current.userRegionLocked).toBe(true);
-
- mockSetSelectedRegion.mockClear();
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_US_REGION,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: false,
- }),
- );
-
- mockUseDepositUser.mockReturnValue({
- userDetails: null,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
-
- rerender({});
-
- expect(result.current.userRegionLocked).toBe(false);
- });
-
- it('handles missing address in user details gracefully', () => {
- const userDetailsWithoutAddress = {
- ...mockUserDetails,
- address: undefined,
- };
-
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: null,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: true,
- }),
- );
-
- mockUseDepositUser.mockReturnValue({
- userDetails: userDetailsWithoutAddress,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
-
- const { result } = renderHook(() => useRegions());
-
- expect(result.current.userRegionLocked).toBe(false);
- expect(mockSetSelectedRegion).toHaveBeenCalledWith(MOCK_US_REGION);
- });
-
- it('resets userRegionLocked when regions become unavailable', () => {
- mockUseDepositSDK.mockReturnValue(
- createMockSDKReturn({
- selectedRegion: MOCK_US_REGION,
- setSelectedRegion: mockSetSelectedRegion,
- isAuthenticated: true,
- }),
- );
-
- mockUseDepositUser.mockReturnValue({
- userDetails: mockUserDetails,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
- });
-
- mockUseDepositSdkMethod.mockReturnValue([
- { data: MOCK_REGIONS, error: null, isFetching: false },
- mockRetryFetchRegions,
- ]);
-
- const { result, rerender } = renderHook(() => useRegions());
-
- expect(result.current.userRegionLocked).toBe(true);
-
- mockUseDepositSdkMethod.mockReturnValue([
- { data: null, error: 'Network error', isFetching: false },
- mockRetryFetchRegions,
- ]);
- rerender({});
- expect(result.current.userRegionLocked).toBe(false);
- });
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/hooks/useRegions.ts b/app/components/UI/Ramp/Deposit/hooks/useRegions.ts
deleted file mode 100644
index 30a082867b8e..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useRegions.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import {
- DepositSdkMethodQuery,
- useDepositSdkMethod,
-} from './useDepositSdkMethod';
-import { useEffect, useState } from 'react';
-import { useDepositSDK } from '../sdk';
-import { DepositRegion } from '@consensys/native-ramps-sdk';
-import { useDepositUser } from './useDepositUser';
-
-export interface UseRegionsResult {
- userRegionLocked: boolean;
- regions: DepositRegion[] | null;
- isFetching: boolean;
- error: string | null;
- retryFetchRegions: DepositSdkMethodQuery<'getCountries'>;
-}
-
-export function useRegions(): UseRegionsResult {
- const { selectedRegion, setSelectedRegion, isAuthenticated } =
- useDepositSDK();
- const [{ data: regions, error, isFetching }, retryFetchRegions] =
- useDepositSdkMethod('getCountries');
-
- const { userDetails } = useDepositUser();
- const [userRegionLocked, setUserRegionLocked] = useState(false);
-
- useEffect(() => {
- setUserRegionLocked(false);
-
- if (regions && regions.length > 0) {
- if (isAuthenticated && userDetails?.address?.countryCode) {
- const userRegion = regions.find(
- (region) => region.isoCode === userDetails.address.countryCode,
- );
-
- if (userRegion) {
- setSelectedRegion(userRegion);
- setUserRegionLocked(true);
- return;
- }
- }
-
- let newSelectedRegion: DepositRegion | null = null;
- if (selectedRegion) {
- newSelectedRegion =
- regions.find((region) => region.isoCode === selectedRegion.isoCode) ||
- null;
- }
-
- if (!newSelectedRegion) {
- newSelectedRegion =
- regions.find((region) => region.geolocated) ||
- regions.find((region) => region.isoCode === 'US') ||
- regions[0];
- }
-
- if (newSelectedRegion) {
- setSelectedRegion(newSelectedRegion);
- }
- }
- }, [
- regions,
- selectedRegion,
- setSelectedRegion,
- isAuthenticated,
- userDetails,
- ]);
-
- return {
- userRegionLocked,
- regions,
- isFetching,
- error,
- retryFetchRegions,
- };
-}
diff --git a/app/components/UI/Ramp/Deposit/hooks/useTokenRates.test.ts b/app/components/UI/Ramp/Deposit/hooks/useTokenRates.test.ts
deleted file mode 100644
index 93d976d36f20..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useTokenRates.test.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-import { renderHook, waitFor } from '@testing-library/react-native';
-import { handleFetch } from '@metamask/controller-utils';
-import useFetchTokenRatesMulti from './useTokenRates';
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
-
-jest.mock('@metamask/controller-utils', () => ({
- handleFetch: jest.fn(),
-}));
-
-const MOCK_USDC_TOKEN: DepositCryptoCurrency = {
- assetId: 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
- chainId: 'eip155:1',
- name: 'USD Coin',
- symbol: 'USDC',
- decimals: 6,
- iconUrl:
- 'https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/1/erc20/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48.png',
-};
-
-const MOCK_USDT_TOKEN: DepositCryptoCurrency = {
- assetId: 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7',
- chainId: 'eip155:1',
- name: 'Tether USD',
- symbol: 'USDT',
- decimals: 6,
- iconUrl:
- 'https://static.cx.metamask.io/api/v2/tokenIcons/assets/eip155/1/erc20/0xdAC17F958D2ee523a2206206994597C13D831ec7.png',
-};
-
-describe('useFetchTokenRatesMulti', () => {
- const mockTokens = [MOCK_USDC_TOKEN, MOCK_USDT_TOKEN];
- const mockFiatCurrency = 'USD';
-
- beforeEach(() => {
- jest.clearAllMocks();
- });
-
- it('should fetch token rates successfully', async () => {
- const mockResponse = {
- 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': {
- usd: 1.0,
- },
- 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7': {
- usd: 1.0,
- },
- };
-
- (handleFetch as jest.Mock).mockResolvedValueOnce(mockResponse);
-
- const { result } = renderHook(() =>
- useFetchTokenRatesMulti({
- tokens: mockTokens,
- fiatCurrency: mockFiatCurrency,
- }),
- );
-
- expect(result.current.isLoading).toBe(true);
- expect(result.current.error).toBe(null);
- expect(result.current.rates).toEqual({});
-
- await waitFor(() => {
- expect(result.current.isLoading).toBe(false);
- });
- expect(result.current.error).toBe(null);
- expect(result.current.rates).toEqual({
- 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': 1.0,
- 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7': 1.0,
- });
-
- expect(handleFetch).toHaveBeenCalledWith(
- expect.stringContaining(
- 'https://price.api.cx.metamask.io/v3/spot-prices?assetIds=eip155%3A1%2Ferc20%3A0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48%2Ceip155%3A1%2Ferc20%3A0xdAC17F958D2ee523a2206206994597C13D831ec7&vsCurrency=USD',
- ),
- );
- });
-
- it('should handle API errors', async () => {
- const mockError = new Error('API Error');
- (handleFetch as jest.Mock).mockRejectedValueOnce(mockError);
-
- const { result } = renderHook(() =>
- useFetchTokenRatesMulti({
- tokens: mockTokens,
- fiatCurrency: mockFiatCurrency,
- }),
- );
-
- await waitFor(() => {
- expect(result.current.isLoading).toBe(false);
- });
- expect(result.current.error).toBe(mockError);
- expect(result.current.rates).toEqual({});
- });
-
- it('should handle missing token rates', async () => {
- const mockResponse = {
- 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': {
- usd: 1.0,
- },
- };
-
- (handleFetch as jest.Mock).mockResolvedValueOnce(mockResponse);
-
- const { result } = renderHook(() =>
- useFetchTokenRatesMulti({
- tokens: mockTokens,
- fiatCurrency: mockFiatCurrency,
- }),
- );
-
- await waitFor(() => {
- expect(result.current.isLoading).toBe(false);
- });
- expect(result.current.error).toBe(null);
- expect(result.current.rates).toEqual({
- 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': 1.0,
- 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7': null,
- });
- });
-
- it('should refetch when tokens or fiat currency changes', async () => {
- const mockResponse = {
- 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48': {
- usd: 1.0,
- },
- };
-
- (handleFetch as jest.Mock).mockResolvedValue(mockResponse);
-
- const { result, rerender } = renderHook(
- ({ tokens, fiatCurrency }) =>
- useFetchTokenRatesMulti({ tokens, fiatCurrency }),
- {
- initialProps: {
- tokens: [MOCK_USDC_TOKEN],
- fiatCurrency: 'USD',
- },
- },
- );
-
- rerender({
- tokens: [MOCK_USDT_TOKEN],
- fiatCurrency: 'USD',
- });
-
- expect(result.current.isLoading).toBe(true);
- await waitFor(() => {
- expect(handleFetch).toHaveBeenCalledTimes(2);
- });
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/hooks/useTokenRates.ts b/app/components/UI/Ramp/Deposit/hooks/useTokenRates.ts
deleted file mode 100644
index 82290d3c1e10..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useTokenRates.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { useState, useEffect } from 'react';
-import { handleFetch } from '@metamask/controller-utils';
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
-
-interface UseFetchTokenRatesMultiResult {
- rates: Record;
- isLoading: boolean;
- error: Error | null;
-}
-
-const PRICE_API_URL = 'https://price.api.cx.metamask.io/v3/spot-prices';
-
-export const useFetchTokenRatesMulti = ({
- tokens,
- fiatCurrency,
-}: {
- tokens: DepositCryptoCurrency[] | null;
- fiatCurrency: string | null;
-}): UseFetchTokenRatesMultiResult => {
- const [rates, setRates] = useState>({});
- const [isLoading, setIsLoading] = useState(true);
- const [error, setError] = useState(null);
-
- useEffect(() => {
- const fetchTokenRates = async () => {
- setIsLoading(true);
- try {
- if (!tokens || !fiatCurrency) {
- return;
- }
-
- const assetIds = tokens.map((token) => token.assetId).join(',');
- const url = new URL(PRICE_API_URL);
- const params = new URLSearchParams({
- assetIds,
- vsCurrency: fiatCurrency,
- });
- url.search = params.toString();
-
- const response = (await handleFetch(url.toString())) as Record<
- string,
- { [key: string]: number }
- >;
-
- const newRates: Record = {};
- const responseKeys = Object.keys(response);
-
- tokens.forEach((token) => {
- const responseKey = responseKeys.find(
- (key) => key.toLowerCase() === token.assetId.toLowerCase(),
- );
- newRates[token.assetId] = responseKey
- ? response[responseKey][fiatCurrency.toLowerCase()]
- : null;
- });
-
- setRates(newRates);
- } catch (e) {
- setError(
- e instanceof Error ? e : new Error('Failed to fetch token rates'),
- );
- } finally {
- setIsLoading(false);
- }
- };
-
- fetchTokenRates();
- }, [tokens, fiatCurrency]);
-
- return { rates, isLoading, error };
-};
-
-export default useFetchTokenRatesMulti;
diff --git a/app/components/UI/Ramp/Deposit/hooks/useUserDetailsPolling.test.ts b/app/components/UI/Ramp/Deposit/hooks/useUserDetailsPolling.test.ts
deleted file mode 100644
index 2d438213b704..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useUserDetailsPolling.test.ts
+++ /dev/null
@@ -1,266 +0,0 @@
-import { renderHook, act } from '@testing-library/react-hooks';
-import useUserDetailsPolling from './useUserDetailsPolling';
-import { useDepositUser } from './useDepositUser';
-
-jest.mock('./useDepositUser');
-
-const mockUseDepositUser = useDepositUser as jest.MockedFunction<
- typeof useDepositUser
->;
-
-const mockFetchUserDetails = jest.fn();
-const mockUserState = {
- userDetails: null as ReturnType['userDetails'],
- error: null as string | null,
- isFetching: false,
- fetchUserDetails: mockFetchUserDetails,
-};
-
-jest.useFakeTimers();
-
-describe('useUserDetailsPolling', () => {
- beforeEach(() => {
- jest.clearAllMocks();
- mockUserState.userDetails = null;
- mockUserState.error = null;
- mockUserState.isFetching = false;
- mockFetchUserDetails.mockResolvedValue(undefined);
- mockUseDepositUser.mockReturnValue(mockUserState);
- });
-
- afterEach(() => {
- jest.clearAllTimers();
- });
-
- it('should start polling automatically by default', () => {
- renderHook(() => useUserDetailsPolling(10000, true, 30));
-
- // Should call immediately
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
-
- // Should call again after interval
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(2);
- });
-
- it('should not start polling when autoStart is false', () => {
- renderHook(() => useUserDetailsPolling(10000, false, 30));
-
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
-
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
- });
-
- it('should use custom polling interval', () => {
- renderHook(() => useUserDetailsPolling(2000, true, 30));
-
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
-
- // Should call after custom interval
- act(() => {
- jest.advanceTimersByTime(2000);
- });
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(2);
- });
-
- it('should return userDetails and status', () => {
- mockUserState.userDetails = {
- id: 'id',
- firstName: 'First',
- lastName: 'Last',
- email: 'test@example.com',
- mobileNumber: '+1234567890',
- status: 'active',
- dob: '1990-01-01',
- address: {
- addressLine1: '123 Main St',
- addressLine2: 'Apt 4',
- city: 'Test City',
- state: 'TS',
- country: 'US',
- countryCode: 'US',
- postCode: '12345',
- },
- createdAt: '2023-01-01T00:00:00Z',
- kyc: {
- status: 'APPROVED',
- type: 'L1',
- workFlowRunId: 'test-workflow-id',
- attempts: [],
- highestApprovedKYCType: 'L1',
- kycMarkedBy: null,
- kycResult: null,
- rejectionDetails: null,
- userId: 'test-user',
- },
- };
-
- const { result } = renderHook(() => useUserDetailsPolling(10000, true, 30));
-
- expect(result.current.userDetails).toEqual({
- id: 'id',
- firstName: 'First',
- lastName: 'Last',
- email: 'test@example.com',
- mobileNumber: '+1234567890',
- status: 'active',
- dob: '1990-01-01',
- address: {
- addressLine1: '123 Main St',
- addressLine2: 'Apt 4',
- city: 'Test City',
- state: 'TS',
- country: 'US',
- countryCode: 'US',
- postCode: '12345',
- },
- createdAt: '2023-01-01T00:00:00Z',
- kyc: {
- status: 'APPROVED',
- type: 'L1',
- workFlowRunId: 'test-workflow-id',
- attempts: [],
- highestApprovedKYCType: 'L1',
- kycMarkedBy: null,
- kycResult: null,
- rejectionDetails: null,
- userId: 'test-user',
- },
- });
- });
-
- it('should stop polling when status is not NOT_SUBMITTED or SUBMITTED', () => {
- const { rerender } = renderHook(() =>
- useUserDetailsPolling(10000, true, 30),
- );
-
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
-
- mockUserState.userDetails = {
- id: 'id',
- firstName: 'First',
- lastName: 'Last',
- email: 'test@example.com',
- mobileNumber: '+1234567890',
- status: 'active',
- dob: '1990-01-01',
- address: {
- addressLine1: '123 Main St',
- addressLine2: 'Apt 4',
- city: 'Test City',
- state: 'TS',
- country: 'US',
- countryCode: 'US',
- postCode: '12345',
- },
- createdAt: '2023-01-01T00:00:00Z',
- kyc: {
- status: 'APPROVED',
- type: 'L1',
- workFlowRunId: 'test-workflow-id',
- attempts: [],
- highestApprovedKYCType: 'L1',
- kycMarkedBy: null,
- kycResult: null,
- rejectionDetails: null,
- userId: 'test-user',
- },
- };
- rerender();
-
- // Should not continue polling
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
- });
-
- it('should allow manual start and stop of polling', () => {
- const { result } = renderHook(() =>
- useUserDetailsPolling(10000, false, 30),
- );
-
- expect(mockFetchUserDetails).not.toHaveBeenCalled();
-
- act(() => {
- result.current.startPolling();
- });
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
-
- act(() => {
- result.current.stopPolling();
- });
-
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
- });
-
- it('should cleanup polling on unmount', () => {
- const { unmount } = renderHook(() =>
- useUserDetailsPolling(10000, true, 30),
- );
-
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
-
- unmount();
-
- // Should not continue polling after unmount
- act(() => {
- jest.advanceTimersByTime(10000);
- });
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
- });
-
- it('should pass through loading and error states', () => {
- mockUserState.isFetching = true;
- mockUserState.error = 'Network error';
-
- const { result } = renderHook(() => useUserDetailsPolling(10000, true, 30));
-
- expect(result.current.loading).toBe(true);
- expect(result.current.error).toBe('Network error');
- });
-
- it('should stop polling after max attempts', () => {
- const { result } = renderHook(() => useUserDetailsPolling(1000, true, 2));
-
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
-
- // First interval call
- act(() => {
- jest.advanceTimersByTime(1000);
- });
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(2);
-
- // Second interval call should stop and set error without calling fetchUserDetails
- act(() => {
- jest.advanceTimersByTime(1000);
- });
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(2);
- expect(result.current.error).toContain(
- 'User details polling reached maximum attempts',
- );
- });
-
- it('should poll indefinitely when maxPollingAttempts is 0', () => {
- const { result } = renderHook(() => useUserDetailsPolling(1000, true, 0));
-
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(1);
-
- for (let i = 0; i < 50; i++) {
- act(() => {
- jest.advanceTimersByTime(1000);
- });
- }
-
- expect(mockFetchUserDetails).toHaveBeenCalledTimes(51);
- expect(result.current.error).toBeNull();
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/hooks/useUserDetailsPolling.ts b/app/components/UI/Ramp/Deposit/hooks/useUserDetailsPolling.ts
deleted file mode 100644
index 07f66ade9774..000000000000
--- a/app/components/UI/Ramp/Deposit/hooks/useUserDetailsPolling.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { useEffect, useRef, useCallback, useState } from 'react';
-import { useDepositUser } from './useDepositUser';
-import { NativeTransakUserDetails } from '@consensys/native-ramps-sdk';
-import { KycStatus } from '../constants';
-
-export interface UserDetailsPollingResult {
- userDetails: NativeTransakUserDetails | null;
- loading: boolean;
- error: string | null;
- startPolling: () => void;
- stopPolling: () => void;
-}
-
-/**
- * Hook to poll for user details from the SDK
- *
- * @param pollingInterval - The interval in milliseconds to poll for user details
- * @param autoStart - Whether to automatically start polling
- * @param maxPollingAttempts - The maximum number of polling attempts before stopping. Set to 0 to poll indefinitely.
- */
-const useUserDetailsPolling = (
- pollingInterval: number = 10000,
- autoStart: boolean = true,
- maxPollingAttempts: number = 30,
-): UserDetailsPollingResult => {
- const intervalRef = useRef(null);
- const pollCountRef = useRef(0);
- const [pollingError, setPollingError] = useState(null);
-
- const {
- userDetails,
- error: sdkError,
- isFetching: loading,
- fetchUserDetails,
- } = useDepositUser();
-
- const stopPolling = useCallback(() => {
- if (intervalRef.current) {
- clearInterval(intervalRef.current);
- intervalRef.current = null;
- }
- }, []);
-
- const startPolling = useCallback(() => {
- stopPolling();
- pollCountRef.current = 0;
- setPollingError(null);
-
- // Call immediately
- fetchUserDetails();
- pollCountRef.current += 1;
-
- // Set up interval
- intervalRef.current = setInterval(() => {
- pollCountRef.current += 1;
-
- if (maxPollingAttempts > 0 && pollCountRef.current > maxPollingAttempts) {
- setPollingError(
- 'User details polling reached maximum attempts. Please try again later.',
- );
- stopPolling();
- return;
- }
-
- fetchUserDetails();
- }, pollingInterval);
- }, [fetchUserDetails, pollingInterval, stopPolling, maxPollingAttempts]);
-
- const kycStatus = userDetails?.kyc?.status;
-
- useEffect(() => {
- if (
- kycStatus &&
- kycStatus !== KycStatus.NOT_SUBMITTED &&
- kycStatus !== KycStatus.SUBMITTED
- ) {
- stopPolling();
- }
- }, [kycStatus, stopPolling]);
-
- useEffect(() => {
- if (autoStart) {
- startPolling();
- }
-
- return () => {
- stopPolling();
- };
- }, [autoStart, startPolling, stopPolling]);
-
- return {
- userDetails,
- loading,
- error: pollingError || sdkError,
- startPolling,
- stopPolling,
- };
-};
-
-export default useUserDetailsPolling;
diff --git a/app/components/UI/Ramp/Deposit/orderProcessor/index.test.ts b/app/components/UI/Ramp/Deposit/orderProcessor/index.test.ts
deleted file mode 100644
index dfe5603fe78d..000000000000
--- a/app/components/UI/Ramp/Deposit/orderProcessor/index.test.ts
+++ /dev/null
@@ -1,447 +0,0 @@
-import { FiatOrder } from '../../../../../reducers/fiatOrders';
-import { DepositSDKNoAuth } from '../sdk';
-import { depositOrderToFiatOrder, processDepositOrder } from './';
-import {
- MOCK_BTC_TOKEN,
- MOCK_CREDIT_DEBIT_CARD,
- MOCK_US_REGION,
-} from '../testUtils/constants';
-import { DepositOrder, NativeRampsSdk } from '@consensys/native-ramps-sdk';
-
-jest.mock('../sdk', () => ({
- DepositSDKNoAuth: {
- getOrder: jest.fn(),
- },
-}));
-
-describe('depositOrderToFiatOrder', () => {
- const now = 1673886669608;
- beforeEach(() => {
- jest.spyOn(Date, 'now').mockImplementation(() => now);
- });
-
- afterAll(() => {
- jest.spyOn(Date, 'now').mockRestore();
- });
-
- it('should return a fiat order', () => {
- const mockOrder: Partial = {
- id: 'test-id',
- provider: 'test-provider',
- createdAt: 1673886669608,
- fiatAmount: 123,
- totalFeesFiat: 9,
- cryptoAmount: 0.012361263,
- cryptoCurrency: MOCK_BTC_TOKEN,
- fiatCurrency: 'USD',
- network: { chainId: 'eip155:1', name: 'Ethereum' },
- status: 'COMPLETED',
- orderType: 'DEPOSIT' as DepositOrder['orderType'],
- walletAddress: '0x1234',
- txHash: '0x987654321',
- providerOrderId: 'test-order-id',
- providerOrderLink: 'https://test.com/order',
- paymentMethod: MOCK_CREDIT_DEBIT_CARD,
- timeDescriptionPending: '1-2 days',
- fiatAmountInUsd: 123,
- feesInUsd: 9,
- region: MOCK_US_REGION,
- paymentDetails: [],
- };
-
- const failedOrder = {
- ...mockOrder,
- status: 'FAILED',
- };
-
- const cancelledOrder = {
- ...mockOrder,
- status: 'CANCELLED',
- };
- const pendingOrder = {
- ...mockOrder,
- status: 'PENDING',
- };
- const createdOrder = {
- ...mockOrder,
- orderType: 'SELL',
- status: 'CREATED',
- };
-
- const unknownStateOrder = {
- ...mockOrder,
- status: 'UNKNOWN_STATE',
- };
-
- expect(depositOrderToFiatOrder(mockOrder as DepositOrder)).toEqual({
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: 9,
- forceUpdate: false,
- cryptoAmount: 0.012361263,
- cryptoFee: 9,
- currency: 'USD',
- currencySymbol: '$',
- amountInUSD: '123',
- cryptocurrency: 'BTC',
- state: 'COMPLETED',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'DEPOSIT',
- errorCount: 0,
- lastTimeFetched: 1673886669608,
- data: mockOrder,
- });
-
- expect(depositOrderToFiatOrder(failedOrder as DepositOrder)).toEqual({
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: 9,
- forceUpdate: false,
- cryptoAmount: 0.012361263,
- cryptoFee: 9,
- currency: 'USD',
- currencySymbol: '$',
- amountInUSD: '123',
- cryptocurrency: 'BTC',
- state: 'FAILED',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'DEPOSIT',
- errorCount: 0,
- lastTimeFetched: 1673886669608,
- data: failedOrder,
- });
- expect(depositOrderToFiatOrder(cancelledOrder as DepositOrder)).toEqual({
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: 9,
- forceUpdate: false,
- cryptoAmount: 0.012361263,
- cryptoFee: 9,
- currency: 'USD',
- currencySymbol: '$',
- amountInUSD: '123',
- cryptocurrency: 'BTC',
- state: 'CANCELLED',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'DEPOSIT',
- errorCount: 0,
- lastTimeFetched: 1673886669608,
- data: cancelledOrder,
- });
- expect(depositOrderToFiatOrder(pendingOrder as DepositOrder)).toEqual({
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: 9,
- forceUpdate: false,
- cryptoAmount: 0.012361263,
- cryptoFee: 9,
- currency: 'USD',
- currencySymbol: '$',
- amountInUSD: '123',
- cryptocurrency: 'BTC',
- state: 'PENDING',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'DEPOSIT',
- errorCount: 0,
- lastTimeFetched: 1673886669608,
- data: pendingOrder,
- });
-
- expect(depositOrderToFiatOrder(createdOrder as DepositOrder)).toEqual({
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: 9,
- forceUpdate: false,
- cryptoAmount: 0.012361263,
- cryptoFee: 9,
- currency: 'USD',
- currencySymbol: '$',
- amountInUSD: '123',
- cryptocurrency: 'BTC',
- state: 'CREATED',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'SELL',
- errorCount: 0,
- lastTimeFetched: 1673886669608,
- data: createdOrder,
- });
-
- expect(depositOrderToFiatOrder(unknownStateOrder as DepositOrder)).toEqual({
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: 9,
- forceUpdate: false,
- cryptoAmount: 0.012361263,
- cryptoFee: 9,
- currency: 'USD',
- currencySymbol: '$',
- amountInUSD: '123',
- cryptocurrency: 'BTC',
- state: 'PENDING',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'DEPOSIT',
- errorCount: 0,
- lastTimeFetched: 1673886669608,
- data: unknownStateOrder,
- });
- });
-
- it('should return a fiat order with default values', () => {
- const mockOrder1: Partial = {
- id: 'test-id',
- provider: 'test-provider',
- createdAt: 1673886669608,
- cryptoCurrency: {
- assetId: 'eip155:1/slip44:60',
- symbol: 'ETH',
- name: 'Ethereum',
- chainId: 'eip155:1',
- decimals: 18,
- iconUrl: 'https://example.com/eth.png',
- },
- fiatCurrency: 'USD',
- fiatAmount: 123,
- network: { chainId: 'eip155:1', name: 'Ethereum' },
- status: 'COMPLETED',
- orderType: 'DEPOSIT' as DepositOrder['orderType'],
- walletAddress: '0x1234',
- txHash: '0x987654321',
- };
-
- const mockOrder2 = {
- id: 'test-id',
- provider: 'test-provider',
- createdAt: 1673886669608,
- fiatAmount: 123,
- cryptoCurrency: {
- assetId: 'eip155:1/slip44:60',
- symbol: 'ETH',
- name: 'Ethereum',
- chainId: 'eip155:1',
- decimals: 18,
- iconUrl: 'https://example.com/eth.png',
- },
- fiatCurrency: 'USD',
- network: { chainId: 'eip155:1', name: 'Ethereum' },
- status: 'COMPLETED',
- orderType: 'DEPOSIT',
- walletAddress: '0x1234',
- txHash: '0x987654321',
- };
-
- expect(depositOrderToFiatOrder(mockOrder1 as DepositOrder)).toEqual({
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: undefined,
- forceUpdate: false,
- cryptoAmount: 0,
- cryptoFee: 0,
- currency: 'USD',
- currencySymbol: '$',
- amountInUSD: undefined,
- cryptocurrency: 'ETH',
- state: 'COMPLETED',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'DEPOSIT',
- errorCount: 0,
- lastTimeFetched: 1673886669608,
- data: mockOrder1,
- });
- expect(
- depositOrderToFiatOrder(mockOrder2 as unknown as DepositOrder),
- ).toEqual({
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: undefined,
- forceUpdate: false,
- cryptoAmount: 0,
- cryptoFee: 0,
- currency: 'USD',
- currencySymbol: '$',
- amountInUSD: undefined,
- cryptocurrency: 'ETH',
- state: 'COMPLETED',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'DEPOSIT',
- errorCount: 0,
- lastTimeFetched: 1673886669608,
- data: mockOrder2,
- });
- });
-});
-
-describe('processDepositOrder', () => {
- const mockOrder = {
- id: 'test-id',
- provider: 'DEPOSIT',
- createdAt: 1673886669608,
- amount: 123,
- fee: 9,
- forceUpdate: false,
- cryptoAmount: 0.012361263,
- cryptoFee: 9,
- currency: 'USD',
- currencySymbol: '',
- cryptocurrency: 'BTC',
- state: 'COMPLETED',
- account: '0x1234',
- network: 'eip155:1',
- txHash: '0x987654321',
- excludeFromPurchases: false,
- orderType: 'DEPOSIT',
- errorCount: 0,
- lastTimeFetched: 1673886669600,
- data: {
- id: 'test-id',
- provider: 'test-provider',
- createdAt: 1673886669608,
- fiatAmount: 123,
- totalFeesFiat: 9,
- forceUpdate: false,
- cryptoAmount: 0.012361263,
- cryptoCurrency: MOCK_BTC_TOKEN,
- fiatCurrency: 'USD',
- network: { chainId: 'eip155:1', name: 'Ethereum' },
- status: 'COMPLETED',
- orderType: 'DEPOSIT',
- walletAddress: '0x1234',
- txHash: '0x987654321',
- },
- } as unknown as FiatOrder;
-
- afterEach(() => {
- jest.spyOn(Date, 'now').mockClear();
- (DepositSDKNoAuth.getOrder as jest.Mock).mockClear();
- });
-
- it('should process an order', async () => {
- (DepositSDKNoAuth.getOrder as jest.Mock).mockImplementation(() => ({
- ...mockOrder.data,
- status: 'FAILED',
- }));
- jest.spyOn(Date, 'now').mockImplementation(() => 1673886669600);
-
- const updatedOrder = await processDepositOrder(mockOrder);
- expect(DepositSDKNoAuth.getOrder).toHaveBeenCalledWith('test-id', '0x1234');
- expect(updatedOrder).toEqual({
- ...mockOrder,
- currencySymbol: '$',
- amountInUSD: undefined,
- state: 'FAILED',
- lastTimeFetched: 1673886669600,
- data: { ...mockOrder.data, status: 'FAILED' },
- });
- });
-
- it('should return the same order if response is empty', async () => {
- (DepositSDKNoAuth.getOrder as jest.Mock).mockImplementation(() => null);
- jest.spyOn(Date, 'now').mockImplementation(() => 1673886669600);
-
- const updatedOrder = await processDepositOrder(mockOrder);
- expect(DepositSDKNoAuth.getOrder).toHaveBeenCalledWith('test-id', '0x1234');
- expect(DepositSDKNoAuth.getOrder).toHaveReturnedWith(null);
- expect(updatedOrder).toEqual(mockOrder);
- });
-
- it('should return the same order if there was an error', async () => {
- (DepositSDKNoAuth.getOrder as jest.Mock).mockImplementation(() => {
- throw new Error('test error');
- });
- jest.spyOn(Date, 'now').mockImplementation(() => 1673886669600);
-
- const updatedOrder = await processDepositOrder(mockOrder);
- expect(DepositSDKNoAuth.getOrder).toHaveBeenCalledWith('test-id', '0x1234');
- expect(updatedOrder).toEqual(mockOrder);
- });
-
- it('should use provided SDK instance when available', async () => {
- const mockSdk = {
- getOrder: jest.fn().mockImplementation(() => ({
- ...mockOrder.data,
- status: 'PENDING',
- })),
- } as unknown as NativeRampsSdk;
- jest.spyOn(Date, 'now').mockImplementation(() => 1673886669600);
-
- const updatedOrder = await processDepositOrder(mockOrder, { sdk: mockSdk });
- expect(mockSdk.getOrder).toHaveBeenCalledWith('test-id', '0x1234');
- expect(DepositSDKNoAuth.getOrder).not.toHaveBeenCalled();
- expect(updatedOrder).toEqual({
- ...mockOrder,
- currencySymbol: '$',
- amountInUSD: undefined,
- state: 'PENDING',
- lastTimeFetched: 1673886669600,
- data: { ...mockOrder.data, status: 'PENDING' },
- });
- });
-
- it('should use deposit order id from SDK response when processing', async () => {
- const orderWithCustomId = {
- ...mockOrder,
- id: 'custom-redux-id',
- data: {
- ...mockOrder.data,
- id: 'deposit-internal-id',
- providerOrderId: 'provider-external-id',
- },
- } as unknown as FiatOrder;
-
- (DepositSDKNoAuth.getOrder as jest.Mock).mockImplementation(() => ({
- ...orderWithCustomId.data,
- status: 'COMPLETED',
- }));
- jest.spyOn(Date, 'now').mockImplementation(() => 1673886669600);
-
- const updatedOrder = await processDepositOrder(orderWithCustomId);
-
- expect(DepositSDKNoAuth.getOrder).toHaveBeenCalledWith(
- 'custom-redux-id',
- '0x1234',
- );
- expect(updatedOrder.id).toBe('deposit-internal-id');
- expect((updatedOrder.data as DepositOrder).providerOrderId).toBe(
- 'provider-external-id',
- );
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/orderProcessor/index.ts b/app/components/UI/Ramp/Deposit/orderProcessor/index.ts
deleted file mode 100644
index d887aa39030a..000000000000
--- a/app/components/UI/Ramp/Deposit/orderProcessor/index.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { DepositOrder, OrderStatusEnum } from '@consensys/native-ramps-sdk';
-import { ProcessorOptions } from '../..';
-import { FiatOrder } from '../../../../../reducers/fiatOrders';
-
-import {
- FIAT_ORDER_PROVIDERS,
- FIAT_ORDER_STATES,
-} from '../../../../../constants/on-ramp';
-import { DepositSDKNoAuth } from '../sdk';
-import Logger from '../../../../../util/Logger';
-
-function getFiatCurrencySymbol(currencyCode: string): string {
- try {
- const parts = new Intl.NumberFormat('en', {
- style: 'currency',
- currency: currencyCode,
- }).formatToParts(0);
- return parts.find((p) => p.type === 'currency')?.value ?? '';
- } catch {
- return '';
- }
-}
-
-const depositOrderStateToFiatOrderState = (
- aggregatorOrderState: DepositOrder['status'],
-) => {
- switch (aggregatorOrderState) {
- case OrderStatusEnum.Completed: {
- return FIAT_ORDER_STATES.COMPLETED;
- }
- case OrderStatusEnum.Failed: {
- return FIAT_ORDER_STATES.FAILED;
- }
- case OrderStatusEnum.Cancelled: {
- return FIAT_ORDER_STATES.CANCELLED;
- }
- case OrderStatusEnum.Created: {
- return FIAT_ORDER_STATES.CREATED;
- }
- case OrderStatusEnum.Pending:
- case OrderStatusEnum.Unknown:
- default: {
- return FIAT_ORDER_STATES.PENDING;
- }
- }
-};
-
-export const depositOrderToFiatOrder = (
- depositOrder: DepositOrder,
-): FiatOrder => ({
- id: depositOrder.id,
- provider: FIAT_ORDER_PROVIDERS.DEPOSIT,
- createdAt: depositOrder.createdAt,
- amount: depositOrder.fiatAmount,
- fee: depositOrder.totalFeesFiat,
- forceUpdate: false,
- cryptoAmount: depositOrder.cryptoAmount || 0,
- cryptoFee: depositOrder.totalFeesFiat || 0,
- currency: depositOrder.fiatCurrency,
- currencySymbol: getFiatCurrencySymbol(depositOrder.fiatCurrency),
- amountInUSD: depositOrder.fiatAmountInUsd?.toString(),
- cryptocurrency: depositOrder.cryptoCurrency?.symbol || '',
- network: depositOrder.network?.chainId || '',
- state: depositOrderStateToFiatOrderState(depositOrder.status),
- account: depositOrder.walletAddress,
- txHash: depositOrder.txHash,
- excludeFromPurchases: false,
- orderType: depositOrder.orderType,
- errorCount: 0,
- lastTimeFetched: Date.now(),
- data: depositOrder,
-});
-
-export async function processDepositOrder(
- order: FiatOrder,
- options?: ProcessorOptions,
-): Promise {
- try {
- const sdk = options?.sdk || DepositSDKNoAuth;
-
- const updatedOrder = await sdk.getOrder(order.id, order.account);
- if (!updatedOrder) {
- throw new Error('Deposit order not found');
- }
-
- const updatedFiatOrder = depositOrderToFiatOrder(updatedOrder);
- return {
- ...updatedFiatOrder,
- account: order.account,
- lastTimeFetched: Date.now(),
- errorCount: 0,
- forceUpdate: false,
- };
- } catch (error) {
- Logger.error(error as Error, {
- message: 'DepositOrder::Processor error while processing order',
- orderId: order.id,
- provider: order.provider,
- orderType: order.orderType,
- state: order.state,
- network: order.network,
- });
- return order;
- }
-}
diff --git a/app/components/UI/Ramp/Deposit/routes/index.tsx b/app/components/UI/Ramp/Deposit/routes/index.tsx
deleted file mode 100644
index f6e15b9b9961..000000000000
--- a/app/components/UI/Ramp/Deposit/routes/index.tsx
+++ /dev/null
@@ -1,211 +0,0 @@
-import React from 'react';
-import {
- createStackNavigator,
- StackNavigationOptions,
-} from '@react-navigation/stack';
-import { RouteProp, useRoute } from '@react-navigation/native';
-import { BuyQuote } from '@consensys/native-ramps-sdk';
-import { DepositSDKProvider } from '../sdk';
-import { DepositNavigationParams } from '../types';
-
-import Root from '../Views/Root';
-import BuildQuote from '../Views/BuildQuote';
-import EnterEmail from '../Views/EnterEmail';
-import OtpCode from '../Views/OtpCode';
-import VerifyIdentity from '../Views/VerifyIdentity';
-import BasicInfo from '../Views/BasicInfo';
-import EnterAddress from '../Views/EnterAddress';
-import KycProcessing from '../Views/KycProcessing';
-import OrderProcessing from '../Views/OrderProcessing';
-import BankDetails from '../Views/BankDetails';
-import AdditionalVerification from '../Views/AdditionalVerification';
-
-import TokenSelectorModal from '../Views/Modals/TokenSelectorModal';
-import RegionSelectorModal from '../Views/Modals/RegionSelectorModal';
-import PaymentMethodSelectorModal from '../Views/Modals/PaymentMethodSelectorModal';
-import UnsupportedRegionModal from '../Views/Modals/UnsupportedRegionModal';
-import UnsupportedStateModal from '../Views/Modals/UnsupportedStateModal/UnsupportedStateModal';
-import StateSelectorModal from '../Views/Modals/StateSelectorModal';
-import WebviewModal, { KycWebviewModal } from '../Views/Modals/WebviewModal';
-import IncompatibleAccountTokenModal from '../Views/Modals/IncompatibleAccountTokenModal';
-import SsnInfoModal from '../Views/Modals/SsnInfoModal';
-import ConfigurationModal from '../Views/Modals/ConfigurationModal';
-import ErrorDetailsModal from '../Views/Modals/ErrorDetailsModal/ErrorDetailsModal';
-
-import Routes from '../../../../../constants/navigation/Routes';
-import { clearStackNavigatorOptions } from '../../../../../constants/navigation/clearStackNavigatorOptions';
-
-interface DepositParamList {
- [key: string]:
- | {
- animationEnabled?: boolean;
- quote?: BuyQuote;
- }
- | DepositNavigationParams
- | undefined;
-}
-
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-type ScreenComponent = React.ComponentType;
-
-const RootStack = createStackNavigator();
-const Stack = createStackNavigator();
-const ModalsStack = createStackNavigator();
-
-const getAnimationOptions = ({
- route,
-}: {
- route: RouteProp;
-}): StackNavigationOptions => {
- const params = route.params;
- const animationEnabled =
- params && 'animationEnabled' in params
- ? params.animationEnabled !== false
- : true;
- return { animationEnabled };
-};
-
-const MainRoutes = () => {
- const route =
- useRoute>();
- const parentParams = route.params;
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-const DepositModalsRoutes = () => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
-
-const DepositRoutes = () => (
-
-
-
-
-
-
-);
-export default DepositRoutes;
diff --git a/app/components/UI/Ramp/Deposit/routes/utils.test.ts b/app/components/UI/Ramp/Deposit/routes/utils.test.ts
deleted file mode 100644
index 000b84b7aaad..000000000000
--- a/app/components/UI/Ramp/Deposit/routes/utils.test.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { createDepositNavigationDetails } from './utils';
-import Routes from '../../../../../constants/navigation/Routes';
-
-describe('createDepositNavigationDetails', () => {
- describe('without intent', () => {
- it('returns route without params when intent is undefined', () => {
- const result = createDepositNavigationDetails(undefined);
-
- expect(result).toEqual([Routes.DEPOSIT.ID]);
- });
-
- it('returns route without params when no intent is provided', () => {
- const result = createDepositNavigationDetails();
-
- expect(result).toEqual([Routes.DEPOSIT.ID]);
- });
- });
-
- describe('with intent', () => {
- it('returns nested navigation structure when intent with assetId is provided', () => {
- const intent = { assetId: 'eth' };
-
- const result = createDepositNavigationDetails(intent);
-
- expect(result).toEqual([
- Routes.DEPOSIT.ID,
- {
- screen: Routes.DEPOSIT.ROOT,
- params: intent,
- },
- ]);
- });
-
- it('returns nested navigation structure when intent with amount is provided', () => {
- const intent = { amount: '100' };
-
- const result = createDepositNavigationDetails(intent);
-
- expect(result).toEqual([
- Routes.DEPOSIT.ID,
- {
- screen: Routes.DEPOSIT.ROOT,
- params: intent,
- },
- ]);
- });
-
- it('returns nested navigation structure when intent with both assetId and amount is provided', () => {
- const intent = { assetId: 'eth', amount: '100' };
-
- const result = createDepositNavigationDetails(intent);
-
- expect(result).toEqual([
- Routes.DEPOSIT.ID,
- {
- screen: Routes.DEPOSIT.ROOT,
- params: intent,
- },
- ]);
- });
-
- it('returns nested navigation structure when intent with chainId format assetId is provided', () => {
- const intent = { assetId: 'eip155:1/0x123' };
-
- const result = createDepositNavigationDetails(intent);
-
- expect(result).toEqual([
- Routes.DEPOSIT.ID,
- {
- screen: Routes.DEPOSIT.ROOT,
- params: intent,
- },
- ]);
- });
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/routes/utils.ts b/app/components/UI/Ramp/Deposit/routes/utils.ts
deleted file mode 100644
index 22a6f16c8bf2..000000000000
--- a/app/components/UI/Ramp/Deposit/routes/utils.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { DepositNavigationParams } from '../types';
-import Routes from '../../../../../constants/navigation/Routes';
-
-export function createDepositNavigationDetails(
- intent?: DepositNavigationParams,
-) {
- const route = Routes.DEPOSIT.ID;
- if (!intent) {
- return [route] as const;
- }
- return [
- route,
- {
- screen: Routes.DEPOSIT.ROOT,
- params: intent,
- },
- ] as const;
-}
diff --git a/app/components/UI/Ramp/Deposit/sdk/index.test.tsx b/app/components/UI/Ramp/Deposit/sdk/index.test.tsx
deleted file mode 100644
index 3053be075eec..000000000000
--- a/app/components/UI/Ramp/Deposit/sdk/index.test.tsx
+++ /dev/null
@@ -1,832 +0,0 @@
-import React, { useContext } from 'react';
-import { Text } from 'react-native';
-import { screen, act, fireEvent } from '@testing-library/react-native';
-import {
- DepositSDK,
- DepositSDKContext,
- DepositSDKProvider,
- useDepositSDK,
- DEPOSIT_ENVIRONMENT,
-} from '.';
-import { backgroundState } from '../../../../../util/test/initial-root-state';
-import {
- MOCK_USDC_TOKEN,
- MOCK_REGIONS,
- MOCK_CREDIT_DEBIT_CARD,
-} from '../testUtils';
-import renderWithProvider from '../../../../../util/test/renderWithProvider';
-
-import { NativeRampsSdk, Context } from '@consensys/native-ramps-sdk';
-
-const mockDispatch = jest.fn();
-jest.mock('react-redux', () => ({
- ...jest.requireActual('react-redux'),
- useDispatch: () => mockDispatch,
-}));
-
-jest.mock('../utils/ProviderTokenVault', () => ({
- getProviderToken: jest
- .fn()
- .mockResolvedValue({ success: false, token: null }),
- storeProviderToken: jest.fn().mockResolvedValue({ success: true }),
-}));
-
-jest.mock('react-native', () => ({
- Platform: {
- OS: 'ios',
- },
-}));
-
-jest.mock('@consensys/native-ramps-sdk', () => ({
- ...jest.requireActual('@consensys/native-ramps-sdk'),
- NativeRampsSdk: jest.fn().mockImplementation(() => ({
- getVersion: jest.fn().mockReturnValue('1.0.0'),
- getBuyQuote: jest.fn().mockResolvedValue({
- quoteId: 'quote-id',
- fiatAmount: 100,
- conversionPrice: 1000,
- marketConversionPrice: 1000,
- slippage: 0,
- fiatCurrency: 'USD',
- cryptoCurrency: 'ETH',
- paymentMethod: 'credit_card',
- cryptoAmount: 0.1,
- isBuyOrSell: 'BUY',
- network: { chainId: 'eip155:1', name: 'Ethereum' },
- feeDecimal: 0,
- totalFee: 0,
- feeBreakdown: [],
- nonce: 1,
- cryptoLiquidityProvider: 'provider',
- notes: [],
- }),
- getUserDetails: jest.fn().mockResolvedValue({
- id: 'user-id',
- firstName: 'Test',
- lastName: 'User',
- email: 'test@example.com',
- mobileNumber: '1234567890',
- status: 'active',
- dob: '1990-01-01',
- kyc: {
- l1: {
- status: 'APPROVED',
- type: 'BASIC',
- updatedAt: '2023-01-01',
- kycSubmittedAt: '2023-01-01',
- },
- },
- address: {
- addressLine1: '123 Main St',
- addressLine2: '',
- state: 'NY',
- city: 'New York',
- postCode: '10001',
- country: 'United States',
- countryCode: 'US',
- },
- createdAt: '2023-01-01',
- isKycApproved: jest.fn().mockReturnValue(true),
- }),
- setAccessToken: jest.fn(),
- setLocale: jest.fn(),
- logout: jest.fn(),
- getGeolocation: jest.fn().mockResolvedValue({ ipCountryCode: 'US' }),
- })),
-}));
-
-const mockedState = {
- engine: {
- backgroundState: {
- ...backgroundState,
- RemoteFeatureFlagController: {
- remoteFeatureFlags: {
- depositConfig: {
- providerApiKey: 'test-provider-api-key',
- },
- },
- },
- },
- },
- fiatOrders: {
- selectedRegionDeposit: null,
- selectedCryptoCurrencyDeposit: null,
- selectedPaymentMethodDeposit: null,
- },
-};
-
-describe('Deposit SDK Context', () => {
- beforeEach(() => {
- jest.clearAllMocks();
- mockDispatch.mockClear();
- });
-
- describe('DepositSDKProvider', () => {
- it('renders and provides context values', () => {
- const ConsumerComponent = () => {
- const { providerApiKey } = useContext(DepositSDKContext) as DepositSDK;
- return {`API Key: ${providerApiKey}`};
- };
-
- renderWithProvider(
-
-
- ,
- {
- state: mockedState,
- },
- );
- const textElement = screen.getByText('API Key: test-provider-api-key');
- expect(textElement).toBeOnTheScreen();
- });
-
- it('initializes NativeRampsSdk with correct parameters', () => {
- renderWithProvider(
-
- Test Component
- ,
- {
- state: mockedState,
- },
- );
-
- expect(NativeRampsSdk).toHaveBeenCalledWith(
- {
- apiKey: 'test-provider-api-key',
- context: Context.MobileIOS,
- locale: 'en',
- },
- DEPOSIT_ENVIRONMENT,
- );
- });
- });
-
- describe('useDepositSDK', () => {
- it('provides access to the NativeRampsSdk instance', () => {
- const TestComponent = () => {
- const { sdk } = useDepositSDK();
-
- React.useEffect(() => {
- if (sdk) {
- sdk.getBuyQuote('USD', 'ETH', 'mainnet', 'credit_card', '100');
- }
- }, [sdk]);
- return Test Component;
- };
-
- renderWithProvider(
-
-
- ,
- {
- state: mockedState,
- },
- );
-
- const mockSdkInstance = (NativeRampsSdk as jest.Mock).mock.results[0]
- .value;
- expect(mockSdkInstance.getBuyQuote).toHaveBeenCalledWith(
- 'USD',
- 'ETH',
- 'mainnet',
- 'credit_card',
- '100',
- );
- });
-
- it('allows calling SDK methods through the context', () => {
- const TestComponent = () => {
- const { sdk } = useDepositSDK();
- return (
-
- sdk?.getBuyQuote('USD', 'ETH', 'mainnet', 'credit_card', '100')
- }
- >
- Test SDK
-
- );
- };
-
- const { getByTestId } = renderWithProvider(
-
-
- ,
- {
- state: mockedState,
- },
- );
-
- const button = getByTestId('sdk-test');
- fireEvent.press(button);
-
- const mockSdkInstance = (NativeRampsSdk as jest.Mock).mock.results[0]
- .value;
- expect(mockSdkInstance.getBuyQuote).toHaveBeenCalledWith(
- 'USD',
- 'ETH',
- 'mainnet',
- 'credit_card',
- '100',
- );
- });
- });
-
- describe('NativeRampsSdk integration', () => {
- it('allows calling SDK methods through the context', () => {
- const TestComponent = () => {
- const { sdk } = useDepositSDK();
- return (
-
- sdk?.getBuyQuote('USD', 'ETH', 'mainnet', 'credit_card', '100')
- }
- >
- Test SDK
-
- );
- };
-
- const { getByTestId } = renderWithProvider(
-
-
- ,
- {
- state: mockedState,
- },
- );
-
- const button = getByTestId('sdk-test');
- fireEvent.press(button);
-
- const mockSdkInstance = (NativeRampsSdk as jest.Mock).mock.results[0]
- .value;
- expect(mockSdkInstance.getBuyQuote).toHaveBeenCalledWith(
- 'USD',
- 'ETH',
- 'mainnet',
- 'credit_card',
- '100',
- );
- });
-
- it('throws an error when used outside of provider', () => {
- const TestComponent = () => {
- try {
- useDepositSDK();
- return This should not render;
- } catch (error) {
- return Error thrown correctly;
- }
- };
-
- renderWithProvider();
- expect(screen.getByText('Error thrown correctly')).toBeOnTheScreen();
- });
- });
-
- describe('Region Management', () => {
- it('initializes with region from Redux state', () => {
- const testRegion =
- MOCK_REGIONS.find((region) => region.isoCode === 'US') || null;
- const stateWithRegion = {
- ...mockedState,
- fiatOrders: {
- ...mockedState.fiatOrders,
- selectedRegionDeposit: testRegion,
- },
- };
-
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: stateWithRegion },
- );
-
- expect(contextValue?.selectedRegion).toEqual(testRegion);
- });
-
- it('initializes with null region when Redux state is null and geolocation is not called yet', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- expect(contextValue?.selectedRegion).toBeNull();
- });
-
- it('updates region and dispatches to Redux when setSelectedRegion is called', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- const newRegion =
- MOCK_REGIONS.find((region) => region.isoCode === 'DE') || null;
-
- act(() => {
- contextValue?.setSelectedRegion(newRegion);
- });
-
- expect(contextValue?.selectedRegion).toEqual(newRegion);
- expect(mockDispatch).toHaveBeenCalledWith({
- type: 'FIAT_SET_REGION_DEPOSIT',
- payload: newRegion,
- });
- });
- });
-
- describe('Authentication', () => {
- it('handles authentication state correctly', async () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- expect(contextValue?.isAuthenticated).toBe(false);
-
- const mockToken = {
- id: 'test-token-id',
- accessToken: 'test-token',
- ttl: 3600,
- created: new Date(),
- userId: 'test-user-id',
- };
-
- await act(async () => {
- const result = await contextValue?.setAuthToken(mockToken);
- expect(result).toBe(true);
- });
-
- await new Promise((resolve) => setTimeout(resolve, 0));
-
- expect(contextValue?.isAuthenticated).toBe(true);
- });
-
- it('checks for existing token', async () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- {
- state: mockedState,
- },
- );
-
- const result = await contextValue?.checkExistingToken();
- expect(result).toBe(false);
- });
-
- it('sets auth token and returns true when existing token is found', async () => {
- const originalMock = jest.requireMock(
- '../utils/ProviderTokenVault',
- ).getProviderToken;
-
- const mockToken = {
- id: 'existing-token-id',
- accessToken: 'existing-token',
- ttl: 3600,
- created: new Date(),
- userId: 'test-user-id',
- };
-
- jest
- .requireMock('../utils/ProviderTokenVault')
- .getProviderToken.mockResolvedValueOnce({
- success: true,
- token: mockToken,
- });
-
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- {
- state: mockedState,
- },
- );
-
- expect(contextValue?.isAuthenticated).toBe(false);
-
- const result = await act(
- async () => await contextValue?.checkExistingToken(),
- );
- expect(result).toBe(true);
- expect(contextValue?.isAuthenticated).toBe(true);
- expect(contextValue?.authToken).toEqual(mockToken);
- jest.requireMock('../utils/ProviderTokenVault').getProviderToken =
- originalMock;
- });
- it('clears authentication state when calling logoutFromProvider with default requireServerInvalidation=true', async () => {
- const resetProviderTokenMock = jest.fn().mockResolvedValue(undefined);
- jest.requireMock('../utils/ProviderTokenVault').resetProviderToken =
- resetProviderTokenMock;
-
- const logoutMock = jest.fn();
- (NativeRampsSdk as jest.Mock).mockImplementationOnce(() => ({
- setAccessToken: jest.fn(),
- logout: logoutMock,
- }));
-
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return Test Component;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- const mockToken = {
- id: 'test-token-id',
- accessToken: 'test-token',
- ttl: 3600,
- created: new Date(),
- userId: 'test-user-id',
- };
-
- await act(async () => {
- await contextValue?.setAuthToken(mockToken);
- });
-
- expect(contextValue?.isAuthenticated).toBe(true);
- expect(contextValue?.authToken).toEqual(mockToken);
-
- await act(async () => {
- await contextValue?.logoutFromProvider();
- });
-
- expect(logoutMock).toHaveBeenCalled();
- expect(resetProviderTokenMock).toHaveBeenCalled();
- expect(contextValue?.isAuthenticated).toBe(false);
- expect(contextValue?.authToken).toBeUndefined();
- });
-
- it('initializes payment method and crypto currency as null', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- {
- state: mockedState,
- },
- );
-
- expect(contextValue?.selectedPaymentMethod).toBeNull();
- expect(contextValue?.selectedCryptoCurrency).toBeNull();
- });
-
- it('allows updating payment method and crypto currency', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- {
- state: mockedState,
- },
- );
-
- const newPaymentMethod = {
- ...MOCK_CREDIT_DEBIT_CARD,
- id: 'new-method',
- };
- const newCryptoCurrency = { ...MOCK_USDC_TOKEN, symbol: 'NEW' };
-
- act(() => {
- contextValue?.setSelectedPaymentMethod(newPaymentMethod);
- contextValue?.setSelectedCryptoCurrency(newCryptoCurrency);
- });
-
- expect(contextValue?.selectedPaymentMethod).toEqual(newPaymentMethod);
- expect(contextValue?.selectedCryptoCurrency).toEqual(newCryptoCurrency);
- });
-
- it('clears authentication state when calling logoutFromProvider with requireServerInvalidation=false even if SDK logout fails', async () => {
- const resetProviderTokenMock = jest.fn().mockResolvedValue(undefined);
- jest.requireMock('../utils/ProviderTokenVault').resetProviderToken =
- resetProviderTokenMock;
-
- const logoutMock = jest
- .fn()
- .mockRejectedValue(new Error('SDK logout failed'));
- (NativeRampsSdk as jest.Mock).mockImplementationOnce(() => ({
- setAccessToken: jest.fn(),
- logout: logoutMock,
- }));
-
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return Test Component;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- const mockToken = {
- id: 'test-token-id',
- accessToken: 'test-token',
- ttl: 3600,
- created: new Date(),
- userId: 'test-user-id',
- };
-
- await act(async () => {
- await contextValue?.setAuthToken(mockToken);
- });
-
- expect(contextValue?.isAuthenticated).toBe(true);
- expect(contextValue?.authToken).toEqual(mockToken);
-
- // Should not throw even when SDK logout fails
- await act(async () => {
- await contextValue?.logoutFromProvider(false);
- });
-
- expect(resetProviderTokenMock).toHaveBeenCalled();
- expect(logoutMock).toHaveBeenCalled();
- expect(contextValue?.isAuthenticated).toBe(false);
- expect(contextValue?.authToken).toBeUndefined();
- });
-
- it('throws error when requireServerInvalidation=true and SDK logout fails', async () => {
- const resetProviderTokenMock = jest.fn().mockResolvedValue(undefined);
- jest.requireMock('../utils/ProviderTokenVault').resetProviderToken =
- resetProviderTokenMock;
-
- const logoutMock = jest
- .fn()
- .mockRejectedValue(new Error('SDK logout failed'));
- (NativeRampsSdk as jest.Mock).mockImplementationOnce(() => ({
- setAccessToken: jest.fn(),
- logout: logoutMock,
- }));
-
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return Test Component;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- const mockToken = {
- id: 'test-token-id',
- accessToken: 'test-token',
- ttl: 3600,
- created: new Date(),
- userId: 'test-user-id',
- };
-
- await act(async () => {
- await contextValue?.setAuthToken(mockToken);
- });
-
- expect(contextValue?.isAuthenticated).toBe(true);
-
- await expect(async () => {
- await contextValue?.logoutFromProvider(true);
- }).rejects.toThrow('SDK logout failed');
-
- expect(contextValue?.isAuthenticated).toBe(true);
- expect(contextValue?.authToken).toEqual(mockToken);
- });
-
- it('throws error when SDK is not initialized during logout', async () => {
- const stateWithoutProviderKeys = {
- ...mockedState,
- engine: {
- backgroundState: {
- ...backgroundState,
- RemoteFeatureFlagController: {
- remoteFeatureFlags: {
- depositConfig: {
- providerApiKey: null,
- },
- },
- },
- },
- },
- };
-
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return Test Component;
- };
-
- renderWithProvider(
-
-
- ,
- { state: stateWithoutProviderKeys },
- );
-
- await expect(async () => {
- await contextValue?.logoutFromProvider();
- }).rejects.toThrow();
- });
- });
-
- describe('Intent Management', () => {
- it('initializes with undefined intent', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- expect(contextValue?.intent).toBeUndefined();
- });
-
- it('updates intent when setIntent is called with a value', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- const newIntent = { assetId: 'eth' };
-
- act(() => {
- contextValue?.setIntent(newIntent);
- });
-
- expect(contextValue?.intent).toEqual(newIntent);
- });
-
- it('clears intent when setIntent is called with undefined', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- const newIntent = { assetId: 'eth', amount: '100' };
-
- act(() => {
- contextValue?.setIntent(newIntent);
- });
-
- expect(contextValue?.intent).toEqual(newIntent);
-
- act(() => {
- contextValue?.setIntent(undefined);
- });
-
- expect(contextValue?.intent).toBeUndefined();
- });
-
- it('updates intent when setIntent is called with setter function', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- const initialIntent = { assetId: 'eth' };
-
- act(() => {
- contextValue?.setIntent(initialIntent);
- });
-
- expect(contextValue?.intent).toEqual(initialIntent);
-
- act(() => {
- contextValue?.setIntent((prev) =>
- prev ? { ...prev, amount: '100' } : undefined,
- );
- });
-
- expect(contextValue?.intent).toEqual({ assetId: 'eth', amount: '100' });
- });
-
- it('allows partial updates to intent via setter function', () => {
- let contextValue: ReturnType | undefined;
- const TestComponent = () => {
- contextValue = useDepositSDK();
- return null;
- };
-
- renderWithProvider(
-
-
- ,
- { state: mockedState },
- );
-
- act(() => {
- contextValue?.setIntent({ assetId: 'eth', amount: '100' });
- });
-
- act(() => {
- contextValue?.setIntent((prev) =>
- prev ? { ...prev, assetId: undefined } : undefined,
- );
- });
-
- expect(contextValue?.intent).toEqual({
- assetId: undefined,
- amount: '100',
- });
- });
- });
-});
diff --git a/app/components/UI/Ramp/Deposit/sdk/index.tsx b/app/components/UI/Ramp/Deposit/sdk/index.tsx
deleted file mode 100644
index 3b89821da3a9..000000000000
--- a/app/components/UI/Ramp/Deposit/sdk/index.tsx
+++ /dev/null
@@ -1,319 +0,0 @@
-import React, {
- ProviderProps,
- createContext,
- useContext,
- useMemo,
- useState,
- useEffect,
- useCallback,
-} from 'react';
-import { Platform } from 'react-native';
-import { useDispatch, useSelector } from 'react-redux';
-import { selectDepositProviderApiKey } from '../../../../../selectors/featureFlagController/deposit';
-import {
- NativeRampsSdk,
- NativeTransakAccessToken,
- Context,
- DepositPaymentMethod,
- DepositRegion,
- DepositCryptoCurrency,
-} from '@consensys/native-ramps-sdk';
-import {
- getProviderToken,
- resetProviderToken,
- storeProviderToken,
-} from '../utils/ProviderTokenVault';
-import { getSdkEnvironment } from './getSdkEnvironment';
-import {
- fiatOrdersRegionSelectorDeposit,
- setFiatOrdersRegionDeposit,
- fiatOrdersCryptoCurrencySelectorDeposit,
- setFiatOrdersCryptoCurrencyDeposit,
- fiatOrdersPaymentMethodSelectorDeposit,
- setFiatOrdersPaymentMethodDeposit,
-} from '../../../../../reducers/fiatOrders';
-import Logger from '../../../../../util/Logger';
-import I18n, { I18nEvents, strings } from '../../../../../../locales/i18n';
-import useRampAccountAddress from '../../hooks/useRampAccountAddress';
-import { DepositNavigationParams } from '../types';
-
-export interface DepositSDK {
- sdk?: NativeRampsSdk;
- sdkError?: Error;
- providerApiKey: string | null;
- isAuthenticated: boolean;
- authToken?: NativeTransakAccessToken;
- setAuthToken: (token: NativeTransakAccessToken) => Promise;
- logoutFromProvider: (requireServerInvalidation?: boolean) => Promise;
- checkExistingToken: () => Promise;
-
- selectedWalletAddress: string | null;
- selectedRegion: DepositRegion | null;
- setSelectedRegion: (region: DepositRegion | null) => void;
- selectedPaymentMethod: DepositPaymentMethod | null;
- setSelectedPaymentMethod: (paymentMethod: DepositPaymentMethod) => void;
- selectedCryptoCurrency: DepositCryptoCurrency | null;
- setSelectedCryptoCurrency: (cryptoCurrency: DepositCryptoCurrency) => void;
- intent?: DepositNavigationParams;
- setIntent: (
- intentOrSetter:
- | DepositNavigationParams
- | ((
- previousIntent: DepositNavigationParams | undefined,
- ) => DepositNavigationParams | undefined)
- | undefined,
- ) => void;
-}
-
-const environment = getSdkEnvironment();
-
-const context =
- Platform.OS === 'ios' ? Context.MobileIOS : Context.MobileAndroid;
-export const DEPOSIT_ENVIRONMENT = environment;
-export const DepositSDKNoAuth = new NativeRampsSdk(
- {
- context,
- locale: I18n.locale,
- },
- environment,
-);
-
-export const DepositSDKContext = createContext(
- undefined,
-);
-
-export const DepositSDKProvider = ({
- value,
- ...props
-}: Partial>) => {
- const dispatch = useDispatch();
- const providerApiKey = useSelector(selectDepositProviderApiKey);
-
- const [sdk, setSdk] = useState();
- const [sdkError, setSdkError] = useState();
- const [isAuthenticated, setIsAuthenticated] = useState(false);
- const [authToken, setAuthToken] = useState();
- const [intent, setIntent] = useState(
- undefined,
- );
-
- const INITIAL_SELECTED_REGION: DepositRegion | null = useSelector(
- fiatOrdersRegionSelectorDeposit,
- );
- const INITIAL_SELECTED_CRYPTO_CURRENCY: DepositCryptoCurrency | null =
- useSelector(fiatOrdersCryptoCurrencySelectorDeposit);
- const INITIAL_SELECTED_PAYMENT_METHOD: DepositPaymentMethod | null =
- useSelector(fiatOrdersPaymentMethodSelectorDeposit);
-
- const [selectedRegion, setSelectedRegion] = useState(
- INITIAL_SELECTED_REGION,
- );
-
- const [selectedPaymentMethod, setSelectedPaymentMethod] =
- useState(INITIAL_SELECTED_PAYMENT_METHOD);
- const [selectedCryptoCurrency, setSelectedCryptoCurrency] =
- useState(INITIAL_SELECTED_CRYPTO_CURRENCY);
-
- const selectedWalletAddress = useRampAccountAddress(
- selectedCryptoCurrency?.chainId,
- );
-
- const setSelectedRegionCallback = useCallback(
- (region: DepositRegion | null) => {
- setSelectedRegion(region);
- dispatch(setFiatOrdersRegionDeposit(region));
- },
- [dispatch],
- );
-
- const setSelectedCryptoCurrencyCallback = useCallback(
- (cryptoCurrency: DepositCryptoCurrency | null) => {
- setSelectedCryptoCurrency(cryptoCurrency);
- dispatch(setFiatOrdersCryptoCurrencyDeposit(cryptoCurrency));
- },
- [dispatch],
- );
-
- const setSelectedPaymentMethodCallback = useCallback(
- (paymentMethod: DepositPaymentMethod | null) => {
- setSelectedPaymentMethod(paymentMethod);
- dispatch(setFiatOrdersPaymentMethodDeposit(paymentMethod));
- },
- [dispatch],
- );
-
- useEffect(() => {
- DepositSDKNoAuth.setLocale(I18n.locale);
- const handleLocaleChanged = (locale: string) => {
- DepositSDKNoAuth.setLocale(locale);
- };
- I18nEvents.addListener('localeChanged', handleLocaleChanged);
- return () => {
- I18nEvents.removeListener('localeChanged', handleLocaleChanged);
- };
- }, []);
-
- useEffect(() => {
- try {
- if (!providerApiKey) {
- throw new Error('Deposit SDK requires valid API key');
- }
-
- const sdkInstance = new NativeRampsSdk(
- {
- apiKey: providerApiKey,
- context,
- locale: I18n.locale,
- },
- environment,
- );
-
- setSdk(sdkInstance);
- } catch (error) {
- setSdkError(error as Error);
- }
- }, [providerApiKey]);
-
- // Listen for locale changes and update SDK locale
- useEffect(() => {
- if (!sdk) return;
-
- const handleLocaleChange = (locale: string) => {
- sdk.setLocale(locale);
- };
- I18nEvents.addListener('localeChanged', handleLocaleChange);
- return () => {
- I18nEvents.removeListener('localeChanged', handleLocaleChange);
- };
- }, [sdk]);
-
- useEffect(() => {
- if (sdk && authToken) {
- sdk.setAccessToken(authToken);
- setIsAuthenticated(true);
- }
- }, [sdk, authToken]);
-
- const checkExistingToken = useCallback(async () => {
- try {
- const tokenResponse = await getProviderToken();
-
- if (tokenResponse.success && tokenResponse.token?.accessToken) {
- setAuthToken(tokenResponse.token);
- return true;
- }
- return false;
- } catch (error) {
- Logger.error(error as Error, 'Error checking existing token:');
- return false;
- }
- }, []);
-
- const setAuthTokenCallback = useCallback(
- async (token: NativeTransakAccessToken): Promise => {
- try {
- const storeResult = await storeProviderToken(token);
- if (storeResult.success) {
- setAuthToken(token);
- setIsAuthenticated(true);
- if (sdk) {
- sdk.setAccessToken(token);
- }
- return true;
- }
- return false;
- } catch (error) {
- Logger.error(error as Error, 'Error setting auth token:');
- return false;
- }
- },
- [sdk],
- );
-
- const logoutFromProvider = useCallback(
- async (requireServerInvalidation = true) => {
- if (!sdk) {
- throw new Error(
- strings('deposit.configuration_modal.error_sdk_not_initialized'),
- );
- }
-
- requireServerInvalidation
- ? await sdk.logout()
- : await sdk
- .logout()
- .catch((error: Error) =>
- Logger.error(
- error as Error,
- 'SDK logout failed but invalidation was not required. Error:',
- ),
- );
-
- await resetProviderToken();
- setAuthToken(undefined);
- setIsAuthenticated(false);
- },
- [sdk],
- );
-
- const contextValue = useMemo(
- (): DepositSDK => ({
- sdk,
- sdkError,
- providerApiKey,
- isAuthenticated,
- authToken,
- setAuthToken: setAuthTokenCallback,
- logoutFromProvider,
- checkExistingToken,
- selectedWalletAddress,
- selectedRegion,
- setSelectedRegion: setSelectedRegionCallback,
- selectedPaymentMethod,
- setSelectedPaymentMethod: setSelectedPaymentMethodCallback,
- selectedCryptoCurrency,
- setSelectedCryptoCurrency: setSelectedCryptoCurrencyCallback,
- intent,
- setIntent,
- }),
- [
- sdk,
- sdkError,
- providerApiKey,
- isAuthenticated,
- authToken,
- setAuthTokenCallback,
- logoutFromProvider,
- checkExistingToken,
- selectedWalletAddress,
- selectedRegion,
- setSelectedRegionCallback,
- selectedPaymentMethod,
- setSelectedPaymentMethodCallback,
- selectedCryptoCurrency,
- setSelectedCryptoCurrencyCallback,
- intent,
- setIntent,
- ],
- );
-
- return (
-
- );
-};
-
-export const useDepositSDK = () => {
- const contextValue = useContext(DepositSDKContext);
- if (!contextValue) {
- throw new Error('useDepositSDK must be used within a DepositSDKProvider');
- }
- return contextValue;
-};
-
-// TODO: Replace "any" with type
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export const withDepositSDK = (Component: React.FC) => (props: any) => (
-
-
-
-);
diff --git a/app/components/UI/Ramp/Deposit/testUtils/constants.ts b/app/components/UI/Ramp/Deposit/testUtils/constants.ts
deleted file mode 100644
index 410f56757e46..000000000000
--- a/app/components/UI/Ramp/Deposit/testUtils/constants.ts
+++ /dev/null
@@ -1,445 +0,0 @@
-import { FIAT_ORDER_STATES } from '../../../../../constants/on-ramp';
-import {
- DepositOrderType,
- BuyQuote,
- DepositOrder,
- type DepositRegion,
- type DepositPaymentMethod,
- DepositPaymentMethodDuration,
- NativeTransakUserDetails,
- NativeTransakUserDetailsKycDetails,
-} from '@consensys/native-ramps-sdk';
-import { IconName } from '../../../../../component-library/components/Icons/Icon';
-import type { DepositSDK } from '../sdk';
-import {
- MOCK_USDC_TOKEN,
- MOCK_USDT_TOKEN,
- MOCK_BTC_TOKEN,
- MOCK_ETH_TOKEN,
- MOCK_USDC_SOLANA_TOKEN,
- MOCK_CRYPTOCURRENCIES,
-} from '../constants/mockCryptoCurrencies';
-
-export const MOCK_US_REGION: DepositRegion = {
- isoCode: 'US',
- flag: '🇺🇸',
- name: 'United States',
- currency: 'USD',
- phone: {
- prefix: '+1',
- placeholder: '(555) 123-4567',
- template: '(###) ###-####',
- },
- supported: true,
-};
-
-export const MOCK_EUR_REGION: DepositRegion = {
- isoCode: 'DE',
- flag: '🇩🇪',
- name: 'Germany',
- currency: 'EUR',
- phone: {
- prefix: '+49',
- placeholder: '30 12345678',
- template: '## ########',
- },
- supported: true,
-};
-
-export const MOCK_CA_REGION: DepositRegion = {
- isoCode: 'CA',
- flag: '🇨🇦',
- name: 'Canada',
- currency: 'CAD',
- phone: {
- prefix: '+1',
- placeholder: '(555) 123-4567',
- template: '(###) ###-####',
- },
- supported: true,
-};
-
-export const MOCK_UNSUPPORTED_REGION: DepositRegion = {
- isoCode: 'XX',
- flag: '🏳️',
- name: 'Unsupported Country',
- currency: 'USD',
- supported: false,
- phone: {
- prefix: '+1',
- placeholder: '(555) 123-4567',
- template: '(###) ###-####',
- },
-};
-
-export const MOCK_FR_REGION: DepositRegion = {
- isoCode: 'FR',
- flag: '🇫🇷',
- name: 'France',
- phone: {
- prefix: '+33',
- placeholder: '1 23 45 67 89',
- template: 'X XX XX XX XX',
- },
- currency: 'EUR',
- supported: true,
-};
-
-export const MOCK_REGIONS: DepositRegion[] = [MOCK_US_REGION, MOCK_EUR_REGION];
-
-export const MOCK_REGIONS_EXTENDED: DepositRegion[] = [
- { ...MOCK_US_REGION, recommended: true },
- MOCK_EUR_REGION,
- { ...MOCK_CA_REGION, supported: false },
- MOCK_FR_REGION,
-];
-
-// ====== CRYPTOCURRENCIES ======
-// Re-exported from constants/mockCryptoCurrencies.ts
-export {
- MOCK_USDC_TOKEN,
- MOCK_USDT_TOKEN,
- MOCK_BTC_TOKEN,
- MOCK_ETH_TOKEN,
- MOCK_USDC_SOLANA_TOKEN,
- MOCK_CRYPTOCURRENCIES,
-};
-
-export const MOCK_CREDIT_DEBIT_CARD: DepositPaymentMethod = {
- id: 'credit_debit_card',
- name: 'Debit or Credit',
- duration: DepositPaymentMethodDuration.instant,
- icon: IconName.Card,
-};
-
-export const MOCK_SEPA_BANK_TRANSFER_PAYMENT_METHOD: DepositPaymentMethod = {
- id: 'sepa_bank_transfer',
- name: 'SEPA Bank Transfer',
- shortName: 'SEPA',
- duration: DepositPaymentMethodDuration.oneToTwoDays,
- icon: IconName.Bank,
-};
-
-export const MOCK_APPLE_PAY: DepositPaymentMethod = {
- id: 'apple_pay',
- name: 'Apple Pay',
- duration: DepositPaymentMethodDuration.instant,
- icon: IconName.Apple,
- iconColor: {
- light: 'var(--color-icon-default)',
- dark: 'var(--color-icon-default)',
- },
-};
-
-export const MOCK_PAYMENT_METHODS: DepositPaymentMethod[] = [
- MOCK_CREDIT_DEBIT_CARD,
- MOCK_APPLE_PAY,
-];
-
-export const MOCK_BUY_QUOTE: BuyQuote = {
- quoteId: 'test-quote-id',
- conversionPrice: 2000,
- marketConversionPrice: 2000,
- slippage: 0.01,
- fiatCurrency: 'USD',
- cryptoCurrency: 'USDC',
- paymentMethod: 'credit_debit_card',
- fiatAmount: 100,
- cryptoAmount: 0.05,
- isBuyOrSell: 'buy',
- network: 'eip155:1',
- feeDecimal: 0.025,
- totalFee: 2.5,
- feeBreakdown: [],
- nonce: 12345,
- cryptoLiquidityProvider: 'test-provider',
- notes: [],
-};
-
-export const MOCK_DEPOSIT_ORDER: Partial = {
- id: 'test-order-id',
- provider: 'test-provider',
- createdAt: 1673886669608,
- fiatAmount: 100,
- totalFeesFiat: 2.5,
- cryptoAmount: 0.05,
- cryptoCurrency: MOCK_USDC_TOKEN,
- fiatCurrency: 'USD',
- network: { chainId: 'eip155:1', name: 'Ethereum' },
- status: 'COMPLETED',
- orderType: DepositOrderType.Deposit,
- walletAddress: '0x1234567890123456789012345678901234567890',
- txHash: '0x987654321',
- exchangeRate: 2000,
- networkFees: 1.25,
- partnerFees: 1.25,
- paymentMethod: MOCK_CREDIT_DEBIT_CARD,
-};
-
-export const MOCK_BANK_DETAILS_ORDER = {
- id: 'test-order-id',
- state: FIAT_ORDER_STATES.CREATED,
- data: {
- id: 'deposit-order-id',
- provider: 'test-provider',
- createdAt: Date.now(),
- fiatAmount: 100,
- fiatCurrency: 'USD',
- cryptoCurrency: MOCK_USDC_TOKEN,
- network: { chainId: 'eip155:1', name: 'Ethereum' },
- status: 'created',
- orderType: 'buy',
- walletAddress: '0x123...',
- paymentMethod: {
- id: 'sepa_bank_transfer',
- name: 'SEPA Bank Transfer',
- duration: DepositPaymentMethodDuration.oneToTwoDays,
- icon: IconName.Bank,
- },
- paymentDetails: [
- {
- fiatCurrency: 'USD',
- paymentMethod: 'sepa_bank_transfer',
- fields: [
- { name: 'Amount', value: '$100.00', id: 'amount' },
- { name: 'First Name (Beneficiary)', value: 'john', id: 'firstName' },
- { name: 'Last Name (Beneficiary)', value: 'doe', id: 'lastName' },
- { name: 'Account Number', value: '1234567890', id: 'accountNumber' },
- { name: 'Bank Name', value: 'test bank', id: 'bankName' },
- {
- name: 'Recipient Address',
- value: '456 recipient street',
- id: 'recipientAddress',
- },
- { name: 'Bank Address', value: '123 bank street', id: 'bankAddress' },
- ],
- },
- ],
- },
-};
-
-export const createMockSDKReturn = (overrides = {}): DepositSDK => ({
- sdk: undefined,
- sdkError: undefined,
- providerApiKey: null,
- isAuthenticated: false,
- authToken: undefined,
- setAuthToken: jest.fn().mockResolvedValue(true),
- logoutFromProvider: jest.fn().mockResolvedValue(undefined),
- checkExistingToken: jest.fn().mockResolvedValue(false),
- selectedWalletAddress: '0x1234567890123456789012345678901234567890',
- selectedRegion: MOCK_US_REGION,
- setSelectedRegion: jest.fn(),
- selectedPaymentMethod: MOCK_CREDIT_DEBIT_CARD,
- setSelectedPaymentMethod: jest.fn(),
- selectedCryptoCurrency: MOCK_USDC_TOKEN,
- setSelectedCryptoCurrency: jest.fn(),
- intent: undefined,
- setIntent: jest.fn(),
- ...overrides,
-});
-
-export const MOCK_USE_REGIONS_RETURN = {
- userRegionLocked: false,
- regions: MOCK_REGIONS,
- error: null,
- isFetching: false,
- retryFetchRegions: jest.fn(),
-};
-
-export const MOCK_USE_CRYPTOCURRENCIES_RETURN = {
- cryptoCurrencies: MOCK_CRYPTOCURRENCIES,
- error: null,
- isFetching: false,
- retryFetchCryptoCurrencies: jest.fn(),
-};
-
-export const MOCK_USE_PAYMENT_METHODS_RETURN = {
- paymentMethods: MOCK_PAYMENT_METHODS,
- error: null,
- isFetching: false,
- retryFetchPaymentMethods: jest.fn(),
-};
-
-export const MOCK_USE_DEPOSIT_TOKEN_EXCHANGE_RETURN = {
- tokenAmount: '0.05',
- isLoadingTokenAmount: false,
- errorLoadingTokenAmount: null,
-};
-
-export const MOCK_USE_ACCOUNT_TOKEN_COMPATIBLE_RETURN = {
- isAccountTokenCompatible: true,
- isLoadingAccountTokenCompatible: false,
- errorLoadingAccountTokenCompatible: null,
-};
-
-export const MOCK_USE_DEPOSIT_SDK_METHOD_RETURN = {
- data: null,
- error: null as string | null,
- isFetching: false,
-};
-
-export const MOCK_ANALYTICS_DEPOSIT_ORDER = {
- id: '123',
- provider: 'DEPOSIT',
- createdAt: Date.now(),
- account: '0x1234567890123456789012345678901234567890',
- excludeFromPurchases: false,
- orderType: DepositOrderType.Deposit,
- amount: '100',
- currency: 'USD',
- cryptoAmount: '0.05',
- cryptocurrency: 'USDC',
- fee: '2.50',
- state: FIAT_ORDER_STATES.COMPLETED,
- network: 'eip155:1',
- data: {
- provider: 'TRANSAK',
- cryptoCurrency: MOCK_USDC_TOKEN,
- network: { chainId: 'eip155:1', name: 'Ethereum' },
- fiatAmount: '100',
- exchangeRate: '2000',
- totalFeesFiat: '2.50',
- networkFees: '1.25',
- partnerFees: '1.25',
- paymentMethod: MOCK_CREDIT_DEBIT_CARD,
- fiatCurrency: 'USD',
- },
-};
-
-export const FIXED_DATE = new Date(2024, 0, 1);
-export const FIXED_TIMESTAMP = FIXED_DATE.getTime();
-
-export const DEFAULT_WALLET_ADDRESS =
- '0x1234567890123456789012345678901234567890';
-export const TEST_QUOTE_ID = 'test-quote-id';
-export const TEST_ORDER_ID = 'test-order-id';
-export const TEST_PROVIDER = 'test-provider';
-
-export const MOCK_USE_REGIONS_ERROR = {
- userRegionLocked: false,
- regions: null,
- error: 'Failed to fetch regions',
- isFetching: false,
- retryFetchRegions: jest.fn(),
-};
-
-export const MOCK_USE_CRYPTOCURRENCIES_ERROR = {
- cryptoCurrencies: null,
- error: 'Failed to fetch cryptos',
- isFetching: false,
- retryFetchCryptoCurrencies: jest.fn(),
-};
-
-export const MOCK_USE_PAYMENT_METHODS_ERROR = {
- paymentMethods: null,
- error: 'Failed to fetch payment methods',
- isFetching: false,
- retryFetchPaymentMethods: jest.fn(),
-};
-
-export const MOCK_USE_REGIONS_LOADING = {
- userRegionLocked: false,
- regions: null,
- error: null,
- isFetching: true,
- retryFetchRegions: jest.fn(),
-};
-
-export const MOCK_USE_CRYPTOCURRENCIES_LOADING = {
- cryptoCurrencies: null,
- error: null,
- isFetching: true,
- retryFetchCryptoCurrencies: jest.fn(),
-};
-
-export const MOCK_USE_PAYMENT_METHODS_LOADING = {
- paymentMethods: null,
- error: null,
- isFetching: true,
- retryFetchPaymentMethods: jest.fn(),
-};
-
-export const MOCK_USE_REGIONS_EMPTY = {
- userRegionLocked: false,
- regions: [],
- error: null,
- isFetching: false,
- retryFetchRegions: jest.fn(),
-};
-
-export const MOCK_USE_CRYPTOCURRENCIES_EMPTY = {
- cryptoCurrencies: [],
- error: null,
- isFetching: false,
- retryFetchCryptoCurrencies: jest.fn(),
-};
-
-export const MOCK_USE_PAYMENT_METHODS_EMPTY = {
- paymentMethods: [],
- error: null,
- isFetching: false,
- retryFetchPaymentMethods: jest.fn(),
-};
-
-export const MOCK_USER_DETAILS_DEFAULT = {
- id: 'user-id',
- firstName: 'Test',
- lastName: 'User',
- email: 'test@example.com',
- mobileNumber: '1234567890',
- status: 'active',
- dob: '1990-01-01',
- kyc: {
- l1: {
- status: 'APPROVED',
- type: 'BASIC',
- updatedAt: '2023-01-01',
- kycSubmittedAt: '2023-01-01',
- },
- } as unknown as NativeTransakUserDetailsKycDetails,
- createdAt: '2023-01-01',
- isKycApproved: jest.fn().mockReturnValue(true),
-};
-
-export const MOCK_USER_DETAILS_US = {
- ...MOCK_USER_DETAILS_DEFAULT,
- id: 'user-id-us',
- address: {
- addressLine1: '123 Main St',
- addressLine2: '',
- state: 'CA',
- city: 'San Francisco',
- postCode: '94101',
- country: 'United States',
- countryCode: 'US',
- },
-} as NativeTransakUserDetails;
-
-export const MOCK_USER_DETAILS_FR = {
- ...MOCK_USER_DETAILS_DEFAULT,
- id: 'user-id-fr',
- address: {
- addressLine1: '123 Rue de la Paix',
- addressLine2: '',
- state: 'Île-de-France',
- city: 'Paris',
- postCode: '75001',
- country: 'France',
- countryCode: 'FR',
- },
-} as NativeTransakUserDetails;
-
-export const MOCK_USE_DEPOSIT_USER_RETURN = {
- userDetails: null,
- error: null,
- isFetching: false,
- fetchUserDetails: jest.fn(),
-};
-
-export const MOCK_USE_DEPOSIT_USER_ERROR = {
- userDetails: null,
- error: 'Failed to fetch user details',
- isFetching: false,
- fetchUserDetails: jest.fn(),
-};
diff --git a/app/components/UI/Ramp/Deposit/testUtils/index.ts b/app/components/UI/Ramp/Deposit/testUtils/index.ts
deleted file mode 100644
index a348f3a9819a..000000000000
--- a/app/components/UI/Ramp/Deposit/testUtils/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-export * from './constants';
-
-export const createMockHookReturn = (
- defaultReturn: T,
- overrides: Partial = {},
-): T => ({
- ...defaultReturn,
- ...overrides,
-});
-
-export const createMockSDKMethods = () => ({
- mockGetQuote: jest.fn(),
- mockRouteAfterAuthentication: jest.fn(),
- mockNavigateToVerifyIdentity: jest.fn(),
- mockTrackEvent: jest.fn(),
- mockPostKycForm: jest.fn(),
- mockSubmitSsnDetails: jest.fn(),
- mockConfirmPayment: jest.fn(),
- mockCancelOrder: jest.fn(),
-});
-
-export const createMockNavigation = () => ({
- mockNavigate: jest.fn(),
- mockGoBack: jest.fn(),
- mockSetNavigationOptions: jest.fn(),
- mockSetParams: jest.fn(),
- mockPop: jest.fn(),
-});
diff --git a/app/components/UI/Ramp/Deposit/types/index.ts b/app/components/UI/Ramp/Deposit/types/index.ts
deleted file mode 100644
index 0bc7ea816c93..000000000000
--- a/app/components/UI/Ramp/Deposit/types/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './analytics';
-export * from './navigationParams';
diff --git a/app/components/UI/Ramp/Views/HeadlessPlayground/HeadlessPlayground.tsx b/app/components/UI/Ramp/Views/HeadlessPlayground/HeadlessPlayground.tsx
index 43ef81a484cb..f8b864a34472 100644
--- a/app/components/UI/Ramp/Views/HeadlessPlayground/HeadlessPlayground.tsx
+++ b/app/components/UI/Ramp/Views/HeadlessPlayground/HeadlessPlayground.tsx
@@ -39,7 +39,7 @@ import {
type QuotesResponse,
} from '../../headless';
import type { Quote } from '../../types';
-import { RAMP_SURFACE } from '../../Deposit/types/analytics';
+import { RAMP_SURFACE } from '../../types/depositAnalytics';
import styleSheet from './HeadlessPlayground.styles';
diff --git a/app/components/UI/Ramp/Views/Modals/SettingsModal/SettingsModal.test.tsx b/app/components/UI/Ramp/Views/Modals/SettingsModal/SettingsModal.test.tsx
index b9b9818b8de8..22f02c274168 100644
--- a/app/components/UI/Ramp/Views/Modals/SettingsModal/SettingsModal.test.tsx
+++ b/app/components/UI/Ramp/Views/Modals/SettingsModal/SettingsModal.test.tsx
@@ -10,7 +10,7 @@ import { ToastContext } from '../../../../../../component-library/components/Toa
import {
getProviderToken,
resetProviderToken,
-} from '../../../Deposit/utils/ProviderTokenVault';
+} from '../../../utils/ProviderTokenVault';
import { PROVIDER_LINKS } from '../../../Aggregator/types';
import type { Provider } from '@metamask/ramps-controller';
@@ -72,7 +72,7 @@ const createMockTransakStagingProvider = (
...overrides,
});
-jest.mock('../../../Deposit/utils/ProviderTokenVault', () => ({
+jest.mock('../../../utils/ProviderTokenVault', () => ({
getProviderToken: jest.fn(),
resetProviderToken: jest.fn(),
}));
diff --git a/app/components/UI/Ramp/Views/Modals/SettingsModal/SettingsModal.tsx b/app/components/UI/Ramp/Views/Modals/SettingsModal/SettingsModal.tsx
index ca73b015fc54..0b4df3703ad7 100644
--- a/app/components/UI/Ramp/Views/Modals/SettingsModal/SettingsModal.tsx
+++ b/app/components/UI/Ramp/Views/Modals/SettingsModal/SettingsModal.tsx
@@ -32,7 +32,7 @@ import { MetaMetricsEvents } from '../../../../../../core/Analytics';
import {
getProviderToken,
resetProviderToken,
-} from '../../../Deposit/utils/ProviderTokenVault';
+} from '../../../utils/ProviderTokenVault';
import { PROVIDER_LINKS } from '../../../Aggregator/types';
import { useElevatedSurface } from '../../../../../../util/theme/themeUtils';
diff --git a/app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.styles.ts b/app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.styles.ts
similarity index 84%
rename from app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.styles.ts
rename to app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.styles.ts
index b72947b4fd1b..d550a4483166 100644
--- a/app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.styles.ts
+++ b/app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../../util/theme/models';
+import { Theme } from '../../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.test.tsx b/app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.test.tsx
similarity index 77%
rename from app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.test.tsx
rename to app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.test.tsx
index d3adfe174009..14239db4a2b0 100644
--- a/app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.test.tsx
+++ b/app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.test.tsx
@@ -1,9 +1,9 @@
import React from 'react';
import { screen } from '@testing-library/react-native';
import SsnInfoModal from './SsnInfoModal';
-import { renderScreen } from '../../../../../../../util/test/renderWithProvider';
-import { backgroundState } from '../../../../../../../util/test/initial-root-state';
-import { strings } from '../../../../../../../../locales/i18n';
+import { renderScreen } from '../../../../../../util/test/renderWithProvider';
+import { backgroundState } from '../../../../../../util/test/initial-root-state';
+import { strings } from '../../../../../../../locales/i18n';
function renderWithProvider(component: React.ComponentType) {
return renderScreen(
diff --git a/app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.tsx b/app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.tsx
similarity index 65%
rename from app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.tsx
rename to app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.tsx
index add3193a3c22..00fd451b3e71 100644
--- a/app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/SsnInfoModal.tsx
+++ b/app/components/UI/Ramp/Views/Modals/SsnInfoModal/SsnInfoModal.tsx
@@ -7,18 +7,18 @@ import styleSheet from './SsnInfoModal.styles';
import Text, {
TextVariant,
TextColor,
-} from '../../../../../../../component-library/components/Texts/Text';
+} from '../../../../../../component-library/components/Texts/Text';
import BottomSheet, {
BottomSheetRef,
-} from '../../../../../../../component-library/components/BottomSheets/BottomSheet';
-import { useStyles } from '../../../../../../hooks/useStyles';
-import { createNavigationDetails } from '../../../../../../../util/navigation/navUtils';
-import { strings } from '../../../../../../../../locales/i18n';
-import Routes from '../../../../../../../constants/navigation/Routes';
+} from '../../../../../../component-library/components/BottomSheets/BottomSheet';
+import { useStyles } from '../../../../../hooks/useStyles';
+import { createNavigationDetails } from '../../../../../../util/navigation/navUtils';
+import { strings } from '../../../../../../../locales/i18n';
+import Routes from '../../../../../../constants/navigation/Routes';
export const createSsnInfoModalNavigationDetails = createNavigationDetails(
- Routes.DEPOSIT.MODALS.ID,
- Routes.DEPOSIT.MODALS.SSN_INFO,
+ Routes.RAMP.MODALS.ID,
+ Routes.RAMP.MODALS.SSN_INFO,
);
function SsnInfoModal() {
diff --git a/app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/index.ts b/app/components/UI/Ramp/Views/Modals/SsnInfoModal/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/Views/Modals/SsnInfoModal/index.ts
rename to app/components/UI/Ramp/Views/Modals/SsnInfoModal/index.ts
diff --git a/app/components/UI/Ramp/Deposit/Views/Modals/StateSelectorModal/StateSelectorModal.styles.ts b/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.styles.ts
similarity index 93%
rename from app/components/UI/Ramp/Deposit/Views/Modals/StateSelectorModal/StateSelectorModal.styles.ts
rename to app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.styles.ts
index d7c495a2e199..303d406f52bb 100644
--- a/app/components/UI/Ramp/Deposit/Views/Modals/StateSelectorModal/StateSelectorModal.styles.ts
+++ b/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../../util/theme/models';
+import { Theme } from '../../../../../../util/theme/models';
interface StateSelectorModalStyleSheetVars {
screenHeight: number;
diff --git a/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.test.tsx b/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.test.tsx
index 93b165f37c53..8556d7e40a44 100644
--- a/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.test.tsx
+++ b/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.test.tsx
@@ -42,7 +42,7 @@ function renderWithProvider(component: React.ComponentType) {
);
}
-jest.mock('../../../Deposit/constants', () => ({
+jest.mock('../../../constants', () => ({
US_STATES: [
{ code: 'CA', name: 'California' },
{ code: 'NY', name: 'New York' },
diff --git a/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.tsx b/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.tsx
index 82f2eafbe118..1587257783ef 100644
--- a/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.tsx
+++ b/app/components/UI/Ramp/Views/Modals/StateSelectorModal/StateSelectorModal.tsx
@@ -18,13 +18,13 @@ import ListItemColumn, {
} from '../../../../../../component-library/components/List/ListItemColumn';
import TextFieldSearch from '../../../../../../component-library/components/Form/TextFieldSearch';
-import styleSheet from '../../../Deposit/Views/Modals/StateSelectorModal/StateSelectorModal.styles';
+import styleSheet from './StateSelectorModal.styles';
import { useStyles } from '../../../../../hooks/useStyles';
import {
createNavigationDetails,
useParams,
} from '../../../../../../util/navigation/navUtils';
-import { US_STATES } from '../../../Deposit/constants';
+import { US_STATES } from '../../../constants';
import Routes from '../../../../../../constants/navigation/Routes';
import { strings } from '../../../../../../../locales/i18n';
import { createUnsupportedStateModalNavigationDetails } from '../UnsupportedStateModal/UnsupportedStateModal';
diff --git a/app/components/UI/Ramp/Deposit/Views/AdditionalVerification/AdditionalVerification.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.styles.ts
similarity index 88%
rename from app/components/UI/Ramp/Deposit/Views/AdditionalVerification/AdditionalVerification.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.styles.ts
index eca48ef362cb..88e69212c44f 100644
--- a/app/components/UI/Ramp/Deposit/Views/AdditionalVerification/AdditionalVerification.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.styles.ts
@@ -1,5 +1,5 @@
import { Dimensions, StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const screenWidth = Dimensions.get('window').width;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.test.tsx
index d62bedb7408a..b23fb7022f2e 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.test.tsx
@@ -39,10 +39,7 @@ jest.mock('../../../../../util/navigation/navUtils', () => ({
}),
}));
-jest.mock(
- '../../Deposit/assets/additional-verification.png',
- () => 'mock-image',
-);
+jest.mock('../../assets/additional-verification.png', () => 'mock-image');
const renderWithTheme = (component: React.ReactElement) =>
render(
diff --git a/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.tsx b/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.tsx
index d6252719b07f..f382f1e026c0 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/AdditionalVerification.tsx
@@ -9,11 +9,11 @@ import {
HeaderStandard,
} from '@metamask/design-system-react-native';
import { useStyles } from '../../../../hooks/useStyles';
-import styleSheet from '../../Deposit/Views/AdditionalVerification/AdditionalVerification.styles';
+import styleSheet from './AdditionalVerification.styles';
import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import { useNavigation } from '@react-navigation/native';
-import PoweredByTransak from '../../Deposit/components/PoweredByTransak';
-import additionalVerificationImage from '../../Deposit/assets/additional-verification.png';
+import PoweredByTransak from '../../components/PoweredByTransak';
+import additionalVerificationImage from '../../assets/additional-verification.png';
import { strings } from '../../../../../../locales/i18n';
import { type TransakBuyQuote } from '@metamask/ramps-controller';
import { useTransakRouting } from '../../hooks/useTransakRouting';
diff --git a/app/components/UI/Ramp/Deposit/Views/BankDetails/BankDetails.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/BankDetails.styles.ts
similarity index 92%
rename from app/components/UI/Ramp/Deposit/Views/BankDetails/BankDetails.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/BankDetails.styles.ts
index 6d2251d94348..384c051d3a32 100644
--- a/app/components/UI/Ramp/Deposit/Views/BankDetails/BankDetails.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/BankDetails.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/BankDetails.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/BankDetails.test.tsx
index 6ad672aca60f..e251943f7a4f 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/BankDetails.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/BankDetails.test.tsx
@@ -103,7 +103,7 @@ jest.mock('../../../../hooks/useThunkDispatch', () => ({
default: () => jest.fn(),
}));
-jest.mock('../../Deposit/utils', () => ({
+jest.mock('../../utils/depositUtils', () => ({
hasDepositOrderField: (data: unknown, field: string) => {
if (!data || typeof data !== 'object') return false;
return field in (data as Record);
@@ -111,13 +111,6 @@ jest.mock('../../Deposit/utils', () => ({
generateThemeParameters: jest.fn(() => ({})),
}));
-jest.mock('../../Deposit/orderProcessor', () => ({
- depositOrderToFiatOrder: jest.fn((order) => ({
- ...order,
- orderType: 'BUY',
- })),
-}));
-
jest.mock(
'../../../../../component-library/components-temp/Loader/Loader',
() => {
@@ -130,7 +123,7 @@ jest.mock(
},
);
-jest.mock('../../Deposit/components/BankDetailRow', () => {
+jest.mock('../../components/BankDetailRow', () => {
const { createElement } = jest.requireActual('react');
const { View, Text } = jest.requireActual('react-native');
return {
diff --git a/app/components/UI/Ramp/Views/NativeFlow/BankDetails.tsx b/app/components/UI/Ramp/Views/NativeFlow/BankDetails.tsx
index bc5c64c1b26c..c8f8e3ea8140 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/BankDetails.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/BankDetails.tsx
@@ -14,7 +14,7 @@ import {
} from '@metamask/design-system-react-native';
import { View, TouchableOpacity, RefreshControl } from 'react-native';
import { ScrollView } from 'react-native-gesture-handler';
-import styleSheet from '../../Deposit/Views/BankDetails/BankDetails.styles';
+import styleSheet from './BankDetails.styles';
import { useNavigation } from '@react-navigation/native';
import { useParams } from '../../../../../util/navigation/navUtils';
import Routes from '../../../../../constants/navigation/Routes';
@@ -22,14 +22,14 @@ import { useStyles } from '../../../../hooks/useStyles';
import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import { strings } from '../../../../../../locales/i18n';
import Loader from '../../../../../component-library/components-temp/Loader/Loader';
-import BankDetailRow from '../../Deposit/components/BankDetailRow';
+import BankDetailRow from '../../components/BankDetailRow';
import {
RampsOrderStatus,
type TransakDepositOrder,
normalizeProviderCode,
} from '@metamask/ramps-controller';
import { useTheme } from '../../../../../util/theme';
-import PrivacySection from '../../Deposit/components/PrivacySection';
+import PrivacySection from '../../components/PrivacySection';
import useAnalytics from '../../hooks/useAnalytics';
import Logger from '../../../../../util/Logger';
diff --git a/app/components/UI/Ramp/Deposit/Views/BasicInfo/BasicInfo.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.styles.ts
similarity index 94%
rename from app/components/UI/Ramp/Deposit/Views/BasicInfo/BasicInfo.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/BasicInfo.styles.ts
index af8907bcdfe7..afcfe81e5f05 100644
--- a/app/components/UI/Ramp/Deposit/Views/BasicInfo/BasicInfo.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.test.tsx
index 71b93e53e4db..b439272c6d71 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.test.tsx
@@ -94,12 +94,12 @@ jest.mock('../../../../../util/Logger', () => ({
error: jest.fn(),
}));
-jest.mock('../../Deposit/utils', () => ({
+jest.mock('../../utils/depositUtils', () => ({
timestampToTransakFormat: (ts: string) => (ts ? '1990-01-01' : ''),
generateThemeParameters: jest.fn(() => ({})),
}));
-jest.mock('../../Deposit/constants/constants', () => ({
+jest.mock('../../constants/transak', () => ({
VALIDATION_REGEX: {
firstName: /^[a-zA-Z\s'-]+$/,
lastName: /^[a-zA-Z\s'-]+$/,
@@ -108,14 +108,11 @@ jest.mock('../../Deposit/constants/constants', () => ({
},
}));
-jest.mock(
- '../../Deposit/components/DepositPhoneField/formatNumberToTemplate',
- () => ({
- formatNumberToTemplate: (num: string) => num,
- }),
-);
+jest.mock('../../utils/formatNumberToTemplate', () => ({
+ formatNumberToTemplate: (num: string) => num,
+}));
-jest.mock('../../Deposit/hooks/useForm', () => ({
+jest.mock('../../hooks/useForm', () => ({
useForm: >({
initialFormData,
validateForm,
diff --git a/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.tsx b/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.tsx
index 48d73bc56d3a..6be338d806b7 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/BasicInfo.tsx
@@ -22,19 +22,19 @@ import {
} from '@metamask/design-system-react-native';
import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import { useStyles } from '../../../../hooks/useStyles';
-import styleSheet from '../../Deposit/Views/BasicInfo/BasicInfo.styles';
+import styleSheet from './BasicInfo.styles';
import { useParams } from '../../../../../util/navigation/navUtils';
import Routes from '../../../../../constants/navigation/Routes';
import { strings } from '../../../../../../locales/i18n';
-import DepositTextField from '../../Deposit/components/DepositTextField';
-import { useForm } from '../../Deposit/hooks/useForm';
-import DepositProgressBar from '../../Deposit/components/DepositProgressBar';
-import DepositDateField from '../../Deposit/components/DepositDateField';
-import { VALIDATION_REGEX } from '../../Deposit/constants/constants';
-import { formatNumberToTemplate } from '../../Deposit/components/DepositPhoneField/formatNumberToTemplate';
-import PoweredByTransak from '../../Deposit/components/PoweredByTransak';
-import PrivacySection from '../../Deposit/components/PrivacySection';
-import { timestampToTransakFormat } from '../../Deposit/utils';
+import DepositTextField from '../../components/DepositTextField';
+import { useForm } from '../../hooks/useForm';
+import DepositProgressBar from '../../components/DepositProgressBar';
+import DepositDateField from '../../components/DepositDateField';
+import { VALIDATION_REGEX } from '../../constants/transak';
+import { formatNumberToTemplate } from '../../utils/formatNumberToTemplate';
+import PoweredByTransak from '../../components/PoweredByTransak';
+import PrivacySection from '../../components/PrivacySection';
+import { timestampToTransakFormat } from '../../utils/depositUtils';
import useAnalytics from '../../hooks/useAnalytics';
import Logger from '../../../../../util/Logger';
import BannerAlert from '../../../../../component-library/components/Banners/Banner/variants/BannerAlert/BannerAlert';
@@ -49,7 +49,7 @@ import {
isTransakPhoneRegisteredError,
type TransakBuyQuote,
} from '@metamask/ramps-controller';
-import type { AddressFormData } from '../../Deposit/Views/EnterAddress/EnterAddress';
+import type { AddressFormData } from '../../types/transakNativeForms';
import { parseUserFacingError } from '../../utils/parseUserFacingError';
import { useHeadlessRampProps } from '../../headless/useHeadlessRampProps';
import { BASIC_INFO_TEST_IDS } from './BasicInfo.testIds';
diff --git a/app/components/UI/Ramp/Deposit/Views/EnterAddress/EnterAddress.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.styles.ts
similarity index 94%
rename from app/components/UI/Ramp/Deposit/Views/EnterAddress/EnterAddress.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/EnterAddress.styles.ts
index 87f52fc9fcf4..e14ac312c94d 100644
--- a/app/components/UI/Ramp/Deposit/Views/EnterAddress/EnterAddress.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.test.tsx
index 002a5ffc9d1f..4deec5e9e32b 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.test.tsx
@@ -77,7 +77,7 @@ jest.mock('../../../../../util/Logger', () => ({
error: jest.fn(),
}));
-jest.mock('../../Deposit/constants/constants', () => ({
+jest.mock('../../constants/transak', () => ({
VALIDATION_REGEX: {
addressLine1: /^.{1,100}$/,
addressLine2: /^.{0,100}$/,
@@ -92,7 +92,7 @@ jest.mock('../../Deposit/constants/constants', () => ({
],
}));
-jest.mock('../../Deposit/hooks/useForm', () => ({
+jest.mock('../../hooks/useForm', () => ({
useForm: >({
initialFormData,
validateForm,
diff --git a/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.tsx b/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.tsx
index 098a632afdc7..6b4b71d46b27 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/EnterAddress.tsx
@@ -12,15 +12,15 @@ import {
} from '@metamask/design-system-react-native';
import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import { useStyles } from '../../../../hooks/useStyles';
-import styleSheet from '../../Deposit/Views/EnterAddress/EnterAddress.styles';
+import styleSheet from './EnterAddress.styles';
import { useParams } from '../../../../../util/navigation/navUtils';
import { strings } from '../../../../../../locales/i18n';
-import DepositTextField from '../../Deposit/components/DepositTextField';
-import { useForm } from '../../Deposit/hooks/useForm';
-import DepositProgressBar from '../../Deposit/components/DepositProgressBar';
-import PoweredByTransak from '../../Deposit/components/PoweredByTransak';
-import PrivacySection from '../../Deposit/components/PrivacySection';
-import { VALIDATION_REGEX } from '../../Deposit/constants/constants';
+import DepositTextField from '../../components/DepositTextField';
+import { useForm } from '../../hooks/useForm';
+import DepositProgressBar from '../../components/DepositProgressBar';
+import PoweredByTransak from '../../components/PoweredByTransak';
+import PrivacySection from '../../components/PrivacySection';
+import { VALIDATION_REGEX } from '../../constants/transak';
import Logger from '../../../../../util/Logger';
import useAnalytics from '../../hooks/useAnalytics';
import BannerAlert from '../../../../../component-library/components/Banners/Banner/variants/BannerAlert/BannerAlert';
diff --git a/app/components/UI/Ramp/Deposit/Views/EnterEmail/EnterEmail.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.styles.ts
similarity index 88%
rename from app/components/UI/Ramp/Deposit/Views/EnterEmail/EnterEmail.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/EnterEmail.styles.ts
index 6f4c3fbc7116..8d362dd9311e 100644
--- a/app/components/UI/Ramp/Deposit/Views/EnterEmail/EnterEmail.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.test.tsx
index dcff4e01e6d9..51660c351ba3 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.test.tsx
@@ -52,23 +52,20 @@ jest.mock('../../../../hooks/useAnalytics/useAnalytics', () => ({
}),
}));
-jest.mock('../../Deposit/utils', () => ({
- ...jest.requireActual('../../Deposit/utils'),
+jest.mock('../../utils/depositUtils', () => ({
+ ...jest.requireActual('../../utils/depositUtils'),
validateEmail: (email: string) => /\S+@\S+\.\S+/.test(email),
generateThemeParameters: jest.fn(() => ({})),
}));
-jest.mock(
- '../../Deposit/components/DepositProgressBar/DepositProgressBar',
- () => {
- const { createElement } = jest.requireActual('react');
- const { View } = jest.requireActual('react-native');
- return {
- __esModule: true,
- default: () => createElement(View, { testID: 'deposit-progress-bar' }),
- };
- },
-);
+jest.mock('../../components/DepositProgressBar/DepositProgressBar', () => {
+ const { createElement } = jest.requireActual('react');
+ const { View } = jest.requireActual('react-native');
+ return {
+ __esModule: true,
+ default: () => createElement(View, { testID: 'deposit-progress-bar' }),
+ };
+});
const renderWithTheme = (component: React.ReactElement) =>
render(
diff --git a/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.tsx b/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.tsx
index 93c9c956860f..f37b0fe7b5d4 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/EnterEmail.tsx
@@ -9,7 +9,7 @@ import {
HeaderStandard,
} from '@metamask/design-system-react-native';
import { useStyles } from '../../../../hooks/useStyles';
-import styleSheet from '../../Deposit/Views/EnterEmail/EnterEmail.styles';
+import styleSheet from './EnterEmail.styles';
import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import {
createNavigationDetails,
@@ -20,9 +20,9 @@ import { useNavigation } from '@react-navigation/native';
import { strings } from '../../../../../../locales/i18n';
import TextField from '../../../../../component-library/components/Form/TextField';
import { createV2OtpCodeNavDetails } from './OtpCode';
-import { validateEmail } from '../../Deposit/utils';
-import DepositProgressBar from '../../Deposit/components/DepositProgressBar/DepositProgressBar';
-import PoweredByTransak from '../../Deposit/components/PoweredByTransak';
+import { validateEmail } from '../../utils/depositUtils';
+import DepositProgressBar from '../../components/DepositProgressBar/DepositProgressBar';
+import PoweredByTransak from '../../components/PoweredByTransak';
import Logger from '../../../../../util/Logger';
import { useAnalytics } from '../../../../hooks/useAnalytics/useAnalytics';
import { MetaMetricsEvents } from '../../../../../core/Analytics';
diff --git a/app/components/UI/Ramp/Deposit/Views/KycProcessing/KycProcessing.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.styles.ts
similarity index 92%
rename from app/components/UI/Ramp/Deposit/Views/KycProcessing/KycProcessing.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/KycProcessing.styles.ts
index ce1f4f3d647a..74485f0f3f5f 100644
--- a/app/components/UI/Ramp/Deposit/Views/KycProcessing/KycProcessing.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.test.tsx
index 86243cd75763..e0857587f1e6 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.test.tsx
@@ -68,7 +68,7 @@ jest.mock('../../../../../util/Logger', () => ({
error: jest.fn(),
}));
-jest.mock('../../Deposit/constants', () => ({
+jest.mock('../../constants', () => ({
KycStatus: {
NOT_SUBMITTED: 'NOT_SUBMITTED',
SUBMITTED: 'SUBMITTED',
diff --git a/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.tsx b/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.tsx
index b3aa33ce6521..a0a59d52f85c 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/KycProcessing.tsx
@@ -1,8 +1,8 @@
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { ActivityIndicator, View } from 'react-native';
-import styleSheet from '../../Deposit/Views/KycProcessing/KycProcessing.styles';
+import styleSheet from './KycProcessing.styles';
import { useFocusEffect, useNavigation } from '@react-navigation/native';
-import DepositProgressBar from '../../Deposit/components/DepositProgressBar';
+import DepositProgressBar from '../../components/DepositProgressBar';
import { useStyles } from '../../../../hooks/useStyles';
import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import { strings } from '../../../../../../locales/i18n';
@@ -19,8 +19,8 @@ import {
FontWeight,
HeaderStandard,
} from '@metamask/design-system-react-native';
-import PoweredByTransak from '../../Deposit/components/PoweredByTransak';
-import { KycStatus } from '../../Deposit/constants';
+import PoweredByTransak from '../../components/PoweredByTransak';
+import { KycStatus } from '../../constants';
import Logger from '../../../../../util/Logger';
import useAnalytics from '../../hooks/useAnalytics';
import { useTransakController } from '../../hooks/useTransakController';
diff --git a/app/components/UI/Ramp/Deposit/Views/OrderProcessing/OrderProcessing.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.styles.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/Views/OrderProcessing/OrderProcessing.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.styles.ts
diff --git a/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.test.tsx
index d035c0b133c3..a8cf776e880f 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.test.tsx
@@ -30,7 +30,7 @@ jest.mock('../../../../../util/navigation/navUtils', () => ({
}),
}));
-jest.mock('../../Deposit/constants', () => ({
+jest.mock('../../constants', () => ({
TRANSAK_SUPPORT_URL: 'https://support.transak.com',
}));
@@ -53,17 +53,14 @@ jest.mock(
},
);
-jest.mock(
- '../../Deposit/components/DepositOrderContent/DepositOrderContent',
- () => {
- const { createElement } = jest.requireActual('react');
- const { View } = jest.requireActual('react-native');
- return {
- __esModule: true,
- default: () => createElement(View, { testID: 'deposit-order-content' }),
- };
- },
-);
+jest.mock('../../components/DepositOrderContent/DepositOrderContent', () => {
+ const { createElement } = jest.requireActual('react');
+ const { View } = jest.requireActual('react-native');
+ return {
+ __esModule: true,
+ default: () => createElement(View, { testID: 'deposit-order-content' }),
+ };
+});
const renderWithTheme = (component: React.ReactElement) =>
render(
diff --git a/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.tsx b/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.tsx
index abe3b1f45a58..f9ad32569b37 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/OrderProcessing.tsx
@@ -1,7 +1,7 @@
import React, { useCallback, useEffect, useMemo } from 'react';
import { Linking, View } from 'react-native';
import { useSelector } from 'react-redux';
-import styleSheet from '../../Deposit/Views/OrderProcessing/OrderProcessing.styles';
+import styleSheet from './OrderProcessing.styles';
import { useNavigation } from '@react-navigation/native';
import { useParams } from '../../../../../util/navigation/navUtils';
import Routes from '../../../../../constants/navigation/Routes';
@@ -10,9 +10,9 @@ import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import { getOrderById } from '../../../../../reducers/fiatOrders';
import { RootState } from '../../../../../reducers';
import { strings } from '../../../../../../locales/i18n';
-import DepositOrderContent from '../../Deposit/components/DepositOrderContent/DepositOrderContent';
+import DepositOrderContent from '../../components/DepositOrderContent/DepositOrderContent';
import { FIAT_ORDER_STATES } from '../../../../../constants/on-ramp';
-import { TRANSAK_SUPPORT_URL } from '../../Deposit/constants';
+import { TRANSAK_SUPPORT_URL } from '../../constants';
import {
Button,
ButtonSize,
diff --git a/app/components/UI/Ramp/Deposit/Views/OtpCode/OtpCode.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/OtpCode.styles.ts
similarity index 91%
rename from app/components/UI/Ramp/Deposit/Views/OtpCode/OtpCode.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/OtpCode.styles.ts
index 48fc5e40bc6c..ccb15f4376d1 100644
--- a/app/components/UI/Ramp/Deposit/Views/OtpCode/OtpCode.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/OtpCode.styles.ts
@@ -1,6 +1,6 @@
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
import { StyleSheet } from 'react-native';
-import { getOtpCellSize } from '../../../utils/getOtpCellSize';
+import { getOtpCellSize } from '../../utils/getOtpCellSize';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/OtpCode.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/OtpCode.test.tsx
index 3a0770d4b692..c5815c9c299e 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/OtpCode.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/OtpCode.test.tsx
@@ -134,7 +134,7 @@ jest.mock('react-native-confirmation-code-field', () => ({
useClearByFocusCell: () => [{}, jest.fn()],
}));
-jest.mock('../../Deposit/constants', () => ({
+jest.mock('../../constants', () => ({
TRANSAK_SUPPORT_URL: 'https://support.transak.com',
}));
diff --git a/app/components/UI/Ramp/Views/NativeFlow/OtpCode.tsx b/app/components/UI/Ramp/Views/NativeFlow/OtpCode.tsx
index 6bfca8d48b92..f6f26d264027 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/OtpCode.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/OtpCode.tsx
@@ -20,7 +20,7 @@ import {
HeaderStandard,
} from '@metamask/design-system-react-native';
import { useStyles } from '../../../../hooks/useStyles';
-import styleSheet from '../../Deposit/Views/OtpCode/OtpCode.styles';
+import styleSheet from './OtpCode.styles';
import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import {
createNavigationDetails,
@@ -35,10 +35,10 @@ import {
useBlurOnFulfill,
useClearByFocusCell,
} from 'react-native-confirmation-code-field';
-import DepositProgressBar from '../../Deposit/components/DepositProgressBar';
+import DepositProgressBar from '../../components/DepositProgressBar';
import Row from '../../Aggregator/components/Row';
-import { TRANSAK_SUPPORT_URL } from '../../Deposit/constants';
-import PoweredByTransak from '../../Deposit/components/PoweredByTransak';
+import { TRANSAK_SUPPORT_URL } from '../../constants';
+import PoweredByTransak from '../../components/PoweredByTransak';
import Logger from '../../../../../util/Logger';
import { useAnalytics } from '../../../../hooks/useAnalytics/useAnalytics';
import { MetaMetricsEvents } from '../../../../../core/Analytics';
diff --git a/app/components/UI/Ramp/Deposit/components/StateSelector/StateSelector.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/StateSelector.styles.ts
similarity index 94%
rename from app/components/UI/Ramp/Deposit/components/StateSelector/StateSelector.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/StateSelector.styles.ts
index 1b06923f7d2c..b07fd99f0ed7 100644
--- a/app/components/UI/Ramp/Deposit/components/StateSelector/StateSelector.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/StateSelector.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
export const createStateSelectorStyles = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/StateSelector.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/StateSelector.test.tsx
index 0e7267007fef..379a55069e47 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/StateSelector.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/StateSelector.test.tsx
@@ -17,7 +17,7 @@ jest.mock('@react-navigation/native', () => {
};
});
-jest.mock('../../Deposit/constants', () => ({
+jest.mock('../../constants', () => ({
US_STATES: [
{ code: 'CA', name: 'California' },
{ code: 'NY', name: 'New York' },
diff --git a/app/components/UI/Ramp/Views/NativeFlow/StateSelector.tsx b/app/components/UI/Ramp/Views/NativeFlow/StateSelector.tsx
index 9651be631922..670060ad3a72 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/StateSelector.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/StateSelector.tsx
@@ -11,8 +11,8 @@ import {
IconColor,
} from '@metamask/design-system-react-native';
import { createStateSelectorModalNavigationDetails } from '../Modals/StateSelectorModal';
-import { US_STATES } from '../../Deposit/constants';
-import { createStateSelectorStyles } from '../../Deposit/components/StateSelector/StateSelector.styles';
+import { US_STATES } from '../../constants';
+import { createStateSelectorStyles } from './StateSelector.styles';
import { strings } from '../../../../../../locales/i18n';
interface StateSelectorProps {
diff --git a/app/components/UI/Ramp/Deposit/Views/VerifyIdentity/VerifyIdentity.styles.ts b/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.styles.ts
similarity index 93%
rename from app/components/UI/Ramp/Deposit/Views/VerifyIdentity/VerifyIdentity.styles.ts
rename to app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.styles.ts
index 622ac9694926..27cdfc0b9943 100644
--- a/app/components/UI/Ramp/Deposit/Views/VerifyIdentity/VerifyIdentity.styles.ts
+++ b/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.styles.ts
@@ -1,5 +1,5 @@
import { Dimensions, StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const screenWidth = Dimensions.get('window').width;
diff --git a/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.test.tsx b/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.test.tsx
index cfb89cba4d2c..161441fd0bd8 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.test.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.test.tsx
@@ -48,17 +48,14 @@ jest.mock('../../hooks/useRampsUserRegion', () => ({
}),
}));
-jest.mock('../../Deposit/constants/constants', () => ({
+jest.mock('../../constants/transak', () => ({
TRANSAK_TERMS_URL_US: 'https://transak.com/terms-us',
TRANSAK_TERMS_URL_WORLD: 'https://transak.com/terms-world',
CONSENSYS_PRIVACY_POLICY_URL: 'https://consensys.io/privacy-policy',
TRANSAK_URL: 'https://transak.com',
}));
-jest.mock(
- '../../Deposit/assets/verifyIdentityIllustration.png',
- () => 'mock-image',
-);
+jest.mock('../../assets/verifyIdentityIllustration.png', () => 'mock-image');
const mockTrackEvent = jest.fn();
jest.mock('../../../../hooks/useAnalytics/useAnalytics', () => ({
diff --git a/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.tsx b/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.tsx
index 281a76a7dc10..69d75d574531 100644
--- a/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.tsx
+++ b/app/components/UI/Ramp/Views/NativeFlow/VerifyIdentity.tsx
@@ -10,19 +10,19 @@ import {
HeaderStandard,
} from '@metamask/design-system-react-native';
import { useStyles } from '../../../../hooks/useStyles';
-import styleSheet from '../../Deposit/Views/VerifyIdentity/VerifyIdentity.styles';
+import styleSheet from './VerifyIdentity.styles';
import ScreenLayout from '../../Aggregator/components/ScreenLayout';
import Routes from '../../../../../constants/navigation/Routes';
import { useNavigation } from '@react-navigation/native';
import { strings } from '../../../../../../locales/i18n';
-import VerifyIdentityImage from '../../Deposit/assets/verifyIdentityIllustration.png';
-import PoweredByTransak from '../../Deposit/components/PoweredByTransak';
+import VerifyIdentityImage from '../../assets/verifyIdentityIllustration.png';
+import PoweredByTransak from '../../components/PoweredByTransak';
import {
TRANSAK_TERMS_URL_US,
TRANSAK_TERMS_URL_WORLD,
CONSENSYS_PRIVACY_POLICY_URL,
TRANSAK_URL,
-} from '../../Deposit/constants/constants';
+} from '../../constants/transak';
import { useRampsUserRegion } from '../../hooks/useRampsUserRegion';
import { useAnalytics } from '../../../../hooks/useAnalytics/useAnalytics';
import { MetaMetricsEvents } from '../../../../../core/Analytics';
diff --git a/app/components/UI/Ramp/Views/OrderDetails/DepositOrderDetails/DepositOrderDetails.test.tsx b/app/components/UI/Ramp/Views/OrderDetails/DepositOrderDetails/DepositOrderDetails.test.tsx
new file mode 100644
index 000000000000..84d6902bd184
--- /dev/null
+++ b/app/components/UI/Ramp/Views/OrderDetails/DepositOrderDetails/DepositOrderDetails.test.tsx
@@ -0,0 +1,145 @@
+import React from 'react';
+import { screen } from '@testing-library/react-native';
+import DepositOrderDetails from './DepositOrderDetails';
+import renderWithProvider from '../../../../../../util/test/renderWithProvider';
+import { backgroundState } from '../../../../../../util/test/initial-root-state';
+import {
+ FIAT_ORDER_STATES,
+ FIAT_ORDER_PROVIDERS,
+} from '../../../../../../constants/on-ramp';
+import { DepositOrder, DepositOrderType } from '../../../types/legacyDeposit';
+import { getOrderById } from '../../../../../../reducers/fiatOrders';
+import { MOCK_DEPOSIT_ORDER, MOCK_US_REGION } from '../../../testUtils';
+
+const mockNavigate = jest.fn();
+const mockSetOptions = jest.fn();
+
+jest.mock('@react-navigation/native', () => {
+ const actualNav = jest.requireActual('@react-navigation/native');
+ return {
+ ...actualNav,
+ useNavigation: () => ({
+ navigate: mockNavigate,
+ setOptions: mockSetOptions,
+ }),
+ useRoute: () => ({
+ params: {
+ orderId: 'test-order-id',
+ },
+ }),
+ };
+});
+
+jest.mock('../../../../../../reducers/fiatOrders', () => ({
+ getOrderById: jest.fn(),
+ updateFiatOrder: jest.fn().mockReturnValue({ type: 'FIAT_UPDATE_ORDER' }),
+ getDetectedGeolocation: jest.fn(),
+}));
+
+describe('DepositOrderDetails Component', () => {
+ const mockOrder = {
+ id: 'test-order-id-123456',
+ provider: FIAT_ORDER_PROVIDERS.DEPOSIT,
+ createdAt: Date.now(),
+ amount: '100',
+ currency: 'USD',
+ cryptoAmount: '0.05',
+ cryptocurrency: 'USDC',
+ fee: '2.50',
+ state: FIAT_ORDER_STATES.COMPLETED,
+ account: '0x1234567890123456789012345678901234567890',
+ network: 'eip155:1',
+ excludeFromPurchases: false,
+ orderType: DepositOrderType.Deposit,
+ data: {
+ ...MOCK_DEPOSIT_ORDER,
+ id: 'test-deposit-order-1',
+ provider: 'deposit',
+ providerOrderId: 'deposit_123',
+ providerOrderLink: 'https://example.com/order/123',
+ createdAt: Date.now(),
+ status: 'COMPLETED',
+ timeDescriptionPending: '1-2 days',
+ fiatAmountInUsd: 100,
+ feesInUsd: 2.5,
+ region: MOCK_US_REGION,
+ paymentDetails: [],
+ } as DepositOrder,
+ };
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ (getOrderById as jest.Mock).mockReturnValue(mockOrder);
+ });
+
+ it('renders completed order from persisted state', () => {
+ renderWithProvider(, {
+ state: {
+ engine: {
+ backgroundState,
+ },
+ },
+ });
+ expect(screen.getByText('Order ID')).toBeOnTheScreen();
+ expect(screen.getByText('Total')).toBeOnTheScreen();
+ });
+
+ it('renders failed order from persisted state', () => {
+ const errorOrder = { ...mockOrder, state: FIAT_ORDER_STATES.FAILED };
+ (getOrderById as jest.Mock).mockReturnValue(errorOrder);
+
+ renderWithProvider(, {
+ state: {
+ engine: {
+ backgroundState,
+ },
+ },
+ });
+ expect(screen.getByText('Order ID')).toBeOnTheScreen();
+ expect(screen.getByText('Total')).toBeOnTheScreen();
+ });
+
+ it('renders pending order from persisted state', () => {
+ const processingOrder = { ...mockOrder, state: FIAT_ORDER_STATES.PENDING };
+ (getOrderById as jest.Mock).mockReturnValue(processingOrder);
+
+ renderWithProvider(, {
+ state: {
+ engine: {
+ backgroundState,
+ },
+ },
+ });
+ expect(screen.getByText('Order ID')).toBeOnTheScreen();
+ expect(screen.getByText('Total')).toBeOnTheScreen();
+ });
+
+ it('renders CREATED order from persisted state', () => {
+ const createdOrder = { ...mockOrder, state: FIAT_ORDER_STATES.CREATED };
+ (getOrderById as jest.Mock).mockReturnValue(createdOrder);
+
+ renderWithProvider(, {
+ state: {
+ engine: {
+ backgroundState,
+ },
+ },
+ });
+ expect(screen.getByText('Order ID')).toBeOnTheScreen();
+ expect(screen.getByText('Total')).toBeOnTheScreen();
+ });
+
+ it('renders no order found state', () => {
+ (getOrderById as jest.Mock).mockReturnValue(null);
+
+ renderWithProvider(, {
+ state: {
+ engine: {
+ backgroundState,
+ },
+ },
+ });
+ expect(screen.queryByText('Order ID')).not.toBeOnTheScreen();
+ expect(screen.queryByText('Total')).not.toBeOnTheScreen();
+ });
+});
diff --git a/app/components/UI/Ramp/Views/OrderDetails/DepositOrderDetails/DepositOrderDetails.tsx b/app/components/UI/Ramp/Views/OrderDetails/DepositOrderDetails/DepositOrderDetails.tsx
new file mode 100644
index 000000000000..82d88e0e841d
--- /dev/null
+++ b/app/components/UI/Ramp/Views/OrderDetails/DepositOrderDetails/DepositOrderDetails.tsx
@@ -0,0 +1,71 @@
+import React, { useCallback } from 'react';
+import { useSelector } from 'react-redux';
+import { useNavigation } from '@react-navigation/native';
+import { HeaderStandard } from '@metamask/design-system-react-native';
+import { ScrollView } from 'react-native-gesture-handler';
+import ScreenLayout from '../../../Aggregator/components/ScreenLayout';
+import { getOrderById } from '../../../../../../reducers/fiatOrders';
+import { strings } from '../../../../../../../locales/i18n';
+import Routes from '../../../../../../constants/navigation/Routes';
+import {
+ createNavigationDetails,
+ useParams,
+} from '../../../../../../util/navigation/navUtils';
+import { RootState } from '../../../../../../reducers';
+import DepositOrderContent from '../../../components/DepositOrderContent/DepositOrderContent';
+
+interface DepositOrderDetailsParams {
+ orderId: string;
+}
+
+export const createDepositOrderDetailsNavDetails =
+ createNavigationDetails(
+ Routes.DEPOSIT.ORDER_DETAILS,
+ );
+
+/** Read-only view for persisted legacy DEPOSIT orders (no live polling). */
+const DepositOrderDetails = () => {
+ const params = useParams();
+ const order = useSelector((state: RootState) =>
+ getOrderById(state, params.orderId),
+ );
+ const navigation = useNavigation();
+ const title = strings('deposit.order_details.title');
+
+ const handleHeaderBack = useCallback(() => {
+ navigation.goBack();
+ }, [navigation]);
+
+ if (!order) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default DepositOrderDetails;
diff --git a/app/components/UI/Ramp/Views/OrderDetails/OrderContent.tsx b/app/components/UI/Ramp/Views/OrderDetails/OrderContent.tsx
index 72b9875cc300..18b1b9f8dfdb 100644
--- a/app/components/UI/Ramp/Views/OrderDetails/OrderContent.tsx
+++ b/app/components/UI/Ramp/Views/OrderDetails/OrderContent.tsx
@@ -33,8 +33,8 @@ import { formatSubscriptNotation } from '../../../../../util/number/subscriptNot
import { formatWithThreshold } from '../../../../../util/assets';
import { getNetworkImageSource } from '../../../../../util/networks';
import Logger from '../../../../../util/Logger';
-import { hasDepositOrderField } from '../../Deposit/utils';
-import BankDetailRow from '../../Deposit/components/BankDetailRow/BankDetailRow';
+import { hasDepositOrderField } from '../../utils/depositUtils';
+import BankDetailRow from '../../components/BankDetailRow/BankDetailRow';
import Routes from '../../../../../constants/navigation/Routes';
import { RampsOrderDetailsSelectorsIDs } from './OrderDetails.testIds';
diff --git a/app/components/UI/Ramp/Views/TokenSelection/TokenSelection.test.tsx b/app/components/UI/Ramp/Views/TokenSelection/TokenSelection.test.tsx
index 217e2707c725..4f2967e451c8 100644
--- a/app/components/UI/Ramp/Views/TokenSelection/TokenSelection.test.tsx
+++ b/app/components/UI/Ramp/Views/TokenSelection/TokenSelection.test.tsx
@@ -2,11 +2,10 @@ import React from 'react';
import { fireEvent, waitFor } from '@testing-library/react-native';
import TokenSelection from './TokenSelection';
import { TokenSelectionSelectors } from './TokenSelection.testIds';
-import useSearchTokenResults from '../../Deposit/hooks/useSearchTokenResults';
+import useSearchTokenResults from '../../hooks/useSearchTokenResults';
import { renderScreen } from '../../../../../util/test/renderWithProvider';
import { backgroundState } from '../../../../../util/test/initial-root-state';
-import { MOCK_CRYPTOCURRENCIES } from '../../Deposit/testUtils';
-import { useRampTokens } from '../../hooks/useRampTokens';
+import { MOCK_CRYPTOCURRENCIES } from '../../testUtils';
import { useRampsController } from '../../hooks/useRampsController';
import Routes from '../../../../../constants/navigation/Routes';
@@ -60,7 +59,7 @@ function renderWithProvider(
);
}
-jest.mock('../../Deposit/hooks/useSearchTokenResults', () => jest.fn());
+jest.mock('../../hooks/useSearchTokenResults', () => jest.fn());
const mockGoToBuy = jest.fn();
@@ -70,16 +69,6 @@ jest.mock('../../hooks/useRampNavigation', () => ({
}),
}));
-const mockUseRampsUnifiedV2Enabled = jest.fn();
-jest.mock('../../hooks/useRampsUnifiedV2Enabled', () => ({
- __esModule: true,
- default: () => mockUseRampsUnifiedV2Enabled(),
-}));
-
-jest.mock('../../hooks/useRampTokens', () => ({
- useRampTokens: jest.fn(),
-}));
-
jest.mock('../../hooks/useRampsController', () => ({
useRampsController: jest.fn(),
}));
@@ -89,7 +78,7 @@ jest.mock('../../../../hooks/useDebouncedValue', () => ({
}));
const mockGetNetworkName = jest.fn();
-jest.mock('../../Deposit/hooks/useDepositCryptoCurrencyNetworkName', () => ({
+jest.mock('../../hooks/useDepositCryptoCurrencyNetworkName', () => ({
useDepositCryptoCurrencyNetworkName: () => mockGetNetworkName,
}));
@@ -120,9 +109,6 @@ jest.mock('../../../../../selectors/networkController', () => ({
}));
const mockTokens = MOCK_CRYPTOCURRENCIES;
-const mockUseRampTokens = useRampTokens as jest.MockedFunction<
- typeof useRampTokens
->;
const mockUseRampsController = useRampsController as jest.MockedFunction<
typeof useRampsController
>;
@@ -145,19 +131,9 @@ describe('TokenSelection Component', () => {
convertToRampsTokens(mockTokens),
);
mockGetNetworkName.mockReturnValue('Ethereum Mainnet');
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false); // Default to V1 behavior
const rampsTokens = convertToRampsTokens(mockTokens);
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
-
- mockUseRampTokens.mockReturnValue({
- topTokens: rampsTokens,
- allTokens: rampsTokens,
- isLoading: false,
- error: null,
- });
-
mockUseRampsController.mockReturnValue({
tokens: {
topTokens: rampsTokens,
@@ -200,8 +176,7 @@ describe('TokenSelection Component', () => {
jest.clearAllMocks();
});
- it('renders token list for legacy flow', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
+ it('renders token list', () => {
const { getByPlaceholderText } = renderWithProvider(TokenSelection);
expect(
@@ -209,17 +184,7 @@ describe('TokenSelection Component', () => {
).toBeOnTheScreen();
});
- it('renders token list for V2 flow', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
- const { getByPlaceholderText } = renderWithProvider(TokenSelection);
-
- expect(
- getByPlaceholderText('Search token by name or address'),
- ).toBeOnTheScreen();
- });
-
- it('calls navigation.goBack when header back is pressed (V2 loaded list)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
+ it('calls navigation.goBack when header back is pressed ', () => {
const { getByTestId } = renderWithProvider(TokenSelection);
fireEvent.press(getByTestId('deposit-back-navbar-button'));
@@ -228,8 +193,7 @@ describe('TokenSelection Component', () => {
expect(mockTrackEvent).toHaveBeenCalled();
});
- it('calls navigation.goBack when header back is pressed while tokens are loading (V2)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
+ it('calls navigation.goBack when header back is pressed while tokens are loading', () => {
mockUseRampsController.mockReturnValue({
tokens: null,
selectedToken: null,
@@ -302,22 +266,8 @@ describe('TokenSelection Component', () => {
});
});
- it('calls goToBuy and closes modal when token is pressed (V1 flow)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
- const { getByTestId } = renderWithProvider(TokenSelection);
-
- const firstToken = getByTestId(`token-list-item-${mockTokens[0].assetId}`);
- fireEvent.press(firstToken);
-
- expect(mockParentGoBack).toHaveBeenCalled();
- expect(mockGoToBuy).toHaveBeenCalledWith({
- assetId: mockTokens[0].assetId,
- });
- });
-
- it('sets selected token and navigates directly to AMOUNT_INPUT without closing modal when token is pressed (V2 flow)', () => {
+ it('sets selected token and navigates directly to AMOUNT_INPUT without closing modal when token is pressed ', () => {
const mockSetSelectedToken = jest.fn();
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
mockUseRampsController.mockReturnValue({
...mockUseRampsController(),
setSelectedToken: mockSetSelectedToken,
@@ -346,58 +296,7 @@ describe('TokenSelection Component', () => {
});
});
- it('displays loading indicator while fetching tokens (legacy)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
- mockUseRampTokens.mockReturnValue({
- topTokens: null,
- allTokens: null,
- isLoading: true,
- error: null,
- });
-
- const { getByTestId } = renderWithProvider(TokenSelection);
-
- expect(
- getByTestId(TokenSelectionSelectors.LOADING_INDICATOR),
- ).toBeOnTheScreen();
- });
-
- it('displays loading when tokens not yet loaded (legacy, null tokens and no error)', () => {
- // Null tokens with isLoading:false (decision settling after geo recovery)
- // must show the spinner, not a "No tokens match" flash.
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
- mockUseRampTokens.mockReturnValue({
- topTokens: null,
- allTokens: null,
- isLoading: false,
- error: null,
- });
-
- const { getByTestId } = renderWithProvider(TokenSelection);
-
- expect(
- getByTestId(TokenSelectionSelectors.LOADING_INDICATOR),
- ).toBeOnTheScreen();
- });
-
- it('does not show loading for a genuinely empty token list (legacy, empty array and no error)', () => {
- // A genuinely empty result is [] (not null) and must not spin forever —
- // guards against gating loading on length instead of null.
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
- mockUseRampTokens.mockReturnValue({
- topTokens: [],
- allTokens: [],
- isLoading: false,
- error: null,
- });
-
- const { queryByTestId } = renderWithProvider(TokenSelection);
-
- expect(queryByTestId(TokenSelectionSelectors.LOADING_INDICATOR)).toBeNull();
- });
-
- it('displays loading indicator while fetching tokens (V2 enabled)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
+ it('displays loading indicator while fetching tokens', () => {
mockUseRampsController.mockReturnValue({
tokens: null,
selectedToken: null,
@@ -439,8 +338,7 @@ describe('TokenSelection Component', () => {
).toBeOnTheScreen();
});
- it('displays loading when tokens not yet loaded (V2, null tokens and no error)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
+ it('displays loading when tokens not yet loaded when tokens are not yet loaded', () => {
mockUseRampsController.mockReturnValue({
tokens: null,
selectedToken: null,
@@ -482,22 +380,7 @@ describe('TokenSelection Component', () => {
).toBeOnTheScreen();
});
- it('displays error message when token fetch fails (legacy)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
- mockUseRampTokens.mockReturnValue({
- topTokens: null,
- allTokens: null,
- isLoading: false,
- error: new Error('Network error'),
- });
-
- const { getByText } = renderWithProvider(TokenSelection);
-
- expect(getByText(/unable to load tokens/i)).toBeOnTheScreen();
- });
-
- it('displays error message when token fetch fails (V2 enabled)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
+ it('displays error message when token fetch fails', () => {
mockUseRampsController.mockReturnValue({
tokens: null,
selectedToken: null,
@@ -537,29 +420,7 @@ describe('TokenSelection Component', () => {
expect(getByText(/unable to load tokens/i)).toBeOnTheScreen();
});
- it('uses topTokens when search string is empty (legacy)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
- const topTokens = convertToRampsTokens([mockTokens[0]]);
- const allTokens = convertToRampsTokens(mockTokens);
-
- mockUseRampTokens.mockReturnValue({
- topTokens,
- allTokens,
- isLoading: false,
- error: null,
- });
-
- renderWithProvider(TokenSelection);
-
- expect(useSearchTokenResults).toHaveBeenCalledWith(
- expect.objectContaining({
- tokens: topTokens,
- }),
- );
- });
-
- it('uses topTokens when search string is empty (V2 enabled)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
+ it('uses topTokens when search string is empty', () => {
const topTokens = convertToRampsTokens([mockTokens[0]]);
const allTokens = convertToRampsTokens(mockTokens);
@@ -609,35 +470,7 @@ describe('TokenSelection Component', () => {
);
});
- it('uses allTokens when user is searching (legacy)', async () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
- const topTokens = convertToRampsTokens([mockTokens[0]]);
- const allTokens = convertToRampsTokens(mockTokens);
-
- mockUseRampTokens.mockReturnValue({
- topTokens,
- allTokens,
- isLoading: false,
- error: null,
- });
-
- const { getByPlaceholderText } = renderWithProvider(TokenSelection);
-
- const searchInput = getByPlaceholderText('Search token by name or address');
- fireEvent.changeText(searchInput, 'USDC');
-
- await waitFor(() => {
- expect(useSearchTokenResults).toHaveBeenCalledWith(
- expect.objectContaining({
- tokens: allTokens,
- searchString: 'USDC',
- }),
- );
- });
- });
-
- it('uses allTokens when user is searching (V2 enabled)', async () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
+ it('uses allTokens when user is searching', async () => {
const topTokens = convertToRampsTokens([mockTokens[0]]);
const allTokens = convertToRampsTokens(mockTokens);
@@ -693,33 +526,7 @@ describe('TokenSelection Component', () => {
});
});
- it('uses topTokens when search string contains only whitespace (legacy)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
- const topTokens = convertToRampsTokens([mockTokens[0]]);
- const allTokens = convertToRampsTokens(mockTokens);
-
- mockUseRampTokens.mockReturnValue({
- topTokens,
- allTokens,
- isLoading: false,
- error: null,
- });
-
- const { getByPlaceholderText } = renderWithProvider(TokenSelection);
-
- const searchInput = getByPlaceholderText('Search token by name or address');
- fireEvent.changeText(searchInput, ' ');
-
- expect(useSearchTokenResults).toHaveBeenCalledWith(
- expect.objectContaining({
- tokens: topTokens,
- searchString: ' ',
- }),
- );
- });
-
- it('uses topTokens when search string contains only whitespace (V2 enabled)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
+ it('uses topTokens when search string contains only whitespace', () => {
const topTokens = convertToRampsTokens([mockTokens[0]]);
const allTokens = convertToRampsTokens(mockTokens);
@@ -773,9 +580,7 @@ describe('TokenSelection Component', () => {
);
});
- it('filters tokens to only include those for configured networks (V2 enabled)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
-
+ it('filters tokens to only include those for configured networks', () => {
const allTokensWithUnconfiguredNetwork = convertToRampsTokens([
...mockTokens,
{
diff --git a/app/components/UI/Ramp/Views/TokenSelection/TokenSelection.tsx b/app/components/UI/Ramp/Views/TokenSelection/TokenSelection.tsx
index 7aa626d1a2cb..84ab5846af51 100644
--- a/app/components/UI/Ramp/Views/TokenSelection/TokenSelection.tsx
+++ b/app/components/UI/Ramp/Views/TokenSelection/TokenSelection.tsx
@@ -26,16 +26,14 @@ import {
import ListItemSelect from '../../../../../component-library/components/List/ListItemSelect';
import TextFieldSearch from '../../../../../component-library/components/Form/TextFieldSearch';
-import useSearchTokenResults from '../../Deposit/hooks/useSearchTokenResults';
-import { useRampTokens, RampsToken } from '../../hooks/useRampTokens';
-import { useDepositCryptoCurrencyNetworkName } from '../../Deposit/hooks/useDepositCryptoCurrencyNetworkName';
-import useRampsUnifiedV2Enabled from '../../hooks/useRampsUnifiedV2Enabled';
+import useSearchTokenResults from '../../hooks/useSearchTokenResults';
+import { RampsToken } from '../../hooks/useRampTokens';
+import { useDepositCryptoCurrencyNetworkName } from '../../hooks/useDepositCryptoCurrencyNetworkName';
import { useRampsController } from '../../hooks/useRampsController';
import { createNavigationDetails } from '../../../../../util/navigation/navUtils';
import { strings } from '../../../../../../locales/i18n';
import Routes from '../../../../../constants/navigation/Routes';
import { useTheme } from '../../../../../util/theme';
-import { useRampNavigation } from '../../hooks/useRampNavigation';
import { useAnalytics } from '../../../../hooks/useAnalytics/useAnalytics';
import { MetaMetricsEvents } from '../../../../../core/Analytics';
import { getDetectedGeolocation } from '../../../../../reducers/fiatOrders';
@@ -57,7 +55,6 @@ function TokenSelection() {
);
const theme = useTheme();
const navigation = useNavigation();
- const isV2UnifiedEnabled = useRampsUnifiedV2Enabled();
const {
tokens: controllerTokens,
@@ -65,7 +62,6 @@ function TokenSelection() {
tokensError: controllerTokensError,
setSelectedToken,
} = useRampsController();
- const legacyTokens = useRampTokens();
const { trackEvent, createEventBuilder } = useAnalytics();
const getNetworkName = useDepositCryptoCurrencyNetworkName();
@@ -76,18 +72,6 @@ function TokenSelection() {
);
const { topTokens, allTokens, isLoading, error } = useMemo(() => {
- if (!isV2UnifiedEnabled) {
- // V1: useRampTokens returns null tokens with isLoading:false while the
- // routing decision settles after geo recovery. Treat null (no error) as
- // loading to avoid a "No tokens match" flash before the fetch. A finished
- // fetch yields an array, so [] => genuinely empty, never an endless spinner.
- const legacyNotYetLoaded = !legacyTokens.topTokens && !legacyTokens.error;
- return {
- ...legacyTokens,
- isLoading: legacyTokens.isLoading || legacyNotYetLoaded,
- };
- }
-
const filterTokens = (
tokens: T[] | undefined,
): T[] | null => {
@@ -117,9 +101,7 @@ function TokenSelection() {
error: controllerTokensError,
};
}, [
- isV2UnifiedEnabled,
controllerTokens,
- legacyTokens,
controllerTokensLoading,
controllerTokensError,
networksByCaipChainId,
@@ -137,11 +119,9 @@ function TokenSelection() {
searchString,
});
- const { goToBuy } = useRampNavigation();
-
const debouncedSearchString = useDebouncedValue(searchString, 500);
- const rampType = isV2UnifiedEnabled ? 'UNIFIED_BUY_2' : 'UNIFIED_BUY';
+ const rampType = 'UNIFIED_BUY_2';
const hasTrackedScreenViewRef = useRef(false);
useEffect(() => {
@@ -192,7 +172,7 @@ function TokenSelection() {
trackEvent(
createEventBuilder(MetaMetricsEvents.RAMPS_TOKEN_SELECTED)
.addProperties({
- ramp_type: isV2UnifiedEnabled ? 'UNIFIED_BUY_2' : 'UNIFIED_BUY',
+ ramp_type: 'UNIFIED_BUY_2',
region: detectedGeolocation || '',
chain_id: selectedToken.chainId,
currency_destination: selectedToken.assetId,
@@ -208,15 +188,8 @@ function TokenSelection() {
.build(),
);
}
- // V1 flow: close the modal before navigating to Deposit/Aggregator
- // V2 flow: set selected token on controller and navigate within the same stack
- if (isV2UnifiedEnabled) {
- setSelectedToken(assetId);
- navigation.navigate(Routes.RAMP.AMOUNT_INPUT, { assetId });
- } else {
- navigation.getParent()?.goBack();
- goToBuy({ assetId });
- }
+ setSelectedToken(assetId);
+ navigation.navigate(Routes.RAMP.AMOUNT_INPUT, { assetId });
},
[
supportedTokens,
@@ -224,9 +197,7 @@ function TokenSelection() {
createEventBuilder,
getNetworkName,
detectedGeolocation,
- isV2UnifiedEnabled,
navigation,
- goToBuy,
setSelectedToken,
],
);
diff --git a/app/components/UI/Ramp/Deposit/assets/additional-verification.png b/app/components/UI/Ramp/assets/additional-verification.png
similarity index 100%
rename from app/components/UI/Ramp/Deposit/assets/additional-verification.png
rename to app/components/UI/Ramp/assets/additional-verification.png
diff --git a/app/components/UI/Ramp/Deposit/assets/deposit-get-started-illustration-musd.png b/app/components/UI/Ramp/assets/deposit-get-started-illustration-musd.png
similarity index 100%
rename from app/components/UI/Ramp/Deposit/assets/deposit-get-started-illustration-musd.png
rename to app/components/UI/Ramp/assets/deposit-get-started-illustration-musd.png
diff --git a/app/components/UI/Ramp/Deposit/assets/deposit-get-started-illustration.png b/app/components/UI/Ramp/assets/deposit-get-started-illustration.png
similarity index 100%
rename from app/components/UI/Ramp/Deposit/assets/deposit-get-started-illustration.png
rename to app/components/UI/Ramp/assets/deposit-get-started-illustration.png
diff --git a/app/components/UI/Ramp/Deposit/assets/powered-by-transak.svg b/app/components/UI/Ramp/assets/powered-by-transak.svg
similarity index 100%
rename from app/components/UI/Ramp/Deposit/assets/powered-by-transak.svg
rename to app/components/UI/Ramp/assets/powered-by-transak.svg
diff --git a/app/components/UI/Ramp/Deposit/assets/verifyIdentityIllustration.png b/app/components/UI/Ramp/assets/verifyIdentityIllustration.png
similarity index 100%
rename from app/components/UI/Ramp/Deposit/assets/verifyIdentityIllustration.png
rename to app/components/UI/Ramp/assets/verifyIdentityIllustration.png
diff --git a/app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.styles.ts b/app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.styles.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.styles.ts
rename to app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.styles.ts
diff --git a/app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.test.tsx b/app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.test.tsx
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.test.tsx
rename to app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.test.tsx
diff --git a/app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.testIds.ts b/app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.testIds.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.testIds.ts
rename to app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.testIds.ts
diff --git a/app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.tsx b/app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.tsx
similarity index 87%
rename from app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.tsx
rename to app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.tsx
index edcf5a580d1c..f7b20deadb7b 100644
--- a/app/components/UI/Ramp/Deposit/components/BankDetailRow/BankDetailRow.tsx
+++ b/app/components/UI/Ramp/components/BankDetailRow/BankDetailRow.tsx
@@ -3,12 +3,12 @@ import { View, TouchableOpacity } from 'react-native';
import Text, {
TextVariant,
TextColor,
-} from '../../../../../../component-library/components/Texts/Text';
+} from '../../../../../component-library/components/Texts/Text';
import Icon, {
IconName,
IconSize,
-} from '../../../../../../component-library/components/Icons/Icon';
-import { useStyles } from '../../../../../../component-library/hooks';
+} from '../../../../../component-library/components/Icons/Icon';
+import { useStyles } from '../../../../../component-library/hooks';
import { styleSheet } from './BankDetailRow.styles';
import Clipboard from '@react-native-clipboard/clipboard';
import { BANK_DETAIL_ROW_TEST_IDS } from './BankDetailRow.testIds';
diff --git a/app/components/UI/Ramp/Deposit/components/BankDetailRow/index.ts b/app/components/UI/Ramp/components/BankDetailRow/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/BankDetailRow/index.ts
rename to app/components/UI/Ramp/components/BankDetailRow/index.ts
diff --git a/app/components/UI/Ramp/Deposit/components/DepositDateField/DepositDateField.test.tsx b/app/components/UI/Ramp/components/DepositDateField/DepositDateField.test.tsx
similarity index 97%
rename from app/components/UI/Ramp/Deposit/components/DepositDateField/DepositDateField.test.tsx
rename to app/components/UI/Ramp/components/DepositDateField/DepositDateField.test.tsx
index 96eca9482820..4ece8dd24dbc 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositDateField/DepositDateField.test.tsx
+++ b/app/components/UI/Ramp/components/DepositDateField/DepositDateField.test.tsx
@@ -3,7 +3,7 @@ import { fireEvent, render } from '@testing-library/react-native';
import { Platform } from 'react-native';
import DepositDateField from './DepositDateField';
-jest.mock('../../../../../../../locales/i18n', () => ({
+jest.mock('../../../../../../locales/i18n', () => ({
locale: 'en-US',
}));
diff --git a/app/components/UI/Ramp/Deposit/components/DepositDateField/DepositDateField.tsx b/app/components/UI/Ramp/components/DepositDateField/DepositDateField.tsx
similarity index 95%
rename from app/components/UI/Ramp/Deposit/components/DepositDateField/DepositDateField.tsx
rename to app/components/UI/Ramp/components/DepositDateField/DepositDateField.tsx
index 745c7ed218e6..4eac5cc472d5 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositDateField/DepositDateField.tsx
+++ b/app/components/UI/Ramp/components/DepositDateField/DepositDateField.tsx
@@ -17,14 +17,14 @@ import {
} from 'react-native';
import DateTimePicker from '@react-native-community/datetimepicker';
import DepositTextField from '../DepositTextField';
-import { useStyles } from '../../../../../hooks/useStyles';
-import I18n from '../../../../../../../locales/i18n';
-import { getIntlDateTimeFormatter } from '../../../../../../util/intl';
+import { useStyles } from '../../../../hooks/useStyles';
+import I18n from '../../../../../../locales/i18n';
+import { getIntlDateTimeFormatter } from '../../../../../util/intl';
import styleSheet from './DespostDateField.styles';
import Icon, {
IconSize,
IconName,
-} from '../../../../../../component-library/components/Icons/Icon';
+} from '../../../../../component-library/components/Icons/Icon';
const MAXIMUM_DATE = new Date(Date.now());
const MINIMUM_DATE = new Date(1900, 0, 1);
diff --git a/app/components/UI/Ramp/Deposit/components/DepositDateField/DespostDateField.styles.ts b/app/components/UI/Ramp/components/DepositDateField/DespostDateField.styles.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/DepositDateField/DespostDateField.styles.ts
rename to app/components/UI/Ramp/components/DepositDateField/DespostDateField.styles.ts
diff --git a/app/components/UI/Ramp/Deposit/components/DepositDateField/index.ts b/app/components/UI/Ramp/components/DepositDateField/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/DepositDateField/index.ts
rename to app/components/UI/Ramp/components/DepositDateField/index.ts
diff --git a/app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.styles.ts b/app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.styles.ts
similarity index 97%
rename from app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.styles.ts
rename to app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.styles.ts
index 4d855217e7aa..d55f3a5b88f6 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.styles.ts
+++ b/app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.test.tsx b/app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.test.tsx
similarity index 95%
rename from app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.test.tsx
rename to app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.test.tsx
index f5468b5d5922..6926baff84c4 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.test.tsx
+++ b/app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.test.tsx
@@ -2,13 +2,13 @@ import React from 'react';
import { screen, fireEvent } from '@testing-library/react-native';
import Clipboard from '@react-native-clipboard/clipboard';
import DepositOrderContent from './DepositOrderContent';
-import renderWithProvider from '../../../../../../util/test/renderWithProvider';
-import { backgroundState } from '../../../../../../util/test/initial-root-state';
-import { DepositOrder, DepositOrderType } from '@consensys/native-ramps-sdk';
+import renderWithProvider from '../../../../../util/test/renderWithProvider';
+import { backgroundState } from '../../../../../util/test/initial-root-state';
+import { DepositOrder, DepositOrderType } from '../../types/legacyDeposit';
import {
FIAT_ORDER_STATES,
FIAT_ORDER_PROVIDERS,
-} from '../../../../../../constants/on-ramp';
+} from '../../../../../constants/on-ramp';
import { MOCK_DEPOSIT_ORDER, MOCK_BANK_DETAILS_ORDER } from '../../testUtils';
jest.mock('@react-native-clipboard/clipboard', () => ({
diff --git a/app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.tsx b/app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.tsx
similarity index 83%
rename from app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.tsx
rename to app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.tsx
index 6bed80896373..640b5f19a56b 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositOrderContent/DepositOrderContent.tsx
+++ b/app/components/UI/Ramp/components/DepositOrderContent/DepositOrderContent.tsx
@@ -2,38 +2,38 @@ import React, { useCallback } from 'react';
import { View, TouchableOpacity, Image } from 'react-native';
import Clipboard from '@react-native-clipboard/clipboard';
import { useSelector } from 'react-redux';
-import { useStyles } from '../../../../../../component-library/hooks';
+import { useStyles } from '../../../../../component-library/hooks';
import Text, {
TextVariant,
TextColor,
-} from '../../../../../../component-library/components/Texts/Text';
+} from '../../../../../component-library/components/Texts/Text';
import Icon, {
IconName,
IconSize,
IconColor,
-} from '../../../../../../component-library/components/Icons/Icon';
-import { strings } from '../../../../../../../locales/i18n';
-import { hasDepositOrderField } from '../../utils';
-import { useFormatters } from '../../../../../hooks/useFormatters';
-import { selectNetworkConfigurationsByCaipChainId } from '../../../../../../selectors/networkController';
-import { getNetworkImageSource } from '../../../../../../util/networks';
-import { useAccountGroupName } from '../../../../../hooks/multichainAccounts/useAccountGroupName';
+} from '../../../../../component-library/components/Icons/Icon';
+import { strings } from '../../../../../../locales/i18n';
+import { hasDepositOrderField } from '../../utils/depositUtils';
+import { useFormatters } from '../../../../hooks/useFormatters';
+import { selectNetworkConfigurationsByCaipChainId } from '../../../../../selectors/networkController';
+import { getNetworkImageSource } from '../../../../../util/networks';
+import { useAccountGroupName } from '../../../../hooks/multichainAccounts/useAccountGroupName';
import Avatar, {
AvatarSize,
AvatarVariant,
-} from '../../../../../../component-library/components/Avatars/Avatar';
-import AvatarToken from '../../../../../../component-library/components/Avatars/Avatar/variants/AvatarToken';
-import BadgeNetwork from '../../../../../../component-library/components/Badges/Badge/variants/BadgeNetwork';
+} from '../../../../../component-library/components/Avatars/Avatar';
+import AvatarToken from '../../../../../component-library/components/Avatars/Avatar/variants/AvatarToken';
+import BadgeNetwork from '../../../../../component-library/components/Badges/Badge/variants/BadgeNetwork';
import BadgeWrapper, {
BadgePosition,
-} from '../../../../../../component-library/components/Badges/BadgeWrapper';
-import Loader from '../../../../../../component-library/components-temp/Loader/Loader';
-import { selectSelectedInternalAccountFormattedAddress } from '../../../../../../selectors/accountsController';
-import { FiatOrder } from '../../../../../../reducers/fiatOrders';
-import { FIAT_ORDER_STATES } from '../../../../../../constants/on-ramp';
+} from '../../../../../component-library/components/Badges/BadgeWrapper';
+import Loader from '../../../../../component-library/components-temp/Loader/Loader';
+import { selectSelectedInternalAccountFormattedAddress } from '../../../../../selectors/accountsController';
+import { FiatOrder } from '../../../../../reducers/fiatOrders';
+import { FIAT_ORDER_STATES } from '../../../../../constants/on-ramp';
import styleSheet from './DepositOrderContent.styles';
-import { DepositOrder } from '@consensys/native-ramps-sdk';
-import { selectAvatarAccountType } from '../../../../../../selectors/settings';
+import { DepositOrder } from '../../types/legacyDeposit';
+import { selectAvatarAccountType } from '../../../../../selectors/settings';
interface DepositOrderContentProps {
order: FiatOrder;
diff --git a/app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgessBar.test.tsx b/app/components/UI/Ramp/components/DepositProgressBar/DepositProgessBar.test.tsx
similarity index 95%
rename from app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgessBar.test.tsx
rename to app/components/UI/Ramp/components/DepositProgressBar/DepositProgessBar.test.tsx
index bd86ee0881df..bddfea023de1 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgessBar.test.tsx
+++ b/app/components/UI/Ramp/components/DepositProgressBar/DepositProgessBar.test.tsx
@@ -1,13 +1,13 @@
import React from 'react';
import { render } from '@testing-library/react-native';
import DepositProgressBar from './DepositProgressBar';
-import { mockTheme } from '../../../../../../util/theme';
+import { mockTheme } from '../../../../../util/theme';
const mockCompletedColor = mockTheme.colors.primary.default;
const mockCurrentColor = mockTheme.colors.success.default;
const mockTodoColor = mockTheme.colors.border.muted;
-jest.mock('../../../../../../component-library/hooks', () => ({
+jest.mock('../../../../../component-library/hooks', () => ({
useStyles: jest.fn(() => ({
styles: {
container: { flexDirection: 'row', paddingVertical: 12 },
diff --git a/app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgressBar.styles.ts b/app/components/UI/Ramp/components/DepositProgressBar/DepositProgressBar.styles.ts
similarity index 92%
rename from app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgressBar.styles.ts
rename to app/components/UI/Ramp/components/DepositProgressBar/DepositProgressBar.styles.ts
index 77fe028eddd2..7554d4a24ad9 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgressBar.styles.ts
+++ b/app/components/UI/Ramp/components/DepositProgressBar/DepositProgressBar.styles.ts
@@ -1,4 +1,4 @@
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
import { StyleSheet } from 'react-native';
const styleSheet = (params: { theme: Theme }) => {
diff --git a/app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgressBar.testIds.ts b/app/components/UI/Ramp/components/DepositProgressBar/DepositProgressBar.testIds.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgressBar.testIds.ts
rename to app/components/UI/Ramp/components/DepositProgressBar/DepositProgressBar.testIds.ts
diff --git a/app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgressBar.tsx b/app/components/UI/Ramp/components/DepositProgressBar/DepositProgressBar.tsx
similarity index 94%
rename from app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgressBar.tsx
rename to app/components/UI/Ramp/components/DepositProgressBar/DepositProgressBar.tsx
index d5297362b277..9a6a95ccb870 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositProgressBar/DepositProgressBar.tsx
+++ b/app/components/UI/Ramp/components/DepositProgressBar/DepositProgressBar.tsx
@@ -1,6 +1,6 @@
import React from 'react';
import { View } from 'react-native';
-import { useStyles } from '../../../../../../component-library/hooks';
+import { useStyles } from '../../../../../component-library/hooks';
import styleSheet from './DepositProgressBar.styles';
import { DEPOSIT_PROGRESS_BAR_TEST_IDS } from './DepositProgressBar.testIds';
diff --git a/app/components/UI/Ramp/Deposit/components/DepositProgressBar/index.ts b/app/components/UI/Ramp/components/DepositProgressBar/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/DepositProgressBar/index.ts
rename to app/components/UI/Ramp/components/DepositProgressBar/index.ts
diff --git a/app/components/UI/Ramp/Deposit/components/DepositTextField/DepositTextField.test.tsx b/app/components/UI/Ramp/components/DepositTextField/DepositTextField.test.tsx
similarity index 93%
rename from app/components/UI/Ramp/Deposit/components/DepositTextField/DepositTextField.test.tsx
rename to app/components/UI/Ramp/components/DepositTextField/DepositTextField.test.tsx
index b0f7b21ecfa1..b38a2d8849f0 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositTextField/DepositTextField.test.tsx
+++ b/app/components/UI/Ramp/components/DepositTextField/DepositTextField.test.tsx
@@ -1,8 +1,8 @@
import React from 'react';
import { render, screen } from '@testing-library/react-native';
import DepositTextField from './DepositTextField';
-import { mockTheme } from '../../../../../../util/theme';
-import { AppThemeKey, Theme } from '../../../../../../util/theme/models';
+import { mockTheme } from '../../../../../util/theme';
+import { AppThemeKey, Theme } from '../../../../../util/theme/models';
const DEPOSIT_FIELD_TEST_ID = 'deposit-field-test-id';
@@ -13,7 +13,7 @@ const defaultProps = {
testID: DEPOSIT_FIELD_TEST_ID,
};
-jest.mock('../../../../../hooks/useStyles', () => ({
+jest.mock('../../../../hooks/useStyles', () => ({
useStyles: () => ({
styles: {
field: {},
diff --git a/app/components/UI/Ramp/Deposit/components/DepositTextField/DepositTextField.tsx b/app/components/UI/Ramp/components/DepositTextField/DepositTextField.tsx
similarity index 78%
rename from app/components/UI/Ramp/Deposit/components/DepositTextField/DepositTextField.tsx
rename to app/components/UI/Ramp/components/DepositTextField/DepositTextField.tsx
index e389ae6dc416..3adf7f00e8f5 100644
--- a/app/components/UI/Ramp/Deposit/components/DepositTextField/DepositTextField.tsx
+++ b/app/components/UI/Ramp/components/DepositTextField/DepositTextField.tsx
@@ -6,12 +6,12 @@ import {
ViewStyle,
StyleProp,
} from 'react-native';
-import { useStyles } from '../../../../../hooks/useStyles';
+import { useStyles } from '../../../../hooks/useStyles';
import { Label } from '@metamask/design-system-react-native';
-import Text from '../../../../../../component-library/components/Texts/Text';
-import TextField from '../../../../../../component-library/components/Form/TextField';
-import { TextFieldProps } from '../../../../../../component-library/components/Form/TextField/TextField.types';
-import { Theme } from '../../../../../../util/theme/models';
+import Text from '../../../../../component-library/components/Texts/Text';
+import TextField from '../../../../../component-library/components/Form/TextField';
+import { TextFieldProps } from '../../../../../component-library/components/Form/TextField/TextField.types';
+import { Theme } from '../../../../../util/theme/models';
interface DepositTextFieldProps extends TextFieldProps {
label: string | React.ReactNode;
diff --git a/app/components/UI/Ramp/Deposit/components/DepositTextField/index.ts b/app/components/UI/Ramp/components/DepositTextField/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/DepositTextField/index.ts
rename to app/components/UI/Ramp/components/DepositTextField/index.ts
diff --git a/app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.styles.ts b/app/components/UI/Ramp/components/ErrorView/ErrorView.styles.ts
similarity index 90%
rename from app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.styles.ts
rename to app/components/UI/Ramp/components/ErrorView/ErrorView.styles.ts
index c76613c04168..0de7fc6c6ef8 100644
--- a/app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.styles.ts
+++ b/app/components/UI/Ramp/components/ErrorView/ErrorView.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.test.tsx b/app/components/UI/Ramp/components/ErrorView/ErrorView.test.tsx
similarity index 87%
rename from app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.test.tsx
rename to app/components/UI/Ramp/components/ErrorView/ErrorView.test.tsx
index eeb2e938e978..dc1e00ce21ff 100644
--- a/app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.test.tsx
+++ b/app/components/UI/Ramp/components/ErrorView/ErrorView.test.tsx
@@ -1,9 +1,9 @@
import React from 'react';
import { fireEvent, screen } from '@testing-library/react-native';
import ErrorView from './ErrorView';
-import { renderScreen } from '../../../../../../util/test/renderWithProvider';
-import { backgroundState } from '../../../../../../util/test/initial-root-state';
-import { strings } from '../../../../../../../locales/i18n';
+import { renderScreen } from '../../../../../util/test/renderWithProvider';
+import { backgroundState } from '../../../../../util/test/initial-root-state';
+import { strings } from '../../../../../../locales/i18n';
function renderWithProvider(component: React.ComponentType) {
return renderScreen(
diff --git a/app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.tsx b/app/components/UI/Ramp/components/ErrorView/ErrorView.tsx
similarity index 72%
rename from app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.tsx
rename to app/components/UI/Ramp/components/ErrorView/ErrorView.tsx
index fab2153ed99b..06fcdd15a56f 100644
--- a/app/components/UI/Ramp/Deposit/components/ErrorView/ErrorView.tsx
+++ b/app/components/UI/Ramp/components/ErrorView/ErrorView.tsx
@@ -1,24 +1,24 @@
import React from 'react';
import { View } from 'react-native';
-import { strings } from '../../../../../../../locales/i18n';
+import { strings } from '../../../../../../locales/i18n';
import {
IconColor,
IconName,
IconSize,
-} from '../../../../../../component-library/components/Icons/Icon/Icon.types';
-import Icon from '../../../../../../component-library/components/Icons/Icon';
+} from '../../../../../component-library/components/Icons/Icon/Icon.types';
+import Icon from '../../../../../component-library/components/Icons/Icon';
import Text, {
TextVariant,
TextColor,
-} from '../../../../../../component-library/components/Texts/Text';
+} from '../../../../../component-library/components/Texts/Text';
import {
ButtonSize,
ButtonVariants,
-} from '../../../../../../component-library/components/Buttons/Button/Button.types';
-import Button from '../../../../../../component-library/components/Buttons/Button';
-import { useStyles } from '../../../../../../component-library/hooks';
+} from '../../../../../component-library/components/Buttons/Button/Button.types';
+import Button from '../../../../../component-library/components/Buttons/Button';
+import { useStyles } from '../../../../../component-library/hooks';
import styleSheet from './ErrorView.styles';
-import ScreenLayout from '../../../Aggregator/components/ScreenLayout';
+import ScreenLayout from '../../Aggregator/components/ScreenLayout';
interface Props {
description?: string;
diff --git a/app/components/UI/Ramp/Deposit/components/ErrorView/index.ts b/app/components/UI/Ramp/components/ErrorView/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/ErrorView/index.ts
rename to app/components/UI/Ramp/components/ErrorView/index.ts
diff --git a/app/components/UI/Ramp/Deposit/components/NetworksFilterBar/NetworksFilterBar.styles.ts b/app/components/UI/Ramp/components/NetworksFilterBar/NetworksFilterBar.styles.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/NetworksFilterBar/NetworksFilterBar.styles.ts
rename to app/components/UI/Ramp/components/NetworksFilterBar/NetworksFilterBar.styles.ts
diff --git a/app/components/UI/Ramp/Deposit/components/NetworksFilterBar/NetworksFilterBar.test.tsx b/app/components/UI/Ramp/components/NetworksFilterBar/NetworksFilterBar.test.tsx
similarity index 95%
rename from app/components/UI/Ramp/Deposit/components/NetworksFilterBar/NetworksFilterBar.test.tsx
rename to app/components/UI/Ramp/components/NetworksFilterBar/NetworksFilterBar.test.tsx
index c12aa04dd461..15d3ecda64c7 100644
--- a/app/components/UI/Ramp/Deposit/components/NetworksFilterBar/NetworksFilterBar.test.tsx
+++ b/app/components/UI/Ramp/components/NetworksFilterBar/NetworksFilterBar.test.tsx
@@ -2,8 +2,8 @@ import React from 'react';
import { fireEvent } from '@testing-library/react-native';
import NetworksFilterBar from './NetworksFilterBar';
import { CaipChainId } from '@metamask/utils';
-import renderWithProvider from '../../../../../../util/test/renderWithProvider';
-import initialRootState from '../../../../../../util/test/initial-root-state';
+import renderWithProvider from '../../../../../util/test/renderWithProvider';
+import initialRootState from '../../../../../util/test/initial-root-state';
function render(component: React.ReactElement) {
return renderWithProvider(component, {
diff --git a/app/components/UI/Ramp/Deposit/components/NetworksFilterBar/NetworksFilterBar.tsx b/app/components/UI/Ramp/components/NetworksFilterBar/NetworksFilterBar.tsx
similarity index 85%
rename from app/components/UI/Ramp/Deposit/components/NetworksFilterBar/NetworksFilterBar.tsx
rename to app/components/UI/Ramp/components/NetworksFilterBar/NetworksFilterBar.tsx
index fdab9c544a2b..ce3a880b82a3 100644
--- a/app/components/UI/Ramp/Deposit/components/NetworksFilterBar/NetworksFilterBar.tsx
+++ b/app/components/UI/Ramp/components/NetworksFilterBar/NetworksFilterBar.tsx
@@ -2,30 +2,30 @@ import React, { useMemo } from 'react';
import { CaipChainId } from '@metamask/utils';
import { ScrollView } from 'react-native-gesture-handler';
-import { AvatarSize } from '../../../../../../component-library/components/Avatars/Avatar';
-import AvatarNetwork from '../../../../../../component-library/components/Avatars/Avatar/variants/AvatarNetwork';
-import { Box } from '../../../../Box/Box';
-import { AlignItems, FlexDirection } from '../../../../Box/box.types';
+import { AvatarSize } from '../../../../../component-library/components/Avatars/Avatar';
+import AvatarNetwork from '../../../../../component-library/components/Avatars/Avatar/variants/AvatarNetwork';
+import { Box } from '../../../Box/Box';
+import { AlignItems, FlexDirection } from '../../../Box/box.types';
import Button, {
ButtonSize,
ButtonVariants,
-} from '../../../../../../component-library/components/Buttons/Button';
+} from '../../../../../component-library/components/Buttons/Button';
import Text, {
TextColor,
TextVariant,
-} from '../../../../../../component-library/components/Texts/Text';
+} from '../../../../../component-library/components/Texts/Text';
import Icon, {
IconName,
IconSize,
-} from '../../../../../../component-library/components/Icons/Icon';
+} from '../../../../../component-library/components/Icons/Icon';
import styleSheet from './NetworksFilterBar.styles';
-import { useStyles } from '../../../../../hooks/useStyles';
-import { excludeFromArray } from '../../utils';
-import { useTokenNetworkInfo } from '../../../hooks/useTokenNetworkInfo';
-import { useTheme } from '../../../../../../util/theme';
-import { strings } from '../../../../../../../locales/i18n';
+import { useStyles } from '../../../../hooks/useStyles';
+import { excludeFromArray } from '../../utils/depositUtils';
+import { useTokenNetworkInfo } from '../../hooks/useTokenNetworkInfo';
+import { useTheme } from '../../../../../util/theme';
+import { strings } from '../../../../../../locales/i18n';
interface NetworksFilterBarProps {
networks: CaipChainId[];
diff --git a/app/components/UI/Ramp/Deposit/components/NetworksFilterBar/index.ts b/app/components/UI/Ramp/components/NetworksFilterBar/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/NetworksFilterBar/index.ts
rename to app/components/UI/Ramp/components/NetworksFilterBar/index.ts
diff --git a/app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.styles.ts b/app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.styles.ts
similarity index 88%
rename from app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.styles.ts
rename to app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.styles.ts
index d74dac66467e..1cc6e2ea4f03 100644
--- a/app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.styles.ts
+++ b/app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
interface NetworksFilterSelectorStyleSheetVars {
screenHeight: number;
diff --git a/app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.test.tsx b/app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.test.tsx
similarity index 96%
rename from app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.test.tsx
rename to app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.test.tsx
index ff959645dd13..2f4e550e3da7 100644
--- a/app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.test.tsx
+++ b/app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.test.tsx
@@ -2,8 +2,8 @@ import React from 'react';
import { fireEvent } from '@testing-library/react-native';
import NetworksFilterSelector from './NetworksFilterSelector';
import { CaipChainId } from '@metamask/utils';
-import renderWithProvider from '../../../../../../util/test/renderWithProvider';
-import initialRootState from '../../../../../../util/test/initial-root-state';
+import renderWithProvider from '../../../../../util/test/renderWithProvider';
+import initialRootState from '../../../../../util/test/initial-root-state';
function render(component: React.ReactElement) {
return renderWithProvider(component, {
diff --git a/app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.tsx b/app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.tsx
similarity index 80%
rename from app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.tsx
rename to app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.tsx
index 7dd1694a6a42..7b692386952c 100644
--- a/app/components/UI/Ramp/Deposit/components/NetworksFilterSelector/NetworksFilterSelector.tsx
+++ b/app/components/UI/Ramp/components/NetworksFilterSelector/NetworksFilterSelector.tsx
@@ -5,26 +5,26 @@ import { FlatList } from 'react-native-gesture-handler';
import styleSheet from './NetworksFilterSelector.styles';
-import AvatarNetwork from '../../../../../../component-library/components/Avatars/Avatar/variants/AvatarNetwork';
-import { AvatarSize } from '../../../../../../component-library/components/Avatars/Avatar';
+import AvatarNetwork from '../../../../../component-library/components/Avatars/Avatar/variants/AvatarNetwork';
+import { AvatarSize } from '../../../../../component-library/components/Avatars/Avatar';
import Button, {
ButtonSize,
ButtonVariants,
ButtonWidthTypes,
-} from '../../../../../../component-library/components/Buttons/Button';
-import Checkbox from '../../../../../../component-library/components/Checkbox';
+} from '../../../../../component-library/components/Buttons/Button';
+import Checkbox from '../../../../../component-library/components/Checkbox';
import ListItemColumn, {
WidthType,
-} from '../../../../../../component-library/components/List/ListItemColumn';
-import ListItemSelect from '../../../../../../component-library/components/List/ListItemSelect';
+} from '../../../../../component-library/components/List/ListItemColumn';
+import ListItemSelect from '../../../../../component-library/components/List/ListItemSelect';
import Text, {
TextVariant,
-} from '../../../../../../component-library/components/Texts/Text';
+} from '../../../../../component-library/components/Texts/Text';
-import { useStyles } from '../../../../../hooks/useStyles';
-import { strings } from '../../../../../../../locales/i18n';
-import { useTokenNetworkInfo } from '../../../hooks/useTokenNetworkInfo';
-import { excludeFromArray } from '../../utils';
+import { useStyles } from '../../../../hooks/useStyles';
+import { strings } from '../../../../../../locales/i18n';
+import { useTokenNetworkInfo } from '../../hooks/useTokenNetworkInfo';
+import { excludeFromArray } from '../../utils/depositUtils';
interface NetworksFilterSelectorProps {
networks: CaipChainId[];
diff --git a/app/components/UI/Ramp/Deposit/components/PoweredByTransak/PoweredByTransak.styles.ts b/app/components/UI/Ramp/components/PoweredByTransak/PoweredByTransak.styles.ts
similarity index 81%
rename from app/components/UI/Ramp/Deposit/components/PoweredByTransak/PoweredByTransak.styles.ts
rename to app/components/UI/Ramp/components/PoweredByTransak/PoweredByTransak.styles.ts
index 21737245c334..bd9c43ca0b01 100644
--- a/app/components/UI/Ramp/Deposit/components/PoweredByTransak/PoweredByTransak.styles.ts
+++ b/app/components/UI/Ramp/components/PoweredByTransak/PoweredByTransak.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Deposit/components/PoweredByTransak/PoweredByTransak.tsx b/app/components/UI/Ramp/components/PoweredByTransak/PoweredByTransak.tsx
similarity index 89%
rename from app/components/UI/Ramp/Deposit/components/PoweredByTransak/PoweredByTransak.tsx
rename to app/components/UI/Ramp/components/PoweredByTransak/PoweredByTransak.tsx
index e2c21a9e1064..d910ccb295a7 100644
--- a/app/components/UI/Ramp/Deposit/components/PoweredByTransak/PoweredByTransak.tsx
+++ b/app/components/UI/Ramp/components/PoweredByTransak/PoweredByTransak.tsx
@@ -1,6 +1,6 @@
import React from 'react';
import PoweredByTransakSVG from '../../assets/powered-by-transak.svg';
-import { useStyles } from '../../../../../hooks/useStyles';
+import { useStyles } from '../../../../hooks/useStyles';
import styleSheet from './PoweredByTransak.styles';
function PoweredByTransak({
diff --git a/app/components/UI/Ramp/Deposit/components/PoweredByTransak/index.ts b/app/components/UI/Ramp/components/PoweredByTransak/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/PoweredByTransak/index.ts
rename to app/components/UI/Ramp/components/PoweredByTransak/index.ts
diff --git a/app/components/UI/Ramp/Deposit/components/PrivacySection/PrivacySection.styles.ts b/app/components/UI/Ramp/components/PrivacySection/PrivacySection.styles.ts
similarity index 84%
rename from app/components/UI/Ramp/Deposit/components/PrivacySection/PrivacySection.styles.ts
rename to app/components/UI/Ramp/components/PrivacySection/PrivacySection.styles.ts
index 69250d75493f..1dc5a917f7d3 100644
--- a/app/components/UI/Ramp/Deposit/components/PrivacySection/PrivacySection.styles.ts
+++ b/app/components/UI/Ramp/components/PrivacySection/PrivacySection.styles.ts
@@ -1,5 +1,5 @@
import { StyleSheet } from 'react-native';
-import { Theme } from '../../../../../../util/theme/models';
+import { Theme } from '../../../../../util/theme/models';
const styleSheet = (params: { theme: Theme }) => {
const { theme } = params;
diff --git a/app/components/UI/Ramp/Deposit/components/PrivacySection/PrivacySection.tsx b/app/components/UI/Ramp/components/PrivacySection/PrivacySection.tsx
similarity index 76%
rename from app/components/UI/Ramp/Deposit/components/PrivacySection/PrivacySection.tsx
rename to app/components/UI/Ramp/components/PrivacySection/PrivacySection.tsx
index d3be663dfd0b..f7bbc48d1e2a 100644
--- a/app/components/UI/Ramp/Deposit/components/PrivacySection/PrivacySection.tsx
+++ b/app/components/UI/Ramp/components/PrivacySection/PrivacySection.tsx
@@ -2,19 +2,19 @@ import React from 'react';
import Icon, {
IconName,
IconSize,
-} from '../../../../../../component-library/components/Icons/Icon';
+} from '../../../../../component-library/components/Icons/Icon';
import ListItem, {
VerticalAlignment,
-} from '../../../../../../component-library/components/List/ListItem';
+} from '../../../../../component-library/components/List/ListItem';
import ListItemColumn, {
WidthType,
-} from '../../../../../../component-library/components/List/ListItemColumn';
+} from '../../../../../component-library/components/List/ListItemColumn';
import Text, {
TextVariant,
-} from '../../../../../../component-library/components/Texts/Text';
+} from '../../../../../component-library/components/Texts/Text';
import styleSheet from './PrivacySection.styles';
-import { useStyles } from '../../../../../hooks/useStyles';
-import { strings } from '../../../../../../../locales/i18n';
+import { useStyles } from '../../../../hooks/useStyles';
+import { strings } from '../../../../../../locales/i18n';
interface PrivacySectionProps {
children?: React.ReactNode;
diff --git a/app/components/UI/Ramp/Deposit/components/PrivacySection/index.ts b/app/components/UI/Ramp/components/PrivacySection/index.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/PrivacySection/index.ts
rename to app/components/UI/Ramp/components/PrivacySection/index.ts
diff --git a/app/components/UI/Ramp/components/TokenListItem/TokenListItem.test.tsx b/app/components/UI/Ramp/components/TokenListItem/TokenListItem.test.tsx
index a6cff2264bf1..4522ed6b775d 100644
--- a/app/components/UI/Ramp/components/TokenListItem/TokenListItem.test.tsx
+++ b/app/components/UI/Ramp/components/TokenListItem/TokenListItem.test.tsx
@@ -3,7 +3,7 @@ import { fireEvent } from '@testing-library/react-native';
import renderWithProvider from '../../../../../util/test/renderWithProvider';
import TokenListItem from './TokenListItem';
import { useTokenNetworkInfo } from '../../hooks/useTokenNetworkInfo';
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
+import { DepositCryptoCurrency } from '../../types/legacyDeposit';
import initialRootState from '../../../../../util/test/initial-root-state';
const mockGetTokenNetworkInfo = jest.fn();
diff --git a/app/components/UI/Ramp/components/TokenListItem/TokenListItem.tsx b/app/components/UI/Ramp/components/TokenListItem/TokenListItem.tsx
index 35912fc0ad56..fa56efd5c2a1 100644
--- a/app/components/UI/Ramp/components/TokenListItem/TokenListItem.tsx
+++ b/app/components/UI/Ramp/components/TokenListItem/TokenListItem.tsx
@@ -1,5 +1,5 @@
import React, { useCallback } from 'react';
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
+import { DepositCryptoCurrency } from '../../types/legacyDeposit';
import ListItemSelect from '../../../../../component-library/components/List/ListItemSelect';
import ListItemColumn, {
diff --git a/app/components/UI/Ramp/constants/index.ts b/app/components/UI/Ramp/constants/index.ts
new file mode 100644
index 000000000000..0527d8d28281
--- /dev/null
+++ b/app/components/UI/Ramp/constants/index.ts
@@ -0,0 +1,2 @@
+export * from './transak';
+export * from './networks';
diff --git a/app/components/UI/Ramp/Deposit/constants/networks.ts b/app/components/UI/Ramp/constants/networks.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/constants/networks.ts
rename to app/components/UI/Ramp/constants/networks.ts
diff --git a/app/components/UI/Ramp/Deposit/constants/constants.ts b/app/components/UI/Ramp/constants/transak.ts
similarity index 98%
rename from app/components/UI/Ramp/Deposit/constants/constants.ts
rename to app/components/UI/Ramp/constants/transak.ts
index 5060cdc4027d..047f49b495ab 100644
--- a/app/components/UI/Ramp/Deposit/constants/constants.ts
+++ b/app/components/UI/Ramp/constants/transak.ts
@@ -1,4 +1,4 @@
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
+import { DepositCryptoCurrency } from '../types/legacyDeposit';
export const TRANSAK_SUPPORT_URL = 'https://support.transak.com';
export const TRANSAK_URL = 'https://www.transak.com';
diff --git a/app/components/UI/Ramp/deeplink/handleRampUrl.test.ts b/app/components/UI/Ramp/deeplink/handleRampUrl.test.ts
index ede6b387ab72..ab0f799ceead 100644
--- a/app/components/UI/Ramp/deeplink/handleRampUrl.test.ts
+++ b/app/components/UI/Ramp/deeplink/handleRampUrl.test.ts
@@ -26,12 +26,6 @@ jest.mock('../../../../core/redux', () => ({
},
}));
-const mockIsRampsUnifiedV2Enabled = jest.fn();
-jest.mock('../utils/isRampsUnifiedV2Enabled', () => ({
- isRampsUnifiedV2Enabled: (state: unknown) =>
- mockIsRampsUnifiedV2Enabled(state),
-}));
-
const mockSelectGeolocationLocation = jest.fn(
() => 'us-ca',
);
@@ -123,7 +117,9 @@ describe('handleRampUrl', () => {
jest.clearAllMocks();
(NavigationService.navigation.navigate as jest.Mock).mockClear();
(handleRedirection as jest.Mock).mockClear();
- mockIsRampsUnifiedV2Enabled.mockReturnValue(false);
+ mockSelectGeolocationLocation.mockReturnValue('us-ca');
+ mockSelectUserRegion.mockReturnValue(null);
+ mockSelectCountries.mockReturnValue({ data: [] });
});
it('handles redirection with the paths', () => {
@@ -138,17 +134,6 @@ describe('handleRampUrl', () => {
);
});
- it('navigates to Buy route when rampType is BUY, redirectPaths length is 0 and query params do not have allowed fields', () => {
- handleRampUrl({
- rampPath: '?as=example',
- rampType: RampType.BUY,
- });
- expect(handleRedirection).not.toHaveBeenCalled();
- expect(NavigationService.navigation.navigate).toHaveBeenCalledWith(
- Routes.RAMP.BUY,
- );
- });
-
it('navigates to Sell route when rampType is SELL, redirectPaths length is 0 and query param do not have allowed fields', () => {
handleRampUrl({
rampPath: '?as=example',
@@ -160,26 +145,6 @@ describe('handleRampUrl', () => {
);
});
- it('navigates to Buy route when rampType is BUY, redirectPaths length is 0 and query param is intent', () => {
- handleRampUrl({
- rampPath: '?chainId=1&address=0x123456',
- rampType: RampType.BUY,
- });
- expect(handleRedirection).not.toHaveBeenCalled();
- expect(NavigationService.navigation.navigate).toHaveBeenCalledWith(
- Routes.RAMP.BUY,
- {
- screen: Routes.RAMP.ID,
- params: {
- screen: Routes.RAMP.BUILD_QUOTE,
- params: {
- assetId: 'eip155:1/erc20:0x123456',
- },
- },
- },
- );
- });
-
it('navigates to Sell route when rampType is SELL, redirectPaths length is 0 and query param is intent', () => {
handleRampUrl({
rampPath: '?chainId=1&address=0x123456',
@@ -200,16 +165,7 @@ describe('handleRampUrl', () => {
);
});
- describe('when Ramps Unified V2 is enabled', () => {
- beforeEach(() => {
- mockIsRampsUnifiedV2Enabled.mockReturnValue(true);
- // Default to a known, supported region so the eligibility gate passes
- // unless a test overrides these.
- mockSelectGeolocationLocation.mockReturnValue('us-ca');
- mockSelectUserRegion.mockReturnValue(null);
- mockSelectCountries.mockReturnValue({ data: [] });
- });
-
+ describe('BUY unified flow', () => {
it('navigates to eligibility failed modal when geolocation stays unknown after refresh', async () => {
mockSelectGeolocationLocation.mockReturnValue(UNKNOWN_LOCATION);
mockRefreshGeolocation.mockResolvedValue(UNKNOWN_LOCATION);
@@ -273,7 +229,7 @@ describe('handleRampUrl', () => {
);
});
- it('navigates to TokenSelection when V2 enabled and no assetId in intent', async () => {
+ it('navigates to TokenSelection when no assetId in intent', async () => {
await handleRampUrl({
rampPath: '?as=example',
rampType: RampType.BUY,
@@ -285,7 +241,7 @@ describe('handleRampUrl', () => {
);
});
- it('navigates to BuildQuote when V2 enabled and ramp intent has assetId', async () => {
+ it('navigates to BuildQuote when ramp intent has assetId', async () => {
mockResolveRampControllerAssetId.mockReturnValue(
'eip155:1/erc20:0x123456',
);
diff --git a/app/components/UI/Ramp/deeplink/handleRampUrl.ts b/app/components/UI/Ramp/deeplink/handleRampUrl.ts
index 47481fa7de3e..326906cbb505 100644
--- a/app/components/UI/Ramp/deeplink/handleRampUrl.ts
+++ b/app/components/UI/Ramp/deeplink/handleRampUrl.ts
@@ -2,14 +2,10 @@ import handleRedirection from './handleRedirection';
import getRedirectPathsAndParams from '../utils/getRedirectPathAndParams';
import { RampType } from '../Aggregator/types';
import parseRampIntent from '../utils/parseRampIntent';
-import {
- createBuyNavigationDetails,
- createSellNavigationDetails,
-} from '../Aggregator/routes/utils';
+import { createSellNavigationDetails } from '../Aggregator/routes/utils';
import Logger from '../../../../util/Logger';
import NavigationService from '../../../../core/NavigationService';
import ReduxService from '../../../../core/redux';
-import { isRampsUnifiedV2Enabled } from '../utils/isRampsUnifiedV2Enabled';
import { createEligibilityFailedModalNavigationDetails } from '../components/EligibilityFailedModal/EligibilityFailedModal';
import { createRampUnsupportedModalNavigationDetails } from '../components/RampUnsupportedModal/RampUnsupportedModal';
import { createBuildQuoteNavDetails } from '../Views/BuildQuote';
@@ -99,20 +95,8 @@ export default function handleRampUrl({ rampPath, rampType }: RampUrlOptions) {
}
switch (rampType) {
- case RampType.BUY: {
- try {
- const state = ReduxService.store.getState();
- if (isRampsUnifiedV2Enabled(state)) {
- return navigateUnifiedV2Buy(rampIntent);
- }
- } catch {
- // Store may not be ready; fall through to legacy behavior
- }
- NavigationService.navigation.navigate(
- ...createBuyNavigationDetails(rampIntent),
- );
- break;
- }
+ case RampType.BUY:
+ return navigateUnifiedV2Buy(rampIntent);
case RampType.SELL:
NavigationService.navigation.navigate(
...createSellNavigationDetails(rampIntent),
diff --git a/app/components/UI/Ramp/headless/types.ts b/app/components/UI/Ramp/headless/types.ts
index 431855da7a80..b45a99faf5da 100644
--- a/app/components/UI/Ramp/headless/types.ts
+++ b/app/components/UI/Ramp/headless/types.ts
@@ -8,7 +8,7 @@ import type {
UserRegion,
} from '@metamask/ramps-controller';
import type { Quote } from '../types';
-import type { RampSurface } from '../Deposit/types/analytics';
+import type { RampSurface } from '../types/depositAnalytics';
/**
* Public input for {@link useHeadlessBuy}'s `getQuotes`.
diff --git a/app/components/UI/Ramp/headless/useHeadlessRampProps.ts b/app/components/UI/Ramp/headless/useHeadlessRampProps.ts
index 301ede4afd07..5c65c62bcb68 100644
--- a/app/components/UI/Ramp/headless/useHeadlessRampProps.ts
+++ b/app/components/UI/Ramp/headless/useHeadlessRampProps.ts
@@ -1,6 +1,6 @@
import { useMemo } from 'react';
import { getSession } from './sessionRegistry';
-import type { RampSurface } from '../Deposit/types/analytics';
+import type { RampSurface } from '../types/depositAnalytics';
/**
* Analytics ramp-type/surface props for a NativeFlow screen, in the two shapes
diff --git a/app/components/UI/Ramp/hooks/useAnalytics.ts b/app/components/UI/Ramp/hooks/useAnalytics.ts
index b5e35c48969f..370d0b932acc 100644
--- a/app/components/UI/Ramp/hooks/useAnalytics.ts
+++ b/app/components/UI/Ramp/hooks/useAnalytics.ts
@@ -1,6 +1,6 @@
import { useCallback } from 'react';
import { AnalyticsEvents as AggregatorEvents } from '../Aggregator/types';
-import { AnalyticsEvents as DepositEvents } from '../Deposit/types';
+import { AnalyticsEvents as DepositEvents } from '../types/depositAnalytics';
import { MetaMetricsEvents } from '../../../../core/Analytics';
import { analytics } from '../../../../util/analytics/analytics';
diff --git a/app/components/UI/Ramp/Deposit/hooks/useDepositCryptoCurrencyNetworkName.test.ts b/app/components/UI/Ramp/hooks/useDepositCryptoCurrencyNetworkName.test.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/hooks/useDepositCryptoCurrencyNetworkName.test.ts
rename to app/components/UI/Ramp/hooks/useDepositCryptoCurrencyNetworkName.test.ts
diff --git a/app/components/UI/Ramp/Deposit/hooks/useDepositCryptoCurrencyNetworkName.ts b/app/components/UI/Ramp/hooks/useDepositCryptoCurrencyNetworkName.ts
similarity index 92%
rename from app/components/UI/Ramp/Deposit/hooks/useDepositCryptoCurrencyNetworkName.ts
rename to app/components/UI/Ramp/hooks/useDepositCryptoCurrencyNetworkName.ts
index 3064f77916f8..5be741dbfc0e 100644
--- a/app/components/UI/Ramp/Deposit/hooks/useDepositCryptoCurrencyNetworkName.ts
+++ b/app/components/UI/Ramp/hooks/useDepositCryptoCurrencyNetworkName.ts
@@ -1,5 +1,5 @@
import { useSelector } from 'react-redux';
-import { selectNetworkConfigurationsByCaipChainId } from '../../../../../selectors/networkController';
+import { selectNetworkConfigurationsByCaipChainId } from '../../../../selectors/networkController';
export function useDepositCryptoCurrencyNetworkName() {
const networkConfigurationsByCaipChainId = useSelector(
diff --git a/app/components/UI/Ramp/Deposit/hooks/useDepositEnabled.test.ts b/app/components/UI/Ramp/hooks/useDepositEnabled.test.ts
similarity index 94%
rename from app/components/UI/Ramp/Deposit/hooks/useDepositEnabled.test.ts
rename to app/components/UI/Ramp/hooks/useDepositEnabled.test.ts
index 830d2409f53e..06ab8b9ef18c 100644
--- a/app/components/UI/Ramp/Deposit/hooks/useDepositEnabled.test.ts
+++ b/app/components/UI/Ramp/hooks/useDepositEnabled.test.ts
@@ -1,7 +1,7 @@
import initialRootState, {
backgroundState,
-} from '../../../../../util/test/initial-root-state';
-import { renderHookWithProvider } from '../../../../../util/test/renderWithProvider';
+} from '../../../../util/test/initial-root-state';
+import { renderHookWithProvider } from '../../../../util/test/renderWithProvider';
import useDepositEnabled from './useDepositEnabled';
import { getVersion } from 'react-native-device-info';
diff --git a/app/components/UI/Ramp/Deposit/hooks/useDepositEnabled.ts b/app/components/UI/Ramp/hooks/useDepositEnabled.ts
similarity index 78%
rename from app/components/UI/Ramp/Deposit/hooks/useDepositEnabled.ts
rename to app/components/UI/Ramp/hooks/useDepositEnabled.ts
index e771707630c1..eed61f0d6b13 100644
--- a/app/components/UI/Ramp/Deposit/hooks/useDepositEnabled.ts
+++ b/app/components/UI/Ramp/hooks/useDepositEnabled.ts
@@ -2,8 +2,8 @@ import { useSelector } from 'react-redux';
import {
selectDepositActiveFlag,
selectDepositMinimumVersionFlag,
-} from '../../../../../selectors/featureFlagController/deposit';
-import { hasMinimumRequiredVersion } from '../../../../../util/remoteFeatureFlag';
+} from '../../../../selectors/featureFlagController/deposit';
+import { hasMinimumRequiredVersion } from '../../../../util/remoteFeatureFlag';
function useDepositEnabled() {
const depositMinimumVersionFlag = useSelector(
diff --git a/app/components/UI/Ramp/hooks/useFiatFunnelMetrics.test.ts b/app/components/UI/Ramp/hooks/useFiatFunnelMetrics.test.ts
index d88eb5b5fd45..d95400a6234c 100644
--- a/app/components/UI/Ramp/hooks/useFiatFunnelMetrics.test.ts
+++ b/app/components/UI/Ramp/hooks/useFiatFunnelMetrics.test.ts
@@ -6,7 +6,7 @@ import {
useFiatFunnelMetrics,
type FiatFunnelMetricsInput,
} from './useFiatFunnelMetrics';
-import { RAMP_SURFACE } from '../Deposit/types/analytics';
+import { RAMP_SURFACE } from '../types/depositAnalytics';
import type { Quote } from '../types';
const REGION = 'us-ca';
diff --git a/app/components/UI/Ramp/hooks/useFiatFunnelMetrics.ts b/app/components/UI/Ramp/hooks/useFiatFunnelMetrics.ts
index 4f091265f05c..2bfdefb2618d 100644
--- a/app/components/UI/Ramp/hooks/useFiatFunnelMetrics.ts
+++ b/app/components/UI/Ramp/hooks/useFiatFunnelMetrics.ts
@@ -3,7 +3,7 @@ import { TransactionType } from '@metamask/transaction-controller';
import useAnalytics from './useAnalytics';
import { useRampsUserRegion } from './useRampsUserRegion';
import { getChainIdFromAssetId } from '../headless';
-import { RAMP_SURFACE, type RampSurface } from '../Deposit/types/analytics';
+import { RAMP_SURFACE, type RampSurface } from '../types/depositAnalytics';
import type { Quote } from '../types';
/**
diff --git a/app/components/UI/Ramp/hooks/useFiatFunnelMetricsAdapter.test.ts b/app/components/UI/Ramp/hooks/useFiatFunnelMetricsAdapter.test.ts
index b54094945f4d..df4c88e52a6e 100644
--- a/app/components/UI/Ramp/hooks/useFiatFunnelMetricsAdapter.test.ts
+++ b/app/components/UI/Ramp/hooks/useFiatFunnelMetricsAdapter.test.ts
@@ -1,6 +1,6 @@
import { renderHook } from '@testing-library/react-native';
import { TransactionType } from '@metamask/transaction-controller';
-import { RAMP_SURFACE } from '../Deposit/types/analytics';
+import { RAMP_SURFACE } from '../types/depositAnalytics';
import { AlertKeys } from '../../../Views/confirmations/constants/alerts';
import { useFiatFunnelMetricsAdapter } from './useFiatFunnelMetricsAdapter';
import { useTransactionMetadataRequest } from '../../../Views/confirmations/hooks/transactions/useTransactionMetadataRequest';
diff --git a/app/components/UI/Ramp/Deposit/hooks/useForm.test.ts b/app/components/UI/Ramp/hooks/useForm.test.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/hooks/useForm.test.ts
rename to app/components/UI/Ramp/hooks/useForm.test.ts
diff --git a/app/components/UI/Ramp/Deposit/hooks/useForm.ts b/app/components/UI/Ramp/hooks/useForm.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/hooks/useForm.ts
rename to app/components/UI/Ramp/hooks/useForm.ts
diff --git a/app/components/UI/Ramp/hooks/useRampNavigation.test.ts b/app/components/UI/Ramp/hooks/useRampNavigation.test.ts
index baaa5f18c47d..9e03aeb33dc7 100644
--- a/app/components/UI/Ramp/hooks/useRampNavigation.test.ts
+++ b/app/components/UI/Ramp/hooks/useRampNavigation.test.ts
@@ -5,11 +5,9 @@ import type { Country, UserRegion } from '@metamask/ramps-controller';
import Routes from '../../../../constants/navigation/Routes';
import { useRampNavigation } from './useRampNavigation';
import { createRampNavigationDetails } from '../Aggregator/routes/utils';
-import { createDepositNavigationDetails } from '../Deposit/routes/utils';
import { createTokenSelectionNavDetails } from '../Views/TokenSelection/TokenSelection';
import { createBuildQuoteNavDetails } from '../Views/BuildQuote';
import { RampType as AggregatorRampType } from '../Aggregator/types';
-import useRampsUnifiedV2Enabled from './useRampsUnifiedV2Enabled';
import { createEligibilityFailedModalNavigationDetails } from '../components/EligibilityFailedModal/EligibilityFailedModal';
import { createRampUnsupportedModalNavigationDetails } from '../components/RampUnsupportedModal/RampUnsupportedModal';
@@ -43,7 +41,6 @@ jest.mock('./useRampsCountries', () => ({
}));
jest.mock('@react-navigation/native');
jest.mock('../Aggregator/routes/utils');
-jest.mock('../Deposit/routes/utils');
jest.mock('../Views/TokenSelection/TokenSelection', () => {
const actual = jest.requireActual('../Views/TokenSelection/TokenSelection');
const mockFn = jest.fn();
@@ -59,8 +56,6 @@ jest.mock('../Views/BuildQuote', () => {
createBuildQuoteNavDetails: mockFn,
};
});
-jest.mock('./useRampsUnifiedV2Enabled');
-
const mockRefreshGeolocation = jest.fn();
jest.mock('../../../../core/Engine', () => ({
context: {
@@ -75,18 +70,10 @@ const mockNavigate = jest.fn();
const mockUseNavigation = useNavigation as jest.MockedFunction<
typeof useNavigation
>;
-const mockUseRampsUnifiedV2Enabled =
- useRampsUnifiedV2Enabled as jest.MockedFunction<
- typeof useRampsUnifiedV2Enabled
- >;
const mockCreateRampNavigationDetails =
createRampNavigationDetails as jest.MockedFunction<
typeof createRampNavigationDetails
>;
-const mockCreateDepositNavigationDetails =
- createDepositNavigationDetails as jest.MockedFunction<
- typeof createDepositNavigationDetails
- >;
const mockCreateTokenSelectionNavigationDetails =
createTokenSelectionNavDetails as jest.MockedFunction<
typeof createTokenSelectionNavDetails
@@ -103,7 +90,7 @@ const supportedUserRegion = {
} as unknown as UserRegion;
// renders the hook with a known geolocation in state by default so the
-// V2 eligibility gate passes; callers can override geolocation per test.
+// eligibility gate passes; callers can override geolocation per test.
const renderUseRampNavigation = (stateOverride: object = {}) =>
renderHookWithProvider(() => useRampNavigation(), {
state: merge(
@@ -131,18 +118,12 @@ describe('useRampNavigation', () => {
navigate: mockNavigate,
} as unknown as ReturnType);
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
-
mockRefreshGeolocation.mockResolvedValue('UNKNOWN');
mockCreateRampNavigationDetails.mockReturnValue([
Routes.RAMP.BUY,
] as unknown as ReturnType);
- mockCreateDepositNavigationDetails.mockReturnValue([
- Routes.DEPOSIT.ID,
- ] as unknown as ReturnType);
-
mockCreateTokenSelectionNavigationDetails.mockReturnValue([
Routes.RAMP.TOKEN_SELECTION,
] as unknown as ReturnType);
@@ -160,350 +141,297 @@ describe('useRampNavigation', () => {
});
describe('goToBuy', () => {
- describe('when unified V2 is enabled', () => {
- beforeEach(() => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
- });
-
- it('navigates to BuildQuote when assetId is provided', () => {
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const mockNavDetails = [
- Routes.RAMP.TOKEN_SELECTION,
- {
- screen: Routes.RAMP.TOKEN_SELECTION_ROOT,
- params: {
- screen: Routes.RAMP.AMOUNT_INPUT,
- params: { assetId: intent.assetId },
- },
+ it('navigates to BuildQuote when assetId is provided', () => {
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
+ const mockNavDetails = [
+ Routes.RAMP.TOKEN_SELECTION,
+ {
+ screen: Routes.RAMP.TOKEN_SELECTION_ROOT,
+ params: {
+ screen: Routes.RAMP.AMOUNT_INPUT,
+ params: { assetId: intent.assetId },
},
- ] as const;
- mockCreateBuildQuoteNavDetails.mockReturnValue(mockNavDetails);
+ },
+ ] as const;
+ mockCreateBuildQuoteNavDetails.mockReturnValue(mockNavDetails);
- const { result } = renderUseRampNavigation();
+ const { result } = renderUseRampNavigation();
- result.current.goToBuy(intent);
+ result.current.goToBuy(intent);
- expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
- expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalledWith({
- assetId: intent.assetId,
- buyFlowOrigin: undefined,
- });
- expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
- expect(mockCreateRampNavigationDetails).not.toHaveBeenCalled();
- expect(mockCreateDepositNavigationDetails).not.toHaveBeenCalled();
+ expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
+ expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalledWith({
+ assetId: intent.assetId,
+ buyFlowOrigin: undefined,
});
+ expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
+ expect(mockCreateRampNavigationDetails).not.toHaveBeenCalled();
+ });
- it('passes buyFlowOrigin through to BuildQuote params', () => {
- const intent = { assetId: 'eip155:1/erc20:0x123' };
+ it('passes buyFlowOrigin through to BuildQuote params', () => {
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
- const { result } = renderUseRampNavigation();
+ const { result } = renderUseRampNavigation();
- result.current.goToBuy(intent, { buyFlowOrigin: 'tokenInfo' });
+ result.current.goToBuy(intent, { buyFlowOrigin: 'tokenInfo' });
- expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalledWith({
- assetId: intent.assetId,
- buyFlowOrigin: 'tokenInfo',
- });
+ expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalledWith({
+ assetId: intent.assetId,
+ buyFlowOrigin: 'tokenInfo',
});
+ });
- it('passes homeTokenList buyFlowOrigin through to BuildQuote params', () => {
- const intent = { assetId: 'eip155:1/erc20:0x123' };
+ it('passes homeTokenList buyFlowOrigin through to BuildQuote params', () => {
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
- const { result } = renderUseRampNavigation();
+ const { result } = renderUseRampNavigation();
- result.current.goToBuy(intent, { buyFlowOrigin: 'homeTokenList' });
+ result.current.goToBuy(intent, { buyFlowOrigin: 'homeTokenList' });
- expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalledWith({
- assetId: intent.assetId,
- buyFlowOrigin: 'homeTokenList',
- });
+ expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalledWith({
+ assetId: intent.assetId,
+ buyFlowOrigin: 'homeTokenList',
});
+ });
- it('navigates to TokenSelection when no assetId is provided (matches handleRampUrl deeplink)', () => {
- // V2 on: must go to TokenSelection like handleRampUrl, not legacy
- const mockNavDetails = [
- Routes.RAMP.TOKEN_SELECTION,
- undefined,
- ] as const;
- mockCreateTokenSelectionNavigationDetails.mockReturnValue(
- mockNavDetails,
- );
+ it('navigates to TokenSelection when no assetId is provided (matches handleRampUrl deeplink)', () => {
+ const mockNavDetails = [Routes.RAMP.TOKEN_SELECTION, undefined] as const;
+ mockCreateTokenSelectionNavigationDetails.mockReturnValue(mockNavDetails);
+
+ const { result } = renderUseRampNavigation();
+
+ result.current.goToBuy();
+
+ expect(mockSetSelectedToken).not.toHaveBeenCalled();
+ expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
+ expect(mockCreateTokenSelectionNavigationDetails).toHaveBeenCalled();
+ expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
+ expect(mockCreateRampNavigationDetails).not.toHaveBeenCalled();
+ });
+
+ it('does not navigate to BuildQuote when overrideUnifiedRouting is true', () => {
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
+ const mockNavDetails = [Routes.RAMP.BUY] as const;
+ mockCreateRampNavigationDetails.mockReturnValue(mockNavDetails);
+
+ const { result } = renderUseRampNavigation();
+
+ result.current.goToBuy(intent, { overrideUnifiedRouting: true });
+
+ expect(mockSetSelectedToken).not.toHaveBeenCalled();
+ expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
+ expect(mockCreateRampNavigationDetails).toHaveBeenCalledWith(
+ AggregatorRampType.BUY,
+ intent,
+ );
+ expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
+ });
+
+ describe('unsupported token routing', () => {
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
+
+ it('navigates to RampUnsupportedModal when tokens loaded and the resolved assetId is not in allTokens', () => {
+ mockTokens = {
+ allTokens: [
+ {
+ assetId: 'eip155:1/erc20:0xaaa',
+ chainId: 'eip155:1',
+ tokenSupported: true,
+ },
+ ],
+ topTokens: [],
+ };
+ const navDetails = createRampUnsupportedModalNavigationDetails();
const { result } = renderUseRampNavigation();
- result.current.goToBuy();
+ result.current.goToBuy(intent);
expect(mockSetSelectedToken).not.toHaveBeenCalled();
+ expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
- expect(mockCreateTokenSelectionNavigationDetails).toHaveBeenCalled();
- expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
- expect(mockCreateRampNavigationDetails).not.toHaveBeenCalled();
});
- it('does not navigate to BuildQuote when overrideUnifiedRouting is true', () => {
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const mockNavDetails = [Routes.RAMP.BUY] as const;
- mockCreateRampNavigationDetails.mockReturnValue(mockNavDetails);
+ it('navigates to RampUnsupportedModal when the matched token has tokenSupported=false', () => {
+ mockTokens = {
+ allTokens: [
+ {
+ assetId: 'eip155:1/erc20:0x123',
+ chainId: 'eip155:1',
+ tokenSupported: false,
+ },
+ ],
+ topTokens: [],
+ };
+ const navDetails = createRampUnsupportedModalNavigationDetails();
const { result } = renderUseRampNavigation();
- result.current.goToBuy(intent, { overrideUnifiedRouting: true });
+ result.current.goToBuy(intent);
expect(mockSetSelectedToken).not.toHaveBeenCalled();
+ expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
- expect(mockCreateRampNavigationDetails).toHaveBeenCalledWith(
- AggregatorRampType.BUY,
- intent,
- );
- expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
});
- describe('unsupported token routing', () => {
- const intent = { assetId: 'eip155:1/erc20:0x123' };
-
- it('navigates to RampUnsupportedModal when tokens loaded and the resolved assetId is not in allTokens', () => {
- mockTokens = {
- allTokens: [
- {
- assetId: 'eip155:1/erc20:0xaaa',
- chainId: 'eip155:1',
- tokenSupported: true,
- },
- ],
- topTokens: [],
- };
- const navDetails = createRampUnsupportedModalNavigationDetails();
-
- const { result } = renderUseRampNavigation();
-
- result.current.goToBuy(intent);
-
- expect(mockSetSelectedToken).not.toHaveBeenCalled();
- expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
- expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
- });
-
- it('navigates to RampUnsupportedModal when the matched token has tokenSupported=false', () => {
- mockTokens = {
- allTokens: [
- {
- assetId: 'eip155:1/erc20:0x123',
- chainId: 'eip155:1',
- tokenSupported: false,
- },
- ],
- topTokens: [],
- };
- const navDetails = createRampUnsupportedModalNavigationDetails();
-
- const { result } = renderUseRampNavigation();
-
- result.current.goToBuy(intent);
-
- expect(mockSetSelectedToken).not.toHaveBeenCalled();
- expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
- expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
- });
-
- it('navigates to BuildQuote when the matched token has tokenSupported=true', () => {
- mockTokens = {
- allTokens: [
- {
- assetId: 'eip155:1/erc20:0x123',
- chainId: 'eip155:1',
- tokenSupported: true,
- },
- ],
- topTokens: [],
- };
- const mockNavDetails = [
- Routes.RAMP.TOKEN_SELECTION,
+ it('navigates to BuildQuote when the matched token has tokenSupported=true', () => {
+ mockTokens = {
+ allTokens: [
{
- screen: Routes.RAMP.TOKEN_SELECTION,
- params: {
- screen: Routes.RAMP.AMOUNT_INPUT,
- params: { assetId: intent.assetId },
- },
+ assetId: 'eip155:1/erc20:0x123',
+ chainId: 'eip155:1',
+ tokenSupported: true,
+ },
+ ],
+ topTokens: [],
+ };
+ const mockNavDetails = [
+ Routes.RAMP.TOKEN_SELECTION,
+ {
+ screen: Routes.RAMP.TOKEN_SELECTION,
+ params: {
+ screen: Routes.RAMP.AMOUNT_INPUT,
+ params: { assetId: intent.assetId },
},
- ] as const;
- mockCreateBuildQuoteNavDetails.mockReturnValue(mockNavDetails);
+ },
+ ] as const;
+ mockCreateBuildQuoteNavDetails.mockReturnValue(mockNavDetails);
- const { result } = renderUseRampNavigation();
+ const { result } = renderUseRampNavigation();
- result.current.goToBuy(intent);
+ result.current.goToBuy(intent);
- expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
- expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalledWith({
- assetId: intent.assetId,
- buyFlowOrigin: undefined,
- });
- expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
+ expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
+ expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalledWith({
+ assetId: intent.assetId,
+ buyFlowOrigin: undefined,
});
+ expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
});
+ });
- describe('eligibility gate (geolocation + RampsController region)', () => {
- it('refreshes geolocation and shows the eligibility failed modal when geolocation stays UNKNOWN', async () => {
- mockRefreshGeolocation.mockResolvedValue('UNKNOWN');
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const navDetails = createEligibilityFailedModalNavigationDetails();
-
- const { result } = renderUseRampNavigation({
- engine: {
- backgroundState: {
- GeolocationController: { location: 'UNKNOWN' },
- },
- },
- });
-
- await result.current.goToBuy(intent);
-
- expect(mockRefreshGeolocation).toHaveBeenCalledTimes(1);
- expect(mockSetSelectedToken).not.toHaveBeenCalled();
- expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
- expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
- });
+ describe('eligibility gate (geolocation + RampsController region)', () => {
+ it('refreshes geolocation and shows the eligibility failed modal when geolocation stays UNKNOWN', async () => {
+ mockRefreshGeolocation.mockResolvedValue('UNKNOWN');
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
+ const navDetails = createEligibilityFailedModalNavigationDetails();
- it('refreshes geolocation and routes into the flow when geolocation recovers', async () => {
- mockRefreshGeolocation.mockResolvedValue('us-ca');
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const eligibilityNavDetails =
- createEligibilityFailedModalNavigationDetails();
-
- const { result } = renderUseRampNavigation({
- engine: {
- backgroundState: {
- GeolocationController: { location: 'UNKNOWN' },
- },
+ const { result } = renderUseRampNavigation({
+ engine: {
+ backgroundState: {
+ GeolocationController: { location: 'UNKNOWN' },
},
- });
-
- await result.current.goToBuy(intent);
-
- expect(mockRefreshGeolocation).toHaveBeenCalledTimes(1);
- expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
- expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalled();
- expect(mockNavigate).not.toHaveBeenCalledWith(
- ...eligibilityNavDetails,
- );
+ },
});
- it('routes into the flow from the geolocation already in state without refreshing', async () => {
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const eligibilityNavDetails =
- createEligibilityFailedModalNavigationDetails();
+ await result.current.goToBuy(intent);
- const { result } = renderUseRampNavigation({
- engine: {
- backgroundState: {
- GeolocationController: { location: 'us-ca' },
- },
- },
- });
+ expect(mockRefreshGeolocation).toHaveBeenCalledTimes(1);
+ expect(mockSetSelectedToken).not.toHaveBeenCalled();
+ expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
+ expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
+ });
- await result.current.goToBuy(intent);
+ it('refreshes geolocation and routes into the flow when geolocation recovers', async () => {
+ mockRefreshGeolocation.mockResolvedValue('us-ca');
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
+ const eligibilityNavDetails =
+ createEligibilityFailedModalNavigationDetails();
- expect(mockRefreshGeolocation).not.toHaveBeenCalled();
- expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
- expect(mockNavigate).not.toHaveBeenCalledWith(
- ...eligibilityNavDetails,
- );
+ const { result } = renderUseRampNavigation({
+ engine: {
+ backgroundState: {
+ GeolocationController: { location: 'UNKNOWN' },
+ },
+ },
});
- it('navigates to unsupported modal when the resolved region is definitively unsupported for buy', async () => {
- mockUserRegion = {
- regionCode: 'cu',
- country: { isoCode: 'CU', supported: { buy: false, sell: false } },
- state: null,
- } as unknown as UserRegion;
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const navDetails = createRampUnsupportedModalNavigationDetails();
+ await result.current.goToBuy(intent);
- const { result } = renderUseRampNavigation();
+ expect(mockRefreshGeolocation).toHaveBeenCalledTimes(1);
+ expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
+ expect(mockCreateBuildQuoteNavDetails).toHaveBeenCalled();
+ expect(mockNavigate).not.toHaveBeenCalledWith(...eligibilityNavDetails);
+ });
- await result.current.goToBuy(intent);
+ it('routes into the flow from the geolocation already in state without refreshing', async () => {
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
+ const eligibilityNavDetails =
+ createEligibilityFailedModalNavigationDetails();
- expect(mockRefreshGeolocation).not.toHaveBeenCalled();
- expect(mockSetSelectedToken).not.toHaveBeenCalled();
- expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
- expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
+ const { result } = renderUseRampNavigation({
+ engine: {
+ backgroundState: {
+ GeolocationController: { location: 'us-ca' },
+ },
+ },
});
- it('navigates to unsupported modal when the region is absent from the loaded supported countries', async () => {
- mockUserRegion = {
- regionCode: 'cu',
- country: { isoCode: 'CU' },
- state: null,
- } as unknown as UserRegion;
- mockCountries = [
- { isoCode: 'US', supported: { buy: true, sell: true } },
- ] as unknown as Country[];
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const navDetails = createRampUnsupportedModalNavigationDetails();
-
- const { result } = renderUseRampNavigation();
-
- await result.current.goToBuy(intent);
-
- expect(mockSetSelectedToken).not.toHaveBeenCalled();
- expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
- expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
- });
+ await result.current.goToBuy(intent);
- it('proceeds into the flow when the resolved region is supported for buy', async () => {
- mockUserRegion = supportedUserRegion;
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const unsupportedNavDetails =
- createRampUnsupportedModalNavigationDetails();
+ expect(mockRefreshGeolocation).not.toHaveBeenCalled();
+ expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
+ expect(mockNavigate).not.toHaveBeenCalledWith(...eligibilityNavDetails);
+ });
+
+ it('navigates to unsupported modal when the resolved region is definitively unsupported for buy', async () => {
+ mockUserRegion = {
+ regionCode: 'cu',
+ country: { isoCode: 'CU', supported: { buy: false, sell: false } },
+ state: null,
+ } as unknown as UserRegion;
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
+ const navDetails = createRampUnsupportedModalNavigationDetails();
- const { result } = renderUseRampNavigation();
+ const { result } = renderUseRampNavigation();
- await result.current.goToBuy(intent);
+ await result.current.goToBuy(intent);
- expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
- expect(mockNavigate).not.toHaveBeenCalledWith(
- ...unsupportedNavDetails,
- );
- });
+ expect(mockRefreshGeolocation).not.toHaveBeenCalled();
+ expect(mockSetSelectedToken).not.toHaveBeenCalled();
+ expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
+ expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
});
- });
- describe('when unified V2 is disabled', () => {
- it('navigates to aggregator BUY without intent', () => {
- const mockNavDetails = [Routes.RAMP.BUY] as const;
- mockCreateRampNavigationDetails.mockReturnValue(mockNavDetails);
+ it('navigates to unsupported modal when the region is absent from the loaded supported countries', async () => {
+ mockUserRegion = {
+ regionCode: 'cu',
+ country: { isoCode: 'CU' },
+ state: null,
+ } as unknown as UserRegion;
+ mockCountries = [
+ { isoCode: 'US', supported: { buy: true, sell: true } },
+ ] as unknown as Country[];
+ const intent = { assetId: 'eip155:1/erc20:0x123' };
+ const navDetails = createRampUnsupportedModalNavigationDetails();
const { result } = renderUseRampNavigation();
- result.current.goToBuy();
+ await result.current.goToBuy(intent);
- expect(mockCreateRampNavigationDetails).toHaveBeenCalledWith(
- AggregatorRampType.BUY,
- undefined,
- );
- expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
+ expect(mockSetSelectedToken).not.toHaveBeenCalled();
+ expect(mockNavigate).toHaveBeenCalledWith(...navDetails);
+ expect(mockCreateBuildQuoteNavDetails).not.toHaveBeenCalled();
});
- it('navigates to aggregator with intent', () => {
+ it('proceeds into the flow when the resolved region is supported for buy', async () => {
+ mockUserRegion = supportedUserRegion;
const intent = { assetId: 'eip155:1/erc20:0x123' };
- const mockNavDetails = [Routes.RAMP.BUY] as const;
- mockCreateRampNavigationDetails.mockReturnValue(mockNavDetails);
+ const unsupportedNavDetails =
+ createRampUnsupportedModalNavigationDetails();
const { result } = renderUseRampNavigation();
- result.current.goToBuy(intent);
+ await result.current.goToBuy(intent);
- expect(mockCreateRampNavigationDetails).toHaveBeenCalledWith(
- AggregatorRampType.BUY,
- intent,
- );
- expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
+ expect(mockSetSelectedToken).toHaveBeenCalledWith(intent.assetId);
+ expect(mockNavigate).not.toHaveBeenCalledWith(...unsupportedNavDetails);
});
});
});
describe('goToAggregator', () => {
it('navigates to aggregator BUY flow (overrides unified routing)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
const mockNavDetails = [Routes.RAMP.BUY] as const;
mockCreateRampNavigationDetails.mockReturnValue(mockNavDetails);
@@ -516,7 +444,6 @@ describe('useRampNavigation', () => {
undefined,
);
expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
- expect(mockCreateDepositNavigationDetails).not.toHaveBeenCalled();
});
it('navigates to aggregator BUY with intent', () => {
@@ -538,7 +465,6 @@ describe('useRampNavigation', () => {
describe('goToSell', () => {
it('navigates to aggregator SELL flow (overrides unified routing)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
const mockNavDetails = [Routes.RAMP.SELL] as const;
mockCreateRampNavigationDetails.mockReturnValue(mockNavDetails);
@@ -551,7 +477,6 @@ describe('useRampNavigation', () => {
undefined,
);
expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
- expect(mockCreateDepositNavigationDetails).not.toHaveBeenCalled();
});
it('navigates to aggregator SELL with intent', () => {
@@ -569,34 +494,4 @@ describe('useRampNavigation', () => {
expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
});
});
-
- describe('goToDeposit', () => {
- it('navigates to deposit flow (overrides unified routing)', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
- const mockNavDetails = [Routes.DEPOSIT.ID] as const;
- mockCreateDepositNavigationDetails.mockReturnValue(mockNavDetails);
-
- const { result } = renderUseRampNavigation();
-
- result.current.goToDeposit();
-
- expect(mockCreateDepositNavigationDetails).toHaveBeenCalledWith(
- undefined,
- );
- expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
- });
-
- it('navigates to deposit with intent', () => {
- const intent = { assetId: 'eip155:1/erc20:0x123' };
- const mockNavDetails = [Routes.DEPOSIT.ID] as const;
- mockCreateDepositNavigationDetails.mockReturnValue(mockNavDetails);
-
- const { result } = renderUseRampNavigation();
-
- result.current.goToDeposit(intent);
-
- expect(mockCreateDepositNavigationDetails).toHaveBeenCalledWith(intent);
- expect(mockNavigate).toHaveBeenCalledWith(...mockNavDetails);
- });
- });
});
diff --git a/app/components/UI/Ramp/hooks/useRampNavigation.ts b/app/components/UI/Ramp/hooks/useRampNavigation.ts
index d60ee6ff2069..2df4de2b7466 100644
--- a/app/components/UI/Ramp/hooks/useRampNavigation.ts
+++ b/app/components/UI/Ramp/hooks/useRampNavigation.ts
@@ -6,11 +6,9 @@ import {
RampType as AggregatorRampType,
} from '../Aggregator/types';
import { createRampNavigationDetails } from '../Aggregator/routes/utils';
-import { createDepositNavigationDetails } from '../Deposit/routes/utils';
import { createTokenSelectionNavDetails } from '../Views/TokenSelection/TokenSelection';
import { createBuildQuoteNavDetails } from '../Views/BuildQuote';
import type { BuyFlowOrigin } from '../Views/BuildQuote/BuildQuote';
-import useRampsUnifiedV2Enabled from './useRampsUnifiedV2Enabled';
import { createRampUnsupportedModalNavigationDetails } from '../components/RampUnsupportedModal/RampUnsupportedModal';
import { createEligibilityFailedModalNavigationDetails } from '../components/EligibilityFailedModal/EligibilityFailedModal';
import { useRampsTokens } from './useRampsTokens';
@@ -22,11 +20,6 @@ import Engine from '../../../../core/Engine';
import { selectGeolocationLocation } from '../../../../selectors/geolocationController';
import { UNKNOWN_LOCATION } from '@metamask/geolocation-controller';
-enum RampMode {
- AGGREGATOR = 'AGGREGATOR',
- DEPOSIT = 'DEPOSIT',
-}
-
/**
* Hook that returns functions to navigate to ramp flows.
*
@@ -34,11 +27,9 @@ enum RampMode {
* - goToBuy: Unified V2 routing gated by RampsController region/eligibility
* - goToAggregator: deprecated Always navigates to aggregator BUY flow (bypasses smart routing)
* - goToSell: Always navigates to aggregator SELL flow
- * - goToDeposit: deprecated Always navigates to deposit flow (bypasses smart routing)
*/
export const useRampNavigation = () => {
const navigation = useNavigation();
- const isRampsUnifiedV2Enabled = useRampsUnifiedV2Enabled();
const geolocationLocation = useSelector(selectGeolocationLocation);
const { userRegion } = useRampsUserRegion();
const { countries } = useRampsCountries();
@@ -48,22 +39,15 @@ export const useRampNavigation = () => {
async (
intent?: RampIntent,
options?: {
- mode?: RampMode;
overrideUnifiedRouting?: boolean;
buyFlowOrigin?: BuyFlowOrigin;
},
) => {
- const { mode = RampMode.AGGREGATOR, overrideUnifiedRouting = false } =
- options || {};
+ const { overrideUnifiedRouting = false } = options || {};
- const isUnifiedRoutingEnabled =
- isRampsUnifiedV2Enabled && !overrideUnifiedRouting;
+ const isUnifiedRoutingEnabled = !overrideUnifiedRouting;
- // Eligibility gate: region + support now come from RampsController
- // (selectUserRegion / selectCountries) plus GeolocationController,
- // replacing the legacy smart-routing decision.
if (isUnifiedRoutingEnabled) {
- // Prefer the location already in state, only refreshing when unknown.
let location: string | undefined = geolocationLocation;
if (!location || location === UNKNOWN_LOCATION) {
@@ -72,7 +56,6 @@ export const useRampNavigation = () => {
).catch(() => undefined);
}
- // Unknown region: cannot determine eligibility → eligibility-failed.
if (!location || location === UNKNOWN_LOCATION) {
navigation.navigate(
...createEligibilityFailedModalNavigationDetails(),
@@ -80,31 +63,18 @@ export const useRampNavigation = () => {
return;
}
- // Region known but definitively unsupported for buy → unsupported
- // modal. Non-blocking: we only divert on a definitive negative signal;
- // if region/countries data is still loading or support is
- // indeterminate, proceed to TokenSelection/BuildQuote.
if (isRampRegionDefinitivelyUnsupported(userRegion, countries)) {
navigation.navigate(...createRampUnsupportedModalNavigationDetails());
return;
}
}
- // V2: If assetId is provided and V2 is enabled, route to BuildQuote
- if (
- isRampsUnifiedV2Enabled &&
- intent?.assetId &&
- !overrideUnifiedRouting
- ) {
- // Resolve to the controller's canonical assetId format (lowercase)
+ if (intent?.assetId && !overrideUnifiedRouting) {
const controllerAssetId = resolveRampControllerAssetId(
intent.assetId,
rampsTokens?.allTokens ?? [],
);
- // When tokens have loaded, divert unsupported tokens to the
- // dedicated modal so users see a clear message instead of landing
- // on BuildQuote with a missing token name.
if (rampsTokens) {
const matchedToken = rampsTokens.allTokens.find(
(tok) => tok.assetId === controllerAssetId,
@@ -121,7 +91,6 @@ export const useRampNavigation = () => {
setSelectedToken(controllerAssetId);
} catch {
// Token may not be in controller's list yet (still loading).
- // Navigate anyway — BuildQuote will handle the missing token.
}
navigation.navigate(
...createBuildQuoteNavDetails({
@@ -132,29 +101,18 @@ export const useRampNavigation = () => {
return;
}
- // V2: If no assetId and V2 is enabled, route to TokenSelection (matches handleRampUrl deeplink behavior)
- if (
- isRampsUnifiedV2Enabled &&
- !intent?.assetId &&
- !overrideUnifiedRouting
- ) {
+ if (!intent?.assetId && !overrideUnifiedRouting) {
navigation.navigate(...createTokenSelectionNavDetails());
return;
}
- // When overriding unified routing or when unified V2 is disabled
- if (mode === RampMode.DEPOSIT) {
- navigation.navigate(...createDepositNavigationDetails(intent));
- } else {
- navigation.navigate(
- ...createRampNavigationDetails(AggregatorRampType.BUY, intent),
- );
- }
+ navigation.navigate(
+ ...createRampNavigationDetails(AggregatorRampType.BUY, intent),
+ );
},
[
setSelectedToken,
navigation,
- isRampsUnifiedV2Enabled,
userRegion,
countries,
rampsTokens,
@@ -168,10 +126,7 @@ export const useRampNavigation = () => {
*/
const goToAggregator = useCallback(
(intent?: RampIntent) => {
- goToBuy(intent, {
- mode: RampMode.AGGREGATOR,
- overrideUnifiedRouting: true,
- });
+ goToBuy(intent, { overrideUnifiedRouting: true });
},
[goToBuy],
);
@@ -185,19 +140,5 @@ export const useRampNavigation = () => {
[navigation],
);
- /**
- * @deprecated Use goToBuy instead. This function always navigates to the deposit flow,
- * bypassing unified routing. Use goToBuy for smart routing that respects user preferences.
- */
- const goToDeposit = useCallback(
- (intent?: RampIntent) => {
- goToBuy(intent, {
- mode: RampMode.DEPOSIT,
- overrideUnifiedRouting: true,
- });
- },
- [goToBuy],
- );
-
- return { goToBuy, goToAggregator, goToSell, goToDeposit };
+ return { goToBuy, goToAggregator, goToSell };
};
diff --git a/app/components/UI/Ramp/hooks/useRampTokens.ts b/app/components/UI/Ramp/hooks/useRampTokens.ts
index 5b3a17ab1f81..46ea1ae24888 100644
--- a/app/components/UI/Ramp/hooks/useRampTokens.ts
+++ b/app/components/UI/Ramp/hooks/useRampTokens.ts
@@ -1,7 +1,7 @@
import { useState, useEffect, useCallback, useMemo } from 'react';
import { useSelector } from 'react-redux';
import { handleFetch } from '@metamask/controller-utils';
-import type { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
+import type { DepositCryptoCurrency } from '../types/legacyDeposit';
import { getDetectedGeolocation } from '../../../../reducers/fiatOrders';
import { selectNetworkConfigurationsByCaipChainId } from '../../../../selectors/networkController';
import Logger from '../../../../util/Logger';
diff --git a/app/components/UI/Ramp/hooks/useRampsButtonClickData.test.ts b/app/components/UI/Ramp/hooks/useRampsButtonClickData.test.ts
index 0b15b9e69219..1b0878f9173a 100644
--- a/app/components/UI/Ramp/hooks/useRampsButtonClickData.test.ts
+++ b/app/components/UI/Ramp/hooks/useRampsButtonClickData.test.ts
@@ -7,11 +7,11 @@ import {
FIAT_ORDER_STATES,
} from '../../../../constants/on-ramp';
import { Order } from '@consensys/on-ramp-sdk';
-import { NativeTransakAccessToken } from '@consensys/native-ramps-sdk';
+import { NativeTransakAccessToken } from '../types/legacyDeposit';
import initialRootState from '../../../../util/test/initial-root-state';
-import { getProviderToken } from '../Deposit/utils/ProviderTokenVault';
+import { getProviderToken } from '../utils/ProviderTokenVault';
-jest.mock('../Deposit/utils/ProviderTokenVault', () => ({
+jest.mock('../utils/ProviderTokenVault', () => ({
getProviderToken: jest.fn(),
}));
diff --git a/app/components/UI/Ramp/hooks/useRampsButtonClickData.ts b/app/components/UI/Ramp/hooks/useRampsButtonClickData.ts
index 024cc2687beb..78ae35db8fda 100644
--- a/app/components/UI/Ramp/hooks/useRampsButtonClickData.ts
+++ b/app/components/UI/Ramp/hooks/useRampsButtonClickData.ts
@@ -2,7 +2,7 @@ import { useEffect, useMemo, useState } from 'react';
import { useSelector } from 'react-redux';
import { getOrders } from '../../../../reducers/fiatOrders';
import { selectRampsOrdersForSelectedAccountGroup } from '../../../../selectors/rampsController';
-import { getProviderToken } from '../Deposit/utils/ProviderTokenVault';
+import { getProviderToken } from '../utils/ProviderTokenVault';
import {
completedOrdersFromFiatOrders,
completedOrdersFromRampsOrders,
diff --git a/app/components/UI/Ramp/hooks/useRampsUnifiedV2Enabled.test.ts b/app/components/UI/Ramp/hooks/useRampsUnifiedV2Enabled.test.ts
deleted file mode 100644
index e6b4193e728d..000000000000
--- a/app/components/UI/Ramp/hooks/useRampsUnifiedV2Enabled.test.ts
+++ /dev/null
@@ -1,219 +0,0 @@
-import initialRootState, {
- backgroundState,
-} from '../../../../util/test/initial-root-state';
-import { renderHookWithProvider } from '../../../../util/test/renderWithProvider';
-import useRampsUnifiedV2Enabled from './useRampsUnifiedV2Enabled';
-import { getVersion } from 'react-native-device-info';
-
-function mockInitialState({
- enabled = true,
- minimumVersion,
-}: {
- enabled?: boolean;
- minimumVersion?: string | null;
-} = {}) {
- return {
- ...initialRootState,
- engine: {
- backgroundState: {
- ...backgroundState,
- RemoteFeatureFlagController: {
- remoteFeatureFlags: {
- rampsUnifiedBuyV2: {
- enabled,
- ...(minimumVersion !== undefined && {
- minimumVersion,
- }),
- },
- },
- },
- },
- },
- };
-}
-
-jest.mock('react-native-device-info', () => ({
- getVersion: jest.fn(),
-}));
-
-describe('useRampsUnifiedV2Enabled', () => {
- const mockGetVersion = jest.mocked(getVersion);
- const originalEnv = process.env;
-
- beforeEach(() => {
- jest.clearAllMocks();
- process.env = { ...originalEnv };
- delete process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED;
- });
-
- afterAll(() => {
- process.env = originalEnv;
- });
-
- describe('Build flag precedence', () => {
- it('returns true when build flag is set to "true" regardless of remote flags', () => {
- process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED = 'true';
- mockGetVersion.mockReturnValue('1.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: false,
- minimumVersion: '2.0.0',
- }),
- },
- );
-
- expect(result.current).toBe(true);
- });
-
- it('returns false when build flag is set to "false" regardless of remote flags', () => {
- process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED = 'false';
- mockGetVersion.mockReturnValue('2.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: true,
- minimumVersion: '1.0.0',
- }),
- },
- );
-
- expect(result.current).toBe(false);
- });
-
- it('returns true when build flag is set to "true" even with version mismatch', () => {
- process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED = 'true';
- mockGetVersion.mockReturnValue('1.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: true,
- minimumVersion: '2.0.0',
- }),
- },
- );
-
- expect(result.current).toBe(true);
- });
- });
-
- describe('Remote feature flag behavior when build flag is not set', () => {
- it('returns true when unified V2 is enabled and version meets the minimum requirement', () => {
- mockGetVersion.mockReturnValue('8.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: true,
- minimumVersion: '7.63.0',
- }),
- },
- );
-
- expect(result.current).toBe(true);
- });
-
- it('returns false when unified V2 is disabled', () => {
- mockGetVersion.mockReturnValue('8.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: false,
- minimumVersion: '7.63.0',
- }),
- },
- );
-
- expect(result.current).toBe(false);
- });
-
- it('returns false when version does not meet the minimum requirement', () => {
- mockGetVersion.mockReturnValue('7.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: true,
- minimumVersion: '7.63.0',
- }),
- },
- );
-
- expect(result.current).toBe(false);
- });
-
- it('returns false when minimum version is not defined', () => {
- mockGetVersion.mockReturnValue('8.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: true,
- minimumVersion: null,
- }),
- },
- );
-
- expect(result.current).toBe(false);
- });
-
- it('returns false when minimum version is undefined', () => {
- mockGetVersion.mockReturnValue('8.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: true,
- minimumVersion: undefined,
- }),
- },
- );
-
- expect(result.current).toBe(false);
- });
-
- it('returns true when version equals minimum version exactly', () => {
- mockGetVersion.mockReturnValue('7.63.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: true,
- minimumVersion: '7.63.0',
- }),
- },
- );
-
- expect(result.current).toBe(true);
- });
-
- it('returns false when both enabled flag and minimum version are not set', () => {
- mockGetVersion.mockReturnValue('8.0.0');
-
- const { result } = renderHookWithProvider(
- () => useRampsUnifiedV2Enabled(),
- {
- state: mockInitialState({
- enabled: false,
- minimumVersion: null,
- }),
- },
- );
-
- expect(result.current).toBe(false);
- });
- });
-});
diff --git a/app/components/UI/Ramp/hooks/useRampsUnifiedV2Enabled.ts b/app/components/UI/Ramp/hooks/useRampsUnifiedV2Enabled.ts
deleted file mode 100644
index a586257ae1c9..000000000000
--- a/app/components/UI/Ramp/hooks/useRampsUnifiedV2Enabled.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { useSelector } from 'react-redux';
-import { selectRampsUnifiedBuyV2Enabled } from '../../../../selectors/featureFlagController/ramps/rampsUnifiedBuyV2';
-
-export default function useRampsUnifiedV2Enabled() {
- const isEnabled = useSelector(selectRampsUnifiedBuyV2Enabled);
-
- const buildFlag = process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED;
- if (buildFlag === 'true' || buildFlag === 'false') {
- return buildFlag === 'true';
- }
-
- return isEnabled;
-}
diff --git a/app/components/UI/Ramp/Deposit/hooks/useSearchTokenResults.test.ts b/app/components/UI/Ramp/hooks/useSearchTokenResults.test.ts
similarity index 98%
rename from app/components/UI/Ramp/Deposit/hooks/useSearchTokenResults.test.ts
rename to app/components/UI/Ramp/hooks/useSearchTokenResults.test.ts
index b8b1e1fc5f53..050e7460a630 100644
--- a/app/components/UI/Ramp/Deposit/hooks/useSearchTokenResults.test.ts
+++ b/app/components/UI/Ramp/hooks/useSearchTokenResults.test.ts
@@ -1,6 +1,6 @@
import { renderHook } from '@testing-library/react-hooks';
import useSearchTokenResults from './useSearchTokenResults';
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
+import { DepositCryptoCurrency } from '../types/legacyDeposit';
const mockTokens: DepositCryptoCurrency[] = [
{
diff --git a/app/components/UI/Ramp/Deposit/hooks/useSearchTokenResults.ts b/app/components/UI/Ramp/hooks/useSearchTokenResults.ts
similarity index 95%
rename from app/components/UI/Ramp/Deposit/hooks/useSearchTokenResults.ts
rename to app/components/UI/Ramp/hooks/useSearchTokenResults.ts
index 23a6d30a63c0..fa1f2fa01efa 100644
--- a/app/components/UI/Ramp/Deposit/hooks/useSearchTokenResults.ts
+++ b/app/components/UI/Ramp/hooks/useSearchTokenResults.ts
@@ -1,6 +1,6 @@
import { useMemo } from 'react';
import Fuse from 'fuse.js';
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
+import { DepositCryptoCurrency } from '../types/legacyDeposit';
import { CaipChainId } from '@metamask/utils';
import { DEPOSIT_NETWORKS_BY_CHAIN_ID } from '../constants/networks';
diff --git a/app/components/UI/Ramp/hooks/useTokenBuyability.test.ts b/app/components/UI/Ramp/hooks/useTokenBuyability.test.ts
index d489f046a8b1..17c8e2aaefd6 100644
--- a/app/components/UI/Ramp/hooks/useTokenBuyability.test.ts
+++ b/app/components/UI/Ramp/hooks/useTokenBuyability.test.ts
@@ -1,30 +1,18 @@
import { renderHook } from '@testing-library/react-native';
// eslint-disable-next-line import-x/no-namespace
import * as tokenBuyabilityModule from './useTokenBuyability';
-import {
- useRampTokens,
- UseRampTokensResult,
- RampsToken,
-} from './useRampTokens';
import { useRampsTokens } from './useRampsTokens';
-import useRampsUnifiedV2Enabled from './useRampsUnifiedV2Enabled';
+import { RampsToken } from './useRampTokens';
import { TokenI } from '../../Tokens/types';
import parseRampIntent from '../utils/parseRampIntent';
-jest.mock('./useRampTokens', () => ({
- useRampTokens: jest.fn(),
-}));
-
jest.mock('./useRampsTokens', () => ({
useRampsTokens: jest.fn(),
}));
-jest.mock('./useRampsUnifiedV2Enabled', () => jest.fn());
jest.mock('../utils/parseRampIntent', () => jest.fn());
-const mockUseRampTokens = jest.mocked(useRampTokens);
const mockUseRampsTokens = jest.mocked(useRampsTokens);
-const mockUseRampsUnifiedV2Enabled = jest.mocked(useRampsUnifiedV2Enabled);
const mockParseRampIntent = jest.mocked(parseRampIntent);
describe('useTokenBuyability', () => {
@@ -55,31 +43,25 @@ describe('useTokenBuyability', () => {
...overrides,
});
- const setupV1Mocks = (): void => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
+ const setupControllerTokens = (
+ allTokens: RampsToken[] | null,
+ isLoading = false,
+ ): void => {
mockUseRampsTokens.mockReturnValue({
- tokens: null,
+ tokens: allTokens ? { topTokens: [], allTokens } : null,
selectedToken: null,
setSelectedToken: jest.fn(),
- isLoading: false,
+ isLoading,
error: null,
});
};
- const setupV2Mocks = (): void => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
- mockUseRampTokens.mockReturnValue({
- allTokens: null,
- isLoading: false,
- } as UseRampTokensResult);
- };
-
beforeEach(() => {
jest.clearAllMocks();
mockParseRampIntent.mockReturnValue({
assetId: 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
});
- setupV1Mocks();
+ setupControllerTokens(null);
});
describe('useTokensBuyability', () => {
@@ -91,21 +73,16 @@ describe('useTokenBuyability', () => {
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
});
- mockUseRampTokens.mockReturnValue({
- allTokens: [
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
- tokenSupported: true,
- }),
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
- tokenSupported: false,
- }),
- ],
- isLoading: false,
- } as UseRampTokensResult);
+ setupControllerTokens([
+ getMockRampToken({
+ assetId: 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
+ tokenSupported: true,
+ }),
+ getMockRampToken({
+ assetId: 'eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
+ tokenSupported: false,
+ }),
+ ]);
mockParseRampIntent.mockImplementation(({ address }) => ({
assetId: `eip155:1/erc20:${address?.toLowerCase()}`,
@@ -121,37 +98,14 @@ describe('useTokenBuyability', () => {
});
});
- it('returns loading from controller tokens when v2 is enabled', () => {
- setupV2Mocks();
- mockUseRampsTokens.mockReturnValue({
- tokens: null,
- selectedToken: null,
- setSelectedToken: jest.fn(),
- isLoading: true,
- error: null,
- });
+ it('returns loading from controller tokens', () => {
+ setupControllerTokens(null, true);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokensBuyability([getMockToken()]),
);
expect(result.current.isLoading).toBe(true);
- expect(mockUseRampTokens).toHaveBeenCalledWith({ fetchOnMount: false });
- });
-
- it('returns loading from legacy tokens when v2 is disabled', () => {
- setupV1Mocks();
- mockUseRampTokens.mockReturnValue({
- allTokens: null,
- isLoading: true,
- } as UseRampTokensResult);
-
- const { result } = renderHook(() =>
- tokenBuyabilityModule.useTokensBuyability([getMockToken()]),
- );
-
- expect(result.current.isLoading).toBe(true);
- expect(mockUseRampTokens).toHaveBeenCalledWith({ fetchOnMount: true });
});
it('does not call parseRampIntent when token address is already a CAIP asset type', () => {
@@ -159,16 +113,12 @@ describe('useTokenBuyability', () => {
address: 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
chainId: 'eip155:1',
});
- mockUseRampTokens.mockReturnValue({
- allTokens: [
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
- tokenSupported: true,
- }),
- ],
- isLoading: false,
- } as UseRampTokensResult);
+ setupControllerTokens([
+ getMockRampToken({
+ assetId: 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
+ tokenSupported: true,
+ }),
+ ]);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokensBuyability([caipToken]),
@@ -184,16 +134,12 @@ describe('useTokenBuyability', () => {
mockParseRampIntent.mockImplementation(() => {
throw new Error('parse failed');
});
- mockUseRampTokens.mockReturnValue({
- allTokens: [
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
- tokenSupported: true,
- }),
- ],
- isLoading: false,
- } as UseRampTokensResult);
+ setupControllerTokens([
+ getMockRampToken({
+ assetId: 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
+ tokenSupported: true,
+ }),
+ ]);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokensBuyability([getMockToken()]),
@@ -206,16 +152,13 @@ describe('useTokenBuyability', () => {
it('returns false for native token when chainId differs', () => {
const nativeToken = getMockToken({ isNative: true, chainId: '0x1' });
- mockUseRampTokens.mockReturnValue({
- allTokens: [
- getMockRampToken({
- assetId: 'eip155:10/slip44:60',
- chainId: 'eip155:10',
- tokenSupported: true,
- }),
- ],
- isLoading: false,
- } as UseRampTokensResult);
+ setupControllerTokens([
+ getMockRampToken({
+ assetId: 'eip155:10/slip44:60',
+ chainId: 'eip155:10',
+ tokenSupported: true,
+ }),
+ ]);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokensBuyability([nativeToken]),
@@ -228,17 +171,13 @@ describe('useTokenBuyability', () => {
it('returns false for native token when assetId is not slip44', () => {
const nativeToken = getMockToken({ isNative: true, chainId: '0x1' });
- mockUseRampTokens.mockReturnValue({
- allTokens: [
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
- chainId: 'eip155:1',
- tokenSupported: true,
- }),
- ],
- isLoading: false,
- } as UseRampTokensResult);
+ setupControllerTokens([
+ getMockRampToken({
+ assetId: 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
+ chainId: 'eip155:1',
+ tokenSupported: true,
+ }),
+ ]);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokensBuyability([nativeToken]),
@@ -250,7 +189,7 @@ describe('useTokenBuyability', () => {
});
});
- describe('when V2 is disabled (legacy flow)', () => {
+ describe('useTokenBuyability', () => {
const testCases = [
{
testName: 'token list is null',
@@ -280,12 +219,12 @@ describe('useTokenBuyability', () => {
{
testName: 'token is in the list and supported',
hookReturn: [
- {
+ getMockRampToken({
assetId:
'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
chainId: 'eip155:1',
tokenSupported: true,
- },
+ }),
],
token: getMockToken(),
expectedBuyable: true,
@@ -293,11 +232,11 @@ describe('useTokenBuyability', () => {
{
testName: 'token is native and supported',
hookReturn: [
- {
+ getMockRampToken({
assetId: 'eip155:1/slip44:60',
chainId: 'eip155:1',
tokenSupported: true,
- },
+ }),
],
token: getMockToken({ isNative: true }),
expectedBuyable: true,
@@ -307,10 +246,7 @@ describe('useTokenBuyability', () => {
it.each(testCases)(
'$testName - returns isBuyable: $expectedBuyable',
({ hookReturn, token, expectedBuyable }) => {
- mockUseRampTokens.mockReturnValue({
- allTokens: hookReturn,
- isLoading: false,
- } as UseRampTokensResult);
+ setupControllerTokens(hookReturn);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokenBuyability(token),
@@ -321,47 +257,8 @@ describe('useTokenBuyability', () => {
},
);
- it('ignores ramp entries without assetId', () => {
- mockUseRampTokens.mockReturnValue({
- allTokens: [getMockRampToken({ assetId: '' })],
- isLoading: false,
- } as UseRampTokensResult);
-
- const { result } = renderHook(() =>
- tokenBuyabilityModule.useTokenBuyability(getMockToken()),
- );
-
- expect(result.current.isBuyable).toBe(false);
- });
-
- it('returns isLoading: true when ramp tokens are loading', () => {
- mockUseRampTokens.mockReturnValue({
- allTokens: null,
- isLoading: true,
- } as UseRampTokensResult);
-
- const { result } = renderHook(() =>
- tokenBuyabilityModule.useTokenBuyability(getMockToken()),
- );
-
- expect(result.current.isBuyable).toBe(false);
- expect(result.current.isLoading).toBe(true);
- });
- });
-
- describe('when V2 is enabled', () => {
- beforeEach(() => {
- setupV2Mocks();
- });
-
it('returns isBuyable: false when controller tokens are null', () => {
- mockUseRampsTokens.mockReturnValue({
- tokens: null,
- selectedToken: null,
- setSelectedToken: jest.fn(),
- isLoading: false,
- error: null,
- });
+ setupControllerTokens(null);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokenBuyability(getMockToken()),
@@ -371,24 +268,13 @@ describe('useTokenBuyability', () => {
});
it('returns isBuyable: true when token is in controller token list (checksummed)', () => {
- // V2 uses parseRampIntent which checksums the address
- mockUseRampsTokens.mockReturnValue({
- tokens: {
- topTokens: [],
- allTokens: [
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F',
- chainId: 'eip155:1',
- tokenSupported: true,
- }),
- ],
- },
- selectedToken: null,
- setSelectedToken: jest.fn(),
- isLoading: false,
- error: null,
- });
+ setupControllerTokens([
+ getMockRampToken({
+ assetId: 'eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F',
+ chainId: 'eip155:1',
+ tokenSupported: true,
+ }),
+ ]);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokenBuyability(getMockToken()),
@@ -398,22 +284,13 @@ describe('useTokenBuyability', () => {
});
it('returns isBuyable: false when token is NOT in controller token list', () => {
- mockUseRampsTokens.mockReturnValue({
- tokens: {
- topTokens: [],
- allTokens: [
- getMockRampToken({
- assetId: 'eip155:1/erc20:0xSomeOtherToken',
- chainId: 'eip155:1',
- tokenSupported: true,
- }),
- ],
- },
- selectedToken: null,
- setSelectedToken: jest.fn(),
- isLoading: false,
- error: null,
- });
+ setupControllerTokens([
+ getMockRampToken({
+ assetId: 'eip155:1/erc20:0xSomeOtherToken',
+ chainId: 'eip155:1',
+ tokenSupported: true,
+ }),
+ ]);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokenBuyability(getMockToken()),
@@ -423,13 +300,7 @@ describe('useTokenBuyability', () => {
});
it('returns isLoading: true when controller tokens are loading', () => {
- mockUseRampsTokens.mockReturnValue({
- tokens: null,
- selectedToken: null,
- setSelectedToken: jest.fn(),
- isLoading: true,
- error: null,
- });
+ setupControllerTokens(null, true);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokenBuyability(getMockToken()),
@@ -439,74 +310,13 @@ describe('useTokenBuyability', () => {
expect(result.current.isLoading).toBe(true);
});
- it('returns isBuyable: false when V2 controller tokens are empty (no fallback)', () => {
- mockUseRampTokens.mockReturnValue({
- allTokens: [
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
- chainId: 'eip155:1',
- tokenSupported: true,
- }),
- ],
- isLoading: false,
- } as unknown as UseRampTokensResult);
-
- mockUseRampsTokens.mockReturnValue({
- tokens: {
- topTokens: [],
- allTokens: [],
- },
- selectedToken: null,
- setSelectedToken: jest.fn(),
- isLoading: false,
- error: null,
- });
-
- const { result } = renderHook(() =>
- tokenBuyabilityModule.useTokenBuyability(getMockToken()),
- );
-
- // V2 enabled: uses only V2 controller tokens, no legacy fallback
- expect(result.current.isBuyable).toBe(false);
- });
-
- it('ignores legacy tokens when V2 is enabled', () => {
- // Legacy says buyable, but V2 controller says NOT buyable
- mockUseRampTokens.mockReturnValue({
- allTokens: [
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
- chainId: 'eip155:1',
- tokenSupported: true,
- }),
- ],
- isLoading: false,
- } as unknown as UseRampTokensResult);
-
- mockUseRampsTokens.mockReturnValue({
- tokens: {
- topTokens: [],
- allTokens: [
- getMockRampToken({
- assetId: 'eip155:1/erc20:0xSomeOtherToken',
- chainId: 'eip155:1',
- tokenSupported: true,
- }),
- ],
- },
- selectedToken: null,
- setSelectedToken: jest.fn(),
- isLoading: false,
- error: null,
- });
+ it('ignores ramp entries without assetId', () => {
+ setupControllerTokens([getMockRampToken({ assetId: '' })]);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokenBuyability(getMockToken()),
);
- // V2 controller has tokens but NOT this one: not buyable (ignores legacy)
expect(result.current.isBuyable).toBe(false);
});
});
@@ -514,17 +324,12 @@ describe('useTokenBuyability', () => {
describe('single token wrapper contract', () => {
it('returns the same result as batch buyability for one token', () => {
const token = getMockToken();
- setupV1Mocks();
- mockUseRampTokens.mockReturnValue({
- allTokens: [
- getMockRampToken({
- assetId:
- 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
- tokenSupported: true,
- }),
- ],
- isLoading: false,
- } as UseRampTokensResult);
+ setupControllerTokens([
+ getMockRampToken({
+ assetId: 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
+ tokenSupported: true,
+ }),
+ ]);
const { result } = renderHook(() =>
tokenBuyabilityModule.useTokenBuyability(token),
diff --git a/app/components/UI/Ramp/hooks/useTokenBuyability.ts b/app/components/UI/Ramp/hooks/useTokenBuyability.ts
index aa9c48c33915..a0987b7ba83a 100644
--- a/app/components/UI/Ramp/hooks/useTokenBuyability.ts
+++ b/app/components/UI/Ramp/hooks/useTokenBuyability.ts
@@ -6,9 +6,7 @@ import {
isHexString,
} from '@metamask/utils';
import { TokenI } from '../../Tokens/types';
-import { useRampTokens } from './useRampTokens';
import { useRampsTokens } from './useRampsTokens';
-import useRampsUnifiedV2Enabled from './useRampsUnifiedV2Enabled';
import { toEvmCaipChainId } from '@metamask/multichain-network-controller';
import parseRampIntent from '../utils/parseRampIntent';
import { getDecimalChainId } from '../../../../util/networks';
@@ -101,25 +99,15 @@ function getIsTokenBuyable(
/**
* Hook that determines if tokens can be bought via ramp services.
- * When unified V2 is enabled, checks against the RampsController's token list.
- * When V2 is disabled, uses the legacy token cache API.
+ * Checks against the RampsController's token list.
*/
export const useTokensBuyability = (
tokens: TokenI[],
): UseTokensBuyabilityResult => {
- const isV2Enabled = useRampsUnifiedV2Enabled();
- const { allTokens: legacyAllTokens, isLoading: legacyLoading } =
- useRampTokens({
- fetchOnMount: !isV2Enabled,
- });
const { tokens: controllerTokens, isLoading: controllerLoading } =
useRampsTokens();
- const isLoading = isV2Enabled ? controllerLoading : legacyLoading;
-
- const rampsTokens = isV2Enabled
- ? controllerTokens?.allTokens
- : legacyAllTokens;
+ const rampsTokens = controllerTokens?.allTokens;
const buyabilityByTokenKey = useMemo(
() =>
tokens.reduce>((accumulator, token) => {
@@ -130,7 +118,7 @@ export const useTokensBuyability = (
[tokens, rampsTokens],
);
- return { buyabilityByTokenKey, isLoading };
+ return { buyabilityByTokenKey, isLoading: controllerLoading };
};
/**
diff --git a/app/components/UI/Ramp/hooks/useTokenNetworkInfo.ts b/app/components/UI/Ramp/hooks/useTokenNetworkInfo.ts
index 2d8bc59d99de..4f6776d2f835 100644
--- a/app/components/UI/Ramp/hooks/useTokenNetworkInfo.ts
+++ b/app/components/UI/Ramp/hooks/useTokenNetworkInfo.ts
@@ -5,7 +5,7 @@ import { ImageSourcePropType } from 'react-native';
import { selectNetworkConfigurationsByCaipChainId } from '../../../../selectors/networkController';
import { getNetworkImageSource } from '../../../../util/networks';
-import { DEPOSIT_NETWORKS_BY_CHAIN_ID } from '../Deposit/constants/networks';
+import { DEPOSIT_NETWORKS_BY_CHAIN_ID } from '../constants/networks';
interface TokenNetworkInfo {
networkName?: string;
diff --git a/app/components/UI/Ramp/hooks/useTransakController.test.ts b/app/components/UI/Ramp/hooks/useTransakController.test.ts
index b1089ee1068d..7bf90a0b9f4e 100644
--- a/app/components/UI/Ramp/hooks/useTransakController.test.ts
+++ b/app/components/UI/Ramp/hooks/useTransakController.test.ts
@@ -10,7 +10,7 @@ const mockGetProviderToken = jest.fn();
const mockStoreProviderToken = jest.fn();
const mockResetProviderToken = jest.fn();
-jest.mock('../Deposit/utils/ProviderTokenVault', () => ({
+jest.mock('../utils/ProviderTokenVault', () => ({
getProviderToken: (...args: unknown[]) => mockGetProviderToken(...args),
storeProviderToken: (...args: unknown[]) => mockStoreProviderToken(...args),
resetProviderToken: (...args: unknown[]) => mockResetProviderToken(...args),
diff --git a/app/components/UI/Ramp/hooks/useTransakController.ts b/app/components/UI/Ramp/hooks/useTransakController.ts
index a1aa0784111a..ccfee1879da4 100644
--- a/app/components/UI/Ramp/hooks/useTransakController.ts
+++ b/app/components/UI/Ramp/hooks/useTransakController.ts
@@ -6,7 +6,7 @@ import {
getProviderToken,
storeProviderToken,
resetProviderToken,
-} from '../Deposit/utils/ProviderTokenVault';
+} from '../utils/ProviderTokenVault';
import Engine from '../../../../core/Engine';
import Logger from '../../../../util/Logger';
import type {
diff --git a/app/components/UI/Ramp/hooks/useTransakRouting.test.ts b/app/components/UI/Ramp/hooks/useTransakRouting.test.ts
index a78c47f18f33..ccc05ae06ae9 100644
--- a/app/components/UI/Ramp/hooks/useTransakRouting.test.ts
+++ b/app/components/UI/Ramp/hooks/useTransakRouting.test.ts
@@ -175,14 +175,7 @@ jest.mock('../../../../selectors/rampsController', () => ({
selectTokens: jest.fn(),
}));
-jest.mock('../Deposit/orderProcessor', () => ({
- depositOrderToFiatOrder: jest.fn((order) => ({
- ...order,
- orderType: 'BUY',
- })),
-}));
-
-jest.mock('../Deposit/utils', () => ({
+jest.mock('../utils/depositUtils', () => ({
generateThemeParameters: jest.fn(() => ({ theme: 'light' })),
}));
@@ -254,7 +247,7 @@ jest.mock('@metamask/ramps-controller', () => ({
normalizeProviderCode: (code: string) => code.replace(/^\/providers\//, ''),
}));
-jest.mock('../Deposit/constants', () => ({
+jest.mock('../constants', () => ({
REDIRECTION_URL: 'https://redirect.example.com',
}));
diff --git a/app/components/UI/Ramp/hooks/useTransakRouting.ts b/app/components/UI/Ramp/hooks/useTransakRouting.ts
index e1f81134081e..0b2285ea0c0a 100644
--- a/app/components/UI/Ramp/hooks/useTransakRouting.ts
+++ b/app/components/UI/Ramp/hooks/useTransakRouting.ts
@@ -9,10 +9,12 @@ import {
normalizeProviderCode,
type TransakBuyQuote,
} from '@metamask/ramps-controller';
-import { REDIRECTION_URL } from '../Deposit/constants';
-import { generateThemeParameters } from '../Deposit/utils';
-import { BasicInfoFormData } from '../Deposit/Views/BasicInfo/BasicInfo';
-import { AddressFormData } from '../Deposit/Views/EnterAddress/EnterAddress';
+import { REDIRECTION_URL } from '../constants';
+import { generateThemeParameters } from '../utils/depositUtils';
+import type {
+ AddressFormData,
+ BasicInfoFormData,
+} from '../types/transakNativeForms';
import { createCheckoutNavDetails } from '../Views/Checkout';
import { createV2EnterEmailNavDetails } from '../Views/NativeFlow/EnterEmail';
import { createKycWebviewNavDetails } from '../Views/NativeFlow/KycWebview';
diff --git a/app/components/UI/Ramp/index.tsx b/app/components/UI/Ramp/index.tsx
index d84d82d3f352..b9a14aa70086 100644
--- a/app/components/UI/Ramp/index.tsx
+++ b/app/components/UI/Ramp/index.tsx
@@ -5,7 +5,6 @@ import { useNavigation } from '@react-navigation/native';
import { OrderOrderTypeEnum } from '@consensys/on-ramp-sdk/dist/API';
import WebView, { WebViewNavigation } from '@metamask/react-native-webview';
import AppConstants from '../../../core/AppConstants';
-import NotificationManager from '../../../core/NotificationManager';
import {
FiatOrder,
getPendingOrders,
@@ -28,20 +27,16 @@ import { trackEvent } from './hooks/useAnalytics';
import { CustomIdData } from '../../../reducers/fiatOrders/types';
import { callbackBaseUrl } from './Aggregator/sdk';
import useFetchRampNetworks from './Aggregator/hooks/useFetchRampNetworks';
-import getNotificationDetails from './utils/getNotificationDetails';
import stateHasOrder from './utils/stateHasOrder';
import Routes from '../../../constants/navigation/Routes';
import getOrderAnalyticsPayload from './utils/getOrderAnalyticsPayload';
-import { NativeRampsSdk } from '@consensys/native-ramps-sdk';
import { RampsOrderStatus } from '@metamask/ramps-controller';
-import { isRampsUnifiedV2Enabled } from './utils/isRampsUnifiedV2Enabled';
import { showV2OrderToast } from './utils/v2OrderToast';
const POLLING_FREQUENCY = AppConstants.FIAT_ORDERS.POLLING_FREQUENCY;
export interface ProcessorOptions {
forced?: boolean;
- sdk?: NativeRampsSdk;
}
export async function processFiatOrder(
@@ -60,20 +55,12 @@ export async function processFiatOrder(
trackEvent(event, params);
}
InteractionManager.runAfterInteractions(() => {
- const isV2 = isRampsUnifiedV2Enabled(state);
- if (isV2) {
- showV2OrderToast({
- orderId: updatedOrder.id,
- cryptocurrency: updatedOrder.cryptocurrency,
- cryptoAmount: updatedOrder.cryptoAmount,
- status: updatedOrder.state as unknown as RampsOrderStatus,
- });
- } else {
- const notificationDetails = getNotificationDetails(updatedOrder);
- if (notificationDetails) {
- NotificationManager.showSimpleNotification(notificationDetails);
- }
- }
+ showV2OrderToast({
+ orderId: updatedOrder.id,
+ cryptocurrency: updatedOrder.cryptocurrency,
+ cryptoAmount: updatedOrder.cryptoAmount,
+ status: updatedOrder.state as unknown as RampsOrderStatus,
+ });
});
}
dispatchUpdateFiatOrder(updatedOrder);
@@ -106,20 +93,12 @@ async function processCustomOrderId(
}
dispatchAddFiatOrder(fiatOrder);
InteractionManager.runAfterInteractions(() => {
- const isV2 = isRampsUnifiedV2Enabled(state);
- if (isV2) {
- showV2OrderToast({
- orderId: fiatOrder.id,
- cryptocurrency: fiatOrder.cryptocurrency,
- cryptoAmount: fiatOrder.cryptoAmount,
- status: fiatOrder.state as unknown as RampsOrderStatus,
- });
- } else {
- const notificationDetails = getNotificationDetails(fiatOrder);
- if (notificationDetails) {
- NotificationManager.showSimpleNotification(notificationDetails);
- }
- }
+ showV2OrderToast({
+ orderId: fiatOrder.id,
+ cryptocurrency: fiatOrder.cryptocurrency,
+ cryptoAmount: fiatOrder.cryptoAmount,
+ status: fiatOrder.state as unknown as RampsOrderStatus,
+ });
});
});
dispatchRemoveFiatCustomIdData(customOrderIdData);
diff --git a/app/components/UI/Ramp/orderProcessor/index.test.ts b/app/components/UI/Ramp/orderProcessor/index.test.ts
index 966161c3371a..f5b659f7baa7 100644
--- a/app/components/UI/Ramp/orderProcessor/index.test.ts
+++ b/app/components/UI/Ramp/orderProcessor/index.test.ts
@@ -3,7 +3,6 @@ import { OrderOrderTypeEnum } from '@consensys/on-ramp-sdk/dist/API';
import processOrder from '.';
import Logger from '../../../../util/Logger';
import { processAggregatorOrder } from '../Aggregator/orderProcessor/aggregator';
-import { processDepositOrder } from '../Deposit/orderProcessor';
import { processUnifiedOrder } from './unifiedOrderProcessor';
import { FiatOrder } from '../../../../reducers/fiatOrders/types';
import { FIAT_ORDER_PROVIDERS } from '../../../../constants/on-ramp';
@@ -57,10 +56,6 @@ jest.mock('../Aggregator/orderProcessor/aggregator', () => ({
processAggregatorOrder: jest.fn((order) => order),
}));
-jest.mock('../Deposit/orderProcessor', () => ({
- processDepositOrder: jest.fn((order) => order),
-}));
-
jest.mock('./unifiedOrderProcessor', () => ({
processUnifiedOrder: jest.fn((order) => order),
}));
@@ -76,9 +71,6 @@ describe('processOrder', () => {
typeof processAggregatorOrder
>
).mockClear();
- (
- processDepositOrder as jest.MockedFunction
- ).mockClear();
(
processUnifiedOrder as jest.MockedFunction
).mockClear();
@@ -88,6 +80,7 @@ describe('processOrder', () => {
FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY,
FIAT_ORDER_PROVIDERS.TRANSAK,
FIAT_ORDER_PROVIDERS.MOONPAY,
+ FIAT_ORDER_PROVIDERS.DEPOSIT,
])('should return same order for provider %s', async (provider) => {
const providerOrder = {
...mockOrder1,
@@ -130,7 +123,6 @@ describe('processOrder', () => {
await processOrder(rampsV2Order);
expect(processUnifiedOrder).toHaveBeenCalledWith(rampsV2Order, undefined);
expect(processAggregatorOrder).not.toHaveBeenCalled();
- expect(processDepositOrder).not.toHaveBeenCalled();
});
it('routes AGGREGATOR order to processAggregatorOrder', async () => {
@@ -141,15 +133,5 @@ describe('processOrder', () => {
);
expect(processUnifiedOrder).not.toHaveBeenCalled();
});
-
- it('routes DEPOSIT order to processDepositOrder', async () => {
- const depositOrder: FiatOrder = {
- ...mockOrder1,
- provider: FIAT_ORDER_PROVIDERS.DEPOSIT,
- };
- await processOrder(depositOrder);
- expect(processDepositOrder).toHaveBeenCalledWith(depositOrder, undefined);
- expect(processUnifiedOrder).not.toHaveBeenCalled();
- });
});
});
diff --git a/app/components/UI/Ramp/orderProcessor/index.ts b/app/components/UI/Ramp/orderProcessor/index.ts
index 490a36a577be..bd313e3d7387 100644
--- a/app/components/UI/Ramp/orderProcessor/index.ts
+++ b/app/components/UI/Ramp/orderProcessor/index.ts
@@ -3,7 +3,6 @@ import { FIAT_ORDER_PROVIDERS } from '../../../../constants/on-ramp';
import { FiatOrder } from '../../../../reducers/fiatOrders';
import Logger from '../../../../util/Logger';
import { processAggregatorOrder } from '../Aggregator/orderProcessor/aggregator';
-import { processDepositOrder } from '../Deposit/orderProcessor';
import { processUnifiedOrder } from './unifiedOrderProcessor';
function processOrder(
@@ -13,7 +12,8 @@ function processOrder(
switch (order.provider) {
case FIAT_ORDER_PROVIDERS.WYRE_APPLE_PAY:
case FIAT_ORDER_PROVIDERS.TRANSAK:
- case FIAT_ORDER_PROVIDERS.MOONPAY: {
+ case FIAT_ORDER_PROVIDERS.MOONPAY:
+ case FIAT_ORDER_PROVIDERS.DEPOSIT: {
return order;
}
case FIAT_ORDER_PROVIDERS.RAMPS_V2: {
@@ -22,9 +22,6 @@ function processOrder(
case FIAT_ORDER_PROVIDERS.AGGREGATOR: {
return processAggregatorOrder(order, options);
}
- case FIAT_ORDER_PROVIDERS.DEPOSIT: {
- return processDepositOrder(order, options);
- }
default: {
const unrecognizedProviderError = new Error(
'FiatOrders::ProcessOrder unrecognized provider',
diff --git a/app/components/UI/Ramp/routes.test.tsx b/app/components/UI/Ramp/routes.test.tsx
index aba6d071eef1..64325658edec 100644
--- a/app/components/UI/Ramp/routes.test.tsx
+++ b/app/components/UI/Ramp/routes.test.tsx
@@ -254,7 +254,7 @@ jest.mock('./Views/Modals/ProcessingInfoModal/ProcessingInfoModal', () => {
return MockModal;
});
-jest.mock('./Deposit/Views/Modals/SsnInfoModal', () => {
+jest.mock('./Views/Modals/SsnInfoModal', () => {
const MockModal = () => {
const { View, Text } = jest.requireActual('react-native');
return (
diff --git a/app/components/UI/Ramp/routes.tsx b/app/components/UI/Ramp/routes.tsx
index 5d0e11608988..7fb32fc631b4 100644
--- a/app/components/UI/Ramp/routes.tsx
+++ b/app/components/UI/Ramp/routes.tsx
@@ -24,7 +24,7 @@ import TokenNotAvailableModal from './Views/Modals/TokenNotAvailableModal';
import ProviderSelectionModal from './Views/Modals/ProviderSelectionModal';
import ErrorDetailsModal from './Views/Modals/ErrorDetailsModal';
import ProcessingInfoModal from './Views/Modals/ProcessingInfoModal/ProcessingInfoModal';
-import SsnInfoModal from './Deposit/Views/Modals/SsnInfoModal';
+import SsnInfoModal from './Views/Modals/SsnInfoModal';
import StateSelectorModal from './Views/Modals/StateSelectorModal';
import UnsupportedStateModal from './Views/Modals/UnsupportedStateModal';
import RampsOrderDetails from './Views/OrderDetails';
diff --git a/app/components/UI/Ramp/testUtils/constants.ts b/app/components/UI/Ramp/testUtils/constants.ts
new file mode 100644
index 000000000000..4d3788c225f7
--- /dev/null
+++ b/app/components/UI/Ramp/testUtils/constants.ts
@@ -0,0 +1,138 @@
+import { FIAT_ORDER_STATES } from '../../../../constants/on-ramp';
+import {
+ DepositOrderType,
+ DepositOrder,
+ type DepositRegion,
+ type DepositPaymentMethod,
+ DepositPaymentMethodDuration,
+} from '../types/legacyDeposit';
+import { IconName } from '../../../../component-library/components/Icons/Icon';
+import {
+ MOCK_USDC_TOKEN,
+ MOCK_USDT_TOKEN,
+ MOCK_BTC_TOKEN,
+ MOCK_ETH_TOKEN,
+ MOCK_USDC_SOLANA_TOKEN,
+ MOCK_CRYPTOCURRENCIES,
+} from './mockCryptoCurrencies';
+
+export const MOCK_US_REGION: DepositRegion = {
+ isoCode: 'US',
+ flag: '🇺🇸',
+ name: 'United States',
+ currency: 'USD',
+ phone: {
+ prefix: '+1',
+ placeholder: '(555) 123-4567',
+ template: '(###) ###-####',
+ },
+ supported: true,
+};
+
+// ====== CRYPTOCURRENCIES ======
+// Re-exported from constants/mockCryptoCurrencies.ts
+export {
+ MOCK_USDC_TOKEN,
+ MOCK_USDT_TOKEN,
+ MOCK_BTC_TOKEN,
+ MOCK_ETH_TOKEN,
+ MOCK_USDC_SOLANA_TOKEN,
+ MOCK_CRYPTOCURRENCIES,
+};
+
+export const MOCK_CREDIT_DEBIT_CARD: DepositPaymentMethod = {
+ id: 'credit_debit_card',
+ name: 'Debit or Credit',
+ duration: DepositPaymentMethodDuration.instant,
+ icon: IconName.Card,
+};
+
+export const MOCK_DEPOSIT_ORDER: Partial = {
+ id: 'test-order-id',
+ provider: 'test-provider',
+ createdAt: 1673886669608,
+ fiatAmount: 100,
+ totalFeesFiat: 2.5,
+ cryptoAmount: 0.05,
+ cryptoCurrency: MOCK_USDC_TOKEN,
+ fiatCurrency: 'USD',
+ network: { chainId: 'eip155:1', name: 'Ethereum' },
+ status: 'COMPLETED',
+ orderType: DepositOrderType.Deposit,
+ walletAddress: '0x1234567890123456789012345678901234567890',
+ txHash: '0x987654321',
+ exchangeRate: 2000,
+ networkFees: 1.25,
+ partnerFees: 1.25,
+ paymentMethod: MOCK_CREDIT_DEBIT_CARD,
+};
+
+export const MOCK_BANK_DETAILS_ORDER = {
+ id: 'test-order-id',
+ state: FIAT_ORDER_STATES.CREATED,
+ data: {
+ id: 'deposit-order-id',
+ provider: 'test-provider',
+ createdAt: Date.now(),
+ fiatAmount: 100,
+ fiatCurrency: 'USD',
+ cryptoCurrency: MOCK_USDC_TOKEN,
+ network: { chainId: 'eip155:1', name: 'Ethereum' },
+ status: 'created',
+ orderType: 'buy',
+ walletAddress: '0x123...',
+ paymentMethod: {
+ id: 'sepa_bank_transfer',
+ name: 'SEPA Bank Transfer',
+ duration: DepositPaymentMethodDuration.oneToTwoDays,
+ icon: IconName.Bank,
+ },
+ paymentDetails: [
+ {
+ fiatCurrency: 'USD',
+ paymentMethod: 'sepa_bank_transfer',
+ fields: [
+ { name: 'Amount', value: '$100.00', id: 'amount' },
+ { name: 'First Name (Beneficiary)', value: 'john', id: 'firstName' },
+ { name: 'Last Name (Beneficiary)', value: 'doe', id: 'lastName' },
+ { name: 'Account Number', value: '1234567890', id: 'accountNumber' },
+ { name: 'Bank Name', value: 'test bank', id: 'bankName' },
+ {
+ name: 'Recipient Address',
+ value: '456 recipient street',
+ id: 'recipientAddress',
+ },
+ { name: 'Bank Address', value: '123 bank street', id: 'bankAddress' },
+ ],
+ },
+ ],
+ },
+};
+
+export const MOCK_ANALYTICS_DEPOSIT_ORDER = {
+ id: '123',
+ provider: 'DEPOSIT',
+ createdAt: Date.now(),
+ account: '0x1234567890123456789012345678901234567890',
+ excludeFromPurchases: false,
+ orderType: DepositOrderType.Deposit,
+ amount: '100',
+ currency: 'USD',
+ cryptoAmount: '0.05',
+ cryptocurrency: 'USDC',
+ fee: '2.50',
+ state: FIAT_ORDER_STATES.COMPLETED,
+ network: 'eip155:1',
+ data: {
+ provider: 'TRANSAK',
+ cryptoCurrency: MOCK_USDC_TOKEN,
+ network: { chainId: 'eip155:1', name: 'Ethereum' },
+ fiatAmount: '100',
+ exchangeRate: '2000',
+ totalFeesFiat: '2.50',
+ networkFees: '1.25',
+ partnerFees: '1.25',
+ paymentMethod: MOCK_CREDIT_DEBIT_CARD,
+ fiatCurrency: 'USD',
+ },
+};
diff --git a/app/components/UI/Ramp/testUtils/index.ts b/app/components/UI/Ramp/testUtils/index.ts
new file mode 100644
index 000000000000..c94f80f843a1
--- /dev/null
+++ b/app/components/UI/Ramp/testUtils/index.ts
@@ -0,0 +1 @@
+export * from './constants';
diff --git a/app/components/UI/Ramp/Deposit/constants/mockCryptoCurrencies.ts b/app/components/UI/Ramp/testUtils/mockCryptoCurrencies.ts
similarity index 96%
rename from app/components/UI/Ramp/Deposit/constants/mockCryptoCurrencies.ts
rename to app/components/UI/Ramp/testUtils/mockCryptoCurrencies.ts
index b7a902b212d3..4854627c8716 100644
--- a/app/components/UI/Ramp/Deposit/constants/mockCryptoCurrencies.ts
+++ b/app/components/UI/Ramp/testUtils/mockCryptoCurrencies.ts
@@ -1,4 +1,4 @@
-import { DepositCryptoCurrency } from '@consensys/native-ramps-sdk';
+import { DepositCryptoCurrency } from '../types/legacyDeposit';
export type MockDepositCryptoCurrency = DepositCryptoCurrency & {
unsupported?: boolean;
diff --git a/app/components/UI/Ramp/Deposit/types/analytics.ts b/app/components/UI/Ramp/types/depositAnalytics.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/types/analytics.ts
rename to app/components/UI/Ramp/types/depositAnalytics.ts
diff --git a/app/components/UI/Ramp/Deposit/types/navigationParams.ts b/app/components/UI/Ramp/types/depositNavigationParams.ts
similarity index 63%
rename from app/components/UI/Ramp/Deposit/types/navigationParams.ts
rename to app/components/UI/Ramp/types/depositNavigationParams.ts
index b558345483bf..669c4b037b7a 100644
--- a/app/components/UI/Ramp/Deposit/types/navigationParams.ts
+++ b/app/components/UI/Ramp/types/depositNavigationParams.ts
@@ -1,4 +1,4 @@
-import { RampIntent } from '../../Aggregator/types';
+import { RampIntent } from '../Aggregator/types';
export type DepositNavigationParams = RampIntent & {
shouldRouteImmediately?: boolean;
diff --git a/app/components/UI/Ramp/types/legacyDeposit.ts b/app/components/UI/Ramp/types/legacyDeposit.ts
new file mode 100644
index 000000000000..66016415382e
--- /dev/null
+++ b/app/components/UI/Ramp/types/legacyDeposit.ts
@@ -0,0 +1,165 @@
+import type { CaipAssetReference, CaipChainId } from '@metamask/utils';
+
+/** Local types formerly imported from `@consensys/native-ramps-sdk`. */
+
+export enum SdkEnvironment {
+ Development = 'dev',
+ Staging = 'stg',
+ Production = 'prod',
+}
+
+export enum DepositOrderType {
+ Deposit = 'DEPOSIT',
+}
+
+export enum DepositPaymentMethodDuration {
+ instant = 'instant',
+ oneToTwoDays = '1_to_2_days',
+}
+
+export const OrderStatusEnum = {
+ Unknown: 'UNKNOWN',
+ Precreated: 'PRECREATED',
+ Created: 'CREATED',
+ Pending: 'PENDING',
+ Failed: 'FAILED',
+ Completed: 'COMPLETED',
+ Cancelled: 'CANCELLED',
+ IdExpired: 'ID_EXPIRED',
+} as const;
+
+export type OrderStatusEnum =
+ (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];
+
+export interface DepositRegion {
+ isoCode: string;
+ flag: string;
+ name: string;
+ phone: {
+ prefix: string;
+ placeholder: string;
+ template: string;
+ };
+ currency: string;
+ supported: boolean;
+ recommended?: boolean;
+ geolocated?: boolean;
+}
+
+export interface DepositPaymentMethod {
+ id: string;
+ name: string;
+ shortName?: string;
+ duration: DepositPaymentMethodDuration;
+ icon: string;
+ iconColor?: {
+ light: string;
+ dark: string;
+ };
+ isManualBankTransfer?: boolean;
+}
+
+export interface DepositNetwork {
+ name: string;
+ chainId: string;
+}
+
+export interface DepositCryptoCurrency {
+ assetId: CaipAssetReference;
+ name: string;
+ chainId: CaipChainId;
+ decimals: number;
+ iconUrl: string;
+ symbol: string;
+}
+
+export interface NativeTransakAccessToken {
+ accessToken: string;
+ ttl: number;
+ created: Date;
+}
+
+export interface NativeTransakUserDetailsKycDetails {
+ status: string;
+ type: string;
+ attempts: unknown[];
+ highestApprovedKYCType: string | null;
+ kycMarkedBy: string | null;
+ kycResult: string | null;
+ rejectionDetails: unknown | null;
+ userId: string;
+ workFlowRunId: string;
+}
+
+export interface NativeTransakUserDetails {
+ id: string;
+ firstName: string;
+ lastName: string;
+ email: string;
+ mobileNumber: string;
+ status: string;
+ dob: string;
+ kyc: NativeTransakUserDetailsKycDetails;
+ address: {
+ addressLine1: string;
+ addressLine2: string;
+ state: string;
+ city: string;
+ postCode: string;
+ country: string;
+ countryCode: string;
+ };
+ createdAt: string;
+}
+
+export interface BuyQuote {
+ quoteId: string;
+ conversionPrice: number;
+ marketConversionPrice: number;
+ slippage: number;
+ fiatCurrency: string;
+ cryptoCurrency: string;
+ paymentMethod: string;
+ fiatAmount: number;
+ cryptoAmount: number;
+ isBuyOrSell: string;
+ network: string;
+ feeDecimal: number;
+ totalFee: number;
+ feeBreakdown: unknown[];
+ nonce: number;
+ cryptoLiquidityProvider: string;
+ notes: unknown[];
+}
+
+export interface DepositOrder {
+ id: string;
+ provider: string;
+ cryptoAmount: number | string;
+ fiatAmount: number;
+ cryptoCurrency: DepositCryptoCurrency;
+ fiatCurrency: string;
+ providerOrderId: string;
+ providerOrderLink: string;
+ createdAt: number;
+ paymentMethod: DepositPaymentMethod;
+ totalFeesFiat: number;
+ txHash: string;
+ walletAddress: string;
+ status: OrderStatusEnum;
+ network: DepositNetwork;
+ timeDescriptionPending: string;
+ fiatAmountInUsd: number;
+ feesInUsd: number;
+ region: DepositRegion;
+ orderType: DepositOrderType.Deposit;
+ exchangeRate?: number;
+ statusDescription?: string;
+ paymentDetails: {
+ fiatCurrency: string;
+ paymentMethod: string;
+ fields: { name: string; id: string; value: string }[];
+ }[];
+ partnerFees?: number;
+ networkFees?: number;
+}
diff --git a/app/components/UI/Ramp/types/legacyNavigation.ts b/app/components/UI/Ramp/types/legacyNavigation.ts
new file mode 100644
index 000000000000..ac293f4ce6ff
--- /dev/null
+++ b/app/components/UI/Ramp/types/legacyNavigation.ts
@@ -0,0 +1,12 @@
+import type { BuyQuote } from './legacyDeposit';
+
+/** Legacy deposit-stack webview modal params (stack removed; types kept for NavigationService). */
+export interface WebviewModalParams {
+ sourceUrl: string;
+ handleNavigationStateChange?: (navState: { url: string }) => void;
+}
+
+export type KycWebviewModalParams = WebviewModalParams & {
+ quote: BuyQuote;
+ workFlowRunId: string;
+};
diff --git a/app/components/UI/Ramp/types/transakNativeForms.ts b/app/components/UI/Ramp/types/transakNativeForms.ts
new file mode 100644
index 000000000000..8eb2ad4dbb2f
--- /dev/null
+++ b/app/components/UI/Ramp/types/transakNativeForms.ts
@@ -0,0 +1,18 @@
+/** Shared Transak native KYC form field types (UB2 NativeFlow). */
+
+export interface BasicInfoFormData {
+ firstName: string;
+ lastName: string;
+ mobileNumber: string;
+ dob: string;
+ ssn?: string;
+}
+
+export interface AddressFormData {
+ addressLine1: string;
+ addressLine2: string;
+ city: string;
+ state: string;
+ postCode: string;
+ countryCode: string;
+}
diff --git a/app/components/UI/Ramp/Deposit/utils/ProviderTokenVault.test.ts b/app/components/UI/Ramp/utils/ProviderTokenVault.test.ts
similarity index 96%
rename from app/components/UI/Ramp/Deposit/utils/ProviderTokenVault.test.ts
rename to app/components/UI/Ramp/utils/ProviderTokenVault.test.ts
index 5b91061331f1..a00d70009a93 100644
--- a/app/components/UI/Ramp/Deposit/utils/ProviderTokenVault.test.ts
+++ b/app/components/UI/Ramp/utils/ProviderTokenVault.test.ts
@@ -1,12 +1,12 @@
-import SecureKeychain from '../../../../../core/SecureKeychain';
+import SecureKeychain from '../../../../core/SecureKeychain';
import {
getProviderToken,
resetProviderToken,
storeProviderToken,
} from './ProviderTokenVault';
-import { NativeTransakAccessToken } from '@consensys/native-ramps-sdk';
+import { NativeTransakAccessToken } from '../types/legacyDeposit';
-jest.mock('../../../../../core/SecureKeychain', () => ({
+jest.mock('../../../../core/SecureKeychain', () => ({
setSecureItem: jest.fn(),
getSecureItem: jest.fn(),
clearSecureScope: jest.fn(),
diff --git a/app/components/UI/Ramp/Deposit/utils/ProviderTokenVault.ts b/app/components/UI/Ramp/utils/ProviderTokenVault.ts
similarity index 93%
rename from app/components/UI/Ramp/Deposit/utils/ProviderTokenVault.ts
rename to app/components/UI/Ramp/utils/ProviderTokenVault.ts
index 3bba2c6d6eda..6d3e66997925 100644
--- a/app/components/UI/Ramp/Deposit/utils/ProviderTokenVault.ts
+++ b/app/components/UI/Ramp/utils/ProviderTokenVault.ts
@@ -1,5 +1,5 @@
-import SecureKeychain from '../../../../../core/SecureKeychain';
-import { NativeTransakAccessToken } from '@consensys/native-ramps-sdk';
+import SecureKeychain from '../../../../core/SecureKeychain';
+import { NativeTransakAccessToken } from '../types/legacyDeposit';
const PROVIDER_TOKEN_KEY = 'TRANSAK_ACCESS_TOKEN';
diff --git a/app/components/UI/Ramp/Deposit/utils/utils.test.ts b/app/components/UI/Ramp/utils/depositUtils.test.ts
similarity index 95%
rename from app/components/UI/Ramp/Deposit/utils/utils.test.ts
rename to app/components/UI/Ramp/utils/depositUtils.test.ts
index 467b41f3aea2..a7c770d9b7a0 100644
--- a/app/components/UI/Ramp/Deposit/utils/utils.test.ts
+++ b/app/components/UI/Ramp/utils/depositUtils.test.ts
@@ -3,20 +3,20 @@ import {
hasDepositOrderField,
generateThemeParameters,
timestampToTransakFormat,
-} from '.';
-import { FiatOrder } from '../../../../../reducers/fiatOrders';
+} from './depositUtils';
+import { FiatOrder } from '../../../../reducers/fiatOrders';
import {
FIAT_ORDER_PROVIDERS,
FIAT_ORDER_STATES,
-} from '../../../../../constants/on-ramp';
-import { DepositOrder, DepositOrderType } from '@consensys/native-ramps-sdk';
-import { strings } from '../../../../../../locales/i18n';
+} from '../../../../constants/on-ramp';
+import { DepositOrder, DepositOrderType } from '../types/legacyDeposit';
+import { strings } from '../../../../../locales/i18n';
import { darkTheme } from '@metamask/design-tokens';
-import { mockTheme } from '../../../../../util/theme';
-import { AppThemeKey } from '../../../../../util/theme/models';
+import { mockTheme } from '../../../../util/theme';
+import { AppThemeKey } from '../../../../util/theme/models';
import { MOCK_ETH_TOKEN } from '../testUtils/constants';
-jest.mock('../../../../../../locales/i18n', () => ({
+jest.mock('../../../../../locales/i18n', () => ({
strings: jest.fn(),
}));
diff --git a/app/components/UI/Ramp/Deposit/utils/index.ts b/app/components/UI/Ramp/utils/depositUtils.ts
similarity index 91%
rename from app/components/UI/Ramp/Deposit/utils/index.ts
rename to app/components/UI/Ramp/utils/depositUtils.ts
index c7dfa9defc05..bcadaaabdb32 100644
--- a/app/components/UI/Ramp/Deposit/utils/index.ts
+++ b/app/components/UI/Ramp/utils/depositUtils.ts
@@ -1,9 +1,9 @@
-import { DepositOrder } from '@consensys/native-ramps-sdk';
-import { FiatOrder } from '../../../../../reducers/fiatOrders';
-import { FIAT_ORDER_STATES } from '../../../../../constants/on-ramp';
-import { renderNumber } from '../../../../../util/number';
-import { strings } from '../../../../../../locales/i18n';
-import { AppThemeKey, Colors } from '../../../../../util/theme/models';
+import { DepositOrder } from '../types/legacyDeposit';
+import { FiatOrder } from '../../../../reducers/fiatOrders';
+import { FIAT_ORDER_STATES } from '../../../../constants/on-ramp';
+import { renderNumber } from '../../../../util/number';
+import { strings } from '../../../../../locales/i18n';
+import { AppThemeKey, Colors } from '../../../../util/theme/models';
const emailRegex =
/^[-!#$%&'*+/0-9=?A-Z^_a-z`{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/;
diff --git a/app/components/UI/Ramp/Deposit/components/DepositPhoneField/formatNumberToTemplate.test.ts b/app/components/UI/Ramp/utils/formatNumberToTemplate.test.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/DepositPhoneField/formatNumberToTemplate.test.ts
rename to app/components/UI/Ramp/utils/formatNumberToTemplate.test.ts
diff --git a/app/components/UI/Ramp/Deposit/components/DepositPhoneField/formatNumberToTemplate.ts b/app/components/UI/Ramp/utils/formatNumberToTemplate.ts
similarity index 100%
rename from app/components/UI/Ramp/Deposit/components/DepositPhoneField/formatNumberToTemplate.ts
rename to app/components/UI/Ramp/utils/formatNumberToTemplate.ts
diff --git a/app/components/UI/Ramp/Deposit/utils/getDepositAnalyticsPayload.test.ts b/app/components/UI/Ramp/utils/getDepositAnalyticsPayload.test.ts
similarity index 97%
rename from app/components/UI/Ramp/Deposit/utils/getDepositAnalyticsPayload.test.ts
rename to app/components/UI/Ramp/utils/getDepositAnalyticsPayload.test.ts
index 98ec860acf17..1f0c697687e2 100644
--- a/app/components/UI/Ramp/Deposit/utils/getDepositAnalyticsPayload.test.ts
+++ b/app/components/UI/Ramp/utils/getDepositAnalyticsPayload.test.ts
@@ -1,7 +1,7 @@
-import { FIAT_ORDER_STATES } from '../../../../../constants/on-ramp';
-import { FiatOrder } from '../../../../../reducers/fiatOrders';
-import { RootState } from '../../../../../reducers';
-import { backgroundState } from '../../../../../util/test/initial-root-state';
+import { FIAT_ORDER_STATES } from '../../../../constants/on-ramp';
+import { FiatOrder } from '../../../../reducers/fiatOrders';
+import { RootState } from '../../../../reducers';
+import { backgroundState } from '../../../../util/test/initial-root-state';
import getDepositAnalyticsPayload from './getDepositAnalyticsPayload';
import {
MOCK_ANALYTICS_DEPOSIT_ORDER,
diff --git a/app/components/UI/Ramp/Deposit/utils/getDepositAnalyticsPayload.ts b/app/components/UI/Ramp/utils/getDepositAnalyticsPayload.ts
similarity index 92%
rename from app/components/UI/Ramp/Deposit/utils/getDepositAnalyticsPayload.ts
rename to app/components/UI/Ramp/utils/getDepositAnalyticsPayload.ts
index bea536b720dd..828cdd49fd74 100644
--- a/app/components/UI/Ramp/Deposit/utils/getDepositAnalyticsPayload.ts
+++ b/app/components/UI/Ramp/utils/getDepositAnalyticsPayload.ts
@@ -1,12 +1,12 @@
import {
FiatOrder,
fiatOrdersRegionSelectorDeposit,
-} from '../../../../../reducers/fiatOrders';
-import { RootState } from '../../../../../reducers';
-import { FIAT_ORDER_STATES } from '../../../../../constants/on-ramp';
-import { hasDepositOrderField } from './index';
-import { AnalyticsEvents } from '../types';
-import { selectNetworkConfigurationsByCaipChainId } from '../../../../../selectors/networkController';
+} from '../../../../reducers/fiatOrders';
+import { RootState } from '../../../../reducers';
+import { FIAT_ORDER_STATES } from '../../../../constants/on-ramp';
+import { hasDepositOrderField } from './depositUtils';
+import { AnalyticsEvents } from '../types/depositAnalytics';
+import { selectNetworkConfigurationsByCaipChainId } from '../../../../selectors/networkController';
/**
* Builds the terminal RAMPS_TRANSACTION_COMPLETED / RAMPS_TRANSACTION_FAILED
diff --git a/app/components/UI/Ramp/utils/getNotificationDetails.test.ts b/app/components/UI/Ramp/utils/getNotificationDetails.test.ts
index 7cf7deaff7a6..2010f2766708 100644
--- a/app/components/UI/Ramp/utils/getNotificationDetails.test.ts
+++ b/app/components/UI/Ramp/utils/getNotificationDetails.test.ts
@@ -1,14 +1,14 @@
-import { DepositOrderType } from '@consensys/native-ramps-sdk';
+import { DepositOrderType } from '../types/legacyDeposit';
import getNotificationDetails from './getNotificationDetails';
import { getNotificationDetails as getAggregatorNotificationDetails } from '../Aggregator/utils';
-import { getNotificationDetails as getDepositNotificationDetails } from '../Deposit/utils';
+import { getNotificationDetails as getDepositNotificationDetails } from '../utils/depositUtils';
import { FiatOrder } from '../../../../reducers/fiatOrders';
jest.mock('../Aggregator/utils', () => ({
getNotificationDetails: jest.fn(),
}));
-jest.mock('../Deposit/utils', () => ({
+jest.mock('../utils/depositUtils', () => ({
getNotificationDetails: jest.fn(),
}));
diff --git a/app/components/UI/Ramp/utils/getNotificationDetails.ts b/app/components/UI/Ramp/utils/getNotificationDetails.ts
index 6a26b9d49cbc..b2a70938627a 100644
--- a/app/components/UI/Ramp/utils/getNotificationDetails.ts
+++ b/app/components/UI/Ramp/utils/getNotificationDetails.ts
@@ -1,7 +1,7 @@
-import { DepositOrderType } from '@consensys/native-ramps-sdk';
+import { DepositOrderType } from '../types/legacyDeposit';
import { FiatOrder } from '../../../../reducers/fiatOrders';
import { getNotificationDetails as getAggregatorNotificationDetails } from '../Aggregator/utils';
-import { getNotificationDetails as getDepositNotificationDetails } from '../Deposit/utils';
+import { getNotificationDetails as getDepositNotificationDetails } from './depositUtils';
function getNotificationDetails(order: FiatOrder) {
if (order.orderType === DepositOrderType.Deposit) {
diff --git a/app/components/UI/Ramp/utils/getOrderAnalyticsPayload.ts b/app/components/UI/Ramp/utils/getOrderAnalyticsPayload.ts
index 7d157413ef37..f82034975a7e 100644
--- a/app/components/UI/Ramp/utils/getOrderAnalyticsPayload.ts
+++ b/app/components/UI/Ramp/utils/getOrderAnalyticsPayload.ts
@@ -1,7 +1,7 @@
import { FIAT_ORDER_PROVIDERS } from '../../../../constants/on-ramp';
import { FiatOrder } from '../../../../reducers/fiatOrders';
import { RootState } from '../../../../reducers';
-import getDepositAnalyticsPayload from '../Deposit/utils/getDepositAnalyticsPayload';
+import getDepositAnalyticsPayload from '../utils/getDepositAnalyticsPayload';
import getAggregatorAnalyticsPayload from '../Aggregator/utils/getAggregatorAnalyticsPayload';
import getRampsV2AnalyticsPayload from './getRampsV2AnalyticsPayload';
diff --git a/app/components/UI/Ramp/utils/getRampsV2AnalyticsPayload.ts b/app/components/UI/Ramp/utils/getRampsV2AnalyticsPayload.ts
index 55e459a2aafd..78824ce66f28 100644
--- a/app/components/UI/Ramp/utils/getRampsV2AnalyticsPayload.ts
+++ b/app/components/UI/Ramp/utils/getRampsV2AnalyticsPayload.ts
@@ -1,7 +1,7 @@
import type { RampsOrder } from '@metamask/ramps-controller';
import { FiatOrder } from '../../../../reducers/fiatOrders';
import { AnalyticsEvents } from '../Aggregator/types';
-import type { AnalyticsEvents as UnifiedAnalyticsEvents } from '../Deposit/types/analytics';
+import type { AnalyticsEvents as UnifiedAnalyticsEvents } from '../types/depositAnalytics';
import { FIAT_ORDER_STATES } from '../../../../constants/on-ramp';
type EventName =
diff --git a/app/components/UI/Ramp/Deposit/sdk/getSdkEnvironment.test.ts b/app/components/UI/Ramp/utils/getSdkEnvironment.test.ts
similarity index 98%
rename from app/components/UI/Ramp/Deposit/sdk/getSdkEnvironment.test.ts
rename to app/components/UI/Ramp/utils/getSdkEnvironment.test.ts
index fd691818f6b6..cda9a2470aec 100644
--- a/app/components/UI/Ramp/Deposit/sdk/getSdkEnvironment.test.ts
+++ b/app/components/UI/Ramp/utils/getSdkEnvironment.test.ts
@@ -1,4 +1,4 @@
-import { SdkEnvironment } from '@consensys/native-ramps-sdk';
+import { SdkEnvironment } from '../types/legacyDeposit';
import { getSdkEnvironment } from './getSdkEnvironment';
describe('getSdkEnvironment', () => {
diff --git a/app/components/UI/Ramp/Deposit/sdk/getSdkEnvironment.ts b/app/components/UI/Ramp/utils/getSdkEnvironment.ts
similarity index 92%
rename from app/components/UI/Ramp/Deposit/sdk/getSdkEnvironment.ts
rename to app/components/UI/Ramp/utils/getSdkEnvironment.ts
index ecba8c9ffa2a..71d4fc8abb07 100644
--- a/app/components/UI/Ramp/Deposit/sdk/getSdkEnvironment.ts
+++ b/app/components/UI/Ramp/utils/getSdkEnvironment.ts
@@ -1,4 +1,4 @@
-import { SdkEnvironment } from '@consensys/native-ramps-sdk';
+import { SdkEnvironment } from '../types/legacyDeposit';
/**
* When BUILDS_ENABLED_WITH_GH_ACTIONS_TEMPORARY (and not E2E), uses RAMPS_ENVIRONMENT (set by builds.yml).
diff --git a/app/components/UI/Ramp/utils/isRampsUnifiedV2Enabled.test.ts b/app/components/UI/Ramp/utils/isRampsUnifiedV2Enabled.test.ts
deleted file mode 100644
index cc0c454ac77d..000000000000
--- a/app/components/UI/Ramp/utils/isRampsUnifiedV2Enabled.test.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-import initialRootState, {
- backgroundState,
-} from '../../../../util/test/initial-root-state';
-import { isRampsUnifiedV2Enabled } from './isRampsUnifiedV2Enabled';
-import { getVersion } from 'react-native-device-info';
-
-jest.mock('react-native-device-info', () => ({
- getVersion: jest.fn(),
-}));
-
-function buildState({
- enabled = true,
- minimumVersion,
-}: {
- enabled?: boolean;
- minimumVersion?: string | null;
-} = {}) {
- return {
- ...initialRootState,
- engine: {
- backgroundState: {
- ...backgroundState,
- RemoteFeatureFlagController: {
- ...backgroundState.RemoteFeatureFlagController,
- remoteFeatureFlags: {
- rampsUnifiedBuyV2: {
- enabled,
- ...(minimumVersion !== undefined && { minimumVersion }),
- },
- },
- },
- },
- },
- };
-}
-
-describe('isRampsUnifiedV2Enabled', () => {
- const mockGetVersion = jest.mocked(getVersion);
- const originalEnv = process.env;
-
- beforeEach(() => {
- jest.clearAllMocks();
- process.env = { ...originalEnv };
- delete process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED;
- });
-
- afterAll(() => {
- process.env = originalEnv;
- });
-
- describe('build flag precedence', () => {
- it('returns true when build flag is "true" regardless of remote flags', () => {
- process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED = 'true';
-
- const result = isRampsUnifiedV2Enabled(
- buildState({ enabled: false, minimumVersion: '99.0.0' }),
- );
-
- expect(result).toBe(true);
- });
-
- it('returns false when build flag is "false" regardless of remote flags', () => {
- process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED = 'false';
-
- const result = isRampsUnifiedV2Enabled(
- buildState({ enabled: true, minimumVersion: '1.0.0' }),
- );
-
- expect(result).toBe(false);
- });
- });
-
- describe('remote feature flag behavior when build flag is not set', () => {
- it('returns true when enabled and version meets minimum requirement', () => {
- mockGetVersion.mockReturnValue('8.0.0');
-
- const result = isRampsUnifiedV2Enabled(
- buildState({ enabled: true, minimumVersion: '7.63.0' }),
- );
-
- expect(result).toBe(true);
- });
-
- it('returns false when enabled flag is false', () => {
- mockGetVersion.mockReturnValue('8.0.0');
-
- const result = isRampsUnifiedV2Enabled(
- buildState({ enabled: false, minimumVersion: '7.63.0' }),
- );
-
- expect(result).toBe(false);
- });
-
- it('returns false when version does not meet minimum requirement', () => {
- mockGetVersion.mockReturnValue('7.0.0');
-
- const result = isRampsUnifiedV2Enabled(
- buildState({ enabled: true, minimumVersion: '7.63.0' }),
- );
-
- expect(result).toBe(false);
- });
-
- it('returns false when minimumVersion is not configured', () => {
- mockGetVersion.mockReturnValue('8.0.0');
-
- const result = isRampsUnifiedV2Enabled(
- buildState({ enabled: true, minimumVersion: null }),
- );
-
- expect(result).toBe(false);
- });
-
- it('returns true when version exactly equals minimum version', () => {
- mockGetVersion.mockReturnValue('7.63.0');
-
- const result = isRampsUnifiedV2Enabled(
- buildState({ enabled: true, minimumVersion: '7.63.0' }),
- );
-
- expect(result).toBe(true);
- });
- });
-});
diff --git a/app/components/UI/Ramp/utils/isRampsUnifiedV2Enabled.ts b/app/components/UI/Ramp/utils/isRampsUnifiedV2Enabled.ts
deleted file mode 100644
index 956ccd194b18..000000000000
--- a/app/components/UI/Ramp/utils/isRampsUnifiedV2Enabled.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { selectRampsUnifiedBuyV2Enabled } from '../../../../selectors/featureFlagController/ramps/rampsUnifiedBuyV2';
-import { RootState } from '../../../../reducers';
-
-/**
- * Non-hook equivalent of useRampsUnifiedV2Enabled.
- * Checks build flag override, active flag, and minimum version gate.
- * Use this in thunks / plain functions where hooks aren't available.
- */
-export function isRampsUnifiedV2Enabled(state: RootState): boolean {
- const buildFlag = process.env.MM_RAMPS_UNIFIED_BUY_V2_ENABLED;
- if (buildFlag === 'true' || buildFlag === 'false') {
- return buildFlag === 'true';
- }
-
- return selectRampsUnifiedBuyV2Enabled(state);
-}
diff --git a/app/components/UI/Ramp/utils/webviewFunnelAnalytics.ts b/app/components/UI/Ramp/utils/webviewFunnelAnalytics.ts
index 7f5e923a4b9f..f18a33d212ac 100644
--- a/app/components/UI/Ramp/utils/webviewFunnelAnalytics.ts
+++ b/app/components/UI/Ramp/utils/webviewFunnelAnalytics.ts
@@ -1,4 +1,4 @@
-import type { RampSurface } from '../Deposit/types/analytics';
+import type { RampSurface } from '../types/depositAnalytics';
import { redactUrlForAnalytics } from './redactUrlForAnalytics';
export type CloseSource =
diff --git a/app/components/UI/Ramp/utils/withRampAndDepositSDK.tsx b/app/components/UI/Ramp/utils/withRampAndDepositSDK.tsx
deleted file mode 100644
index 22d16d2df636..000000000000
--- a/app/components/UI/Ramp/utils/withRampAndDepositSDK.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import React from 'react';
-import { RampSDKProvider } from '../Aggregator/sdk';
-import { DepositSDKProvider } from '../Deposit/sdk';
-
-function withRampAndDepositSDK(Component: React.ComponentType) {
- return (props: Record) => (
-
-
-
-
-
- );
-}
-export default withRampAndDepositSDK;
diff --git a/app/components/UI/TokenDetails/components/TokenDetailsActions.test.tsx b/app/components/UI/TokenDetails/components/TokenDetailsActions.test.tsx
index 11136958ed93..44b9b416f282 100644
--- a/app/components/UI/TokenDetails/components/TokenDetailsActions.test.tsx
+++ b/app/components/UI/TokenDetails/components/TokenDetailsActions.test.tsx
@@ -27,7 +27,7 @@ jest.mock('@react-navigation/native', () => {
};
});
-jest.mock('../../Ramp/Deposit/hooks/useDepositEnabled', () => ({
+jest.mock('../../Ramp/hooks/useDepositEnabled', () => ({
__esModule: true,
default: () => ({ isDepositEnabled: true }),
}));
diff --git a/app/components/UI/TokenDetails/hooks/useTokenAtomicActions.test.ts b/app/components/UI/TokenDetails/hooks/useTokenAtomicActions.test.ts
index cfedafbd0b9e..d12927b660d2 100644
--- a/app/components/UI/TokenDetails/hooks/useTokenAtomicActions.test.ts
+++ b/app/components/UI/TokenDetails/hooks/useTokenAtomicActions.test.ts
@@ -33,7 +33,7 @@ import {
getOrders,
} from '../../../../reducers/fiatOrders';
import { selectRampsOrdersForSelectedAccountGroup } from '../../../../selectors/rampsController';
-import { getProviderToken } from '../../Ramp/Deposit/utils/ProviderTokenVault';
+import { getProviderToken } from '../../Ramp/utils/ProviderTokenVault';
import { TokenDetailsSource } from '../constants/constants';
import {
createMockInternalAccount,
@@ -97,7 +97,7 @@ jest.mock('../../../../selectors/rampsController', () => ({
selectRampsOrdersForSelectedAccountGroup: jest.fn(),
}));
-jest.mock('../../Ramp/Deposit/utils/ProviderTokenVault', () => ({
+jest.mock('../../Ramp/utils/ProviderTokenVault', () => ({
getProviderToken: jest.fn(),
}));
@@ -149,12 +149,6 @@ jest.mock('../../Ramp/hooks/useRampNavigation', () => ({
}),
}));
-const mockRampsUnifiedV2Enabled = jest.fn(() => false);
-jest.mock('../../Ramp/hooks/useRampsUnifiedV2Enabled', () => ({
- __esModule: true,
- default: () => mockRampsUnifiedV2Enabled(),
-}));
-
const mockSendNonEvmAsset = jest.fn().mockResolvedValue(false);
jest.mock('../../../hooks/useSendNonEvmAsset', () => ({
useSendNonEvmAsset: () => ({
@@ -287,7 +281,6 @@ beforeEach(() => {
goToSwaps: mockGoToSwaps,
networkModal: null,
});
- mockRampsUnifiedV2Enabled.mockReturnValue(false);
});
/**
@@ -564,17 +557,6 @@ describe('useTokenAtomicActions - useHandleOnBuy', () => {
is_authenticated: true,
region: 'US',
order_count: 0,
- ramp_type: 'BUY',
- });
- });
-
- it('switches ramp_type to UNIFIED_BUY_2 when the unified-v2 flag is enabled', async () => {
- mockRampsUnifiedV2Enabled.mockReturnValue(true);
-
- const { result } = await renderOnBuy();
- result.current();
-
- assertAnalyticsEvent(MetaMetricsEvents.RAMPS_BUTTON_CLICKED, {
ramp_type: 'UNIFIED_BUY_2',
});
});
diff --git a/app/components/UI/TokenDetails/hooks/useTokenAtomicActions.ts b/app/components/UI/TokenDetails/hooks/useTokenAtomicActions.ts
index a2ba1874c15a..b73749454d64 100644
--- a/app/components/UI/TokenDetails/hooks/useTokenAtomicActions.ts
+++ b/app/components/UI/TokenDetails/hooks/useTokenAtomicActions.ts
@@ -36,12 +36,11 @@ import {
getOrders,
} from '../../../../reducers/fiatOrders';
import { selectRampsOrdersForSelectedAccountGroup } from '../../../../selectors/rampsController';
-import { getProviderToken } from '../../Ramp/Deposit/utils/ProviderTokenVault';
+import { getProviderToken } from '../../Ramp/utils/ProviderTokenVault';
import {
completedOrdersFromFiatOrders,
completedOrdersFromRampsOrders,
} from '../../Ramp/utils/determinePreferredProvider';
-import useRampsUnifiedV2Enabled from '../../Ramp/hooks/useRampsUnifiedV2Enabled';
import { BridgeToken } from '../../Bridge/types';
import { adaptTokenSecurityData } from '../../Bridge/utils/tokenSecurityUtils';
import { getSwapDestToken } from '../../Bridge/utils/getSwapDestToken';
@@ -221,7 +220,6 @@ export const useHandleOnBuy = ({ token }: { token: TokenActionInput }) => {
const store = useStore();
const { trackEvent, createEventBuilder } = useAnalytics();
const { goToBuy } = useRampNavigation();
- const isV2UnifiedEnabled = useRampsUnifiedV2Enabled();
const isAuthenticated = useIsRampAuthenticated();
return useCallback(() => {
@@ -271,7 +269,7 @@ export const useHandleOnBuy = ({ token }: { token: TokenActionInput }) => {
button_text: 'Buy',
location: 'TokenDetails',
chain_id_destination: getDecimalChainId(tokenChainIdHex),
- ramp_type: isV2UnifiedEnabled ? 'UNIFIED_BUY_2' : 'BUY',
+ ramp_type: 'UNIFIED_BUY_2',
region: rampGeodetectedRegion,
is_authenticated: isAuthenticated,
preferred_provider: preferredProvider,
@@ -282,15 +280,7 @@ export const useHandleOnBuy = ({ token }: { token: TokenActionInput }) => {
);
goToBuy({ assetId }, { buyFlowOrigin: 'tokenInfo' });
- }, [
- store,
- token,
- trackEvent,
- createEventBuilder,
- isV2UnifiedEnabled,
- isAuthenticated,
- goToBuy,
- ]);
+ }, [store, token, trackEvent, createEventBuilder, isAuthenticated, goToBuy]);
};
/**
diff --git a/app/components/UI/WalletHomeOnboardingSteps/useWalletHomeOnboardingChecklistFundPress.test.ts b/app/components/UI/WalletHomeOnboardingSteps/useWalletHomeOnboardingChecklistFundPress.test.ts
index 7cdcd43674e1..45cb03c0ba67 100644
--- a/app/components/UI/WalletHomeOnboardingSteps/useWalletHomeOnboardingChecklistFundPress.test.ts
+++ b/app/components/UI/WalletHomeOnboardingSteps/useWalletHomeOnboardingChecklistFundPress.test.ts
@@ -30,12 +30,6 @@ jest.mock('../Ramp/hooks/useRampsButtonClickData', () => ({
useRampsButtonClickData: () => mockUseRampsButtonClickData(),
}));
-const mockUseRampsUnifiedV2Enabled = jest.fn();
-jest.mock('../Ramp/hooks/useRampsUnifiedV2Enabled', () => ({
- __esModule: true,
- default: () => mockUseRampsUnifiedV2Enabled(),
-}));
-
jest.mock('react-redux', () => ({
useSelector: jest.fn((selector: (...args: unknown[]) => unknown) =>
selector({} as never),
@@ -62,7 +56,6 @@ describe('useWalletHomeOnboardingChecklistFundPress', () => {
beforeEach(() => {
jest.clearAllMocks();
mockUseRampsButtonClickData.mockReturnValue(defaultButtonClickData);
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
mockUseWalletHomeOnboardingFundRampIntent.mockReturnValue({
rampIntent: undefined,
isLoading: false,
@@ -84,7 +77,7 @@ describe('useWalletHomeOnboardingChecklistFundPress', () => {
expect(mockAddProperties).toHaveBeenCalledWith({
button_text: 'Add funds',
location: ActionLocation.ONBOARDING_CHECKLIST,
- ramp_type: 'BUY',
+ ramp_type: 'UNIFIED_BUY_2',
region: 'US',
is_authenticated: true,
preferred_provider: 'test-provider',
@@ -112,22 +105,4 @@ describe('useWalletHomeOnboardingChecklistFundPress', () => {
assetId: MAINNET_MUSD_RAMP_ASSET_ID,
});
});
-
- it('uses UNIFIED_BUY_2 ramp_type when V2 unified is enabled', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
-
- const { result } = renderHook(() =>
- useWalletHomeOnboardingChecklistFundPress(goToBuy),
- );
-
- act(() => {
- result.current();
- });
-
- expect(mockAddProperties).toHaveBeenCalledWith(
- expect.objectContaining({
- ramp_type: 'UNIFIED_BUY_2',
- }),
- );
- });
});
diff --git a/app/components/UI/WalletHomeOnboardingSteps/useWalletHomeOnboardingChecklistFundPress.ts b/app/components/UI/WalletHomeOnboardingSteps/useWalletHomeOnboardingChecklistFundPress.ts
index a09be4fe7fc7..415cd579f75a 100644
--- a/app/components/UI/WalletHomeOnboardingSteps/useWalletHomeOnboardingChecklistFundPress.ts
+++ b/app/components/UI/WalletHomeOnboardingSteps/useWalletHomeOnboardingChecklistFundPress.ts
@@ -4,7 +4,6 @@ import { MetaMetricsEvents } from '../../../core/Analytics';
import { useAnalytics } from '../../hooks/useAnalytics/useAnalytics';
import { ActionLocation } from '../../../util/analytics/actionButtonTracking';
import { getDetectedGeolocation } from '../../../reducers/fiatOrders';
-import useRampsUnifiedV2Enabled from '../Ramp/hooks/useRampsUnifiedV2Enabled';
import { useRampsButtonClickData } from '../Ramp/hooks/useRampsButtonClickData';
import { walletHomeOnboardingPrimaryLabelForStep } from './walletHomeOnboardingStepsStrings';
import { useWalletHomeOnboardingFundRampIntent } from './useWalletHomeOnboardingFundRampIntent';
@@ -22,19 +21,16 @@ export function useWalletHomeOnboardingChecklistFundPress(
): () => void {
const { trackEvent, createEventBuilder } = useAnalytics();
const buttonClickData = useRampsButtonClickData();
- const isV2UnifiedEnabled = useRampsUnifiedV2Enabled();
const region = useSelector(getDetectedGeolocation);
const { rampIntent } = useWalletHomeOnboardingFundRampIntent();
return useCallback(() => {
- const rampType = isV2UnifiedEnabled ? 'UNIFIED_BUY_2' : 'BUY';
-
trackEvent(
createEventBuilder(MetaMetricsEvents.RAMPS_BUTTON_CLICKED)
.addProperties({
button_text: walletHomeOnboardingPrimaryLabelForStep('fund'),
location: ActionLocation.ONBOARDING_CHECKLIST,
- ramp_type: rampType,
+ ramp_type: 'UNIFIED_BUY_2',
region,
is_authenticated: buttonClickData.is_authenticated,
preferred_provider: buttonClickData.preferred_provider,
@@ -50,7 +46,6 @@ export function useWalletHomeOnboardingChecklistFundPress(
buttonClickData.preferred_provider,
createEventBuilder,
goToBuy,
- isV2UnifiedEnabled,
rampIntent,
region,
trackEvent,
diff --git a/app/components/Views/AccountsMenu/AccountsMenu.test.tsx b/app/components/Views/AccountsMenu/AccountsMenu.test.tsx
index a06da079a32c..25b49cceee07 100644
--- a/app/components/Views/AccountsMenu/AccountsMenu.test.tsx
+++ b/app/components/Views/AccountsMenu/AccountsMenu.test.tsx
@@ -64,8 +64,6 @@ jest.mock('../../../../locales/i18n', () => ({
strings: jest.fn((key: string) => key),
}));
-jest.mock('../../UI/Ramp/hooks/useRampsUnifiedV2Enabled');
-
const mockGoToBuy = jest.fn();
jest.mock('../../UI/Ramp/hooks/useRampNavigation', () => ({
useRampNavigation: () => ({
@@ -221,7 +219,7 @@ describe('AccountsMenu', () => {
expect(mockAddProperties).toHaveBeenCalledWith({
button_text: 'Buy',
location: 'AccountsMenu',
- ramp_type: 'BUY',
+ ramp_type: 'UNIFIED_BUY_2',
chain_id_destination: null,
region: 'US',
is_authenticated: true,
diff --git a/app/components/Views/AccountsMenu/AccountsMenu.tsx b/app/components/Views/AccountsMenu/AccountsMenu.tsx
index a305fb5ee0d6..7cf23f26ca07 100644
--- a/app/components/Views/AccountsMenu/AccountsMenu.tsx
+++ b/app/components/Views/AccountsMenu/AccountsMenu.tsx
@@ -25,7 +25,6 @@ import Routes from '../../../constants/navigation/Routes';
import { strings } from '../../../../locales/i18n';
import { useAnalytics } from '../../hooks/useAnalytics/useAnalytics';
import { AccountsMenuSelectorsIDs } from './AccountsMenu.testIds';
-import useRampsUnifiedV2Enabled from '../../UI/Ramp/hooks/useRampsUnifiedV2Enabled';
import AppConstants from '../../../core/AppConstants';
import DeeplinkManager from '../../../core/DeeplinkManager/DeeplinkManager';
import { getDetectedGeolocation } from '../../../reducers/fiatOrders';
@@ -50,7 +49,6 @@ const AccountsMenu = () => {
const { goToBuy } = useRampNavigation();
const rampGeodetectedRegion = useSelector(getDetectedGeolocation);
const rampsButtonClickData = useRampsButtonClickData();
- const isV2UnifiedEnabled = useRampsUnifiedV2Enabled();
const isNotificationEnabled = useSelector(
selectIsMetamaskNotificationsEnabled,
);
@@ -66,7 +64,7 @@ const AccountsMenu = () => {
.addProperties({
button_text: 'Buy',
location: 'AccountsMenu',
- ramp_type: isV2UnifiedEnabled ? 'UNIFIED_BUY_2' : 'BUY',
+ ramp_type: 'UNIFIED_BUY_2',
chain_id_destination: null,
region: rampGeodetectedRegion ?? null,
is_authenticated: rampsButtonClickData.is_authenticated ?? null,
@@ -82,7 +80,6 @@ const AccountsMenu = () => {
trackEvent,
rampGeodetectedRegion,
rampsButtonClickData,
- isV2UnifiedEnabled,
]);
const onPressNotifications = useCallback(() => {
diff --git a/app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.test.tsx b/app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.test.tsx
index 311e5bda65d7..f5e9e22946ea 100644
--- a/app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.test.tsx
+++ b/app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.test.tsx
@@ -42,7 +42,7 @@ jest.mock('../../../../core/redux/slices/bridge', () => ({
selectIsSwapsEnabled: jest.fn(),
}));
-jest.mock('../../../UI/Ramp/Deposit/hooks/useDepositEnabled', () => ({
+jest.mock('../../../UI/Ramp/hooks/useDepositEnabled', () => ({
__esModule: true,
default: () => ({ isDepositEnabled: true }),
}));
diff --git a/app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.tsx b/app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.tsx
index b87e4a3ed7bf..83001d131537 100644
--- a/app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.tsx
+++ b/app/components/Views/AssetDetails/AssetDetailsActions/AssetDetailsActions.tsx
@@ -11,7 +11,7 @@ import { useSelector } from 'react-redux';
import { selectCanSignTransactions } from '../../../../selectors/accountsController';
import { selectIsSwapsEnabled } from '../../../../core/redux/slices/bridge';
import Routes from '../../../../constants/navigation/Routes';
-import useDepositEnabled from '../../../UI/Ramp/Deposit/hooks/useDepositEnabled';
+import useDepositEnabled from '../../../UI/Ramp/hooks/useDepositEnabled';
import { RootState } from '../../../../reducers';
import { useAnalytics } from '../../../../components/hooks/useAnalytics/useAnalytics';
import {
diff --git a/app/components/Views/Homepage/Sections/Tokens/hooks/useRampsButtonClickedEvent.test.ts b/app/components/Views/Homepage/Sections/Tokens/hooks/useRampsButtonClickedEvent.test.ts
index db09bc548d6b..f2ecf5093992 100644
--- a/app/components/Views/Homepage/Sections/Tokens/hooks/useRampsButtonClickedEvent.test.ts
+++ b/app/components/Views/Homepage/Sections/Tokens/hooks/useRampsButtonClickedEvent.test.ts
@@ -22,12 +22,6 @@ jest.mock('../../../../../UI/Ramp/hooks/useRampsButtonClickData', () => ({
useRampsButtonClickData: () => mockUseRampsButtonClickData(),
}));
-const mockUseRampsUnifiedV2Enabled = jest.fn();
-jest.mock('../../../../../UI/Ramp/hooks/useRampsUnifiedV2Enabled', () => ({
- __esModule: true,
- default: () => mockUseRampsUnifiedV2Enabled(),
-}));
-
jest.mock('react-redux', () => ({
useSelector: jest.fn((selector: (...args: unknown[]) => unknown) =>
selector({} as never),
@@ -48,10 +42,9 @@ describe('useRampsButtonClickedEvent', () => {
beforeEach(() => {
jest.clearAllMocks();
mockUseRampsButtonClickData.mockReturnValue(defaultButtonClickData);
- mockUseRampsUnifiedV2Enabled.mockReturnValue(false);
});
- it('fires RAMPS_BUTTON_CLICKED with ramp_type BUY when unified V2 is off', () => {
+ it('fires RAMPS_BUTTON_CLICKED with ramp_type UNIFIED_BUY_2', () => {
const { result } = renderHook(() => useRampsButtonClickedEvent());
act(() => {
@@ -64,7 +57,7 @@ describe('useRampsButtonClickedEvent', () => {
expect(mockAddProperties).toHaveBeenCalledWith({
button_text: 'Buy',
location: 'TokensSection',
- ramp_type: 'BUY',
+ ramp_type: 'UNIFIED_BUY_2',
region: 'US',
is_authenticated: false,
preferred_provider: undefined,
@@ -98,20 +91,6 @@ describe('useRampsButtonClickedEvent', () => {
);
});
- it('fires with ramp_type UNIFIED_BUY_2 when V2 is enabled', () => {
- mockUseRampsUnifiedV2Enabled.mockReturnValue(true);
-
- const { result } = renderHook(() => useRampsButtonClickedEvent());
-
- act(() => {
- result.current.trackBuyButtonClicked();
- });
-
- expect(mockAddProperties).toHaveBeenCalledWith(
- expect.objectContaining({ ramp_type: 'UNIFIED_BUY_2' }),
- );
- });
-
it('includes authentication and order data from useRampsButtonClickData', () => {
mockUseRampsButtonClickData.mockReturnValue({
is_authenticated: true,
diff --git a/app/components/Views/Homepage/Sections/Tokens/hooks/useRampsButtonClickedEvent.ts b/app/components/Views/Homepage/Sections/Tokens/hooks/useRampsButtonClickedEvent.ts
index c2b031127ef9..cdb395c9b1c5 100644
--- a/app/components/Views/Homepage/Sections/Tokens/hooks/useRampsButtonClickedEvent.ts
+++ b/app/components/Views/Homepage/Sections/Tokens/hooks/useRampsButtonClickedEvent.ts
@@ -3,31 +3,25 @@ import { useSelector } from 'react-redux';
import { useAnalytics } from '../../../../../hooks/useAnalytics/useAnalytics';
import { MetaMetricsEvents } from '../../../../../../core/Analytics';
import { useRampsButtonClickData } from '../../../../../UI/Ramp/hooks/useRampsButtonClickData';
-import useRampsUnifiedV2Enabled from '../../../../../UI/Ramp/hooks/useRampsUnifiedV2Enabled';
import { getDetectedGeolocation } from '../../../../../../reducers/fiatOrders';
/**
* Encapsulates the `Ramps Button Clicked` analytics event for the
- * Tokens Section empty state. Feature-flag-dependent properties
- * (ramp_type) are resolved internally so callers only need to invoke
- * the returned callback.
+ * Tokens Section empty state.
*/
export const useRampsButtonClickedEvent = () => {
const { trackEvent, createEventBuilder } = useAnalytics();
const buttonClickData = useRampsButtonClickData();
- const isV2UnifiedEnabled = useRampsUnifiedV2Enabled();
const region = useSelector(getDetectedGeolocation);
const trackBuyButtonClicked = useCallback(
(assetSymbol?: string) => {
- const rampType = isV2UnifiedEnabled ? 'UNIFIED_BUY_2' : 'BUY';
-
trackEvent(
createEventBuilder(MetaMetricsEvents.RAMPS_BUTTON_CLICKED)
.addProperties({
button_text: 'Buy',
location: 'TokensSection',
- ramp_type: rampType,
+ ramp_type: 'UNIFIED_BUY_2',
region,
is_authenticated: buttonClickData.is_authenticated,
preferred_provider: buttonClickData.preferred_provider,
@@ -37,13 +31,7 @@ export const useRampsButtonClickedEvent = () => {
.build(),
);
},
- [
- trackEvent,
- createEventBuilder,
- isV2UnifiedEnabled,
- region,
- buttonClickData,
- ],
+ [trackEvent, createEventBuilder, region, buttonClickData],
);
return { trackBuyButtonClicked };
diff --git a/app/components/Views/confirmations/hooks/alerts/useGasSponsorshipWarningAlert.test.ts b/app/components/Views/confirmations/hooks/alerts/useGasSponsorshipWarningAlert.test.ts
index e7f3dfd28cff..c2d7d1605fc0 100644
--- a/app/components/Views/confirmations/hooks/alerts/useGasSponsorshipWarningAlert.test.ts
+++ b/app/components/Views/confirmations/hooks/alerts/useGasSponsorshipWarningAlert.test.ts
@@ -72,7 +72,6 @@ describe('useGasSponsorshipWarningAlert', () => {
goToBuy: jest.fn(),
goToAggregator: jest.fn(),
goToSell: jest.fn(),
- goToDeposit: jest.fn(),
});
mockUseIsGasSponsored.mockReturnValue(true);
});
diff --git a/app/components/Views/confirmations/hooks/alerts/useInsufficientBalanceAlert.test.ts b/app/components/Views/confirmations/hooks/alerts/useInsufficientBalanceAlert.test.ts
index 96f92d7a785b..17c791704b13 100644
--- a/app/components/Views/confirmations/hooks/alerts/useInsufficientBalanceAlert.test.ts
+++ b/app/components/Views/confirmations/hooks/alerts/useInsufficientBalanceAlert.test.ts
@@ -136,7 +136,6 @@ describe('useInsufficientBalanceAlert', () => {
goToBuy: mockGoToBuy,
goToAggregator: jest.fn(),
goToSell: jest.fn(),
- goToDeposit: jest.fn(),
});
useTransactionPayHasSourceAmountMock.mockReturnValue(false);
diff --git a/app/components/Views/confirmations/hooks/pay/useFiatConfirm.ts b/app/components/Views/confirmations/hooks/pay/useFiatConfirm.ts
index cc034bb8cfb4..c9d0b312aa5f 100644
--- a/app/components/Views/confirmations/hooks/pay/useFiatConfirm.ts
+++ b/app/components/Views/confirmations/hooks/pay/useFiatConfirm.ts
@@ -11,7 +11,7 @@ import type { Quote } from '../../../../UI/Ramp/types';
import {
RAMP_SURFACE,
type RampSurface,
-} from '../../../../UI/Ramp/Deposit/types/analytics';
+} from '../../../../UI/Ramp/types/depositAnalytics';
import Engine from '../../../../../core/Engine';
import { getTransactionPayFiatTestOptions } from '../../../../../util/environment';
import { useTransactionMetadataRequest } from '../transactions/useTransactionMetadataRequest';
diff --git a/app/core/Authentication/Authentication.test.ts b/app/core/Authentication/Authentication.test.ts
index 6c09a6c1ebf8..60530f419658 100644
--- a/app/core/Authentication/Authentication.test.ts
+++ b/app/core/Authentication/Authentication.test.ts
@@ -52,7 +52,7 @@ import {
import { TraceName, TraceOperation } from '../../util/trace';
import { analytics } from '../../util/analytics/analytics';
import { MetaMetricsEvents } from '../Analytics';
-import { resetProviderToken as depositResetProviderToken } from '../../components/UI/Ramp/Deposit/utils/ProviderTokenVault';
+import { resetProviderToken as depositResetProviderToken } from '../../components/UI/Ramp/utils/ProviderTokenVault';
import { clearAllVaultBackups } from '../BackupVault/backupVault';
import { Engine as EngineClass } from '../Engine/Engine';
import { cancelBulkLink } from '../../store/sagas/rewardsBulkLinkAccountGroups';
@@ -309,7 +309,7 @@ jest.mock('@sentry/react-native', () => ({
captureException: (...args: unknown[]) => mockCaptureException(...args),
}));
-jest.mock('../../components/UI/Ramp/Deposit/utils/ProviderTokenVault', () => ({
+jest.mock('../../components/UI/Ramp/utils/ProviderTokenVault', () => ({
resetProviderToken: jest.fn(),
}));
diff --git a/app/core/Authentication/Authentication.ts b/app/core/Authentication/Authentication.ts
index e756a775cd4c..274eba40c2e0 100644
--- a/app/core/Authentication/Authentication.ts
+++ b/app/core/Authentication/Authentication.ts
@@ -72,7 +72,7 @@ import { analytics } from '../../util/analytics/analytics';
import { AnalyticsEventBuilder } from '../../util/analytics/AnalyticsEventBuilder';
import { MetaMetricsEvents } from '../Analytics/MetaMetrics.events';
import { createDataDeletionTask as createDataDeletionTaskUtil } from '../../util/analytics/analyticsDataDeletion';
-import { resetProviderToken as depositResetProviderToken } from '../../components/UI/Ramp/Deposit/utils/ProviderTokenVault';
+import { resetProviderToken as depositResetProviderToken } from '../../components/UI/Ramp/utils/ProviderTokenVault';
import {
setAllowLoginWithRememberMe,
setOsAuthEnabled,
diff --git a/app/core/Engine/controllers/geolocation-api-service-init.test.ts b/app/core/Engine/controllers/geolocation-api-service-init.test.ts
index 8709b85df04b..b219a5d86635 100644
--- a/app/core/Engine/controllers/geolocation-api-service-init.test.ts
+++ b/app/core/Engine/controllers/geolocation-api-service-init.test.ts
@@ -12,12 +12,12 @@ import { MOCK_ANY_NAMESPACE, type MockAnyNamespace } from '@metamask/messenger';
jest.mock('@metamask/geolocation-controller');
-jest.mock('../../../components/UI/Ramp/Deposit/sdk/getSdkEnvironment', () => ({
+jest.mock('../../../components/UI/Ramp/utils/getSdkEnvironment', () => ({
getSdkEnvironment: jest.fn(),
}));
-import { getSdkEnvironment } from '../../../components/UI/Ramp/Deposit/sdk/getSdkEnvironment';
-import { SdkEnvironment } from '@consensys/native-ramps-sdk';
+import { getSdkEnvironment } from '../../../components/UI/Ramp/utils/getSdkEnvironment';
+import { SdkEnvironment } from '../../../components/UI/Ramp/types/legacyDeposit';
const mockGetSdkEnvironment = jest.mocked(getSdkEnvironment);
function getInitRequestMock(): jest.Mocked<
diff --git a/app/core/Engine/controllers/geolocation-api-service-init.ts b/app/core/Engine/controllers/geolocation-api-service-init.ts
index 6138a0ed3f16..d3a1bc2e4cb4 100644
--- a/app/core/Engine/controllers/geolocation-api-service-init.ts
+++ b/app/core/Engine/controllers/geolocation-api-service-init.ts
@@ -3,8 +3,8 @@ import {
Env,
type GeolocationApiServiceMessenger,
} from '@metamask/geolocation-controller';
-import { SdkEnvironment } from '@consensys/native-ramps-sdk';
-import { getSdkEnvironment } from '../../../components/UI/Ramp/Deposit/sdk/getSdkEnvironment';
+import { SdkEnvironment } from '../../../components/UI/Ramp/types/legacyDeposit';
+import { getSdkEnvironment } from '../../../components/UI/Ramp/utils/getSdkEnvironment';
import type { MessengerClientInitFunction } from '../types';
/**
diff --git a/app/core/Engine/controllers/ramps-controller/event-handlers/analytics.ts b/app/core/Engine/controllers/ramps-controller/event-handlers/analytics.ts
index 6ecf532ce8cf..90d8b20bc6f8 100644
--- a/app/core/Engine/controllers/ramps-controller/event-handlers/analytics.ts
+++ b/app/core/Engine/controllers/ramps-controller/event-handlers/analytics.ts
@@ -15,7 +15,7 @@ import {
} from '../headlessOrderContextRegistry';
// Type-only import so `react` is not pulled into core; mirrors the emission in
// `useAnalytics` without importing the hook.
-import type { AnalyticsEvents } from '../../../../../components/UI/Ramp/Deposit/types/analytics';
+import type { AnalyticsEvents } from '../../../../../components/UI/Ramp/types/depositAnalytics';
/**
* Builds the `RAMPS_TRANSACTION_FAILED` payload for a headless order. Mirrors
diff --git a/app/core/Engine/controllers/ramps-controller/headlessOrderContextRegistry.ts b/app/core/Engine/controllers/ramps-controller/headlessOrderContextRegistry.ts
index e86abe530e75..b6b7d15a533a 100644
--- a/app/core/Engine/controllers/ramps-controller/headlessOrderContextRegistry.ts
+++ b/app/core/Engine/controllers/ramps-controller/headlessOrderContextRegistry.ts
@@ -1,4 +1,4 @@
-import type { RampSurface } from '../../../../components/UI/Ramp/Deposit/types/analytics';
+import type { RampSurface } from '../../../../components/UI/Ramp/types/depositAnalytics';
import { extractOrderCode } from '../../../../components/UI/Ramp/utils/extractOrderCode';
/**
diff --git a/app/core/Engine/controllers/ramps-controller/ramps-controller-init.test.ts b/app/core/Engine/controllers/ramps-controller/ramps-controller-init.test.ts
index 3cfb6e2a69ce..17a1f48f01c4 100644
--- a/app/core/Engine/controllers/ramps-controller/ramps-controller-init.test.ts
+++ b/app/core/Engine/controllers/ramps-controller/ramps-controller-init.test.ts
@@ -77,26 +77,10 @@ const getInitRampsDebugBridgeMock = (): jest.Mock =>
) as { initRampsDebugBridge: jest.Mock }
).initRampsDebugBridge;
-const createMockInitMessenger = (
- overrides: {
- enabled?: boolean;
- minimumVersion?: string | null;
- } = {},
-): RampsControllerInitMessenger => {
- const { enabled = false, minimumVersion = null } = overrides;
-
- return {
- call: jest.fn().mockReturnValue({
- remoteFeatureFlags: {
- rampsUnifiedBuyV2: {
- enabled,
- minimumVersion,
- },
- },
- }),
+const createMockInitMessenger = (): RampsControllerInitMessenger =>
+ ({
subscribe: jest.fn(),
- } as unknown as RampsControllerInitMessenger;
-};
+ }) as unknown as RampsControllerInitMessenger;
describe('ramps controller init', () => {
const rampsControllerClassMock = jest.mocked(RampsController);
@@ -211,116 +195,25 @@ describe('ramps controller init', () => {
expect(rampsControllerState).toStrictEqual(initialRampsControllerState);
});
- describe('when V2 feature flag is enabled', () => {
- it('calls init at startup', async () => {
- initRequestMock.initMessenger = createMockInitMessenger({
- enabled: true,
- minimumVersion: '1.0.0',
- });
-
- rampsControllerInit(initRequestMock);
-
- await waitFor(() => {
- expect(mockInit).toHaveBeenCalledTimes(1);
- });
- });
-
- it('calls init when remote flags were off at startup then V2 enables on RemoteFeatureFlagController:stateChange', async () => {
- let remoteEnabled = false;
- const subscribeMock = jest.fn();
- const initMessenger = {
- call: jest.fn(() => ({
- remoteFeatureFlags: {
- rampsUnifiedBuyV2: remoteEnabled
- ? { enabled: true, minimumVersion: '1.0.0' }
- : { enabled: false },
- },
- })),
- subscribe: subscribeMock,
- } as unknown as RampsControllerInitMessenger;
-
- initRequestMock.initMessenger = initMessenger;
-
- rampsControllerInit(initRequestMock);
-
- expect(mockInit).not.toHaveBeenCalled();
-
- const stateChangeHandler = subscribeMock.mock.calls.find(
- (call) => call[0] === 'RemoteFeatureFlagController:stateChange',
- )?.[1] as () => void;
-
- expect(stateChangeHandler).toBeDefined();
-
- remoteEnabled = true;
- stateChangeHandler();
-
- await waitFor(() => {
- expect(mockInit).toHaveBeenCalledTimes(1);
- });
- });
-
- it('handles init failure gracefully', async () => {
- initRequestMock.initMessenger = createMockInitMessenger({
- enabled: true,
- minimumVersion: '1.0.0',
- });
- mockInit.mockRejectedValue(new Error('Network error'));
-
- expect(() => rampsControllerInit(initRequestMock)).not.toThrow();
+ it('calls init at startup', async () => {
+ rampsControllerInit(initRequestMock);
- await waitFor(() => {
- expect(mockInit).toHaveBeenCalledTimes(1);
- });
+ await waitFor(() => {
+ expect(mockInit).toHaveBeenCalledTimes(1);
});
});
- describe('when V2 feature flag is disabled', () => {
- it('does not call init at startup', async () => {
- initRequestMock.initMessenger = createMockInitMessenger({
- enabled: false,
- });
-
- rampsControllerInit(initRequestMock);
-
- await waitFor(() => {
- expect(mockInit).not.toHaveBeenCalled();
- });
- });
-
- it('does not call init when enabled is true but minimumVersion is missing', async () => {
- initRequestMock.initMessenger = createMockInitMessenger({
- enabled: true,
- minimumVersion: null,
- });
+ it('handles init failure gracefully', async () => {
+ mockInit.mockRejectedValue(new Error('Network error'));
- rampsControllerInit(initRequestMock);
+ expect(() => rampsControllerInit(initRequestMock)).not.toThrow();
- await waitFor(() => {
- expect(mockInit).not.toHaveBeenCalled();
- });
- });
-
- it('does not call init when RemoteFeatureFlagController throws', async () => {
- initRequestMock.initMessenger = {
- call: jest.fn().mockImplementation(() => {
- throw new Error('Controller not ready');
- }),
- subscribe: jest.fn(),
- } as unknown as RampsControllerInitMessenger;
-
- rampsControllerInit(initRequestMock);
-
- await waitFor(() => {
- expect(mockInit).not.toHaveBeenCalled();
- });
+ await waitFor(() => {
+ expect(mockInit).toHaveBeenCalledTimes(1);
});
});
- it('always returns the controller instance regardless of flag state', () => {
- initRequestMock.initMessenger = createMockInitMessenger({
- enabled: false,
- });
-
+ it('returns the controller instance', () => {
const result = rampsControllerInit(initRequestMock);
expect(result.controller).toBeDefined();
@@ -353,9 +246,6 @@ describe('ramps controller init', () => {
it('requires RampsDebugBridge and calls initRampsDebugBridge with controller and messenger', () => {
process.env.RAMPS_DEBUG_DASHBOARD = 'true';
- initRequestMock.initMessenger = createMockInitMessenger({
- enabled: false,
- });
const { controller } = rampsControllerInit(initRequestMock);
const initRampsDebugBridge = getInitRampsDebugBridgeMock();
@@ -369,9 +259,6 @@ describe('ramps controller init', () => {
it('does not load RampsDebugBridge when RAMPS_DEBUG_DASHBOARD is false', () => {
process.env.RAMPS_DEBUG_DASHBOARD = 'false';
- initRequestMock.initMessenger = createMockInitMessenger({
- enabled: false,
- });
rampsControllerInit(initRequestMock);
@@ -379,10 +266,6 @@ describe('ramps controller init', () => {
});
it('does not load RampsDebugBridge when RAMPS_DEBUG_DASHBOARD is unset', () => {
- initRequestMock.initMessenger = createMockInitMessenger({
- enabled: false,
- });
-
rampsControllerInit(initRequestMock);
expect(getInitRampsDebugBridgeMock()).not.toHaveBeenCalled();
diff --git a/app/core/Engine/controllers/ramps-controller/ramps-controller-init.ts b/app/core/Engine/controllers/ramps-controller/ramps-controller-init.ts
index 435f9457680c..c8db0e6783c3 100644
--- a/app/core/Engine/controllers/ramps-controller/ramps-controller-init.ts
+++ b/app/core/Engine/controllers/ramps-controller/ramps-controller-init.ts
@@ -5,8 +5,6 @@ import {
getDefaultRampsControllerState,
} from '@metamask/ramps-controller';
import type { RampsControllerInitMessenger } from '../../messengers/ramps-controller-messenger';
-import { validatedVersionGatedFeatureFlag } from '../../../../util/remoteFeatureFlag';
-import { RAMPS_UNIFIED_BUY_V2_FLAG_KEY } from '../../../../selectors/featureFlagController/ramps/rampsUnifiedBuyV2';
import { handleOrderStatusChangedForNotifications } from './event-handlers/notification';
import { handleOrderStatusChangedForMetrics } from './event-handlers/analytics';
@@ -18,34 +16,13 @@ function isRampsDebugDashboardEnabled(): boolean {
return process.env.RAMPS_DEBUG_DASHBOARD === 'true';
}
-/**
- * Whether Unified Buy V2 is enabled per RemoteFeatureFlagController state.
- *
- * @param initMessenger - The init messenger to read RemoteFeatureFlagController state.
- * @returns Whether V2 is enabled.
- */
-function getIsRampsUnifiedBuyV2Enabled(
- initMessenger: RampsControllerInitMessenger,
-): boolean {
- try {
- const remoteState = initMessenger.call(
- 'RemoteFeatureFlagController:getState',
- );
- const remoteFlag =
- remoteState?.remoteFeatureFlags?.[RAMPS_UNIFIED_BUY_V2_FLAG_KEY];
- return validatedVersionGatedFeatureFlag(remoteFlag) ?? false;
- } catch {
- return false;
- }
-}
-
/**
* Initialize the ramps controller.
*
* @param request - The request object.
* @param request.controllerMessenger - The messenger to use for the controller.
* @param request.persistedState - The persisted state.
- * @param request.initMessenger - The init messenger for reading feature flags.
+ * @param request.initMessenger - The init messenger for order event subscriptions.
* @returns The initialized controller.
*/
export const rampsControllerInit: MessengerClientInitFunction<
@@ -63,7 +40,7 @@ export const rampsControllerInit: MessengerClientInitFunction<
let orderSubscriptionsRegistered = false;
- const registerUnifiedBuyV2OrderSubscriptions = (): void => {
+ const registerOrderSubscriptions = (): void => {
if (orderSubscriptionsRegistered) {
return;
}
@@ -78,11 +55,8 @@ export const rampsControllerInit: MessengerClientInitFunction<
);
};
- const startUnifiedBuyV2IfEnabled = (): void => {
- if (!getIsRampsUnifiedBuyV2Enabled(initMessenger)) {
- return;
- }
- registerUnifiedBuyV2OrderSubscriptions();
+ const startRampsController = (): void => {
+ registerOrderSubscriptions();
controller
.init()
.then(() => {
@@ -93,18 +67,7 @@ export const rampsControllerInit: MessengerClientInitFunction<
});
};
- startUnifiedBuyV2IfEnabled();
-
- // Remote flags can be empty on first Engine init and fill in once the
- // controller has fetched; re-check so RampsController.init() runs then.
- //
- // This event fires for any RemoteFeatureFlagController state update — not
- // only rampsUnifiedBuyV2. When V2 is off, startUnifiedBuyV2IfEnabled returns
- // immediately. When V2 is on, order subscriptions register once; init() and
- // startOrderPolling() are idempotent, so repeat invocations are safe.
- initMessenger.subscribe('RemoteFeatureFlagController:stateChange', () => {
- startUnifiedBuyV2IfEnabled();
- });
+ startRampsController();
// Dev-only: streams controller state / traffic to the local dashboard (see Ramp/debug/README.md).
// Use require (not dynamic import) so Jest can mock the module; Metro drops this block in prod (__DEV__ false).
diff --git a/app/core/NavigationService/types.ts b/app/core/NavigationService/types.ts
index b886756bf260..cf9ce3f70c3e 100644
--- a/app/core/NavigationService/types.ts
+++ b/app/core/NavigationService/types.ts
@@ -66,12 +66,11 @@ import type {
RampBuySellParams,
RampOrderDetailsParams,
RampAggregatorBuildQuoteParams,
- DepositBuildQuoteParams,
SimpleRampBuildQuoteParams,
WebviewModalParams,
KycWebviewModalParams,
} from '../../components/UI/Ramp/Aggregator/types/navigation';
-import type { DepositNavigationParams } from '../../components/UI/Ramp/Deposit/types/navigationParams';
+import type { DepositNavigationParams } from '../../components/UI/Ramp/types/depositNavigationParams';
// Transactions params
import type {
@@ -298,11 +297,11 @@ export interface RootStackParamList extends ParamListBase {
/**
* BuildQuote route is shared between:
* - Ramp Aggregator: uses RampAggregatorBuildQuoteParams (showBack, assetId, amount, currency)
- * - Deposit: uses DepositBuildQuoteParams (shouldRouteImmediately)
+ * - Unified buy (Ramp): uses SimpleRampBuildQuoteParams
*/
BuildQuote:
| RampAggregatorBuildQuoteParams
- | DepositBuildQuoteParams
+ | SimpleRampBuildQuoteParams
| undefined;
BuildQuoteHasStarted: undefined;
Quotes: undefined;
diff --git a/app/reducers/fiatOrders/index.test.ts b/app/reducers/fiatOrders/index.test.ts
index 630bca80d467..b356d7bf1ca3 100644
--- a/app/reducers/fiatOrders/index.test.ts
+++ b/app/reducers/fiatOrders/index.test.ts
@@ -6,7 +6,7 @@ import {
import {
MOCK_CREDIT_DEBIT_CARD,
MOCK_USDC_TOKEN,
-} from '../../components/UI/Ramp/Deposit/testUtils/constants';
+} from '../../components/UI/Ramp/testUtils/constants';
import { merge } from 'lodash';
import fiatOrderReducer, {
addActivationKey,
diff --git a/app/reducers/fiatOrders/index.ts b/app/reducers/fiatOrders/index.ts
index 14d08ded46f0..446a52388201 100644
--- a/app/reducers/fiatOrders/index.ts
+++ b/app/reducers/fiatOrders/index.ts
@@ -5,7 +5,7 @@ import type {
DepositRegion,
DepositCryptoCurrency,
DepositPaymentMethod,
-} from '@consensys/native-ramps-sdk';
+} from '../../components/UI/Ramp/types/legacyDeposit';
import type { RampsOrder } from '@metamask/ramps-controller';
import { selectSelectedAccountGroupWithInternalAccountsAddresses } from '../../selectors/multichainAccounts/accountTreeController';
import { selectChainId } from '../../selectors/networkController';
diff --git a/app/reducers/fiatOrders/types.ts b/app/reducers/fiatOrders/types.ts
index 6c3656a3dbe4..764f0755787e 100644
--- a/app/reducers/fiatOrders/types.ts
+++ b/app/reducers/fiatOrders/types.ts
@@ -9,7 +9,7 @@ import {
DepositCryptoCurrency,
DepositPaymentMethod,
DepositRegion,
-} from '@consensys/native-ramps-sdk';
+} from '../../components/UI/Ramp/types/legacyDeposit';
import type { RampsOrder } from '@metamask/ramps-controller';
import {
addAuthenticationUrl,
diff --git a/app/selectors/featureFlagController/ramps/rampsUnifiedBuyV2.test.ts b/app/selectors/featureFlagController/ramps/rampsUnifiedBuyV2.test.ts
deleted file mode 100644
index c8a9b757fd3d..000000000000
--- a/app/selectors/featureFlagController/ramps/rampsUnifiedBuyV2.test.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { selectRampsUnifiedBuyV2Enabled } from './rampsUnifiedBuyV2';
-// eslint-disable-next-line import-x/no-namespace
-import * as remoteFeatureFlagModule from '../../../util/remoteFeatureFlag';
-
-jest.mock('react-native-device-info', () => ({
- getVersion: jest.fn().mockReturnValue('1.0.0'),
-}));
-
-describe('selectRampsUnifiedBuyV2Enabled', () => {
- let mockHasMinimumRequiredVersion: jest.SpyInstance;
-
- beforeEach(() => {
- jest.clearAllMocks();
- mockHasMinimumRequiredVersion = jest.spyOn(
- remoteFeatureFlagModule,
- 'hasMinimumRequiredVersion',
- );
- mockHasMinimumRequiredVersion.mockReturnValue(true);
- });
-
- afterEach(() => {
- mockHasMinimumRequiredVersion?.mockRestore();
- });
-
- it('returns true when remote flag is valid and enabled', () => {
- const result = selectRampsUnifiedBuyV2Enabled.resultFunc({
- rampsUnifiedBuyV2: {
- enabled: true,
- minimumVersion: '1.0.0',
- },
- });
- expect(result).toBe(true);
- });
-
- it('returns false when remote flag is valid but disabled', () => {
- const result = selectRampsUnifiedBuyV2Enabled.resultFunc({
- rampsUnifiedBuyV2: {
- enabled: false,
- minimumVersion: '1.0.0',
- },
- });
- expect(result).toBe(false);
- });
-
- it('returns false when version check fails', () => {
- mockHasMinimumRequiredVersion.mockReturnValue(false);
- const result = selectRampsUnifiedBuyV2Enabled.resultFunc({
- rampsUnifiedBuyV2: {
- enabled: true,
- minimumVersion: '99.0.0',
- },
- });
- expect(result).toBe(false);
- });
-
- it('returns false when remote flag is invalid', () => {
- const result = selectRampsUnifiedBuyV2Enabled.resultFunc({
- rampsUnifiedBuyV2: {
- enabled: 'invalid',
- minimumVersion: 123,
- },
- });
- expect(result).toBe(false);
- });
-
- it('returns false when remote feature flags are empty', () => {
- const result = selectRampsUnifiedBuyV2Enabled.resultFunc({});
- expect(result).toBe(false);
- });
-
- it('returns false when rampsUnifiedBuyV2 is null', () => {
- const result = selectRampsUnifiedBuyV2Enabled.resultFunc({
- rampsUnifiedBuyV2: null,
- });
- expect(result).toBe(false);
- });
-});
diff --git a/app/selectors/featureFlagController/ramps/rampsUnifiedBuyV2.ts b/app/selectors/featureFlagController/ramps/rampsUnifiedBuyV2.ts
deleted file mode 100644
index da25e5058abf..000000000000
--- a/app/selectors/featureFlagController/ramps/rampsUnifiedBuyV2.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { createSelector } from 'reselect';
-import { selectRemoteFeatureFlags } from '..';
-import {
- validatedVersionGatedFeatureFlag,
- VersionGatedFeatureFlag,
-} from '../../../util/remoteFeatureFlag';
-
-export const RAMPS_UNIFIED_BUY_V2_FLAG_KEY = 'rampsUnifiedBuyV2';
-
-export const selectRampsUnifiedBuyV2Enabled = createSelector(
- selectRemoteFeatureFlags,
- (remoteFeatureFlags) => {
- const remoteFlag = remoteFeatureFlags[
- RAMPS_UNIFIED_BUY_V2_FLAG_KEY
- ] as unknown as VersionGatedFeatureFlag;
- return validatedVersionGatedFeatureFlag(remoteFlag) ?? false;
- },
-);
diff --git a/app/store/migrations/102.test.ts b/app/store/migrations/102.test.ts
index 7fbf2a3853b7..d579d1edfc40 100644
--- a/app/store/migrations/102.test.ts
+++ b/app/store/migrations/102.test.ts
@@ -2,7 +2,7 @@ import { captureException } from '@sentry/react-native';
import { cloneDeep } from 'lodash';
import { IconName } from '../../component-library/components/Icons/Icon/index';
import { brandColor } from '@metamask/design-tokens';
-import { DepositOrderType } from '@consensys/native-ramps-sdk';
+import { DepositOrderType } from '../../components/UI/Ramp/types/legacyDeposit';
import { OrderOrderTypeEnum } from '@consensys/on-ramp-sdk/dist/API';
import migrate from './102';
diff --git a/app/store/migrations/102.ts b/app/store/migrations/102.ts
index 759ce42c578c..3ea3d764c14c 100644
--- a/app/store/migrations/102.ts
+++ b/app/store/migrations/102.ts
@@ -8,7 +8,7 @@ import {
DepositPaymentMethod,
DepositPaymentMethodDuration,
DepositOrderType,
-} from '@consensys/native-ramps-sdk';
+} from '../../components/UI/Ramp/types/legacyDeposit';
const CRYPTO_CURRENCY_MAP: Record = {
'eip155:1/erc20:0xacA92E438df0B2401fF60dA7E4337B687a2435DA': {
diff --git a/app/util/test/initial-background-state.json b/app/util/test/initial-background-state.json
index dd8ac974020d..8575a4bc93a3 100644
--- a/app/util/test/initial-background-state.json
+++ b/app/util/test/initial-background-state.json
@@ -818,7 +818,7 @@
"countries": {
"data": [],
"selected": null,
- "isLoading": false,
+ "isLoading": true,
"error": null
},
"providerAutoSelected": false,
@@ -863,7 +863,15 @@
}
}
},
- "requests": {},
+ "requests": {
+ "getCountries:[]": {
+ "data": null,
+ "error": null,
+ "lastFetchedAt": 123,
+ "status": "loading",
+ "timestamp": 123
+ }
+ },
"orders": [],
"providerAutoSelected": false
},
diff --git a/babel.config.tests.js b/babel.config.tests.js
index c797cd3c17f8..e8c934f10eec 100644
--- a/babel.config.tests.js
+++ b/babel.config.tests.js
@@ -24,8 +24,8 @@ const newOverrides = [
'app/core/Engine/controllers/gator-permissions-controller/gator-permissions-controller-init.test.ts',
'app/core/Engine/controllers/remote-feature-flag-controller/utils.ts',
'app/core/Engine/controllers/remote-feature-flag-controller/utils.test.ts',
- 'app/components/UI/Ramp/Deposit/sdk/getSdkEnvironment.ts',
- 'app/components/UI/Ramp/Deposit/sdk/getSdkEnvironment.test.ts',
+ 'app/components/UI/Ramp/utils/getSdkEnvironment.ts',
+ 'app/components/UI/Ramp/utils/getSdkEnvironment.test.ts',
'app/components/UI/Ramp/Aggregator/sdk/getSdkEnvironment.ts',
'app/components/UI/Ramp/Aggregator/sdk/getSdkEnvironment.test.ts',
'app/core/Engine/controllers/ramps-controller/ramps-service-init.ts',
@@ -34,10 +34,6 @@ const newOverrides = [
'app/core/Engine/controllers/ramps-controller/ramps-controller-init.test.ts',
'app/core/Engine/controllers/authenticated-user-storage-service-init.ts',
'app/core/Engine/controllers/authenticated-user-storage-service-init.test.ts',
- 'app/components/UI/Ramp/hooks/useRampsUnifiedV2Enabled.ts',
- 'app/components/UI/Ramp/hooks/useRampsUnifiedV2Enabled.test.ts',
- 'app/components/UI/Ramp/utils/isRampsUnifiedV2Enabled.ts',
- 'app/components/UI/Ramp/utils/isRampsUnifiedV2Enabled.test.ts',
'app/components/UI/Ramp/hooks/useRampTokens.ts',
'app/components/UI/Ramp/hooks/useRampTokens.test.ts',
'app/components/Views/confirmations/hooks/pay/useTransactionPayWithdraw.ts',
diff --git a/package.json b/package.json
index e7930ba1f566..302cbefacafe 100644
--- a/package.json
+++ b/package.json
@@ -220,7 +220,6 @@
"dependencies": {
"@braze/react-native-sdk": "patch:@braze/react-native-sdk@npm%3A19.1.0#~/.yarn/patches/@braze-react-native-sdk-npm-19.1.0-076-reactmoduleinfo.patch",
"@config-plugins/detox": "^9.0.0",
- "@consensys/native-ramps-sdk": "^2.1.7",
"@consensys/on-ramp-sdk": "2.1.12",
"@craftzdog/react-native-buffer": "^6.1.0",
"@ethersproject/abi": "^5.7.0",
diff --git a/tests/api-mocking/mock-responses/feature-flags-mocks.ts b/tests/api-mocking/mock-responses/feature-flags-mocks.ts
index 471cdcc21797..c7e8e0badc04 100644
--- a/tests/api-mocking/mock-responses/feature-flags-mocks.ts
+++ b/tests/api-mocking/mock-responses/feature-flags-mocks.ts
@@ -141,33 +141,6 @@ export const remoteFeatureFlagHomepageSectionsV1Enabled = (enabled = true) => ({
},
});
-export const remoteFeatureFlagRampsUnifiedV2Enabled = (enabled = true) => ({
- rampsUnifiedBuyV2: {
- enabled,
- minimumVersion: '7.63.0',
- },
-});
-
-/**
- * Enables unified ramps (V2).
- */
-export const remoteFeatureFlagRampsUnifiedEnabled = (enabled = true) => ({
- ...remoteFeatureFlagRampsUnifiedV2Enabled(enabled),
-});
-
-/**
- * V2 toggle for E2E. Uses minimumVersion 0.0.0 so debug builds pass the gate.
- * Pair with FixtureBuilder.withRampsUnifiedBuyRemoteFlagsSeededForE2E({ rampsUnifiedBuyV2 }).
- */
-export const remoteFeatureFlagRampsUnifiedMatrixForE2E = (
- rampsUnifiedBuyV2Enabled: boolean,
-) => ({
- rampsUnifiedBuyV2: {
- enabled: rampsUnifiedBuyV2Enabled,
- minimumVersion: '0.0.0',
- },
-});
-
export const remoteFeatureFlagTrendingTokensEnabled = (enabled = true) => ({
trendingTokens: enabled,
});
diff --git a/tests/component-view/presets/marketInsightsView.ts b/tests/component-view/presets/marketInsightsView.ts
index 845b2d263b3e..cd3272074cdb 100644
--- a/tests/component-view/presets/marketInsightsView.ts
+++ b/tests/component-view/presets/marketInsightsView.ts
@@ -4,7 +4,7 @@ import { initialStateBridge } from './bridge';
/**
* Redux preset for MarketInsightsView component-view tests: bridge + fiat state,
- * market insights and ramps V2 flags (version gate 0.0.0 for unit/view runs).
+ * market insights flag (version gate 0.0.0 for unit/view runs).
*/
export const initialStateMarketInsightsView = () =>
initialStateBridge({ deterministicFiat: true })
@@ -13,10 +13,6 @@ export const initialStateMarketInsightsView = () =>
enabled: true,
minimumVersion: '0.0.0',
},
- rampsUnifiedBuyV2: {
- enabled: true,
- minimumVersion: '0.0.0',
- },
} as unknown as Record)
.withPreferences({
tokenSortConfig: {
diff --git a/tests/docs/ONRAMP-PROVIDER-TESTING.md b/tests/docs/ONRAMP-PROVIDER-TESTING.md
index f0ea60403fd1..ca1ec1209827 100644
--- a/tests/docs/ONRAMP-PROVIDER-TESTING.md
+++ b/tests/docs/ONRAMP-PROVIDER-TESTING.md
@@ -42,14 +42,13 @@ All manual staging tests should be run against a **non-production build** of the
Before testing, confirm the following:
- You are using a **non-production build** of the app (debug, QA, or RC build targeting staging)
-- The following **remote feature flags** are active on your build:
+- The following **remote feature flag** is active on your build:
- | Flag | Purpose |
- | ------------------- | ---------------------------------------------- |
- | `rampsUnifiedBuyV2` | Enables the V2 provider/quote flow |
- | `depositConfig` | Required for the Transak native (deposit) flow |
+ | Flag | Purpose |
+ | --------------- | ---------------------------------------------- |
+ | `depositConfig` | Required for the Transak native (deposit) flow |
- If the Buy button is missing, these flags are likely inactive on your build. Check with the team or enable them via a local override.
+ If the Buy button is missing, this flag is likely inactive on your build. Check with the team or enable it via a local override.
- Your device's **region is supported**. The staging environment is confirmed to work for:
- United States (California)
@@ -229,7 +228,7 @@ Regardless of provider, verify:
## Troubleshooting
**Buy button is not visible**
-Confirm the `rampsUnifiedBuyV2` feature flag is active on your build. The Buy entry point is always rendered, but V2 enables the V2 provider/quote flow.
+Confirm the `depositConfig` feature flag is active on your build when testing the Transak native deposit flow.
**No providers or quotes returned**
Your detected region may not be supported. Verify your device's region is set to a supported country (US, France, Spain, or Saint Lucia) and relaunch the app.
diff --git a/tests/feature-flags/feature-flag-registry.ts b/tests/feature-flags/feature-flag-registry.ts
index 74cbd8492061..e35df4e0444a 100644
--- a/tests/feature-flags/feature-flag-registry.ts
+++ b/tests/feature-flags/feature-flag-registry.ts
@@ -4176,17 +4176,6 @@ export const FEATURE_FLAG_REGISTRY: Record = {
status: FeatureFlagStatus.Active,
},
- rampsUnifiedBuyV2: {
- name: 'rampsUnifiedBuyV2',
- type: FeatureFlagType.Remote,
- inProd: true,
- productionDefault: {
- minimumVersion: '7.74.0',
- enabled: true,
- },
- status: FeatureFlagStatus.Active,
- },
-
rewardsAnnouncementModalEnabled: {
name: 'rewardsAnnouncementModalEnabled',
type: FeatureFlagType.Remote,
diff --git a/tests/framework/fixtures/FixtureBuilder.ts b/tests/framework/fixtures/FixtureBuilder.ts
index 21067980c21e..484de655bf5e 100644
--- a/tests/framework/fixtures/FixtureBuilder.ts
+++ b/tests/framework/fixtures/FixtureBuilder.ts
@@ -499,28 +499,6 @@ class FixtureBuilder {
return this;
}
- /**
- * Seeds the ramps unified buy V2 flag in RemoteFeatureFlagController so deeplinks
- * and early navigation match the intended path before the remote config API responds.
- * Uses minimumVersion 0.0.0 so any E2E app build passes the version gate.
- */
- withRampsUnifiedBuyRemoteFlagsSeededForE2E(options?: {
- rampsUnifiedBuyV2?: boolean;
- }) {
- const rampsUnifiedBuyV2 = options?.rampsUnifiedBuyV2 ?? true;
- merge(this.fixture.state.engine.backgroundState, {
- RemoteFeatureFlagController: {
- remoteFeatureFlags: {
- rampsUnifiedBuyV2: {
- enabled: rampsUnifiedBuyV2,
- minimumVersion: '0.0.0',
- },
- },
- },
- });
- return this;
- }
-
/**
* Sets detected geolocation (e.g. for RWA/Stocks section visibility in Trending).
* Use a non-restricted country code so RWA data is shown when not in __DEV__ (e.g. CI).
diff --git a/tests/page-objects/Ramps/BuildQuoteView.ts b/tests/page-objects/Ramps/BuildQuoteView.ts
index 4521929bcfde..b14498f5f77f 100644
--- a/tests/page-objects/Ramps/BuildQuoteView.ts
+++ b/tests/page-objects/Ramps/BuildQuoteView.ts
@@ -3,6 +3,7 @@ import Gestures from '../../framework/Gestures';
import Utilities from '../../framework/Utilities';
import { BuildQuoteSelectors } from '../../../app/components/UI/Ramp/Aggregator/Views/BuildQuote/BuildQuote.testIds';
+import { BUILD_QUOTE_TEST_IDS } from '../../../app/components/UI/Ramp/Views/BuildQuote/BuildQuote.testIds';
import { AddressSelectorSelectors } from '../../../app/components/Views/AddressSelector/AddressSelector.testIds';
import { EncapsulatedElementType } from '../../framework';
@@ -73,6 +74,10 @@ class BuildQuoteView {
return Matchers.getElementByID(BuildQuoteSelectors.CONTINUE_BUTTON);
}
+ get backButton(): EncapsulatedElementType {
+ return Matchers.getElementByID(BUILD_QUOTE_TEST_IDS.BACK_BUTTON);
+ }
+
get quickAmount25(): EncapsulatedElementType {
return Matchers.getElementByLabel('25%');
}
@@ -116,6 +121,12 @@ class BuildQuoteView {
});
}
+ async tapBackButton(): Promise {
+ await Gestures.waitAndTap(this.backButton, {
+ elemDescription: 'Back Button in Build Quote View',
+ });
+ }
+
async tapSelectAddressDropdown(): Promise {
await Gestures.waitAndTap(this.accountPickerDropdown, {
elemDescription: 'Account dropdown in address selector',
diff --git a/tests/smoke/ramps/deeplink-to-buy-flow.spec.ts b/tests/smoke/ramps/deeplink-to-buy-flow.spec.ts
deleted file mode 100644
index e856c72c73c3..000000000000
--- a/tests/smoke/ramps/deeplink-to-buy-flow.spec.ts
+++ /dev/null
@@ -1,160 +0,0 @@
-import TestHelpers from '../../helpers';
-import { loginToApp } from '../../flows/wallet.flow';
-import { withFixtures } from '../../framework/fixtures/FixtureHelper';
-import { SmokeMoney } from '../../tags';
-import FixtureBuilder from '../../framework/fixtures/FixtureBuilder';
-import BuildQuoteView from '../../page-objects/Ramps/BuildQuoteView';
-import TokenSelectScreen from '../../page-objects/Ramps/TokenSelectScreen';
-
-import Assertions from '../../framework/Assertions';
-import { setupRegionAwareOnRampMocks } from '../../api-mocking/mock-responses/ramps/ramps-mocks';
-import { Mockttp } from 'mockttp';
-import { RampsRegions, RampsRegionsEnum } from '../../framework/Constants';
-import { remoteFeatureFlagRampsUnifiedMatrixForE2E } from '../../api-mocking/mock-responses/feature-flags-mocks';
-import { setupRemoteFeatureFlagsMock } from '../../api-mocking/helpers/remoteFeatureFlagsHelper';
-
-const BASE_USDC_BUY_DEEPLINK =
- 'metamask://buy?chainId=8453&address=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913&amount=25';
-
-// This test was migrated to the new framework but should be reworked to use withFixtures properly
-describe(SmokeMoney('Buy Crypto Deeplinks'), () => {
- beforeAll(async () => {
- await TestHelpers.reverseServerPort();
- });
-
- beforeEach(async () => {
- jest.setTimeout(150000);
- });
- it('Deep links to onramp ETH', async () => {
- const buyLink = 'metamask://buy?chainId=1&amount=275';
- const selectedRegion = RampsRegions[RampsRegionsEnum.UNITED_STATES];
-
- await withFixtures(
- {
- fixture: new FixtureBuilder()
- .withRampsUnifiedBuyRemoteFlagsSeededForE2E({
- rampsUnifiedBuyV2: false,
- })
- .withRampsSelectedPaymentMethod()
- .withRampsSelectedRegion(selectedRegion)
- .build(),
- testSpecificMock: async (mockServer: Mockttp) => {
- await setupRemoteFeatureFlagsMock(
- mockServer,
- remoteFeatureFlagRampsUnifiedMatrixForE2E(false),
- );
- await setupRegionAwareOnRampMocks(mockServer, selectedRegion);
- },
- restartDevice: true,
- },
- async () => {
- await loginToApp();
- await device.sendToHome();
- await device.launchApp({
- url: buyLink,
- });
- await BuildQuoteView.tapTokenDropdown('Ethereum');
-
- await TokenSelectScreen.tapTokenByName('DAI');
- await Assertions.expectTextDisplayed('Dai Stablecoin');
- await Assertions.expectTextDisplayed('$275');
- await Assertions.expectTextDisplayed('USD');
- },
- );
- });
- it('Deep links to onramp on Base network', async () => {
- const selectedRegion = RampsRegions[RampsRegionsEnum.UNITED_STATES];
-
- await withFixtures(
- {
- fixture: new FixtureBuilder()
- .withRampsUnifiedBuyRemoteFlagsSeededForE2E({
- rampsUnifiedBuyV2: false,
- })
- .withPopularNetworks()
- .withRampsSelectedRegion(selectedRegion)
- .withRampsSelectedPaymentMethod()
- .build(),
- testSpecificMock: async (mockServer: Mockttp) => {
- await setupRemoteFeatureFlagsMock(
- mockServer,
- remoteFeatureFlagRampsUnifiedMatrixForE2E(false),
- );
- await setupRegionAwareOnRampMocks(mockServer, selectedRegion);
- },
- restartDevice: true,
- },
- async () => {
- await loginToApp();
- await device.sendToHome();
- await device.launchApp({
- url: BASE_USDC_BUY_DEEPLINK,
- });
- await Assertions.expectTextDisplayed('USD Coin');
- },
- );
- });
-
- // TODO: Uncomment once we have the tests passing according to the UI/UX
- describe.skip('Buy deeplink ramps unified V2 flag matrix (Base USDC)', () => {
- const selectedRegion = RampsRegions[RampsRegionsEnum.UNITED_STATES];
-
- it('Deep links when unified V2 is on', async () => {
- await withFixtures(
- {
- fixture: new FixtureBuilder()
- .withRampsUnifiedBuyRemoteFlagsSeededForE2E({
- rampsUnifiedBuyV2: true,
- })
- .withPopularNetworks()
- .withRampsSelectedRegion(selectedRegion)
- .withRampsSelectedPaymentMethod()
- .build(),
- testSpecificMock: async (mockServer: Mockttp) => {
- await setupRemoteFeatureFlagsMock(
- mockServer,
- remoteFeatureFlagRampsUnifiedMatrixForE2E(true),
- );
- await setupRegionAwareOnRampMocks(mockServer, selectedRegion);
- },
- restartDevice: true,
- },
- async () => {
- await loginToApp();
- await device.sendToHome();
- await device.launchApp({ url: BASE_USDC_BUY_DEEPLINK });
- await Assertions.expectTextDisplayed('USDC');
- },
- );
- });
-
- it('Deep links when unified V2 is off', async () => {
- await withFixtures(
- {
- fixture: new FixtureBuilder()
- .withRampsUnifiedBuyRemoteFlagsSeededForE2E({
- rampsUnifiedBuyV2: false,
- })
- .withPopularNetworks()
- .withRampsSelectedRegion(selectedRegion)
- .withRampsSelectedPaymentMethod()
- .build(),
- testSpecificMock: async (mockServer: Mockttp) => {
- await setupRemoteFeatureFlagsMock(
- mockServer,
- remoteFeatureFlagRampsUnifiedMatrixForE2E(false),
- );
- await setupRegionAwareOnRampMocks(mockServer, selectedRegion);
- },
- restartDevice: true,
- },
- async () => {
- await loginToApp();
- await device.sendToHome();
- await device.launchApp({ url: BASE_USDC_BUY_DEEPLINK });
- await Assertions.expectTextDisplayed('USD Coin');
- },
- );
- });
- });
-});
diff --git a/tests/smoke/ramps/onramp-unified-buy.spec.ts b/tests/smoke/ramps/onramp-unified-buy.spec.ts
index cdba2503b410..037666c6cffb 100644
--- a/tests/smoke/ramps/onramp-unified-buy.spec.ts
+++ b/tests/smoke/ramps/onramp-unified-buy.spec.ts
@@ -16,7 +16,6 @@ import {
setupDepositOnRampMocks,
setupBuyOnRampMocks,
} from '../../api-mocking/mock-responses/ramps/ramps-mocks';
-import { remoteFeatureFlagRampsUnifiedMatrixForE2E } from '../../api-mocking/mock-responses/feature-flags-mocks';
import { setupRemoteFeatureFlagsMock } from '../../api-mocking/helpers/remoteFeatureFlagsHelper';
import { ONRAMP_PERSONA } from '../../api-mocking/mock-responses/ramps/onramp-persona-data';
@@ -32,7 +31,6 @@ const selectedRegion = RampsRegions[RampsRegionsEnum.UNITED_STATES];
const newUserUnifiedBuyV2Mocks = async (mockServer: Mockttp) => {
await setupRemoteFeatureFlagsMock(mockServer, {
- ...remoteFeatureFlagRampsUnifiedMatrixForE2E(true),
depositConfig: {
active: true,
providerApiKey: 'DUMMY_VALUE_FOR_TESTING',
@@ -44,10 +42,6 @@ const newUserUnifiedBuyV2Mocks = async (mockServer: Mockttp) => {
};
const returningUserUnifiedBuyV2Mocks = async (mockServer: Mockttp) => {
- await setupRemoteFeatureFlagsMock(
- mockServer,
- remoteFeatureFlagRampsUnifiedMatrixForE2E(true),
- );
await setupBuyOnRampMocks(mockServer, selectedRegion);
};
@@ -81,7 +75,6 @@ describe(SmokeMoney('Onramp Unified Buy'), () => {
fixture: new FixtureBuilder()
.withNetworkController(CustomNetworks.Tenderly.Mainnet.providerConfig)
.withRampsSelectedRegion(selectedRegion)
- .withRampsUnifiedBuyRemoteFlagsSeededForE2E()
.withMetaMetricsOptIn()
.build(),
restartDevice: true,
@@ -149,7 +142,6 @@ describe(SmokeMoney('Onramp Unified Buy'), () => {
fixture: new FixtureBuilder()
.withNetworkController(CustomNetworks.Tenderly.Mainnet.providerConfig)
.withRampsSelectedRegion(selectedRegion)
- .withRampsUnifiedBuyRemoteFlagsSeededForE2E()
.withMetaMetricsOptIn()
.build(),
restartDevice: true,
diff --git a/yarn.lock b/yarn.lock
index eed98b131ab4..69c0e0535b07 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2198,21 +2198,6 @@ __metadata:
languageName: node
linkType: hard
-"@consensys/native-ramps-sdk@npm:^2.1.7":
- version: 2.1.7
- resolution: "@consensys/native-ramps-sdk@npm:2.1.7"
- dependencies:
- "@metamask/utils": "npm:^11.5.0"
- async: "npm:^3.2.3"
- axios: "npm:^1.11.0"
- axios-retry: "npm:^3.1.2"
- crypto-js: "npm:^4.2.0"
- reflect-metadata: "npm:^0.1.13"
- uuid: "npm:^9.0.0"
- checksum: 10/52c8a7911861dce0b2828c1dee039ffd40934e343bdda4a29b742cc104919c477f033dea95b6686a7cbf03c4ef21bcf1c7617ae000001d617fc618189d6cabc4
- languageName: node
- linkType: hard
-
"@consensys/on-ramp-sdk@npm:2.1.12":
version: 2.1.12
resolution: "@consensys/on-ramp-sdk@npm:2.1.12"
@@ -3805,7 +3790,7 @@ __metadata:
languageName: node
linkType: hard
-"@exodus/bitcoin-wallet-standard@npm:^0.0.0":
+"@exodus/bitcoin-wallet-standard@npm:0.0.0":
version: 0.0.0
resolution: "@exodus/bitcoin-wallet-standard@npm:0.0.0"
dependencies:
@@ -8108,17 +8093,15 @@ __metadata:
linkType: hard
"@metamask/bitcoin-wallet-standard@npm:^1.0.0":
- version: 1.0.0
- resolution: "@metamask/bitcoin-wallet-standard@npm:1.0.0"
+ version: 1.1.0
+ resolution: "@metamask/bitcoin-wallet-standard@npm:1.1.0"
dependencies:
- "@exodus/bitcoin-wallet-standard": "npm:^0.0.0"
- "@metamask/multichain-api-client": "npm:^0.11.0"
- "@wallet-standard/base": "npm:^1.1.0"
- "@wallet-standard/features": "npm:^1.1.0"
- "@wallet-standard/wallet": "npm:^1.1.0"
- bs58: "npm:^6.0.0"
- jsontokens: "npm:^4.0.1"
- checksum: 10/c0484f16aa4e290a47eab7b6a17afd08028a7b1d3d684b17114865b39f53120ef587aa854567659f5fac520bd2b1a5acf0d88e5528a73ea957e2399a2cb05f03
+ "@exodus/bitcoin-wallet-standard": "npm:0.0.0"
+ "@metamask/multichain-api-client": "npm:0.12.0"
+ "@wallet-standard/base": "npm:1.1.0"
+ "@wallet-standard/features": "npm:1.1.0"
+ "@wallet-standard/wallet": "npm:1.1.0"
+ checksum: 10/d0d381259c0342e3c7993c773cbc99f42235678c2a3aa8522b8a1521b57092904940a8a4bd55158926e07f9f79588b6d29124b58d023d757e62bfee0adc4399a
languageName: node
linkType: hard
@@ -9271,6 +9254,13 @@ __metadata:
languageName: node
linkType: hard
+"@metamask/multichain-api-client@npm:0.12.0":
+ version: 0.12.0
+ resolution: "@metamask/multichain-api-client@npm:0.12.0"
+ checksum: 10/79f7b2e53cae25fb825a825650b98bbedf4d700b82b87a4df90c7e5ae62eb1aa8d3089fcdeaa66b104d737fe1ade93f202eae1b2599346599fccbc62d046a5fa
+ languageName: node
+ linkType: hard
+
"@metamask/multichain-api-client@npm:^0.11.0":
version: 0.11.0
resolution: "@metamask/multichain-api-client@npm:0.11.0"
@@ -9870,13 +9860,13 @@ __metadata:
linkType: hard
"@metamask/seedless-onboarding-controller@npm:^10.0.1":
- version: 10.0.1
- resolution: "@metamask/seedless-onboarding-controller@npm:10.0.1"
+ version: 10.0.2
+ resolution: "@metamask/seedless-onboarding-controller@npm:10.0.2"
dependencies:
"@metamask/auth-network-utils": "npm:^0.3.0"
"@metamask/base-controller": "npm:^9.1.0"
"@metamask/browser-passworder": "npm:^6.0.0"
- "@metamask/keyring-controller": "npm:^26.0.0"
+ "@metamask/keyring-controller": "npm:^27.0.0"
"@metamask/messenger": "npm:^1.2.0"
"@metamask/toprf-secure-backup": "npm:^1.0.0"
"@metamask/utils": "npm:^11.9.0"
@@ -9884,7 +9874,7 @@ __metadata:
"@noble/curves": "npm:^1.9.2"
"@noble/hashes": "npm:^1.8.0"
async-mutex: "npm:^0.5.0"
- checksum: 10/8ea21268dd212c8d0059fca6d246ceb266e218cb21195695588120dd58fb99366af91f16353d3727afc7a49fa6fe3736d579517b1ff9900f6c896ba94516d441
+ checksum: 10/6a69118488e208d32ab6d675f5980af22368cbe651cb390e48343389bc1bd5046a408ed899ffdd63c9aecad159fa2a25712ac163c3b1265fbb0b9f952e7679cc
languageName: node
linkType: hard
@@ -10387,13 +10377,13 @@ __metadata:
linkType: hard
"@metamask/tron-wallet-snap@npm:^1.27.0":
- version: 1.27.0
- resolution: "@metamask/tron-wallet-snap@npm:1.27.0"
- checksum: 10/7555f647d89502aebe5f629242113203b123ab981b9a59105cc9ae9c404cfe3ee2ac10c7d246bb58c86f15b87a874ced0629bb91429f9cc01696ac22132a5da9
+ version: 1.28.0
+ resolution: "@metamask/tron-wallet-snap@npm:1.28.0"
+ checksum: 10/e8fe563735e0fca306cd1caa2cde45b193d0f09f7a3da545be24eee55a64f1ff239a7460ad9c4a0c6b67552a1423ef18328350a4b76a2409a1fbe609f69b8769
languageName: node
linkType: hard
-"@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.10.0, @metamask/utils@npm:^11.11.0, @metamask/utils@npm:^11.4.0, @metamask/utils@npm:^11.4.2, @metamask/utils@npm:^11.5.0, @metamask/utils@npm:^11.8.1, @metamask/utils@npm:^11.9.0":
+"@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.10.0, @metamask/utils@npm:^11.11.0, @metamask/utils@npm:^11.4.0, @metamask/utils@npm:^11.4.2, @metamask/utils@npm:^11.8.1, @metamask/utils@npm:^11.9.0":
version: 11.11.0
resolution: "@metamask/utils@npm:11.11.0"
dependencies:
@@ -20236,7 +20226,7 @@ __metadata:
languageName: node
linkType: hard
-"@wallet-standard/base@npm:^1.0.1, @wallet-standard/base@npm:^1.1.0":
+"@wallet-standard/base@npm:1.1.0, @wallet-standard/base@npm:^1.0.1, @wallet-standard/base@npm:^1.1.0":
version: 1.1.0
resolution: "@wallet-standard/base@npm:1.1.0"
checksum: 10/11dbb8ed80566265916ab193ad5eab1585d55996781a88039d2bc4480428b1e778901b2dcff3e688dcac7de45e8a9272026f37f07f1e75168caff581906c5079
@@ -20268,7 +20258,7 @@ __metadata:
languageName: node
linkType: hard
-"@wallet-standard/features@npm:^1.0.3, @wallet-standard/features@npm:^1.1.0":
+"@wallet-standard/features@npm:1.1.0, @wallet-standard/features@npm:^1.0.3, @wallet-standard/features@npm:^1.1.0":
version: 1.1.0
resolution: "@wallet-standard/features@npm:1.1.0"
dependencies:
@@ -20277,7 +20267,7 @@ __metadata:
languageName: node
linkType: hard
-"@wallet-standard/wallet@npm:^1.1.0":
+"@wallet-standard/wallet@npm:1.1.0, @wallet-standard/wallet@npm:^1.1.0":
version: 1.1.0
resolution: "@wallet-standard/wallet@npm:1.1.0"
dependencies:
@@ -33996,7 +33986,7 @@ __metadata:
languageName: node
linkType: hard
-"jsontokens@npm:4.0.1, jsontokens@npm:^4.0.1":
+"jsontokens@npm:4.0.1":
version: 4.0.1
resolution: "jsontokens@npm:4.0.1"
dependencies:
@@ -35360,7 +35350,6 @@ __metadata:
"@babel/runtime": "npm:^7.25.0"
"@braze/react-native-sdk": "patch:@braze/react-native-sdk@npm%3A19.1.0#~/.yarn/patches/@braze-react-native-sdk-npm-19.1.0-076-reactmoduleinfo.patch"
"@config-plugins/detox": "npm:^9.0.0"
- "@consensys/native-ramps-sdk": "npm:^2.1.7"
"@consensys/on-ramp-sdk": "npm:2.1.12"
"@craftzdog/react-native-buffer": "npm:^6.1.0"
"@ethersproject/abi": "npm:^5.7.0"
@@ -46493,7 +46482,7 @@ __metadata:
languageName: node
linkType: hard
-"valibot@npm:1.3.1, valibot@npm:^1.2.0":
+"valibot@npm:1.3.1":
version: 1.3.1
resolution: "valibot@npm:1.3.1"
peerDependencies:
@@ -46505,6 +46494,18 @@ __metadata:
languageName: node
linkType: hard
+"valibot@npm:^1.2.0":
+ version: 1.4.1
+ resolution: "valibot@npm:1.4.1"
+ peerDependencies:
+ typescript: ">=5"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ checksum: 10/39092725e4045e332e3593e9b95253c1a3429033e13be1805597fb8d346ad20a727bef82971e3b9a1b7d631bb8ad65fff186ec55d430e16f25b6bbba151c4e80
+ languageName: node
+ linkType: hard
+
"valid-url@npm:1.0.9, valid-url@npm:^1.0.9":
version: 1.0.9
resolution: "valid-url@npm:1.0.9"