chore: back-merge main → dev (2026-07-02 hotfix wave)#2339
Conversation
…ll-crash 🚑 hotfix(add-money): stop prod page crash when FX rate fails (PEANUT-UI-PS7)
Frontend for the offramp.xyz -> Peanut migration badge (backend in peanut-api-ts). Adds the BADGES entry + art and the /invite campaign resolution: invite-code `offramp`, utm_campaign `offramp`, and bare ?campaign=OFFRAMP_USER (vanity claim, no waitlist skip). Mirrors TOUCHED_GRASS.
Swap the badge asset to the b12-teary design — the Offramp coin with teary kawaii eyes (bittersweet farewell as offramp.xyz shuts down), bolt intact + little feet. Same path/filename, no code change.
feat(badges): wire Offramp User badge (art + campaign maps)
…ppable setup modal 2026-07-02 dup-card incident: the setup modal read cards[0] (newest) while the backend stored the session-key grant on a different card — every tap 'succeeded', the modal never dismissed, and the error-gated Skip never rendered. All card flows now use the existing findActiveCard helper, and a grant that succeeds without flipping hasWithdrawApproval reveals the escape hatch and pages Sentry (console.warn + captureMessage).
…bit) — a re-issued card must not inherit an old card's grant success
Companion to peanut-api-ts #1093. For BRL, Add Money now shows Manteca's dynamic PIX QR instead of the static bank-details screen: render the copia-e-cola via QRCodeWrapper, a copy button, a live m:ss expiry countdown, and poll the deposit intent status to auto-advance to a success state. ARS path untouched. - showQR step (nuqs) routed by the response discriminator (type === 'QR') - useMantecaDepositPolling: read-only mirror of GET /manteca/deposit/:id/status - QRCodeWrapper gains an optional className width-override (160 -> 280px here) - hook + component tests
…'s details Drops MantecaPixDepositData; the dynamic QR now reads from the existing MantecaDepositResponseData.details.qr (the ramp-on synthetic), routed to showQR by currency. Matches the BE pivot (api #1093) off deposit-request. details.qr is a stub until Manteca confirms the field name.
…g screen Two PIX-deposit polish items: - Add money → Brazil now defaults the input denomination to BRL (Argentina → ARS) instead of USD — you deposit in your local currency. - Show the branded CyclingLoading screen (spinning peanut + rotating messages, same as PIX-payment processing) while the BRL QR is being generated, and in place of the plain "Preparing your PIX QR…" fallback.
…lement screen - Add money → Brazil defaults the denomination to BRL (PIX is in BRL); every other country keeps USD (Argentina reverts to USD). - useMantecaDepositPolling now surfaces a 'processing' status for the payment-settling window (Manteca PROCESSING / AWAITING_SETTLEMENT); the QR screen shows the branded CyclingLoading during it, so the flow is QR → processing → "Deposit received!".
…ire the maintenance warn
Manteca shipped the dynamic BRL QR to prod today. Probe (mono
ops/scripts/manteca/probe-brl-rampon-qr.ts) pinned the real shape: the
EMVCo copia-e-cola rides in details.depositAddresses.PIX.{code,url,
expiresAt,bankId}; the old static depositAddress/depositAlias are gone
for BRL (now optional in the type — the ARS share-details screen keeps a
'' fallback but BRL never routes there).
With the QR flow live the warn-only maintenance surface comes off:
pixBrazilOnrampMaintenance flips false (machinery stays for future
outages), the unused banner copy is trimmed to the badge, and the
maintenance test now snapshots/restores the shipped flag instead of
hardcoding true — flipping the committed default no longer poisons the
config singleton for later tests.
- overviewFresh: a grant whose overview refetch failed is STALE, not stuck — don't false-page Sentry on flaky connections (grant() now reports it) - per-card Skip dismissal: skipping stuck card A must not suppress card B's legitimate prompt in the same session - stuck state now explains itself (error copy + Try again CTA) instead of happy-path text with an unexplained Skip - Sentry warn dedupe uses a Set — alternating active cards (A→B→A) no longer re-page for an already-warned card
…-review findings 4+5) A hard failure on card A no longer leaks 'Try again' copy and the skip escape into a re-issued card B's first prompt — same stale-signal class as the grantSucceededFor fix, applied to the hook's un-scoped error.
feat(manteca): BRL PIX deposit QR screen (details.depositAddresses.PIX)
…ection fix(card): key card flows off findActiveCard, never cards[0] + un-trappable setup modal
…t PROCESSING Manteca flips a ramp-on to ACTIVE (→ intent PROCESSING) seconds after creation, while the user hasn't paid. The polling hook read PROCESSING as 'payment detected' and swapped the QR for a permanent CyclingLoading — the reported 'QR shows, then loads again, and it's lost'. The BE status endpoint now returns the synthetic stage (api#1112); the settling screen only shows once stage >= 2 (fiat actually received). Absent/null stage (older BE, legacy row) degrades to keeping the QR visible.
fix(manteca): PIX QR no longer vanishes — settling gates on stage, not PROCESSING
Users comparing cards can't find which chains/stables we support without signing up (X thread 2026-07-02 — reviewers literally said they look for this in the FAQ and bounce when it's missing). Renders the answer from the same rhino.consts the add-money Choose Network drawer uses, so the public claim can never drift from what the app actually accepts; plain-text answer feeds the FAQPage JSON-LD for SEO.
Fiat rails now live once in FIAT_RAILS (chips + JSON-LD prose both derive from it), Solana/Tron chips derive from OTHER_SUPPORTED_CHAINS, token chips reuse getSupportedTokens' logoUrl, chainDisplayName moves to a utils file per export rules, withSupportedRails wraps in one place, and the FAQ array is memoized (LandingPageClient re-renders per scroll frame).
feat: advertise supported networks, tokens and bank rails in landing FAQ
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 17 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (25)
Comment |
Code-analysis diffPainscore total: 5858.95 → 5857.65 (-1.3) 🆕 New findings (68)
…and 48 more. ✅ Resolved (58)
…and 38 more. 📈 Painscore deltas (top movers)
|
🧪 UI test report — ✅ all greenSuites
📊 Coverage (unit)
⏱ 10 slowest test cases
|
Summary
Brings today's ~16 main hotfix commits back into dev so the dev→main release is conflict-free: card findActiveCard + un-trappable setup modal (#2334 + follow-ups), Manteca BRL PIX QR deposit screens + settling-stage fix, landing supported-rails FAQ, badge art tweak.
Merge was textually clean. Typecheck + 1665 tests green on the merged tree.
Risks
None beyond the constituent PRs — pure sync, no new code.
QA
Local gate on the merge commit: typecheck ✅, jest 1665 ✅ (108 suites).