Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
|
||
| // Visible tabs - these are the main navigation tabs | ||
| const VISIBLE_TAB_NAMES = ['index', 'savings', 'card', 'activity']; | ||
| const VISIBLE_TAB_NAMES = ['index', 'savings', Platform.OS === 'ios' ? null : 'card', 'activity']; |
There was a problem hiding this comment.
Array contains null value on iOS
Low Severity
The VISIBLE_TAB_NAMES array includes null when Platform.OS === 'ios', creating an array like ['index', 'savings', null, 'activity']. While this doesn't cause runtime errors (since route.name won't match null), it's semantically incorrect and adds unnecessary overhead. The array should either be constructed conditionally or filtered with .filter(Boolean) to remove falsy values.
| > | ||
| <Text className="text-base font-bold text-black">Done</Text> | ||
| </Button> | ||
| )} |
There was a problem hiding this comment.
Minimum withdrawal threshold traps user funds
High Severity
The withdraw button now only appears when parseFloat(availableBalance) >= 1, replacing the previous behavior where the button was always visible but disabled when balance was zero or less. Users with balances between $0 and $1 (e.g., $0.50) cannot withdraw their funds because the withdraw button is hidden and replaced with a "Done" button that only closes the modal, effectively trapping their money.
…-validation-0JJBI fix(card-deposit): keep gasless hint icon and text color in sync
Zod 4 exposes parse failures via error.issues, but the deposit form was reading error.errors (the v3 shape), so validationError always resolved to null and the balance / borrow / invalid-amount messages never reached ErrorDisplay. Switch to err.issues[0].message, matching the extraction used in CardWithdrawForm, so users see the actual reason the button is disabled. https://claude.ai/code/session_015A1KTGTkLJht3CZWifFKZN
…-validation-0JJBI fix(card-deposit): surface zod v4 validation errors in deposit form
The default toast badge text is 'Onchain', which is misleading on the 'Deposits not available' / 'External deposits not available' errors that fire from card-deposit forms. Pass an empty badgeText so no badge is rendered for these toasts.
…rror-nbb0K-qa fix(card-deposit): drop Onchain badge from card-deposit error toasts (qa)
Allow card deposits below the sponsor threshold to proceed gaslessly. Drops the minimum-amount validation in useDepositFromSolidUsdc when the category is CARD, and removes the related warning UI in the deposit-to-card modal so the gasless badge is shown unconditionally. https://claude.ai/code/session_019ajaJ3Dc3VrjYR4nQvZKQG
…um-2yg9g Remove minimum deposit validation for gasless card deposits
…r structured warnings
Two fixes for the Rain-via-Didit decline path so users get an
actionable next step instead of a generic dead end:
- Switch CardStatusResponse.kycWarnings from string[] to KycWarning[]
to match the backend's structured shape ({risk, short_description,
long_description, ...}). Update the step-1 description formatter to
prefer DIDIT_WARNING_DESCRIPTIONS overrides, fall back to Didit's
short_description, then long_description, then the formatted risk
tag — so warnings we haven't enumerated (e.g. BARCODE_NOT_DETECTED)
still display human-readable copy instead of [object Object].
- Add onVerificationDeclined to useDiditSession that toasts and
redirects to /card/activate?kycStatus=rejected, mirroring the
existing onVerificationPending pattern. Wire it into the Declined
branches of the web SDK onComplete + status_updated event, the
native SDK callback, and the polling loop. Previously Declined fell
into onVerificationError, leaving the user on /kyc with a generic
"Try again" button that just looped a fresh session against the same
bad document.
https://claude.ai/code/session_01DAk1pR6NuGujs24TQ7TFwm
…KsRJ Improve KYC warning display and handle Didit verification decline
The desktop SpendingBalanceCard was rounding totalUsdValue to whole dollars via .toFixed(0), so any cashback under $0.50 rendered as "$0". The mobile CashbackDisplay used .toFixed(2) but then parseFloat-ed it back to a number, dropping trailing zeros (e.g. "$0.30" rendered as "$0.3"). Format both as "$X.XX" strings. https://claude.ai/code/session_01KbGt2z23Ci4FWrvDcC8pEc
…-nRYlP Fix cashback value formatting to preserve decimal precision
- Update card-onboard page header to "Free Visa Vard" - Replace marketing layout with new "Solid card" summary (free, virtual, 3% cashback, zero top-up fee) - Add "Fees and charges" link that opens a modal with full card details - Extract shared SolidCardSummary component for reuse between the page and modal - Add optional className prop to GetCardButton so it can be full-width inside the modal
…pup-43f6c Refactor card waitlist page with new fees modal and card summary
- "Free Visa Vard" -> "Free Visa Card" - "Borrow agains savings" -> "Borrow against savings"
…pup-43f6c fix(card-onboard): correct "Card" and "against" typos
- Increase summary feature icons from 28px square to 36px round - Reduce CardWaitlistContainer minHeight from 500 to 450 - Drop the wrapper circle around fees-modal detail icons; render the 50px image directly since the assets already include their own background
…pup-43f6c refactor(card-onboard): adjust icon sizing and gradient height
…right edge So only the front card is visible; the gradient already clips overflow.
…pup-43f6c style(card-fees-modal): enlarge card image and shift it ~50% off the …
Mobile renders a hero card image with title, description, fees link, and a full-width Get-your-card button under NavbarMobile. Desktop keeps the green-gradient summary card layout. CardWaitlistPage now picks the variant based on isScreenMedium.
…pup-43f6c feat(card-onboard): split mobile and desktop into separate components
…ur-card press - pb-24 on the mobile page so content clears the tab bar - GetCardButton accepts an optional onPress so callers can run side effects (the fees modal uses it to close itself before navigating)
…pup-43f6c fix(card-onboard): mobile bottom inset and close fees modal on Get-yo…
useTransferToWallet's background receipt watcher fed the resolved waitForTransactionReceipt promise straight to TransactionStatus.SUCCESS, but viem resolves with the receipt regardless of execution outcome — a reverted on-chain tx returns receipt.status === 'reverted' rather than throwing. Connect-wallet add-funds activities therefore flipped to SUCCESS even when the user's transfer reverted on-chain, masking the failure in the activity list / detail page. Inspect receipt.status before promoting to SUCCESS; reverted receipts go through the same FAILED + error-metadata path the .catch() branch already uses, matching the contract pattern used in useTransactionReceiptPolling and other deposit hooks. https://claude.ai/code/session_01RxjZ6dUk9zmVbuPEXcvqaX
…ity-VfZbm Handle reverted transactions in wallet transfer flow
Replace deprecated solid-user-terms link with the dedicated card-terms-for-international-consumer-program article so non-US users see the correct terms during card activation. https://claude.ai/code/session_011Y3KdhvK3pEKb5Kd2v8gxA
…s-1Avlm Update international card terms URL
getStepDescription early-returned the generic Rain status text and never consulted kycWarnings, so the rejection labels we now surface from the backend (via the user.updated webhook applicationReason field) were silently dropped on the first step of /card/activate. Pass warnings into getKYCDescription and bullet them under the NEEDS_INFORMATION message — the only Rain state Rain documents as carrying temporary, user-actionable labels. Final rejections (denied/locked/canceled) stay generic so we don't leak compliance labels like SANCTIONS or PEP to the user.
…ge-BJ6Bf Surface KYC rejection reasons for NEEDS_INFORMATION state


Note
High Risk
Updates KYC and card funding/management flows across web and native (including new third-party SDKs and iOS extension targets), which are user-verification and payments-adjacent paths with higher regression risk.
Overview
Adds multi-provider card support (Bridge vs Rain) across the app, including provider-aware formatting, deposit address selection (contracts vs
funding_instructions), card status routing, and gating of actions like deposit/withdraw/freeze/PIN management based on provider and customer/KYC state.Reworks KYC: replaces the existing Persona-based
kycflow with Didit (newkyc.native.tsxfor mobile and updated web embedding), and adds a separatebridge-kycPersona page for Bridge-only KYC; card KYC entry now redirects to the correct provider flow.Introduces MeaWallet MPP integration and iOS Wallet Extensions (new extension entrypoints + docs), adds registry/config plumbing (
.npmrc,meawallet/mea_configignore, Expo plugins + EAS extension provisioning), and removes Fingerprint.com usage/envs and signup fingerprint collection. Also adds a hiddensavings-oldroute for side-by-side savings calculation comparison and minor home/coin chart UX/data-fetch adjustments (spin-and-win card, CoinGecko native token charting, savings summary backend hook).Written by Cursor Bugbot for commit 1f5b304. This will update automatically on new commits. Configure here.