Skip to content

Qa#1505

Open
LiorAgnin wants to merge 248 commits into
masterfrom
qa
Open

Qa#1505
LiorAgnin wants to merge 248 commits into
masterfrom
qa

Conversation

@LiorAgnin
Copy link
Copy Markdown
Contributor

@LiorAgnin LiorAgnin commented Feb 15, 2026

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 kyc flow with Didit (new kyc.native.tsx for mobile and updated web embedding), and adds a separate bridge-kyc Persona 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_config ignore, Expo plugins + EAS extension provisioning), and removes Fingerprint.com usage/envs and signup fingerprint collection. Also adds a hidden savings-old route 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.

@vercel
Copy link
Copy Markdown

vercel Bot commented Feb 15, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
solid-app-staging Ready Ready Preview, Comment May 10, 2026 9:56am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
solid-app Ignored Ignored Preview May 10, 2026 9:56am

Request Review

Comment thread store/useActivityStore.ts
Comment thread components/Transaction/index.tsx
Comment thread app/(protected)/(tabs)/activity/[clientTxId].tsx
Comment thread hooks/useCardWithdrawals.ts
Comment thread hooks/useGeoCompliance.ts
Comment thread lib/api.ts
Comment thread components/Markdown.tsx Outdated
Comment thread components/Card/WithdrawCardFundsModal.tsx
Comment thread components/CustomTabBar.tsx Outdated

// 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'];
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

>
<Text className="text-base font-bold text-black">Done</Text>
</Button>
)}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

MusabShakeel576 and others added 30 commits May 3, 2026 18:28
…-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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants