diff --git a/src/components/AddWithdraw/AddWithdrawCountriesList.tsx b/src/components/AddWithdraw/AddWithdrawCountriesList.tsx index 3c35a330c..a63caaf6f 100644 --- a/src/components/AddWithdraw/AddWithdrawCountriesList.tsx +++ b/src/components/AddWithdraw/AddWithdrawCountriesList.tsx @@ -182,6 +182,11 @@ const AddWithdrawCountriesList = ({ flow }: AddWithdrawCountriesListProps) => { } if (gate.kind === 'accept-tos') { guardWithTos() + } else if (gate.kind === 'provide-email') { + // A rail that flipped to email-blocked between form-open and submit + // is self-serve — open the email sheet, NOT the contact-support KYC + // modal (mirrors checkBridgeGate; the whole point of provide-email). + setShowProvideEmail(true) } else { setIsKycModalOpen(true) } diff --git a/src/components/AddWithdraw/__tests__/AddWithdrawCountriesList.test.tsx b/src/components/AddWithdraw/__tests__/AddWithdrawCountriesList.test.tsx index 0a1737561..f49360439 100644 --- a/src/components/AddWithdraw/__tests__/AddWithdrawCountriesList.test.tsx +++ b/src/components/AddWithdraw/__tests__/AddWithdrawCountriesList.test.tsx @@ -160,6 +160,10 @@ jest.mock('@/components/AddWithdraw/DynamicBankAccountForm', () => ({ DynamicBan jest.mock('@/components/Global/TokenAndNetworkConfirmationModal', () => ({ __esModule: true, default: () => null })) jest.mock('@/components/Kyc/SumsubKycModals', () => ({ SumsubKycModals: () => null })) jest.mock('@/components/Kyc/BridgeTosStep', () => ({ BridgeTosStep: () => null })) +jest.mock('@/components/Kyc/ProvideEmailStep', () => ({ + __esModule: true, + default: (props: any) => (props.visible ?
: null), +})) jest.mock('@/components/Kyc/InitiateKycModal', () => ({ InitiateKycModal: (props: any) => (props.visible ? : null), })) @@ -235,6 +239,22 @@ describe('AddWithdrawCountriesList — bank gate', () => { expect(mockPush).not.toHaveBeenCalled() expect(screen.getByTestId('initiate-kyc-modal')).toBeInTheDocument() }) + + // provide-email is a self-serve gate (one email unblocks the rail) — it must + // open the email sheet, NEVER the contact-support KYC modal. Both the click + // gate (checkBridgeGate) and the form-submit gate (handleFormSubmit) must + // route it there; a missing branch on the submit path turned self-serve + // recovery into a support ticket (2026-07 review finding). + it('an email-blocked gate opens the provide-email sheet, not the contact-support KYC modal', () => { + setCapabilities('provide-email', [{ status: 'blocked', channel: 'bank', country: 'US' }]) + + render(