From 373afb768020aaba9cb3195572e107cd14b8f8ba Mon Sep 17 00:00:00 2001 From: kushagrasarathe <76868364+kushagrasarathe@users.noreply.github.com> Date: Tue, 19 May 2026 14:35:59 +0530 Subject: [PATCH 1/4] fix: check transfer readiness gate before showing 'under review' modal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Users with Bridge KYC status 'incomplete' (needs TOS acceptance) were shown a dead-end 'Your verification is under review' modal because AddWithdrawCountriesList checked isUserBridgeKycUnderReview before consulting the transfer readiness gate. The gate correctly identifies TOS as the blocker via rails metadata, but was never reached. Changes: - Split isBridgeUnderReview into isBridgeUnderReview (genuinely under review) and isBridgeIncomplete (user needs to act) - AddWithdrawCountriesList now checks the gate first — TOS modal opens for incomplete users, 'under review' only for genuinely reviewing - Added BridgeTosStep and InitiateKycModal to the country list view - Updated useBridgeTransferReadiness to skip enrollment for incomplete - Updated LimitsPageView and useHomeCarouselCTAs for the new flag --- .../AddWithdraw/AddWithdrawCountriesList.tsx | 51 ++++++++++++++++++- src/features/limits/views/LimitsPageView.tsx | 4 +- .../useBridgeTransferReadiness.test.ts | 8 +++ src/hooks/useBridgeTransferReadiness.ts | 21 ++++++-- src/hooks/useHomeCarouselCTAs.tsx | 6 ++- src/hooks/useKycStatus.tsx | 3 +- src/hooks/useUnifiedKycStatus.ts | 14 ++--- 7 files changed, 91 insertions(+), 16 deletions(-) diff --git a/src/components/AddWithdraw/AddWithdrawCountriesList.tsx b/src/components/AddWithdraw/AddWithdrawCountriesList.tsx index 2fc5ff391..e2bcec852 100644 --- a/src/components/AddWithdraw/AddWithdrawCountriesList.tsx +++ b/src/components/AddWithdraw/AddWithdrawCountriesList.tsx @@ -181,6 +181,15 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { const extraParams = isBankFromSend ? `method=${methodParam}` : undefined router.push(rewriteMethodPath(method.path, extraParams)) } else if (method.id.includes('default-bank-withdraw') || method.id.includes('sepa-instant-withdraw')) { + // check transfer readiness gate first — tos takes priority over generic "under review" + if (gate.type !== 'ready') { + if (gate.type === 'accept_tos') { + guardWithTos() + } else { + setIsKycModalOpen(true) + } + return + } if (isUserBridgeKycUnderReview) { setShowKycStatusModal(true) return @@ -215,7 +224,15 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { setIsSupportedTokensModalOpen(true) return } - // show kyc status modal if user is kyc under review + // check transfer readiness gate first — tos takes priority over generic "under review" + if (gate.type !== 'ready') { + if (gate.type === 'accept_tos') { + guardWithTos() + } else { + setIsKycModalOpen(true) + } + return + } if (isUserBridgeKycUnderReview) { setShowKycStatusModal(true) return @@ -454,6 +471,38 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { isKycApprovedModalOpen={showKycStatusModal} onClose={() => setShowKycStatusModal(false)} /> + setIsKycModalOpen(false)} + onVerify={async () => { + if (gate.type === 'fixable_rejection') { + await sumsubFlow.handleSelfHealResubmit('BRIDGE') + } else { + await sumsubFlow.handleInitiateKyc( + 'STANDARD', + undefined, + gate.type === 'needs_enrollment' || undefined + ) + } + }} + onContactSupport={() => { + setIsKycModalOpen(false) + setIsSupportModalOpen(true) + }} + isLoading={sumsubFlow.isLoading} + error={sumsubFlow.error} + variant={getKycModalVariant(gate.type)} + providerMessage={getGateProviderMessage(gate)} + regionName={currentCountry?.title} + /> + { + hideTos() + // re-attempt the action after tos acceptance + }} + onSkip={hideTos} + /> ) diff --git a/src/features/limits/views/LimitsPageView.tsx b/src/features/limits/views/LimitsPageView.tsx index 5052b0831..6cc9a7217 100644 --- a/src/features/limits/views/LimitsPageView.tsx +++ b/src/features/limits/views/LimitsPageView.tsx @@ -20,7 +20,7 @@ import { getProviderRoute } from '../utils' const LimitsPageView = () => { const onBack = useSafeBack('/profile', { replace: true }) const { unlockedRegions, lockedRegions } = useIdentityVerification() - const { isUserKycApproved, isUserBridgeKycUnderReview } = useKycStatus() + const { isUserKycApproved, isUserBridgeKycUnderReview, isUserBridgeKycIncomplete } = useKycStatus() const { hasMantecaLimits } = useLimits() // check if user has any kyc at all @@ -67,7 +67,7 @@ const LimitsPageView = () => { {/* locked regions - only render if there are actual locked regions */} {filteredLockedRegions.length > 0 && ( - + )} {/* rest of world - always shown with coming soon */} diff --git a/src/hooks/__tests__/useBridgeTransferReadiness.test.ts b/src/hooks/__tests__/useBridgeTransferReadiness.test.ts index f78ab8564..1f632516f 100644 --- a/src/hooks/__tests__/useBridgeTransferReadiness.test.ts +++ b/src/hooks/__tests__/useBridgeTransferReadiness.test.ts @@ -41,6 +41,7 @@ function setup({ isSumsubApproved = false, isBridgeApproved = false, isBridgeUnderReview = false, + isBridgeIncomplete = false, } = {}) { mockTosStatus.mockReturnValue({ needsBridgeTos, @@ -59,6 +60,7 @@ function setup({ isUserSumsubKycApproved: isSumsubApproved, isUserBridgeKycApproved: isBridgeApproved, isUserBridgeKycUnderReview: isBridgeUnderReview, + isUserBridgeKycIncomplete: isBridgeIncomplete, isUserMantecaKycApproved: false, isUserKycApproved: isBridgeApproved, }) @@ -105,6 +107,12 @@ describe('useBridgeTransferReadiness', () => { expect(result.current.gate.type).toBe('ready') }) + it('ready when sumsub approved and bridge incomplete (enrollment not needed)', () => { + setup({ isSumsubApproved: true, isBridgeIncomplete: true }) + const { result } = renderHook(() => useBridgeTransferReadiness()) + expect(result.current.gate.type).toBe('ready') + }) + it('ready when sumsub approved and bridge approved', () => { setup({ isSumsubApproved: true, isBridgeApproved: true }) const { result } = renderHook(() => useBridgeTransferReadiness()) diff --git a/src/hooks/useBridgeTransferReadiness.ts b/src/hooks/useBridgeTransferReadiness.ts index 6beb079cc..8bed58d17 100644 --- a/src/hooks/useBridgeTransferReadiness.ts +++ b/src/hooks/useBridgeTransferReadiness.ts @@ -25,7 +25,8 @@ export type BridgeGateAction = export function useBridgeTransferReadiness() { const { needsBridgeTos } = useBridgeTosStatus() const { bridge: bridgeRejection } = useProviderRejectionStatus() - const { isUserSumsubKycApproved, isUserBridgeKycApproved, isUserBridgeKycUnderReview } = useKycStatus() + const { isUserSumsubKycApproved, isUserBridgeKycApproved, isUserBridgeKycUnderReview, isUserBridgeKycIncomplete } = + useKycStatus() const gate: BridgeGateAction = useMemo(() => { // 1. hard rejection — contact support (checked first because tos is moot for hard-rejected users) @@ -41,14 +42,26 @@ export function useBridgeTransferReadiness() { return { type: 'fixable_rejection', userMessage: bridgeRejection.userMessage } } - // 4. needs enrollment (sumsub approved but bridge not started/approved) - if (isUserSumsubKycApproved && !isUserBridgeKycApproved && !isUserBridgeKycUnderReview) { + // 4. needs enrollment (sumsub approved but bridge not started/approved/in-progress) + if ( + isUserSumsubKycApproved && + !isUserBridgeKycApproved && + !isUserBridgeKycUnderReview && + !isUserBridgeKycIncomplete + ) { return { type: 'needs_enrollment' } } // 5. ready return { type: 'ready' } - }, [needsBridgeTos, bridgeRejection, isUserSumsubKycApproved, isUserBridgeKycApproved, isUserBridgeKycUnderReview]) + }, [ + needsBridgeTos, + bridgeRejection, + isUserSumsubKycApproved, + isUserBridgeKycApproved, + isUserBridgeKycUnderReview, + isUserBridgeKycIncomplete, + ]) return { gate } } diff --git a/src/hooks/useHomeCarouselCTAs.tsx b/src/hooks/useHomeCarouselCTAs.tsx index 87acbbfa2..4c84b1adc 100644 --- a/src/hooks/useHomeCarouselCTAs.tsx +++ b/src/hooks/useHomeCarouselCTAs.tsx @@ -83,7 +83,8 @@ export const useHomeCarouselCTAs = () => { } = useNotifications() const toast = useToast() const router = useRouter() - const { isUserKycApproved, isUserBridgeKycUnderReview, isUserMantecaKycApproved } = useKycStatus() + const { isUserKycApproved, isUserBridgeKycUnderReview, isUserBridgeKycIncomplete, isUserMantecaKycApproved } = + useKycStatus() const { deviceType } = useDeviceType() const isPwa = usePWAStatus() const { setIsIosPwaInstallModalOpen, openSupportWithMessage } = useModalsContext() @@ -287,7 +288,7 @@ export const useHomeCarouselCTAs = () => { }) } - if (!hasKycApproval && !isUserBridgeKycUnderReview) { + if (!hasKycApproval && !isUserBridgeKycUnderReview && !isUserBridgeKycIncomplete) { _carouselCTAs.push({ id: 'kyc-prompt', title: ( @@ -317,6 +318,7 @@ export const useHomeCarouselCTAs = () => { isPushOptedIn, isUserKycApproved, isUserBridgeKycUnderReview, + isUserBridgeKycIncomplete, isUserMantecaKycApproved, router, requestPermission, diff --git a/src/hooks/useKycStatus.tsx b/src/hooks/useKycStatus.tsx index 36b2909f3..08b2567b5 100644 --- a/src/hooks/useKycStatus.tsx +++ b/src/hooks/useKycStatus.tsx @@ -7,7 +7,7 @@ import useUnifiedKycStatus from './useUnifiedKycStatus' * existing consumers keep the same api shape. */ export default function useKycStatus() { - const { isBridgeApproved, isMantecaApproved, isSumsubApproved, isKycApproved, isBridgeUnderReview } = + const { isBridgeApproved, isMantecaApproved, isSumsubApproved, isKycApproved, isBridgeUnderReview, isBridgeIncomplete } = useUnifiedKycStatus() return { @@ -16,5 +16,6 @@ export default function useKycStatus() { isUserSumsubKycApproved: isSumsubApproved, isUserKycApproved: isKycApproved, isUserBridgeKycUnderReview: isBridgeUnderReview, + isUserBridgeKycIncomplete: isBridgeIncomplete, } } diff --git a/src/hooks/useUnifiedKycStatus.ts b/src/hooks/useUnifiedKycStatus.ts index 5b099649c..57e7cebaa 100644 --- a/src/hooks/useUnifiedKycStatus.ts +++ b/src/hooks/useUnifiedKycStatus.ts @@ -55,18 +55,19 @@ export default function useUnifiedKycStatus() { [isBridgeApproved, isMantecaApproved, isSumsubApproved] ) - const isBridgeUnderReview = useMemo( - () => user?.user.bridgeKycStatus === 'under_review' || user?.user.bridgeKycStatus === 'incomplete', - [user] - ) + // bridge is actively reviewing submitted docs + const isBridgeUnderReview = useMemo(() => user?.user.bridgeKycStatus === 'under_review', [user]) + + // user still needs to complete requirements (tos, proof of address, etc.) + const isBridgeIncomplete = useMemo(() => user?.user.bridgeKycStatus === 'incomplete', [user]) const isSumsubActionRequired = useMemo(() => sumsubStatus === 'ACTION_REQUIRED', [sumsubStatus]) const isSumsubInProgress = useMemo(() => isSumsubStatusInProgress(sumsubStatus), [sumsubStatus]) const isKycInProgress = useMemo( - () => isBridgeUnderReview || isSumsubInProgress, - [isBridgeUnderReview, isSumsubInProgress] + () => isBridgeUnderReview || isBridgeIncomplete || isSumsubInProgress, + [isBridgeUnderReview, isBridgeIncomplete, isSumsubInProgress] ) return { @@ -76,6 +77,7 @@ export default function useUnifiedKycStatus() { // bridge isBridgeApproved, isBridgeUnderReview, + isBridgeIncomplete, // manteca isMantecaApproved, // sumsub From d95cffcbd2a3ae745b3774af5b43436d444dc7bf Mon Sep 17 00:00:00 2001 From: kushagrasarathe <76868364+kushagrasarathe@users.noreply.github.com> Date: Tue, 19 May 2026 15:04:13 +0530 Subject: [PATCH 2/4] simplify: deduplicate gate check, hoist shared modals, fix TOS replay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Extract checkBridgeGate() helper — gate-check + under-review block was duplicated in handleAddMethodClick and handleWithdrawMethodClick - Hoist InitiateKycModal, BridgeTosStep, SumsubKycModals into sharedModals fragment — rendered once instead of duplicated in form and list views - Fix BridgeTosStep onComplete in list view: was a no-op (just hideTos). Now stores the interrupted method click in a ref and replays it after TOS acceptance. Form view falls back to formRef.current?.handleSubmit() as before. --- .../AddWithdraw/AddWithdrawCountriesList.tsx | 164 ++++++++---------- 1 file changed, 71 insertions(+), 93 deletions(-) diff --git a/src/components/AddWithdraw/AddWithdrawCountriesList.tsx b/src/components/AddWithdraw/AddWithdrawCountriesList.tsx index e2bcec852..950565619 100644 --- a/src/components/AddWithdraw/AddWithdrawCountriesList.tsx +++ b/src/components/AddWithdraw/AddWithdrawCountriesList.tsx @@ -13,7 +13,7 @@ import { withdrawBankUrl, rewriteMethodPath } from '@/utils/native-routes' import { isCapacitor } from '@/utils/capacitor' import EmptyState from '../Global/EmptyStates/EmptyState' import { useAuth } from '@/context/authContext' -import { useEffect, useMemo, useRef, useState } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { DynamicBankAccountForm, type IBankAccountDetails } from './DynamicBankAccountForm' import { addBankAccount } from '@/app/actions/users' import { type AddBankAccountPayload } from '@/app/actions/types/users.types' @@ -83,6 +83,9 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { const { setIsSupportModalOpen } = useModalsContext() const [showKycStatusModal, setShowKycStatusModal] = useState(false) + // stores the callback to replay after tos acceptance in the list view + const pendingAfterTosRef = useRef<(() => void) | null>(null) + // close kyc modal when sumsub sdk opens useEffect(() => { if (sumsubFlow.showWrapper) setIsKycModalOpen(false) @@ -101,6 +104,27 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { (country) => country.type === 'country' && country.path === countrySlugFromUrl ) + /** returns true if the user is gated (caller should return early) */ + const checkBridgeGate = useCallback( + (onAfterTos?: () => void): boolean => { + if (gate.type !== 'ready') { + if (gate.type === 'accept_tos') { + pendingAfterTosRef.current = onAfterTos ?? null + guardWithTos() + } else { + setIsKycModalOpen(true) + } + return true + } + if (isUserBridgeKycUnderReview) { + setShowKycStatusModal(true) + return true + } + return false + }, + [gate, isUserBridgeKycUnderReview, guardWithTos] + ) + const handleFormSubmit = async ( payload: AddBankAccountPayload, rawData: IBankAccountDetails @@ -181,19 +205,7 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { const extraParams = isBankFromSend ? `method=${methodParam}` : undefined router.push(rewriteMethodPath(method.path, extraParams)) } else if (method.id.includes('default-bank-withdraw') || method.id.includes('sepa-instant-withdraw')) { - // check transfer readiness gate first — tos takes priority over generic "under review" - if (gate.type !== 'ready') { - if (gate.type === 'accept_tos') { - guardWithTos() - } else { - setIsKycModalOpen(true) - } - return - } - if (isUserBridgeKycUnderReview) { - setShowKycStatusModal(true) - return - } + if (checkBridgeGate(() => handleWithdrawMethodClick(method))) return // Bridge methods: Set in context and navigate for amount input setSelectedMethod({ @@ -224,19 +236,7 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { setIsSupportedTokensModalOpen(true) return } - // check transfer readiness gate first — tos takes priority over generic "under review" - if (gate.type !== 'ready') { - if (gate.type === 'accept_tos') { - guardWithTos() - } else { - setIsKycModalOpen(true) - } - return - } - if (isUserBridgeKycUnderReview) { - setShowKycStatusModal(true) - return - } + if (checkBridgeGate(() => handleAddMethodClick(method))) return const target = rewriteMethodPath(method.path) // force full navigation in capacitor — router.push to same page with @@ -286,6 +286,48 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { ) } + // shared modals — rendered once regardless of view (form vs list) + const sharedModals = ( + <> + setIsKycModalOpen(false)} + onVerify={async () => { + if (gate.type === 'fixable_rejection') { + await sumsubFlow.handleSelfHealResubmit('BRIDGE') + } else { + await sumsubFlow.handleInitiateKyc( + 'STANDARD', + undefined, + gate.type === 'needs_enrollment' || undefined + ) + } + }} + onContactSupport={() => { + setIsKycModalOpen(false) + setIsSupportModalOpen(true) + }} + isLoading={sumsubFlow.isLoading} + error={sumsubFlow.error} + variant={getKycModalVariant(gate.type)} + providerMessage={getGateProviderMessage(gate)} + regionName={currentCountry?.title} + /> + { + hideTos() + const replay = pendingAfterTosRef.current + pendingAfterTosRef.current = null + if (replay) replay() + else formRef.current?.handleSubmit() + }} + onSkip={hideTos} + /> + + + ) + if (view === 'form') { return (
@@ -324,39 +366,7 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { initialData={{}} error={null} /> - setIsKycModalOpen(false)} - onVerify={async () => { - if (gate.type === 'fixable_rejection') { - await sumsubFlow.handleSelfHealResubmit('BRIDGE') - } else { - await sumsubFlow.handleInitiateKyc( - 'STANDARD', - undefined, - gate.type === 'needs_enrollment' || undefined - ) - } - }} - onContactSupport={() => { - setIsKycModalOpen(false) - setIsSupportModalOpen(true) - }} - isLoading={sumsubFlow.isLoading} - error={sumsubFlow.error} - variant={getKycModalVariant(gate.type)} - providerMessage={getGateProviderMessage(gate)} - regionName={currentCountry?.title} - /> - { - hideTos() - formRef.current?.handleSubmit() - }} - onSkip={hideTos} - /> - + {sharedModals}
) } @@ -471,39 +481,7 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { isKycApprovedModalOpen={showKycStatusModal} onClose={() => setShowKycStatusModal(false)} /> - setIsKycModalOpen(false)} - onVerify={async () => { - if (gate.type === 'fixable_rejection') { - await sumsubFlow.handleSelfHealResubmit('BRIDGE') - } else { - await sumsubFlow.handleInitiateKyc( - 'STANDARD', - undefined, - gate.type === 'needs_enrollment' || undefined - ) - } - }} - onContactSupport={() => { - setIsKycModalOpen(false) - setIsSupportModalOpen(true) - }} - isLoading={sumsubFlow.isLoading} - error={sumsubFlow.error} - variant={getKycModalVariant(gate.type)} - providerMessage={getGateProviderMessage(gate)} - regionName={currentCountry?.title} - /> - { - hideTos() - // re-attempt the action after tos acceptance - }} - onSkip={hideTos} - /> - + {sharedModals} ) } From 5ca53424eda4e5bc88ec43b1c484f11552e1ad60 Mon Sep 17 00:00:00 2001 From: kushagrasarathe <76868364+kushagrasarathe@users.noreply.github.com> Date: Tue, 19 May 2026 15:25:11 +0530 Subject: [PATCH 3/4] style: run prettier on useKycStatus and LimitsPageView --- src/features/limits/views/LimitsPageView.tsx | 5 ++++- src/hooks/useKycStatus.tsx | 10 ++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/features/limits/views/LimitsPageView.tsx b/src/features/limits/views/LimitsPageView.tsx index 6cc9a7217..71b8949cf 100644 --- a/src/features/limits/views/LimitsPageView.tsx +++ b/src/features/limits/views/LimitsPageView.tsx @@ -67,7 +67,10 @@ const LimitsPageView = () => { {/* locked regions - only render if there are actual locked regions */} {filteredLockedRegions.length > 0 && ( - + )} {/* rest of world - always shown with coming soon */} diff --git a/src/hooks/useKycStatus.tsx b/src/hooks/useKycStatus.tsx index 08b2567b5..9a10f0db7 100644 --- a/src/hooks/useKycStatus.tsx +++ b/src/hooks/useKycStatus.tsx @@ -7,8 +7,14 @@ import useUnifiedKycStatus from './useUnifiedKycStatus' * existing consumers keep the same api shape. */ export default function useKycStatus() { - const { isBridgeApproved, isMantecaApproved, isSumsubApproved, isKycApproved, isBridgeUnderReview, isBridgeIncomplete } = - useUnifiedKycStatus() + const { + isBridgeApproved, + isMantecaApproved, + isSumsubApproved, + isKycApproved, + isBridgeUnderReview, + isBridgeIncomplete, + } = useUnifiedKycStatus() return { isUserBridgeKycApproved: isBridgeApproved, From f2fccaefd828dd998817100d5e2e9ac45bbe3c90 Mon Sep 17 00:00:00 2001 From: kushagrasarathe <76868364+kushagrasarathe@users.noreply.github.com> Date: Tue, 19 May 2026 15:46:14 +0530 Subject: [PATCH 4/4] fix: add under_review guard to handleFormSubmit, add regression test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - handleFormSubmit now checks isUserBridgeKycUnderReview after the gate check — prevents erroneously initiating sumsub for users whose bridge KYC is genuinely under review (reachable via deep-link or back nav) - add explicit regression test for the main bug scenario: bridge incomplete + tos needed → gate returns accept_tos --- src/components/AddWithdraw/AddWithdrawCountriesList.tsx | 6 ++++++ src/hooks/__tests__/useBridgeTransferReadiness.test.ts | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/components/AddWithdraw/AddWithdrawCountriesList.tsx b/src/components/AddWithdraw/AddWithdrawCountriesList.tsx index 950565619..1ee627bb3 100644 --- a/src/components/AddWithdraw/AddWithdrawCountriesList.tsx +++ b/src/components/AddWithdraw/AddWithdrawCountriesList.tsx @@ -144,6 +144,12 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { return { error: 'gate_blocked', silent: true } } + // bridge kyc still under review — don't initiate a new sumsub flow + if (isUserBridgeKycUnderReview) { + setShowKycStatusModal(true) + return { error: 'gate_blocked', silent: true } + } + // scenario (1): happy path: if the user has already completed kyc, we can add the bank account directly // email and name are now collected by sumsub — no need to check them here if (isUserKycApproved) { diff --git a/src/hooks/__tests__/useBridgeTransferReadiness.test.ts b/src/hooks/__tests__/useBridgeTransferReadiness.test.ts index 1f632516f..fad5663e6 100644 --- a/src/hooks/__tests__/useBridgeTransferReadiness.test.ts +++ b/src/hooks/__tests__/useBridgeTransferReadiness.test.ts @@ -130,6 +130,12 @@ describe('useBridgeTransferReadiness', () => { const { result } = renderHook(() => useBridgeTransferReadiness()) expect(result.current.gate.type).toBe('accept_tos') }) + + it('accept_tos when bridge incomplete and tos needed (main bug scenario)', () => { + setup({ needsBridgeTos: true, isBridgeIncomplete: true, isSumsubApproved: true }) + const { result } = renderHook(() => useBridgeTransferReadiness()) + expect(result.current.gate.type).toBe('accept_tos') + }) }) describe('getKycModalVariant', () => {