diff --git a/shared/lib/p2p-fiat.ts b/shared/lib/p2p-fiat.ts index b25f665f..f0de9164 100644 --- a/shared/lib/p2p-fiat.ts +++ b/shared/lib/p2p-fiat.ts @@ -1046,11 +1046,22 @@ export async function requestWithdraw( toast.info('Processing withdrawal...'); - const { data, error } = await supabase.functions.invoke('process-withdraw', { + const { data, error, response } = await supabase.functions.invoke('process-withdraw', { body: { userId, token, amount, walletAddress } }); - if (error) throw error; + // Supabase client wraps non-2xx as generic FunctionsHttpError (data=null). + // Extract the actual error from the unread response body. + if (error) { + let errorMessage = 'Withdrawal failed'; + if (response) { + try { + const body = await response.json(); + errorMessage = body?.error || errorMessage; + } catch { /* response body already consumed or not JSON */ } + } + throw new Error(errorMessage); + } if (!data?.success) { throw new Error(data?.error || 'Withdrawal failed'); diff --git a/web/supabase/migrations/20260224080000_drop_withdrawal_limits_auth_fk.sql b/web/supabase/migrations/20260224080000_drop_withdrawal_limits_auth_fk.sql new file mode 100644 index 00000000..4297b913 --- /dev/null +++ b/web/supabase/migrations/20260224080000_drop_withdrawal_limits_auth_fk.sql @@ -0,0 +1,13 @@ +-- Migration: Drop auth.users FK constraint on p2p_withdrawal_limits +-- This table was missed in 20260223120000 and 20260224050000 migrations. +-- user_id is now a deterministic UUID v5 derived from citizen/visa number, +-- not an auth.users entry. The FK causes check_withdrawal_limit() to fail +-- with a constraint violation on INSERT. + +ALTER TABLE public.p2p_withdrawal_limits + DROP CONSTRAINT IF EXISTS p2p_withdrawal_limits_user_id_fkey; + +-- Also drop the ON DELETE CASCADE since auth.users is no longer the source +-- The constraint name may vary; try the default naming convention too +ALTER TABLE public.p2p_withdrawal_limits + DROP CONSTRAINT IF EXISTS p2p_withdrawal_limits_pkey_fkey;