# @funkit/connect-rn

## 8.1.0

### Minor Changes

- a4a1e23: Add locked crypto deposits with asset selection, refreshed amount estimates, explicit copying, and unavailable states.
- 544a0ce: Support loading and retry states for token price estimates.

### Patch Changes

- a4a1e23: Choose a locked crypto deposit’s token and network together before confirming, and prevent confirming unavailable withdrawal token/network pairs.
- 665dd8d: Preserve deposit token precision and prepare asset selection with network-specific address availability checks.
- a4a1e23: Expand a locked crypto deposit address to reveal its complete value.
- a4a1e23: Explain the send amount for locked crypto deposits in a dismissible tooltip.
- e52bd63: Keep the amount screen in place while an existing MoonPay connection advances to Apple Pay.
- 059edbe: Keep cancelled and declined MoonPay Apple Pay attempts retryable in every environment, without dismissing the deposit flow.
- aac8adf: Keep the deposit sheet from closing on a backdrop tap while the Swapped embed is taking a card payment, so a stray tap can no longer interrupt the 3DS / biometric challenge.
- Updated dependencies [bd9d5e8]
- Updated dependencies [e06ae58]
- Updated dependencies [48aae63]
  - @funkit/api-base@8.5.1
  - @funkit/connect-core@8.4.0
  - @funkit/chains@2.4.1
  - @funkit/utils@5.0.1

## 8.0.0

### Major Changes

- fd90e03: The deposit sheets' Liquid Glass material now ships inside the SDK, so a host installs nothing and passes nothing for it.
  
  Migration: `expo` and `expo-blur` are now peer dependencies — install both, then rebuild your binary so the SDK's `FunkitGlassEffect` pod links. Drop `renderBackdropBlur` and `liquidGlass` from `FunkitProvider` unless you need a different material; a kept `renderBackdropBlur` takes no arguments now (`BackdropBlurRenderer` is `() => ReactNode`).
- 28c7128: Deposits await the sheet, hosts pass their identity minter by ref, and a failed identity check now tells the host whether to sign the user back in, stop, or retry.
  
  `checkoutConfig.targetAsset` also accepts a Solana mint, so Solana USDC targets need no cast.
  
  **Migration**
  
  - `beginDeposit` now returns `Promise<void>` that resolves once the flow is on screen. It also resolves (never rejects) if a newer `beginDeposit` replaced it or the flow closed first, so fire-and-forget callers get no unhandled rejection; check `onDepositError` for failures. A misconfigured flow still throws synchronously at the call, so existing `try { beginDeposit(cfg) } catch {}` keeps working; `await` it to know when the sheet is up.
  - Pass `getIdentityAssertionRef` (a `useRef` holding your minter) on `FunkitProvider`'s `config`. `getIdentityAssertion` still works but is deprecated.
  - Have your minter reject with `code: 'SESSION_EXPIRED' | 'ACCOUNT_INELIGIBLE' | 'TRANSIENT'`. `onDepositError` gains the `session_expired` code: the flow has closed — re-authenticate the user and call `beginDeposit` again.

### Minor Changes

- 387e230: Fiat deposits with an identity minter let the backend resolve the recipient from the verified assertion without a frontend wallet address.
- a1f9be5: Accept an explicit gross destination-token deposit cap in client metadata, independently of the fiat input amount.
- 01c1797: Withdraw USDC from a connected Solana wallet, to crypto or to cash, through the new opt-in Solana withdrawal entry.

### Patch Changes

- fd90e03: Deposit amount digits use their natural widths instead of tabular spacing.
- afbd9e5: Allow hosts to send debug events through the configured Funkit logging pipeline.
- 50fe735: Full-height withdrawal steps fill the container the flow is mounted in rather than the browser window, so a host dialog no longer clips the foot of the screen.
- d7f401e: Hide the deposit max route on the identity options card and offer a way to close the deposit instead
- 9fcba82: An amount over the buyer's own limit is now answered on the amount field, naming the cap that refused and offering the way down to it, instead of an alert the buyer has to dismiss before they can act. The alert remains for a refusal that carries no cap under the entered amount.
- c452c25: The amount screen now learns the buyer's spending ceiling before it asks for a price, so an amount over it is answered immediately instead of buying a refusal.
- e056364: Fix the withdrawal amount screen laying out wrongly and the flow sheet logging a nested-button DOM error under react-native-web.
- 3889bd1: The Liquid Glass deposit sheet takes a lighter tint, so more of the host app reads through it.
- fd90e03: Fade the deposit sheet's grabber in with the sheet instead of showing it at full strength mid-rise.
- 91a2785: Remove the close button from the fee details drawer
- 30c01e5: Support withdrawals from non-EVM source tokens on the React Native crypto and cash rails.
- 6c28263: Document Solana withdrawal setup.
- 32d3ac1: Keep the Swapped card payment journey inside the WebView instead of handing it to the system browser
- Updated dependencies [d4de552]
- Updated dependencies [28c7128]
- Updated dependencies [30c01e5]
- Updated dependencies [d4de552]
- Updated dependencies [12a70d7]
- Updated dependencies [c452c25]
  - @funkit/api-base@8.5.0
  - @funkit/connect-core@8.3.0

## 7.0.0

### Major Changes

- 642346f: Fee details drawer matches the design's type, spacing and attribution mark
  
  Migration: register a third Inter cut, `Inter-SemiBold`, alongside `Inter-Regular` and `Inter-Medium`. Until then the semibold weight falls back to the platform system font. A hand-built `FunkitFontTokens` needs a `body.weight.semibold` entry.
- 3bf7a60: `@stripe/stripe-react-native` is now an optional peer dependency, loaded only when a host configures Stripe, so hosts without Stripe never link or evaluate its native module.
  
  **Breaking:** the SDK is no longer a dependency of this package. Nothing changes for a host that does not pass `stripeOnramp` to `FunkitProvider`: no install, no rebuild, and Expo Go keeps working.
  
  **Migration for hosts using Stripe.** Install the SDK in your app and link its Onramp module, then rebuild the native binary. The Stripe rail cannot run in Expo Go.
  
  ```bash
  pnpm add @stripe/stripe-react-native
  ```
  
  ```jsonc
  // app.json / app.config.ts (Expo)
  "plugins": [["@stripe/stripe-react-native", { "includeOnramp": true }]]
  ```
  
  Bare React Native autolinks the base module but not Onramp: add `pod 'stripe-react-native/Onramp'` to your Podfile and `StripeSdk_includeOnramp=true` to `gradle.properties`, then `pod install` and rebuild. A JS-only update (EAS Update, CodePush) cannot add the native module, so ship a store build before enabling `stripeOnramp` for users.
- c4ea859: Bind Stripe's SDK inside the package instead of asking hosts to implement a client
  
  **Breaking:** `StripeOnrampClient` and its ten supporting types (`StripeAuthorizeResult`, `StripeHasLinkAccountResult`, `StripeKycInfo`, `StripeLinkRegistration`, `StripeOnrampError`, `StripeRegisterLinkUserResult`, `StripeCollectPaymentMethodResult`, `StripeCreateCryptoPaymentTokenResult`, `StripePlatformPayParams`, `StripeVoidResult`) are no longer exported, and `<FunkitProvider stripeOnramp>` now takes `StripeOnrampConfig` rather than a client.
  
  **Migration.** Delete your Stripe boundary component, keep `@stripe/stripe-react-native` installed in your app (it is an optional peer of this package), and pass the configuration straight to the provider:
  
  ```diff
  -<StripeOnrampBoundary config={stripeConfig}>
  -  {(stripeOnramp) => <FunkitProvider stripeOnramp={stripeOnramp}>{children}</FunkitProvider>}
  -</StripeOnrampBoundary>
  +<FunkitProvider
  +  stripeOnramp={{
  +    publishableKey: STRIPE_PUBLISHABLE_KEY,
  +    merchantDisplayName: 'Your App',
  +    merchantIdentifier: 'merchant.your.app',
  +    urlScheme: 'your-app',
  +  }}
  +>
  +  {children}
  +</FunkitProvider>
  ```
  
  Omit `stripeOnramp` and no Stripe code runs. Apple Pay still requires a native rebuild, because the Apple Merchant ID is an app entitlement.

### Minor Changes

- 67085fd: Direct fiat deposits now settle on Coinbase's own success event and report it through `onDepositSubmitted`, replacing the status screens with a confirmation toast.
- 1bccb47: Refuse an unsupported region before the deposit amount screen, instead of after a quote or a KYC form.
- 6594183: Resolve whether fiat deposits are served in the buyer's region from their IP, and log the decision.
- f2ac65e: Add the unsupported-region receipt, which closes back to the host app instead of offering a retry.
- 00e8eae: Fiat deposit methods can pin quotes to a chosen set of providers when testing against a non-production backend; production refuses it.
- cd5ac82: Correlate a flow's logs under one trace id, and expose `getFunkitTraceInfo` / `flushFunkitLogs` for host debug tooling.
- 400e5f6: Configure deposit payment methods and their fiat target assets while preserving existing deposit behavior.
- 400e5f6: Localize deposit payment labels, fee details, and payment badges automatically.
- 400e5f6: Report deposit outcomes and standardize flow errors with codes and retry flags.
- 400e5f6: Keep the active user identity stable until an open flow closes.
- 400e5f6: Format deposit balances and support asynchronously loaded withdrawal balances in React Native flows.
- bc00257: Add an optional Stripe Embedded Components session-auth capability to the managed fiat flow.

### Patch Changes

- fba9acb: Turn between the deposit amount screen and the pages after it instead of cutting
- 1939601: Country picker: a close button over the list, the chosen country headed "Your Country", and an index rail that appears once the list is scrolled
- fa27e56: Lighten the deposit sheet and fee drawer so the host's material reads through, give the drawer the design's drop shadow, and keep opaque flow sheets filled on Liquid Glass hosts.
- 142dfed: more useful error states for failed quoting
- ceb94c5: Report a fiat payment failure as a banner over the deposit header instead of a notice beside the action.
- d532b7d: The test-only fiat provider override is now `unstable_routingOverrides`, so it is not reached by accident.
- b23016a: Remove the bright line down the deposit sheet's edges and across the fee drawer's head.
- d7b5ef8: Deposits now have a maximum: over it the amount jolts, the screen names the cap and offers "Change to maximum", and an over-limit refusal says what the ceiling is.
- 085ecd5: The identity acknowledgement waits four seconds before showing its verdict, and Continue hands the deposit amount back instead of closing the flow.
- 154a1bb: The KYC country chooser opens on the country the field already holds instead of at the top of the list
- 154a1bb: Draw MoonPay's customer due diligence round as its own KYC pages.
- c6fc603: The KYC glyphs now fade from the host's brand color instead of grey.
- 35e4cbd: Stop the identity form opening with a refusal banner about the round before it.
- 154a1bb: Fix the MoonPay deposit's KYC and failure screens: forms stay usable when a quote lapses, a captured payment is never charged twice, and a refused authorization says what to do next.
- 154a1bb: Reuse active MoonPay connections and complete quote challenges without asking returning customers to authenticate again.
- 997387f: Deposit amount pills now use the screen's number style and Figma's tighter spacing.
- 142dfed: A deposit now has one maximum and one answer to it. Whichever ceiling binds — the host's, the corridor's, or the buyer's own remaining allowance reported by a refusal — the amount jolts, the screen names the figure, and a single tap changes the amount to it. The invented $2,500 fallback is gone, so the only maximum a buyer is shown is one that is really enforced, and $1,000,000 is the sole hard bound on what can be typed.
- d4a167c: Give the primary action a press response, so a submission reads as taken.
- e6addf8: Fee rates in the deposit fee details drawer are always written to two decimals (e.g. 4.20%).
- f147595: Deposit maximums are now remembered for the session, so an amount already known to be over the maximum is answered immediately.
- 4b42434: Speed the loading ring up to a turn every 600ms.
- c4ea859: Report why Stripe authorization failed instead of "[object Object]".
- c4ea859: Complete a Stripe purchase that needs a card confirmation step.
- c4ea859: Fix Stripe's KYC rounds dead-ending after the first one.
- c4ea859: Sign a returning buyer back into Stripe without a second one-time code.
- Updated dependencies [142dfed]
- Updated dependencies [1bccb47]
- Updated dependencies [38e9946]
- Updated dependencies [d532b7d]
- Updated dependencies [00e8eae]
- Updated dependencies [cd5ac82]
- Updated dependencies [154a1bb]
- Updated dependencies [f147595]
- Updated dependencies [c4ea859]
- Updated dependencies [bc00257]
  - @funkit/connect-core@8.2.0

## 6.2.0

### Minor Changes

- a0062bc: Support iOS 26 Liquid Glass for the deposit sheets and drawers
- faaa214: `withdrawalWallet` is now optional on `WithdrawalFlowConfig`, so the withdrawal flow renders and quotes without a signer, and withholds cash payout methods.

### Patch Changes

- f722b76: The Coinbase terms notice stays on every Coinbase-priced quote, not only where a tap accepts them.
- 61ba6c1: No functional changes to the published package
- 52e851d: Name the deposit floor on the keystroke instead of after a debounce, so a below-minimum amount no longer shows a stale "Deposit with Apple Pay" action for up to 800ms before the minimum state replaces it
- 3c28e93: Widen the deposit amount shortcuts to span the action area and left-align the payment mark with them, so the shortcuts, the payment mark and the submit button all share one left edge
- cf9d578: Restore the close button on the fee details drawer
- a0062bc: Align the deposit fee drawer with the design: glass rather than an opaque panel, tighter top spacing, a dimmed fee rate, and a "You'll get" total on fiat deposits
- cb6342b: Recover a provider-rendered fiat auth surface whose provider session died, by following the resend the round publishes instead of remounting the dead surface.
- Updated dependencies [cb6342b]
  - @funkit/connect-core@8.1.1

## 6.1.0

### Minor Changes

- da4b6fe: Add the resolved identity states to the deposit KYC banner.

### Patch Changes

- e78fc80: Align the deposit screen's payment mark with the quick-amount shortcuts
- c4083fa: Name the reason a card deposit was declined — bank decline, billing mismatch, region, or a deposit limit — in all supported languages.
- 507ffee: Say why a card payment was refused on the deposit screen, in funkit's own words, instead of leaving the buyer with a bare retry button.
- 2e5cb11: Explain a card deposit that fails while loading or settling, including whether the card was charged or will be refunded.
- f38b53b: The country list opens on the buyer's own country, pinned under its own heading, with an alphabet rail to drag through and no keyboard in the way
- a55adaa: Remove the brand glow from the V2 deposit surface.
- db448a0: No consumer-facing behavior changes.
- a55adaa: Draw the deposit sheet as the design's glass: an 85% black surface over the host blur, a 36pt head, a white hairline edge and a drop shadow.
- 460b3d2: Draw the date of birth page to its design: a sentence heading, a centred wheel, and a refusal that stands in the action's place.
- ea54719: Type the date of birth instead of leaving the field blank when the native date picker cannot load.
- bbc3beb: Acknowledge a completed identity form with its outcome screen instead of returning silently to the deposit amount.
- 75e3c91: Add the identity options card the deposit screen opens once KYC resolves.
- 812fa52: Wire the identity options card to deposit max, re-do verification and support.
- 9b10caf: Report a resolved identity check on the deposit screen instead of a full-screen outcome.
- 812fa52: Ask for identity verification on the deposit screen when the provider requires it before a first deposit.
- 27c1f56: The Apple Pay mark and the fee line on the deposit amount screen now sit on the same centre line.
- 278be57: The deposit floor's "Change to minimum" action now appears after the minimum notice rather than alongside it.
- d7b1afa: Make MoonPay authorization screens reachable with the upstream mobile SDK fix and document the required app crypto setup.
- 7d6d78d: fix(connect-rn): match V2 deposit drawer settling to the Stocks motion reference
- 24e7f8c: The OTP screen shows US phone numbers with a space after the area code.
- 89d472e: The fee details summary for card and Apple Pay deposits now says the fee is deducted from the deposit; crypto deposits with a configured fee keep the added-to-charge wording.
- eb518b7: The deposit amount screen's centred header no longer draws a back chevron.
- 3dc310a: fix(connect-rn): remove the fee drawer close button while retaining gesture dismissal
- 62569ec: Fixed the Swapped deposit and withdrawal embeds not scrolling on Android.
- 5babe4e: Tell buyers their ID check needs correcting when a provider asks for the form again, instead of showing the first-time verification prompt.
- 7d6d78d: fix(connect-rn): dismiss every V2 deposit drawer by the same gesture, grabber and backdrop
- Updated dependencies [3c85052]
- Updated dependencies [3c85052]
- Updated dependencies [cbfe8c1]
- Updated dependencies [db448a0]
- Updated dependencies [812fa52]
- Updated dependencies [9b10caf]
- Updated dependencies [84f1fcf]
- Updated dependencies [5babe4e]
- Updated dependencies [c2c7331]
  - @funkit/connect-core@8.1.0
  - @funkit/api-base@8.4.0

## 6.0.0

### Major Changes

- b29078c: Fiat deposits whose destination asset is what the rail already buys are now paid straight to the recipient instead of through a generated deposit address.
  
  `amountEntry.fiat.cryptoCurrencyAddress` is required: set it to the address (or SPL mint) of the token named by `cryptoCurrencyCode`, on `chainId`. Matching `checkoutConfig.targetAsset` is what selects the direct route.
  
  ```diff
   fiat: {
     paymentMethod: 'apple_pay',
     cryptoCurrencyCode: 'USDC',
  +  cryptoCurrencyAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
     chainId: '1151111081099710',
   },
  ```

### Minor Changes

- b29078c: Deposits now honour a `customRecipient` on the checkout config, matching the web SDK.
- c621550: A fiat order paid straight to the recipient now shows as complete when its delivery transaction lands, instead of waiting for the backend to settle it.
- 92e7e32: Add `amountEntry.minLimitUsd`: amounts under the floor show a persistent notice and a one-tap action that enters the minimum.
- 1f21381: Centre the deposit title over a back chevron when the host supplies no brand mark or account context, and let hosts name the deposit screen.
- 9f9269b: Redraw the fiat country picker as a searchable sheet over the step that raised it

### Patch Changes

- 76f165c: Token and recipient comparisons no longer treat two base58 addresses differing only in case as the same address.
  
  `isEVMAddressEquivalent` is removed from `@funkit/utils` and `@funkit/connect-core`. Replace it with `isAddressEquivalent`, which takes the same arguments and picks the comparison from the address format: EVM hex folds case, base58 (Solana, Tron) must match exactly.
  
  ```diff
  -import { isEVMAddressEquivalent } from '@funkit/utils'
  +import { isAddressEquivalent } from '@funkit/utils'
  
  -isEVMAddressEquivalent({ firstAddress, secondAddress })
  +isAddressEquivalent({ firstAddress, secondAddress })
  ```
- eef85ee: Apple Pay and loading actions now take their corner radius from the theme's button token, and the waiting action is drawn as a bare fill.
- 627cd0a: Hold the waiting action's spinner back by 150ms so a wait that ends sooner never flashes a ring.
- 9962a07: Set the fiat code screen's headline in the primary colour at title size, and tighten a US number to (415)555-0134
- 48e5ac9: Keep a continuous loading indicator while preparing checkout and loading the Apple Pay button.
- a53805b: Write the deposit minimum disclaimer in whole units, so a $2 minimum no longer reads as $2.00.
- b9e0ee2: Change the deposit action between states by crossing its fill colour instead of scaling and fading the whole button.
- 56c82ae: Round the deposit sheet's top corners to 34pt and soften every sheet corner.
- 03d0bd9: Hold the deposit fee in its loading state until the Apple Pay button is ready, so the two appear together.
- ad0b884: Show the deposit fee drawer's fee as a single "Fee 0.5%" row, rounded to one decimal and never naming the payment provider.
- 12a100b: Show a loading or retry control on the fiat deposit screen instead of a CTA stuck in a dimmed, unpressable state.
- 91cc64a: Drop the glow from the over-limit amount flash, leaving the yellow tint.
- 52d6e06: Restore smooth amount centering when typing and deleting across short and long values.
- ddab1d7: Soften the keyboard action's entrance: it fades on from 12px below instead of rising from behind the keyboard.
- 92e55fe: Deposit spinner: the delay before the ring appears can now be tuned per surface (still 150ms by default).
- 9101b3a: Spin the loading ring faster, with its rate rising and falling once per turn.
- e1cedfd: Prevent amount entrance animations from replaying when editing a prepared Apple Pay checkout.
- da40025: Phone autofill now moves the country code onto the country chip instead of leaving it in the number field.
- c3b2407: The deposit sheet's translucent background no longer darkens toward its top edge.
- 4fe6a17: Draw the KYC occupation and purpose answers on the screen instead of behind a chooser sheet
- Updated dependencies [76f165c]
- Updated dependencies [b29078c]
- Updated dependencies [b29078c]
- Updated dependencies [c621550]
- Updated dependencies [a5e893c]
- Updated dependencies [86ba6ef]
  - @funkit/connect-core@8.0.0
  - @funkit/api-base@8.3.1

## 5.0.0

### Major Changes

- ef57ef7: Render provider-owned session authorization separately from OTP and add MoonPay account-connection and Apple Pay surfaces using MoonPay's React Native SDK.
  
  Migration: exhaustive `FiatScreen` mappings must handle the new `AUTH_CAPTURE` screen.

### Minor Changes

- a3c1f6a: Allow deposit flows to include host correlation metadata (an external user id and transaction id).
- 5fe84a2: Coinbase's Apple Pay button is drawn in the amount screen's action slot, as a pill-shaped button, instead of on a page of its own.
- 333f284: The fiat contact, code and KYC screens now behave as screens: they hold the sheet against swipes and taps, stay up through the requests they send and wear a refusal as their own notice, ride the keyboard on its own curve, keep typed text level with its placeholder, accept a phone number however it is dialled and validate it against real numbering plans, show Continue only once the contact is valid, and open, turn pages and reveal their action with the design's transitions.
- a2e92ee: Support prefilled, optionally locked deposit amounts.
- 5376c23: The fiat KYC form follows the R2 design's feedback states: a refused page tints its fields, names the reason and buzzes only when the user tries to leave it, Continue appears once a typed page is complete, Confirm returns to any page still refused, and a date of birth under 18 is refused on the device.
- ac06f72: A fiat refusal the server sends back onto the quote (a limit, a provider outage, a form it no longer holds) is now announced with the platform's own alert over the amount screen instead of silently closing the step.

### Patch Changes

- 770da6d: Accept quote-less fiat KYC discovery forms and the dedicated US SSN last-four field.
- 73ff099: Align deposit fee disclosures and use the matching information symbol.
- b96b753: Improve calling-code picker performance when opening and searching
- 5d4256e: Center the payment terms disclaimer within the checkout footer.
- 8c981fb: Preserve React 18 and i18next 23 compatibility for payment consent translations.
- 384cce3: Mint a checkoutId UUID per deposit/withdrawal.
- 8970fd7: The fiat KYC form now runs on `@tanstack/react-form`; a refusal on an earlier page keeps gating the final submit, and a new form round no longer inherits the previous round's touched state.
- b857c61: Lock the deposit amount screen's numpad, backspace, and quick amounts when the host disables amount editing.
- 0378e8b: Prefill the deposit amount screen (crypto and fiat) from `DepositFlowConfig.initialAmount`, preserved across fiat-flow retries.
- bd149d1: Prefill and optionally lock Swapped deposit amounts and currencies.
- 323a5bb: Refine deposit disclaimers and place document links after an explicit line break.
- 18d1b71: Align deposit header balances and reserve consistent space for account avatars.
- 22ce7a9: Match SDK deposit action heights and label sizing to the deposit layout.
- 87f9d76: Align deposit spacing and keypad bounds with the design, with narrower margins on small phones.
- 933ecce: Show Coinbase Apple Pay checkout without an extra deposit tap and expose the fresh quote’s selected provider.
  
  Migration: `UseFiatQuoteResult` now includes an optional `provider`; existing callers require no changes.
- 5d4256e: Keep deposits editable when no payment provider is available and show retry dates for blocked deposits.
- 5d4256e: Explain expired verification codes, guide users to resend, and prevent verification action buttons from crashing.
- 72b7cc3: Preserve structured API refusals, show provider minimum deposits on fiat amount entry, use Pump branding for success states, and hide retry actions for terminal purchase failures.
- 933ecce: Share the fiat payment-session endpoint constant and preserve provider-specific checkout preparation behind the common fiat flow.
- b65fb99: Improve fiat sheet opacity and country-aware OTP phone formatting.
- 5d4256e: Match the payment disclaimer typography and spacing to the mobile design.
- baa2ac0: Fix Apple Pay deposits getting stuck after changing the amount by allowing unfinished deposits to be resumed or cancelled and refreshing abandoned quotes.
- dffb517: Keep fiat quotes fresh across reopened flows and visible through payment capture.
- 8c981fb: Collect payment terms consent through the normal deposit action with a linked notice beneath the keypad.
- 5d4256e: Improve verification artwork contrast on dark customer themes and honor customer status colors.
- 5d4256e: Show the shared verification progress indicator while document verification starts.
- 206ae21: Update the KYC faceplate copy to match the Figma designs and name the ID-verification vendor in the document round.
- 5d4256e: Show the current step on every identity verification form page, including birth date and questionnaires.
- f558444: Match the KYC In Review, On Hold and Rejected screens to the KYC R2 design.
- 5d4256e: Use a native date-of-birth wheel and segmented full or last-four SSN entry during US identity verification.
- 5d4256e: Introduce document verification before opening the identity provider.
- eafb519: Align identity consent, form headings, address rows, and submission controls with the mobile verification design.
- 5d4256e: Match KYC deposit notices and payment recovery to the mobile design, including document artwork and native phone feedback.
- 5d4256e: Show native recovery alerts for unavailable identity verification and payment providers.
- 5d4256e: Match KYC code confirmation and error feedback, format phone inputs, and align actions with the native keyboard.
- 5d4256e: Match identity review, hold, and restriction screens to the mobile KYC designs while preserving recovery actions and retry deadlines.
- 5d4256e: Match KYC country and additional-verification forms to the mobile design and animate KYC actions upward from the keyboard.
- 5d4256e: Match KYC form materials and preserve editable contact and document verification recovery states.
- c038d78: Match identity verification submission feedback to the mobile design, dismiss the keyboard while sending, and prevent edits until submission finishes.
- 5d4256e: Recover from temporary identity provider failures without showing an account restriction.
- 5d4256e: Distinguish first-time identity verification from deposit-limit upgrades in deposit prompts.
- 5a7879f: Reword the fee details drawer summary and drop its "powered by Fun" mark
- f32fd43: Ask for the phone number when a fiat quote answers with the session round itself
- 347bc4a: Follow the reworded fee details summary in the seven non-English locales
- a525fdc: Automatically submit complete verification codes and prevent edits or resends while verification is pending.
- 5d4256e: Allow buyers to verify the same phone number again when their verification expires.
- 63a354f: Refine phone verification typography, spacing, and the back-button glyph.
- fa71b44: Preserve leading phone digits while typing and deleting, including numbers starting with 1.
- fa71b44: Fix phone number text shifting vertically when typing or clearing digits on iOS.
- 59ea27b: Keep the fiat contact screen up until the round it opens arrives
- 92597b1: Reduce the Swapped deposit surface height when the deposit amount is locked.
- b9bd7ff: Match fiat surface materials, show live fee disclosures, initialize the visible birth date, and explain OTP rate limits.
- 16218bb: Deposit screen: the payment method badge (e.g. Apple Pay) now shows before an amount is entered
- 94debdd: Keep deposit action transitions stationary and animate their fills independently from labels.
- 798ee30: The fiat deposit consent notice no longer outlives the quote it was accepted for.
- 8c981fb: Keep payment consent clear of the keypad and home indicator, and distinguish document links.
- bece9cc: Center the deposit amount within the available space on every screen height and dim untouched amounts to the design opacity.
- c5be149: Match deposit quick-amount chip sizes, spacing, corners, and typography to the mobile design.
- b72df9e: Keep the deposit sheet fixed while fitting consent and keypad content on smaller screens.
- 0717796: Match deposit keypad row spacing and edge alignment while keeping its position stable across states.
- e6fdcfa: Show identity consent as a separate step before the identity form.
- 5fe84a2: Match Apple Pay deposit buttons and loading states to the same full-width pill without overlap.
- Updated dependencies [770da6d]
- Updated dependencies [7e4ed3f]
- Updated dependencies [8f5a732]
- Updated dependencies [384cce3]
- Updated dependencies [bd149d1]
- Updated dependencies [933ecce]
- Updated dependencies [72b7cc3]
- Updated dependencies [933ecce]
- Updated dependencies [dffb517]
- Updated dependencies [206ae21]
- Updated dependencies [f32fd43]
- Updated dependencies [ef57ef7]
- Updated dependencies [b3c8a12]
  - @funkit/connect-core@7.0.0
  - @funkit/api-base@8.3.0
  - @funkit/chains@2.4.0

## 4.3.0

### Minor Changes

- 3ff966e: Choose the calling code on the fiat phone field instead of typing it

### Patch Changes

- 3b56f60: Swapped Terms of Use and other external links now open in the system browser instead of replacing the payment flow, and Android hardware back returns to the order page or the method list.
- 435a19c: Draw Coinbase's Apple Pay button on a fiat deposit instead of an unsupported notice
- eb924c6: Show Coinbase's Apple Pay button instead of pressing it from script
- 46d5375: Fix a fiat deposit stalling on the amount screen after a verification code is accepted
- eec29dc: Build and test against Expo SDK 57 and React Native 0.86
- a98768f: Name the host's email on a fiat code round the session collects no address for
- 50e2acc: Collect every contact a fiat session asks for, and verify each on its own code round
- 0159074: The Swapped payment sheet now sits above the Android navigation bar and iOS home indicator so fee rows and buttons stay visible.
- 78f075b: Accept the terms a fiat provider requires, so a deposit that needs them can be placed
- Updated dependencies [b948af2]
- Updated dependencies [3a6256a]
- Updated dependencies [46d5375]
- Updated dependencies [50e2acc]
- Updated dependencies [78f075b]
  - @funkit/api-base@8.2.0
  - @funkit/connect-core@6.1.0

## 4.2.0

### Minor Changes

- 93f6518: Answer a fiat identity date with the platform's own picker, from a new optional `@react-native-community/datetimepicker` peer.
- 6c01cc3: Ask where the fiat session code should be sent, and answer the code round.
- c4a17d3: Draw a fiat identity field row for each type a form declares.
- 782789e: Route a fiat deposit through the identity screens and provider surfaces a round asks for.
- 0678009: Step the fiat identity form one section at a time, over the price it is for.
- b6e327e: Open the fiat identity flow on a screen that takes the buyer's consent.
- d37b629: Mark a refused identity field, and the round's own error, in the design's yellow.
- f79dc98: Page a declared fiat identity form the way the design groups its fields.
- 782789e: Say on the amount screen when identity verification is what holds a deposit.
- 056ec4a: Add the fiat identity form's colours and metrics.

### Patch Changes

- e3fc541: Fiat quotes send the buyer's geo object the API now requires, instead of a bare country.
  
  Migration: `useFiatQuote`'s `country: string` prop and `QuoteRequest.country` are replaced by
  `geo: { alpha2: string; region?: string }`. Pass the geo lookup's own answer —
  `{ alpha2: userIpInfo.alpha2, region: userIpInfo.state }`. A US buyer needs `region`;
  the server refuses a US quote without it.
- 07ab436: Collect the mobile number a fiat session asks for, instead of only an email address.
- 053d65f: Re-send a fiat deposit under a fresh price when the server no longer holds the quoted one
- d6878c0: The geo lookup only asks a second provider for a missing state when the caller needs one; web takes the first country as before.
- b31b898: Identity screens name the provider whose terms apply, prefill country from the buyer's region, keep the retry screen after a failed email step, and disable resend when the round offers none.
- Updated dependencies [0dd9bb6]
- Updated dependencies [d759c2e]
- Updated dependencies [e3fc541]
- Updated dependencies [053d65f]
- Updated dependencies [d6878c0]
- Updated dependencies [19abab6]
- Updated dependencies [91fa0ce]
- Updated dependencies [91fa0ce]
- Updated dependencies [f2d1fb9]
- Updated dependencies [f2d1fb9]
  - @funkit/api-base@8.1.0
  - @funkit/connect-core@6.0.0

## 4.1.0

### Minor Changes

- 3e35fc3: Send the buyer's country on fiat quotes, which no provider will price without.
  
  **Migration.** `QuoteRequest` gains a required `country` — ISO 3166-1 alpha-2 of
  the buyer. Code that builds one must supply it; a request without it is answered
  `404 "No provider can price that purchase right now."` `useFiatQuote` takes it
  optionally and sends no quote until it resolves.
- e4b413a: Quote fiat deposits in the buyer's regional currency.
- df228c4: Replace the unreleased fiat auth-token API with identity-assertion naming.
- 3e35fc3: Make `amountEntry.feeRate` optional — a fiat rail quotes its own fee.

### Patch Changes

- 9398f11: Open the fee details drawer from the fiat amount screen's fee line.
- e0a192f: Route fiat capture surfaces through a per-provider adapter registry.
- Updated dependencies [005d0ca]
- Updated dependencies [005d0ca]
- Updated dependencies [005d0ca]
- Updated dependencies [91fd04a]
- Updated dependencies [ad4f69c]
- Updated dependencies [3e35fc3]
- Updated dependencies [e4b413a]
- Updated dependencies [df228c4]
- Updated dependencies [05a0fed]
- Updated dependencies [641d2a1]
- Updated dependencies [76848d7]
- Updated dependencies [2dd0720]
- Updated dependencies [a8cf4cd]
  - @funkit/api-base@8.0.0
  - @funkit/chains@2.3.0
  - @funkit/connect-core@5.0.0

## 4.0.0

### Major Changes

- 9fc3393: Fiat capture surfaces are rendered by the SDK, so hosts no longer supply `renderCaptureSurface`.
  
  Migration: delete `renderCaptureSurface` from your `fiatRail` config and drop any import of the removed `FiatCaptureSurfaceProps` type. The SDK now draws the provider's payment sheet itself; a provider it cannot draw falls back to the unsupported screen as before.

### Patch Changes

- 9fc3393: A payment taken on the amount screen now creates the order instead of being dropped.
- 1320275: fix: unmount after test completion
- 20d4e4b: fix(connect-rn): deflake the withdrawal payout-methods hook test on slow CI runners
- Updated dependencies [9fc3393]
- Updated dependencies [4a4ea7d]
  - @funkit/connect-core@4.4.0

## 3.11.0

### Minor Changes

- 3836140: Groundwork for the deposit fee-details drawer (screen not yet reachable).
- 74c61e5: Deposit fee disclosure fades off while typing and fades back in with the repriced fee.
- b9b8a75: The V2 amount screen can now quote fiat deposits and render backend-selected payment surfaces in place.
- 555ef9e: feat(connect-rn): hold delete on the deposit numpad to clear the amount
- a3bf723: Deposit fee line opens a fee-details drawer.
- f2db1ac: Deposit amount screen shows a "powered by Fun" mark, which hosts can turn off in their config.

### Patch Changes

- b5d384e: Pass the host's user auth-token minter through to the fiat flow.
- e82489d: The V2 deposit amount surface is drawn as glass over the host app.
- 5a96429: V2 deposit amount stays centred while it fits and, once wider than the screen, pins its left edge and scales down from there.
- Updated dependencies [b5d384e]
- Updated dependencies [b5d384e]
- Updated dependencies [67bcc99]
- Updated dependencies [60ffb40]
- Updated dependencies [838b4a7]
- Updated dependencies [60ffb40]
- Updated dependencies [c60f3b1]
- Updated dependencies [d6629ee]
- Updated dependencies [3b5f688]
  - @funkit/api-base@7.3.0
  - @funkit/connect-core@4.3.0
  - @funkit/chains@2.2.1

## 3.10.1

### Patch Changes

- 2364013: fix: Nado withdrawals request their deposit address with a checksummed recipient
- 260becc: V2 deposit amount screen re-renders only the keypad keys and glyphs that changed on each keystroke.
- c980638: V2 deposit amount: typing a zero onto zero swells the amount instead of shaking, and the leading zero brightens in place rather than remounting.
- c7d2fda: fix(connect-rn): allow withdrawing to your own wallet on a venue-submitted rail
- Updated dependencies [b2c2340]
- Updated dependencies [2364013]
  - @funkit/connect-core@4.2.0
  - @funkit/api-base@7.2.1

## 3.10.0

### Minor Changes

- c33e3c8: Add an opt-in amount-first deposit experience for React Native.
- 7259085: Support a distinct error haptic for refused keypad input via the new HapticKind parameter

### Patch Changes

- c33e3c8: Internal refactor
- 24a6f31: fix(connect-rn): hide Apple Pay from the payment method list on Android
- Updated dependencies [9abc673]
- Updated dependencies [2be999d]
- Updated dependencies [5f06dd8]
- Updated dependencies [54031e2]
- Updated dependencies [c8b7cfb]
- Updated dependencies [d1b33c1]
- Updated dependencies [32c647e]
- Updated dependencies [7259085]
  - @funkit/api-base@7.2.0
  - @funkit/connect-core@4.1.1

## 3.9.0

### Minor Changes

- e071c47: feat(connect-rn): add `submitWithdrawal`, for venues that submit the withdrawal themselves
- f9e3e58: feat(connect-rn): track a venue-submitted withdrawal to completion, showing it as requested until it lands
- 384ffee: feat(connect-rn): add `@funkit/connect-rn/clients/nado` for withdrawing USDT0 from a Nado subaccount
- c8a547b: fix(connect-rn): report the delivering transaction when a venue withdrawal settles cross-chain

### Patch Changes

- db6edb4: No consumer facing changes.
- 7fc8dc1: The Swapped embed no longer flashes a dark panel while loading — the themed spinner now holds until the embed is ready.
- 7e79bfb: Fix blank card/3DS step in the Swapped deposit flow on iOS by allowing the srcdoc challenge subframe in the payment WebView.
- Updated dependencies [db6edb4]
- Updated dependencies [c8a547b]
- Updated dependencies [b2148be]
- Updated dependencies [87d5708]
- Updated dependencies [e671988]
- Updated dependencies [d0fb831]
  - @funkit/connect-core@4.1.0
  - @funkit/api-base@7.1.2

## 3.8.0

### Minor Changes

- 086ac1c: Add `hideCryptoDeposit` to `FunkitConfig` to hide the built-in Crypto funding option on the Add money screen (React Native only — the web SDK does not support this option)

### Patch Changes

- 1e6df43: Lighter Fast's unstaked withdrawal fee is now always accurate to the account's current stake, and the quote waits for it before pricing.
- b28ba34: Brace every `if`/`else`/loop body — formatting only, no behaviour change.
- dae8c51: Append EIP-681 `@<chainId>` suffix to EVM deposit QR code URIs so MetaMask mobile's scanner can resolve the network
- 7cb4c64: Withdrawal submission and completion now have smoother screen transitions.
- 55551d6: fix(connect-rn): keep flow state when a step changes the sheet's sizing
- 838ed23: fix(connect-rn): show customer-scoped features for the current identity
- Updated dependencies [4b25619]
- Updated dependencies [84683ff]
- Updated dependencies [df95715]
- Updated dependencies [d46284d]
- Updated dependencies [1e6df43]
- Updated dependencies [1e6df43]
- Updated dependencies [1e6df43]
- Updated dependencies [b28ba34]
- Updated dependencies [dae8c51]
- Updated dependencies [2522e00]
- Updated dependencies [2ad0cd5]
  - @funkit/api-base@7.1.1
  - @funkit/connect-core@4.0.0

## 3.7.0

### Minor Changes

- 4c02988: Lighter Native Bridge withdrawals can be submitted from `@funkit/connect-rn`, recorded for attribution.
- 3d95b7f: Risk assessment now screens on the transaction's chain: `getRiskAssessmentForAddress` accepts an optional `chainId`, and checkout and withdrawal screens send it.
- e72e8d9: feat(connect-rn): taps through the optional `react-native-haptic-feedback` peer when installed, overridable via `FunkitProvider`'s `hapticFeedback`
- 61fffd1: feat(connect-rn): token-and-chain grid picker for the withdrawal destination
- 6cc3034: feat(connect-rn): tabbed token/chain picker with search for the withdrawal destination
- 14cfa5b: feat(connect-rn): the crypto withdrawal is the amount and recipient steps, with the old single-form screen gone
- c667b94: Crypto withdrawal amounts can now be entered in dollars, with a tap to switch between dollars and the source token. Sources priced in dollars no longer wait on a price lookup to show their value.
- e76ae84: feat(connect-rn): amount display whose digits slide in as they are typed and out as they are deleted
- f2f8eeb: feat(connect-rn): the withdrawal amount screen now fills the screen, status bar included
- 759b3f4: feat(connect-rn): withdrawal amount screen — numpad entry over the source card, with Use Max giving way to Continue
- f2f8eeb: feat(connect-rn): the crypto withdrawal now asks for the amount on its own step before the recipient
- cebbd0f: feat(connect-rn): in-app numpad for entering an amount, tapping on every press
- cde4297: feat(connect-rn): the withdrawal reports itself going out and landing on the amount it was signed for
- b6f58fb: feat(connect-rn): the withdrawal shows what the recipient receives, with a breakdown of the estimate
- 4c718c2: feat(connect-rn): the crypto withdrawal asks for the recipient on its own screen, with paste, clear and the connected wallet
- f283759: feat(connect-rn): the crypto withdrawal is signed from the recipient step
- 657e4a3: feat(connect-rn): source card naming what a withdrawal is drawn from, with its balance and a Use Max shortcut
- ec87169: Crypto withdrawals now price the source token, so the USD minimum and maximum a host configures take effect.
- 993ac35: React Native token pricing now falls back to Relay when the funkit price API can't price a token, so configured USD withdrawal limits stay enforced.
- 4523118: Show the provider's own message when a crypto withdrawal fails for a reason the SDK cannot classify, instead of generic copy.

### Patch Changes

- 76dafe1: Withdrawal flat-fee deduction now comes from `@funkit/connect-core`, so web and React Native price the same amount.
- 67d1b06: fix(connect-rn): a failing clipboard read no longer interrupts the withdrawal Paste
- d2f7455: Document Lighter withdrawal integration in the package README.
- ca5a3dd: No consumer facing changes.
- 9722639: No consumer facing changes.
- fa18a86: fix(connect-rn): render CDN token and chain logos that style their paths with CSS classes
- c667b94: Withdrawal amounts entered in dollars no longer blank out while a decimal point is typed, and dollars are offered only once the source token's precision is known.
- f283759: fix(connect-rn): a withdrawal whose quote fails says so, instead of loading forever
- 53d7f38: fix(connect-rn): a network blip no longer stops a withdrawal from being followed to its outcome
- 519f359: fix(connect-rn): scroll the chain, token and source pickers on Android
- db08b0d: fix(connect): reject non-decimal withdrawal source balance values
- Updated dependencies [fade45e]
- Updated dependencies [759b3f4]
- Updated dependencies [c667b94]
- Updated dependencies [c667b94]
- Updated dependencies [53d7f38]
- Updated dependencies [76dafe1]
- Updated dependencies [bbb0301]
- Updated dependencies [3d95b7f]
- Updated dependencies [993ac35]
- Updated dependencies [db08b0d]
- Updated dependencies [e1354ad]
  - @funkit/api-base@7.1.0
  - @funkit/connect-core@3.1.0

## 3.6.0

### Minor Changes

- bb62bf9: `@funkit/connect-rn/clients/lighter` exports `useLighterWithdrawal`, which returns the ready Fast withdrawal method to hand to `beginWithdrawal`.
- 1c78322: Lighter Fast withdrawals: USDC Perps out of the user's Lighter L2 account to any supported chain.
- 1cc26d5: Lighter Fast withdrawals now apply and display the unstaked fee for users below the staking threshold.
- 4f94ba7: Withdrawal flows accept host-supplied methods via `WithdrawalFlowConfig.methods`, and `@funkit/connect-rn/clients/lighter` carries Lighter's withdrawal configuration.
- 4d46db3: `@funkit/connect-rn/clients/lighter` exports `useLighterWithdrawalMethods`, which resolves a Lighter account's Fast and Native Bridge withdrawal rows.
- a381a6a: Withdrawal methods can declare a flat fee taken off the amount before quoting, and a fee billed as source-chain gas that lands in the summary's network cost.
- f9953fc: The crypto withdrawal form now lets the user pick between the source tokens the host configured.

### Patch Changes

- e150c20: Log the Swapped embed's full flow lifecycle, matching the web SDK's coverage.
- cb1caa9: No consumer-facing changes.
- 2147ad7: No consumer-facing changes.
- 90be596: No consumer-facing changes.
- d846615: Fix the withdrawal recipient shortcut filling the payer's identifier instead of the connected wallet address.
- 3a6351a: The withdrawal recipient shortcut no longer offers the zero address.
- a6cc332: Renamed `toWithdrawalExecutionErrorCode` to `toWalletExecutionErrorCode` and its `WithdrawalExecutionErrorCode` type to `WalletExecutionErrorCode`.

  Migration: rename the import — the codes (`insufficient-gas`, `switch-chain`, `generic`) and behavior are unchanged.

- Updated dependencies [b361db0]
- Updated dependencies [332d186]
- Updated dependencies [aafdbba]
- Updated dependencies [c68c3d6]
- Updated dependencies [d2336bb]
- Updated dependencies [35b64db]
- Updated dependencies [a5c5bed]
- Updated dependencies [86b10f0]
- Updated dependencies [a6cc332]
- Updated dependencies [3a6351a]
  - @funkit/connect-core@3.0.0

## 3.5.0

### Minor Changes

- 26b59c4: feat(connect-rn): dim the host app behind the flow sheet, with an optional host-supplied backdrop blur
- fba0b56: Add Lighter deposit support to `@funkit/connect-rn`: external user IDs are sent verbatim and the deposit recipient resolves to the user's Lighter L2 main-account index, never the L1 wallet address.
- 4911ff9: Add crypto withdrawal configuration: selectable source tokens, an integrator balance callback, and min/max limits.
- be8118a: Crypto withdrawals can now choose which asset and chain the recipient is paid in.
- c4b476d: Crypto withdrawals can now be submitted on React Native, with on-chain status polling.

### Patch Changes

- a7258d9: feat: shadow-compare geo lookups against Fun's first-party endpoint, promotable via the `enable-fun-geo-primary` gate
- 7110ca9: Match the crypto withdrawal's error and warning copy to the web SDK's, in every locale.
- 7110ca9: Expose the relay fee breakdown helper and the debounced-value hook used to price a withdrawal.
- 30027d7: Validate the crypto withdrawal form and name the remaining blocker on the submit button.
- c4b476d: A host callback that throws no longer interrupts the deposit or withdrawal flow.
- 2a56dde: feat(connect-rn): log the deposit and withdrawal config when a flow begins
- 9fbd930: fix(connect-rn): reduce log payload size for host-supplied React nodes
- 09de4e4: fix(connect-rn): logging no longer throws when log context can't be serialized
- 18c2f00: Source the read-only RPC client from @funkit/connect-core instead of a local copy.
- 0413098: The crypto withdrawal screen now takes an amount and a recipient address.
- Updated dependencies [8eb9f08]
- Updated dependencies [195843e]
- Updated dependencies [0872c5f]
- Updated dependencies [18c2f00]
- Updated dependencies [2ed588e]
- Updated dependencies [a7258d9]
- Updated dependencies [fba0b56]
- Updated dependencies [c4b476d]
- Updated dependencies [12d5574]
- Updated dependencies [7110ca9]
- Updated dependencies [c4b476d]
- Updated dependencies [5d71640]
  - @funkit/api-base@7.0.0
  - @funkit/connect-core@2.5.0

## 3.4.0

### Minor Changes

- df0914a: feat(connect-rn): remember the deposit chain the user picked across app launches
- c241a07: feat(connect-rn): add deposit chain selection screens
- 5ecf481: feat(connect-rn): show the selected deposit chain and its minimum on the transfer screen
- 560abd8: feat(connect-rn): choose a deposit chain before the transfer screen on a first deposit
- c24e881: Add a crypto address option to the withdrawal method list.

### Patch Changes

- a970588: feat(connect-rn): auto-copy the deposit address when the transfer screen opens and whenever the address changes
- 2aaf5c9: fix(connect-rn): keep the chain picker clear of the screen edge on devices without a home indicator
- 3bfee91: feat(connect-rn): swipe the Transfer Crypto screen down to exit the deposit flow
- d09afe4: refactor(connect-rn): internal split of the deposit flow body; no consumer-facing changes
  - @funkit/connect-core@2.4.1

## 3.3.0

### Minor Changes

- 3f8f25a: feat(connect-rn): support `prefillFiatEmail` on `FunkitConfig` to prefill the Swapped fiat ramp email

### Patch Changes

- df4e7d8: fix: treat Bitcoin, Lightning and HyperCore consistently as non-EVM chains across web and RN
- ea114c9: fix(connect-rn): stop the Add money list flashing crypto-only on first open
- 340b63d: Internal refactor of the React Native forms-of-payment hook, no behavior change
- Updated dependencies [df4e7d8]
- Updated dependencies [4235f2f]
  - @funkit/chains@2.2.0
  - @funkit/connect-core@2.4.0

## 3.2.0

### Minor Changes

- a5cc6a8: Enforce the configured minimum deposit on React Native fiat (cash) deposits, matching web.
- 5aafc85: Add i18n with an English locale and a `locale` option on `FunkitProvider`
- fc112c7: Add zh, ko, ja, tr, es, ru, and fr locales to the RN SDK
- 5cf737b: Export `useFunkitRecentDepositsImpl` for fetching recent deposits without a `FunkitProvider`.

### Patch Changes

- 37829e2: Centralize deposit-side min/max amount math in `@funkit/connect-core`.
- 8fce60a: Centralize withdrawal-side amount validation and Swapped sell limits in `@funkit/connect-core`.
- 1584cf7: Prevent the checkout widget from crashing while minimum-transfer settings are loading.
- b7988cf: chore(connect-rn): migrate hook tests off deprecated react-test-renderer
- d876a2c: chore(connect-rn): remove deprecated react-test-renderer
- 145b401: Bank-transfer rows on the Add money screen now compose their limit + timing subtitle per locale.
- d671459: Remove the unused `AddressCopiedToast` export.
- 4ffb271: Translate payment method subtitles, network labels, and the deposit-address placeholder
- 3cb609b: Translate the deposit method picker, withdraw picker, and region-blocked screens
- b918a2d: Translate the transfer, QR code, and available chains screens
- 9b285ea: fix(connect-core): require https when validating Swapped embed origins.
- 2e08f43: Swipe-down-to-dismiss on the flow sheet now works only on the home screen; pushed screens (e.g. the Swapped embed) can no longer be dismissed by swiping.
- 04252e5: The flow sheet now tops out flush below the status bar instead of extending behind it.
- Updated dependencies [37829e2]
- Updated dependencies [8fce60a]
- Updated dependencies [1584cf7]
- Updated dependencies [ee44046]
- Updated dependencies [9b285ea]
  - @funkit/connect-core@2.3.0

## 3.1.0

### Minor Changes

- 407d80a: feat(connect-rn): expose recent-deposits and checkouts-by-user history/polling hooks

### Patch Changes

- 2a52f59: Leave a 50px gap below the payment-method list on the Add money / Withdraw sheets.
- b045af6: Fade the available-chains list edges when it overflows, hinting at off-screen rows.
- 409dca4: Match web for the payment-method rows: transparent theme-aware FOP icons, local
  vector marks for saved cards, and shared display-name titles.
- 7a07ff1: Show the real card limit on payment-method rows instead of a placeholder.
- 22822f3: Tighten the deposit QR chain-icon cluster so it occludes fewer modules and the icons keep clean padding.
- 6ca6ea0: Render Visa, JCB, and UnionPay logos on saved cards instead of a generic glyph.
- 38c309b: Keep a 16px gap above the home indicator on the deposit and available-chains bottom buttons.
- Updated dependencies [3a2e779]
- Updated dependencies [8ac239a]
  - @funkit/connect-core@2.2.0

## 3.0.0

### Major Changes

- 6fb8531: Rework the theme tokens to strictly mirror the Figma "Fun Variables" export.

  `FunkitTokens` is now a nested tree matching Figma's variable groups
  (`background` / `content` / `border` / `font` / `spacing` / `brand` / `button` /
  `opacity`) instead of the previous flat groups, and only reflects states that
  exist in the design (`default` / `pressed` / some `disabled`). The Restyle theme
  no longer exposes a flat `colors` bucket — colors are read from the nested
  groups via `useTheme()`.

  **Breaking changes / migration:**

  - **`FunkitColorTokens` is removed.** There is no flat color type or `colors`
    bucket. Read colors from the nested groups, e.g. `theme.background.modal`,
    `theme.content.elements.primary`, `theme.background.button.primary.default`.
  - **`FunkitTokens` is restructured** into the nested Figma groups. Code that
    built or spread `FunkitTokens` (e.g. `tokens.colors`, `tokens.radii`,
    `tokens.sizes`, `tokens.fonts`) must move to the new shape
    (`tokens.background`/`content`/`border.radius`/`button`/`font`, …).
  - **`fonts` → `font`**, now split into `body` / `header` with Figma style-name
    weights (`Regular` / `Medium`); `fontFamilyForWeight(family, styleName)`
    replaces the old `(fonts, weight)` signature. New exports: `ButtonSurface`,
    `FunkitFontStyleName`, `FONT_STYLE_CSS_WEIGHT`.
  - Components should set colors via `style` from `useTheme()` rather than Restyle
    color-string props (`backgroundColor="…"`), which no longer resolve.

### Minor Changes

- 5867170: Add `lightTheme(override?)` / `darkTheme(override?)` theme factories and the
  `FunkitTokensOverride` type, mirroring web's `@funkit/connect` theme API.
  Consumers build a brand theme by passing a deep-partial override of the nested
  `FunkitTokens` groups — deep-merged onto the built-in light/dark tokens — instead
  of assembling a full token object by hand.

### Patch Changes

- 20c27a4: Use the raw `externalUserId` as the Funkit `userId` for Mallard instead of pipe-joining it with the apiKey. Mallard supplies the wallet address as `externalUserId` and expects it passed through unprefixed.
- 30b1e1d: Fix the Add money list flashing crypto-only during Statsig init: `FunkitFlowProvider` now holds the skeleton on `useStatsigClient().isLoading`, since while Statsig initializes the `enableswappeddeposit` gate reads its `false` fallback (indistinguishable from a genuinely-off gate).
- a4a146d: `FunkitProvider`'s `debug` prop now defaults to `__DEV__`: React Native debug builds echo every log record to the console (Metro terminal) and run Statsig in the dev environment tier, matching the web SDK's `debug` semantics. Release builds are unchanged; pass `debug={false}` to force production behavior in a dev build.
- e0bcdb7: Resolve country-conditional Statsig variant configs against the user's IP country: new RN `useDynamicConfig` wrapper (mirroring the web SDK's) threads `alpha2` into core config resolution for all connect-rn call sites.
- dd503cd: Show the status icon on the unavailable / error message states, matching the
  geo-blocked screen.
- dad6cb2: Move the duplicated Moonpay→ipapi IP-country lookup into a shared `useUserIpInfo` hook in `@funkit/connect-core`; web and RN keep thin wrappers injecting their `logger`, `enabled` gate, and `staleTime`. Public API and web behavior unchanged.
- Updated dependencies [0755d6b]
- Updated dependencies [96f35d1]
- Updated dependencies [dad6cb2]
  - @funkit/connect-core@2.1.0

## 2.1.0

### Minor Changes

- 88c8874: Execute fiat-withdrawal orders through the host `WithdrawalClient` — a validated Swapped order runs the on-chain leg and reports `onWithdrawalSubmitted(orderId, txHash)`; user rejections stay interactive, failures surface a retryable error and `onWithdrawalError`
- 1afdd25: Handle the Swapped withdrawal lifecycle messages in the embed (fiat offramp, [5/8]): `webViewSwappedTransport` / `SwappedScreen` parse and relay `SWAPPED_NEW_WITHDRAWAL`, `SWAPPED_WITHDRAWAL_SUCCESSFUL`, and validated `SWAPPED_ORDER_DATA`. The WebView message origin gate is now fail-closed, validating against the last committed navigation URL when a build omits `nativeEvent.url`. Deposit behavior unchanged.
- 2509eaf: Wire the managed Swapped fiat-offramp flow ([6/8]): `useFunkitCheckout` gains `beginWithdrawal(config)`, and `FunkitFlowProvider` drives the payout-method list → Swapped WebView, capping the sell to `sourceUsdBalance` and blocking below Swapped's minimum. Exports the `WithdrawalFlowConfig` / `WithdrawalClient` contract types. On-chain execution lands in [7/8]; until then a validated order reaches the host via `onWithdrawalOrder`.
- 140835a: Add the withdrawal FOPs data layer (Swapped fiat offramp, [3/8]): the `WithdrawalFlowConfig` contract types, `useWithdrawalFops` (Statsig-gated payout-method fetch + balance→EUR sell cap), and `useFiatExchangeRates`. Data only — the screen and flow wiring land in later PRs.
- 0564bb8: Add `WithdrawMethodScreen` (Swapped fiat offramp, [4/8]) — the payout-method picker, a thin composition over `SelectMethodScreen` (bare-list layout) with terminal empty / balance-too-low states. Tested but not yet wired into the flow.

### Patch Changes

- 8211c26: feat(connect-rn): render AvailableChainsScreen as nested sheet with Got it button
- 916073b: Update CheckoutBlockedScreen to match Figma design: add "Add money" title, swap info icon for alert circle icon, add "View available regions" link text
- e5320cb: feat(connect-rn): render QrCodeScreen as nested bottom sheet with Done button and responsive padding
- d0c8554: fix(connect-rn): primary buttons follow the `button` radius token

  Primary action buttons (Copy/Share, Done, retry, "Got it") hardcoded a full-pill radius instead of reading the themeable `button` token, so brands could not square their buttons. They now use `borderRadius="button"`; the default token is 999, keeping the full-pill look for themes that don't override it.

- 89018b6: Split the internal `SwappedScreen` into deposit (`SwappedScreen`) and withdrawal (`SwappedWithdrawScreen`) components with per-mode message handling. No public API or user-facing behavior changes.

## 2.0.0

### Major Changes

- 640371e: Add an `exports` map (root entry only) and replace `export * from '@funkit/connect-core'` with the curated managed API plus the core types that appear in this package's public signatures (`CheckoutTokenTransferConfig`, `DynamicTargetAssetCandidate`).

  Breaking: deep `dist/**` imports no longer resolve, and the RN entry no longer re-exports the whole `@funkit/connect-core`. Import core symbols from `@funkit/connect-core` directly.

### Patch Changes

- b8a3f1e: Ship the full `dist` tree and `CHANGELOG.md` in the published tarball. `@funkit/connect-core` previously listed only `dist/index.js` in `files`, so any future code-split chunk (`dist/chunk-*.js`, emitted once a dynamic `import()` is added under `splitting: true`) would have been silently excluded from the package. Both packages now publish their changelog too.
- 89e29b3: Tag the Statsig user with `custom.sdkType` (`react-native` / `web`) so a config shared across SDKs can be scoped per-SDK via a per-customer targeting rule.
- a46364d: Rename the internal `AddMoneyScreen` to `SelectMethodScreen` ([2/8]) — it now backs both the deposit and withdrawal method lists, so the deposit-specific name no longer fits. Pure rename; no behavior or public-API change (`PaymentMethodOption` / `ReceiveTokenOption` keep their names).
- Updated dependencies [b2abbb5]
- Updated dependencies [b8a3f1e]
- Updated dependencies [4f0f4a0]
  - @funkit/connect-core@2.0.0

## 1.0.11

### Patch Changes

- d58690c: Remove dead vendored code: `StatsigProviderRN`, `useClientBootstrapInitRN`, and `ConsoleLogTransport`. These were unreferenced internally and never exported from the public barrel (Statsig RN bindings and logging transports are intentionally internal). The active Statsig path uses `useClientAsyncInitRN` + `StatsigClientRN`, and logging ships via `datadogHttpLogTransport`.
- d442c9b: Set a 60s staleTime on the internally-created fallback QueryClient to avoid refetching on every remount
- Updated dependencies [8ae9a55]
  - @funkit/connect-core@1.7.1

## 1.0.10

### Patch Changes

- Updated dependencies [6ae84b0]
- Updated dependencies [a074ecf]
  - @funkit/connect-core@1.7.0

## 1.0.9

### Patch Changes

- Updated dependencies [7636095]
  - @funkit/connect-core@1.6.2

## 1.0.8

### Patch Changes

- Updated dependencies [cac2d42]
- Updated dependencies [4b8c04b]
- Updated dependencies [79c92ec]
- Updated dependencies [16cc96f]
- Updated dependencies [4c446f9]
- Updated dependencies [d27111c]
  - @funkit/connect-core@1.6.1
  - @funkit/chains@2.1.3
  - @funkit/api-base@6.0.0

## 1.0.7

### Patch Changes

- Updated dependencies [ec71a28]
- Updated dependencies [2d5650d]
  - @funkit/chains@2.1.2
  - @funkit/connect-core@1.6.0

## 1.0.6

### Patch Changes

- 99812aa: feat(withdrawal): resolve token addresses from config, drop the per-symbol API lookup

  The withdrawal screen no longer resolves token addresses with a `getAssetErc20ByChainAndSymbol` round-trip; the addresses already live in config.

  - `@funkit/connect-core`: `resolveTokenTransferConfig` adds `addressBySymbolByChainId` (`chainId → symbol/alias → original-case address`), preserving casing (checksummed EVM, base58 Solana/Tron).
  - `@funkit/connect`: `WithdrawalContent` reads the destination address from that map and the Lighter Secure source address from a hardcoded map in `LighterWithdrawal.tsx`, pricing both via `useAssetAddressPrice`. Removes all `useAssetSymbolPrice` usage from the withdrawal flow (hooks left for a follow-up cleanup).
  - `@funkit/connect-rn`: test-only fixture update.

- Updated dependencies [a395c4c]
- Updated dependencies [c3d2458]
- Updated dependencies [ce05191]
- Updated dependencies [b8a7aaa]
- Updated dependencies [202c15b]
- Updated dependencies [99812aa]
  - @funkit/api-base@5.2.0
  - @funkit/connect-core@1.5.0

## 1.0.5

### Patch Changes

- Updated dependencies [394a46c]
  - @funkit/api-base@5.1.0
  - @funkit/connect-core@1.4.1

## 1.0.4

### Patch Changes

- Updated dependencies [86d2a31]
- Updated dependencies [b8c578e]
  - @funkit/connect-core@1.4.0

## 1.0.3

### Patch Changes

- ae17d2a: fix(connect-rn): move "Address copied" toast 80px from top of screen
- bb08629: docs: rewrite the `@funkit/connect-rn` README as a developer guide (architecture, peer dependencies, Expo Go compatibility, local build/test workflow) and repoint the in-code doc comments (`connect-rn`/`connect-core` `index.ts`, `LogTransport`) from the retired `docs/connect-rn-architecture.md` design doc to it. Client/integration usage of the SDK is maintained in Notion. Comment/doc only — no API or behavior changes.
- Updated dependencies [fc74160]
- Updated dependencies [bb08629]
- Updated dependencies [639d776]
- Updated dependencies [23ec218]
- Updated dependencies [09452ce]
- Updated dependencies [cd57fba]
  - @funkit/api-base@5.0.0
  - @funkit/connect-core@1.3.0

## 1.0.2

### Patch Changes

- Updated dependencies [f64e821]
  - @funkit/connect-core@1.2.0

## 1.0.1

### Patch Changes

- e98d6c6: fix(connect-rn): uniform 6px spacing between deposit address card elements
- Updated dependencies [5d5d4f5]
  - @funkit/connect-core@1.1.1

## 1.0.0

### Major Changes

- 304fbdd: Derive Add money payment methods + crypto source icons internally; rename `DepositFlowConfig.selectedChainId` to `sourceChain` (string).

### Minor Changes

- cb5d3c4: Render the managed deposit flow in a `@gorhom/bottom-sheet`, sized to its content. `@gorhom/bottom-sheet`, `react-native-gesture-handler`, and `react-native-reanimated` are now **required** peer deps, and the app root must be wrapped in `<GestureHandlerRootView>`.
- 80f3acd: Add geoblocked checkout screen to the deposit flow
- 219a880: Add the `ChooseChainScreen` (Figma: Fun Mobile / Transfer Crypto chain list) — shown when the user taps "Change" on the Transfer screen. A themed bottom-sheet surface with back + centered title + a list of chains (EVM Chains, Solana, Tron, Bitcoin, …). Data-driven via `chains: ChainOption[]` + `onSelectChain`; chain icons are host-supplied (`icon`), keeping the package `react-native-svg`-free. Exported as public API. Navigation (Change → this screen → back with the chosen chain) is wired by the host via the existing `onChangeNetwork` / `onSelectChain` callbacks.
- ea84a30: Default the connect-rn theme to the **system** UI font (SF on iOS, Roboto on Android) instead of Inter, so the package renders correctly with no font assets registered by the host. connect-rn is now fully font-agnostic — it ships no typeface and no font preset; hosts that want a custom font (e.g. Inter) define their own `fonts` tokens and register the matching files.

  BREAKING: the `FUNKIT_REQUIRED_FONTS` export is removed — connect-rn no longer requires any host-registered fonts by default. Migration: to keep rendering in Inter, define your own font tokens in the host app and build your theme with them:

  ```ts
  import {
    type FunkitFontTokens,
    fontFamilyForWeight,
    lightTokens,
    toRestyleTheme,
  } from "@funkit/connect-rn";

  const interFonts: FunkitFontTokens = {
    family: "Inter",
    weights: {
      base: { familySuffix: "Regular", cssWeight: "400" },
      medium: { familySuffix: "Medium", cssWeight: "500" },
    },
  };

  const theme = toRestyleTheme({ ...lightTokens, fonts: interFonts });
  // register assets under fontFamilyForWeight(interFonts, 'base'|'medium')
  // ('Inter-Regular' / 'Inter-Medium') — the replacement for FUNKIT_REQUIRED_FONTS
  ```

- 827fece: Add fluid animations across the deposit flow (bottom-sheet resize, deposit-to dropdown, and network selector) plus an animated address-copied toast exposed as the new `AddressCopiedToast` component.
- 8ea4b32: Wire the transfer screens into a managed flow behind a web-SDK-style API. `useFunkitCheckout()` now returns `beginDeposit(config)` (mirroring `@funkit/connect`'s `useFunkitCheckout`/`beginCheckout`): it opens the SDK's own bottom-sheet modal and runs the flow — Add money → Transfer/UDA → Choose chain / Supported tokens / QR — so host apps render no screens themselves. The five screens, the Statsig RN bindings, logging, identity context, and transfer hooks are all internal now; the public surface is `FunkitProvider` + `useFunkitCheckout` (+ the `DepositFlowConfig` item shapes). For this release the host supplies the flow's data via `DepositFlowConfig`; sourcing it internally (api-base / chains / Statsig / `useTransferInit`) and CDN icons are follow-ups (see TODOs).
- 2e663b9: Render Inter correctly by selecting weights through per-cut font families (`FUNKIT_REQUIRED_FONTS` is now `{ base: 'Inter-Regular', medium: 'Inter-Medium' }` — register each name) and align body text line heights with Figma.
- 219a880: Add the `QrCodeScreen` (Figma: Fun Mobile / qr-code-modal) — the full-screen deposit QR view reached from the Transfer screen's QR button. A themed surface with a close action, the framed QR code, a "Scan to deposit … / use it only for supported chains" caption (with an optional tappable link), and a share button. The scannable QR is host-supplied via the `qrCode` slot (e.g. `react-native-qrcode-svg`), so the package stays `react-native-svg`-free. Exported as public API.
- 649a519: Add the `SupportedTokensScreen` (Figma: Fun Mobile / Supported tokens) — shown from the Transfer screen's chain-name / info affordance. Back + title, a search field, horizontally-scrolling chain filter chips (All / Ethereum / BSC / …), and the token list (icon + symbol + chain). Controlled/presentational: the search value, selected chip, and the (host-filtered) `tokens` list come from props; token icons are host-supplied, keeping the package `react-native-svg`-free. The search input's colors follow the active theme via Restyle's `useTheme`. Exported as public API.
- 827fece: Refine the deposit flow screens and add an optional `overflowMode` to `SourceTokenCluster` and `initialDropdownOpen` to `AddMoneyScreen`.
- dd362c9: Redesign the deposit-flow screens (Add money, Transfer Crypto, QR code) and add an "Available chains" screen — the selected network's chains with per-chain minimum-deposit amounts (from `mintokentransfervalue`, mirroring web). Wire copy/share (clipboard via `expo-clipboard`, falling back to `@react-native-clipboard/clipboard`) and add an on-device Storybook harness. Pin react to 19.2.3 to match the RN 0.85 renderer.

  The Transfer-screen network switcher is now derived internally from the curated chain list (`tokentransferconfig`) instead of being host-configured: the `depositChains` field was removed from `DepositFlowConfig`. Every EVM chain collapses into one "EVM Chains" segment and each non-EVM chain (Solana / Tron / Bitcoin) is its own segment; `selectedChainId` still picks the initially-selected network.

### Patch Changes

- 15d1159: Fix a gray rectangular border around the deposit-address card on Android. The card had an `elevation` shadow but no opaque background, so Android couldn't clip the shadow to the card's rounded corners. Giving it a `bgModal` background clips the elevation shadow correctly.
- 57e49a8: Align the modal close buttons across the Transfer, QR, and Available chains screens (24px inset, 56px touch target).
- f288caf: Paint the deposit-flow bottom sheet's surface (matching each screen's `bgModal` + rounded top) and extend it below the content so dragging the sheet above its content height reveals more surface instead of the backdrop — the elastic over-drag no longer exposes the sheet's bottom edge.
- 827fece: Center each chain logo within its circular ring in `SourceTokenCluster` and `AvailableChainsScreen` so the icon border no longer offsets the logo by 1px.
- be6e6cf: Add a `copyToClipboard` override on FunkitProvider so hosts can supply their own clipboard (e.g. expo-clipboard in Expo Go); the default still lazily loads @react-native-clipboard/clipboard
- a9f9769: Hold the Add money loading state until the geo-eligibility check and the deposit-address/QR generation both resolve, so the deposit UI no longer flashes before a blocked user is routed away or before the address is ready.
- f4a74f1: Fix off-center chain logos with a visible gray ring in the Transfer Crypto network selector. The logos were wrapped in a bordered box the same size as the icon, whose 1px inset shrank and offset the logo and exposed the border as a ring. `FunIcon` already clips each logo to a centered circle, so the wrapping rings are removed and the logos render full-bleed, matching Figma.
- ea4b6af: Match the source-token overflow chips to Figma: a centered "+" icon on the Add money row and a circular "+N" count chip on Transfer (previously a mis-centered text "+" in an oval).
- 9fc8470: Show the full deposit address with a Copy button below the QR on the QR-code screen
- 4a0aff8: Add a white quiet-zone backing behind the QR chain-logo cluster so the QR no longer bleeds through
- 827fece: Render the deposit QR with a fixed dark color so it stays scannable (dark-on-light) in dark mode.
- beb3c84: Add the shared `useSwappedDefaultCurrencyQuery` hook to `@funkit/connect-core` and use it in `@funkit/connect-rn` to resolve the Swapped deposit flow's default fiat currency from the user's region instead of hardcoding USD.
- 40b8f2d: Show the minimum deposit on the Transfer screen for single-chain networks (Solana / Tron / Bitcoin) instead of a non-navigable chain-logo chevron.
- af9e919: Open the keyboard automatically in the Swapped deposit flow and slide the bottom sheet above it instead of shrinking.
- d5f375e: Fix copy-address toast blocking all sheet button taps for ~2s — replace the native `<Modal>` (which captures all touches even when transparent) with an absolutely-positioned `View` rendered above the gorhom sheet via sibling z-ordering.
- 7eefd13: Show a back arrow (not a close X) on the Transfer Crypto screen's leading button, since it returns to the Add money screen.
- 3fb075a: feat(connect-rn): update styles for transfer crypto, add money and qr code screens to match figma designs
- 55c21d3: fix(connect-rn): expand swapped theme variables to fix continue button text color
- Updated dependencies [827fece]
- Updated dependencies [beb3c84]
- Updated dependencies [79f4b01]
- Updated dependencies [79f4b01]
- Updated dependencies [79f4b01]
- Updated dependencies [c90915d]
- Updated dependencies [389a29d]
- Updated dependencies [32d1cc6]
  - @funkit/connect-core@1.1.0
  - @funkit/chains@2.1.1

## 0.2.0-next.0

### Minor Changes

- 67ce912: Show real, fetched payment methods on the Add money screen, replacing the
  hardcoded list. When Swapped is enabled (`enableswappeddeposit`), the screen
  renders a single flat list (no Crypto/Cash tabs — mobile has no such design):
  the user's saved forms of payment on top, then the **Crypto** (Transfer Crypto)
  row, then the generic Swapped FOPs (Card / Apple Pay / Revolut Pay / Bank
  Transfer), matching the Figma order. FOP rows come from `useFops` via the pure
  `toFopRows` (CDN icon + `"<limit> limit"` subtitle, with `" · 1-2 days"` for
  bank transfers). When Swapped is off, the screen keeps the host's configured
  methods.

  Selecting a FOP is a no-op stub pending the Swapped WebView (handed off there
  once it lands). Connect Exchange (Bluvo) and virtual-bank/SEPA are out of this
  V1.

- b0526d6: Add the `AddMoneyScreen` funding-source picker (Figma: Fun Mobile / Add money) — the payment-method selection step that precedes the Transfer/UDA screen. A themed bottom-sheet surface (grabber + centered title + scrollable list of methods) built from the connect-rn Restyle primitives, so it tracks the active light/dark scheme. Data-driven via `methods: PaymentMethodOption[]` + `onSelectMethod`; brand icons are host-supplied (`icon` / `trailing`), keeping the package asset- and `react-native-svg`-free. Exported as part of the public API (screens are the consumer surface).
- fa32433: Reflect the selected chain on the Transfer screen. Picking a different chain on the choose-chain screen now updates the network **label**, the network **icon**, and the generated **deposit address + QR** on the Transfer screen — previously they stayed fixed on the initial (EVM) chain. The flow tracks the selected `ChainOption` and derives the label/icon from it (falling back to the config defaults), and the selected chain's `chainId` drives which generated address + QR type is shown. The `with-expo` demo now sets `chainId` on every chain (EVM/Solana/Tron/Bitcoin) so switching actually changes the address.
- 169af7e: Add the `ChooseChainScreen` (Figma: Fun Mobile / Transfer Crypto chain list) — shown when the user taps "Change" on the Transfer screen. A themed bottom-sheet surface with back + centered title + a list of chains (EVM Chains, Solana, Tron, Bitcoin, …). Data-driven via `chains: ChainOption[]` + `onSelectChain`; chain icons are host-supplied (`icon`), keeping the package `react-native-svg`-free. Exported as public API. Navigation (Change → this screen → back with the chosen chain) is wired by the host via the existing `onChangeNetwork` / `onSelectChain` callbacks.
- 95fe691: Make the Transfer screen's copy and share buttons actually work. The buttons showed a "Copied!" confirmation but never wrote to the clipboard, because the managed flow didn't pass `onCopyAddress`/`onShareAddress`. The flow now copies the **full** deposit address (the screen only shows it truncated) via `@react-native-clipboard/clipboard` and shares it via React Native's built-in `Share`. Adds `@react-native-clipboard/clipboard >=1.13.0` as a peer dependency.

  The clipboard peer is loaded **lazily and guarded**: a host that hasn't linked the native module (an un-rebuilt dev client, Expo Go, or a consumer that didn't install the peer) degrades to a no-op + warning instead of crashing at startup with the `'RNCClipboard' could not be found` TurboModule invariant.

- c21ded0: Fix Datadog logging never reaching the transport. The `FunLogger` queues every record until `logger.configure(...)` is called, and connect-rn never called it — so nothing was ever shipped to Datadog. `FunkitProvider` now configures the logger with the `config.apiKey` + debug flag (mirroring the web SDK) and sets user context, so queued logs flush and records emit to the Datadog HTTP transport in production. The SDK version is inlined at build time (`src/version.ts`) and sent as the log `sdkVersion`.

  Also changes the default Datadog `service` tag from `connect-rn-sdk` to `connect-rn`.

- 57d7a5c: Generate the deposit address and QR code inside the managed deposit flow. Given a `checkoutConfig` (target chain + asset) on the flow config and identity on `<FunkitProvider>`, the flow now resolves the Universal Deposit Address and EIP-681 QR URI via the transfer hooks and renders the QR with `react-native-qrcode-svg` — no longer host-supplied.

  - `<FunkitProvider>` gains `config` (`{ apiKey, externalUserId? }`, mirroring the identity-relevant subset of the web SDK's `funkitConfig`), `walletAddress` (the connected address — web reads this from wagmi; RN has no wallet provider so the host passes it), and an optional `queryClient` (defaults to an internal one). It now mounts `QueryClientProvider` + the identity context internally, so transfer queries run under a single provider. `userId` is resolved web-style (`apiKey|externalUserId`, else the wallet address).
  - `DepositFlowConfig`: adds `checkoutConfig`, `selectedChainId`, and `dynamicRoutingId`; `depositAddress` and `qrCode` become optional host overrides/fallbacks (shown while generation loads or when no identity is configured). The displayed address is truncated by the flow.
  - `ChainOption` gains `chainId` — picking a chain on the choose-chain screen now updates the active chain so the generated address + QR match the selected network.
  - Adds `react-native-qrcode-svg >=6.3.0` as a peer dependency (renders via the `react-native-svg` peer already added for CDN icons).

- 399eede: Wire the transfer screens into a managed flow behind a web-SDK-style API. `useFunkitCheckout()` now returns `beginDeposit(config)` (mirroring `@funkit/connect`'s `useFunkitCheckout`/`beginCheckout`): it opens the SDK's own bottom-sheet modal and runs the flow — Add money → Transfer/UDA → Choose chain / Supported tokens / QR — so host apps render no screens themselves. The five screens, the Statsig RN bindings, logging, identity context, and transfer hooks are all internal now; the public surface is `FunkitProvider` + `useFunkitCheckout` (+ the `DepositFlowConfig` item shapes). For this release the host supplies the flow's data via `DepositFlowConfig`; sourcing it internally (api-base / chains / Statsig / `useTransferInit`) and CDN icons are follow-ups (see TODOs).
- 0cdbc22: Add `useFops` + `toFopRows` for fetching Swapped forms of payment (Card / Apple
  Pay / Google Pay / Bank Transfer) — a thin RN port of web's `useFops` (`getFops`).
  Identity comes from `useFunkitIdentity`; the deposit recipient is derived from
  `useTransferInit` + the core `getDepositAddressForChain`. `toFopRows` is the pure
  mapping to display rows (label + CDN icon + `"<limit> limit • <time>"` subtitle,
  coming-soon FOPs disabled).

  Adaptations vs. web: **no geo-fencing** — the country code and `useFunkitUserIp`
  gating are dropped (`countryCode` is optional on `GetFopsParams`), so FOPs are
  fetched regardless of region. The Swapped theme query params, EUR min-amount,
  saved-currency lookup, and exchange-rate-based limits are deferred (limits fall
  back to the default). These are internal — wired into the Add money cash tab in a
  follow-up.

- b86fed9: Resolve the user's real country for the Swapped cash methods. Adds `useUserIpInfo`
  — a React Native port of web's hook that resolves the user's country (ISO
  alpha-2) + region from their IP via Moonpay's IP endpoint (primary) with an
  ipapi.co fallback (plain `fetch`, no native modules). `useFops` now sends this
  real country to `/fops` instead of the hardcoded default, so Swapped lists the
  correct region's payment methods; the default is kept only as a fallback while
  the lookup is in flight or if it fails. Geo-lookup failures log at WARN (the
  flow degrades gracefully).

  Per-region geoblocking (comparing the country against the `blockedcountries`
  Statsig config and disabling methods for blocked regions, like web's
  `isUserGeoblocked`) is the remaining follow-up.

- b40be1c: Fix chain logos that were missing or mis-positioned (e.g. Tron invisible, Solana/Bitcoin squashed into a corner). `FunIcon` previously injected a fixed `viewBox="0 0 28 28"` onto every CDN SVG, which clobbered the viewBox that some logos already ship (Solana 16×16, Tron `138.8 49.5 522 500.2`) — pushing their artwork off-screen or into a corner. `FunIcon` now fetches each SVG and **synthesizes a viewBox only when one is missing** (derived from its width/height), never overriding an existing one, then renders via `SvgXml`. Results are cached per URL.
- 108b301: Add the React Native identity context and thin token-transfer hooks. `FunkitIdentity` (`{ apiKey, userId, walletAddress, loginType }`) is supplied by the host via `FunkitIdentityProvider`/`useFunkitIdentity` (RN has no wagmi). `useTransferInit` composes the core `getCheckoutTokenTransferParams` helper with `@funkit/api-base`'s `initializeCheckoutTokenTransferAddress` in a `useQuery`; `useUDAParams` resolves UDA config from the `uda_params` dynamic config; `useTokenTransfer` derives the deposit address, QR URI, and min-transfer value (default slippage). All web/customer branches (Lighter main account, Polymarket target override, geo/post-action gating, per-customer slippage matrix, i18n, fiat) are intentionally dropped. Adds `@tanstack/react-query` (`>=5`) as a peer dependency. These are internal (not part of the public API), to be wired through `FunkitProvider` once the Transfer screen lands.
- c49f5ba: Add React Native logging transports for the core `FunLogger`. `DatadogHttpLogTransport` ships records to Datadog over raw `fetch` (NOT the Datadog SDK — `@datadog/mobile-react-native` requires native modules), batching and flushing fire-and-forget on a timer, swallowing network errors, and authenticating with the public client token. `ConsoleLogTransport` is a dependency-free dev sink. A `FunLogger` singleton wired with the HTTP transport mirrors `@funkit/connect`'s web `logger`. No new native dependencies — only `fetch`. These are internal (not part of the public API), to be wired through `FunkitProvider` once identity/config lands.
- 2eb5610: Add the `QrCodeScreen` (Figma: Fun Mobile / qr-code-modal) — the full-screen deposit QR view reached from the Transfer screen's QR button. A themed surface with a close action, the framed QR code, a "Scan to deposit … / use it only for supported chains" caption (with an optional tappable link), and a share button. The scannable QR is host-supplied via the `qrCode` slot (e.g. `react-native-qrcode-svg`), so the package stays `react-native-svg`-free. Exported as public API.
- ea13570: Scaffold the `@funkit/connect-rn` package — React Native bindings that currently re-export `@funkit/connect-core`. RN platform halves land in later releases.
- 57d891c: Wire Statsig into `FunkitProvider` for React Native. Vendored the RN bindings from `@statsig/react-native-bindings` (+ `react-native-core`) with `react-native-device-info` removed — the only native module required is `@react-native-async-storage/async-storage` (new required peer dependency; AsyncStorage-backed persistence, device-info fields left `undefined`). `FunkitProvider` now mounts an internal `FunkitStatsigProvider` (same Fun client key + custom proxy as `@funkit/connect`, client created via the RN bindings) and accepts a `debug` prop (dev environment tier + verbose logging). The Statsig bindings stay internal (not part of the public API, mirroring `@funkit/connect`); all Statsig symbols resolve from the single `@statsig/react-bindings` peer so there's one client-core copy.
- 6ebf77e: Render the real, **curated** supported-deposit-tokens list (was placeholder, and an earlier attempt wrongly used the raw allow-list — meme coins and all). `useSupportedTokens` now resolves the list the same way the web SDK does: the Statsig `tokentransferconfig` (curated chains + asset addresses), filtered by `disabletokentransferchainsandassets`, merged with `@funkit/api-base`'s `getSupportedAssets` metadata via the shared `resolveTokenTransferConfig` (connect-core). The managed flow feeds this into the supported-tokens screen; `DepositFlowConfig.supportedTokens` / `tokenChainFilters` remain optional host overrides. `SupportedToken` gains `chainId` + `address` (for filtering/selection). Search, chain-filter, and selection interactivity follow separately.
- 024551c: Wire up the supported-tokens screen interactivity. Search (by symbol or chain name) and the chain-filter chips now filter the list (`filterSupportedTokens`), and selecting a token re-targets the transfer to that token's chain — the UDA deposit address is per-chain, so the Transfer screen's network label/icon and the generated address/QR update to the selected token's chain (reusing the choose-chain selection). The screen's search/filter/select were previously presentational.
- f6d33e6: Add the `SupportedTokensScreen` (Figma: Fun Mobile / Supported tokens) — shown from the Transfer screen's chain-name / info affordance. Back + title, a search field, horizontally-scrolling chain filter chips (All / Ethereum / BSC / …), and the token list (icon + symbol + chain). Controlled/presentational: the search value, selected chip, and the (host-filtered) `tokens` list come from props; token icons are host-supplied, keeping the package `react-native-svg`-free. The search input's colors follow the active theme via Restyle's `useTheme`. Exported as public API.
- 9f85d13: Render chain and token logos from Fun's icon CDN inside the managed deposit flow. Adds `FunIcon` (picks `react-native-svg`'s `SvgUri` for `.svg` chain logos vs `Image` for `.png` token logos — RN's built-in `Image` can't render SVG) and `ChainClusterIcon` (a single logo, or a 2×2 cluster for multi-chain groups). The flow now derives the network icon, crypto payment-method icon, choose-chain icons, and supported-token icons from config when the host doesn't supply its own: `DepositFlowConfig.networkIconChains?` and `ChainOption.iconKeys?` (CDN chain keys, e.g. `['ethereum', 'polygon']`); token icons are resolved from each token's symbol. Adds `react-native-svg >=15.0.0` as a peer dependency.
- 1b90155: Open the Swapped embedded payment flow in a WebView when a cash method is
  selected on Add money. Picking a Card / Apple Pay / Revolut Pay / Bank Transfer
  row now navigates to a `SwappedScreen` that loads the FOP's `embeddedFlowUrl`.

  - `createWebViewSwappedTransport` + `SWAPPED_WEBVIEW_INJECTED_JS` +
    `handleWebViewMessage` implement the shared `SwappedTransport` contract over a
    `WebView` (the React Native counterpart of web's iframe transport): the
    injected bridge redirects the embed's `postMessage` to the native channel, and
    inbound messages are JSON-parsed and **origin-validated** (`isSwappedOrigin`)
    before reaching handlers.
  - `SwappedScreen` maps the embed's messages to flow navigation (mirroring web's
    `SwappedIframeController`): back / new-deposit → back, close → close flow,
    transaction-successful → success; errors log at WARN.

  Adds `react-native-webview` (`>=13`) as a peer dependency. Sending theme/method
  to the embed on `SWAPPED_READY` (web's `useSwappedSession`) and a host success
  callback are follow-ups.

- 7eef6e3: Add the connect-rn Shopify Restyle theme: local light/dark design tokens (from the Fun Mobile Figma variables), a `toRestyleTheme` adapter, and a `FunkitProvider` that accepts `themes` + an optional `colorScheme` prop (falls back to the system Appearance when unset). Exposes `useFunkitColorScheme()` with a manual `toggleColorScheme()` (a no-op while a `colorScheme` prop is set), plus `useColorScheme` and typed `Box` / `Text` primitives. The theme is owned entirely by connect-rn (not shared with connect-core).
- 6b87806: Add the `TransferCryptoScreen` (Figma: Fun Mobile / Transfer Crypto) — the Universal-Deposit-Address screen reached after picking Crypto on `AddMoneyScreen`. A themed bottom-sheet surface with a top bar (back / title / QR), a network selector row (chain cluster + label + Change), and the deposit-address card with copy/share circular buttons. Built from the connect-rn Restyle primitives so it tracks the active light/dark scheme. UI only — data (`depositAddress`, `networkLabel`) and actions (`onBack`, `onShowQrCode`, `onChangeNetwork`, `onCopyAddress`, `onShareAddress`) are host-supplied; the chain-cluster icon is a host slot (`networkIcon`) and back/QR/copy/share use built-in svg-free glyphs, so the package needs no `react-native-svg`. Exported as public API.

### Patch Changes

- 4428292: Gate non-EVM deposit chains on a minted address, shared between web and RN.
  Adds `isTransferChainEnabled(chainId, transferInit, isWithdrawal?)` to
  `@funkit/connect-core` — EVM chains are always enabled; Solana/Bitcoin/Tron are
  enabled only once the deposit-init response carries their address; withdrawals
  enable every chain. `@funkit/connect`'s `useEnabledTokenTransferChainTokens` now
  delegates to this helper instead of its inline solana/bitcoin/tron checks
  (behavior-preserving — the web suite passes unchanged).

  `@funkit/connect-rn`'s supported-tokens list previously showed every curated
  chain regardless of whether its deposit address existed. `useTokenTransfer` now
  surfaces `transferInit`, and `useSupportedTokens({ transferInit })` filters both
  the token rows and the chain-filter chips through the shared helper — so RN
  hides Solana/Bitcoin/Tron until their address is minted, matching web.

- 7926a68: Fix customer-gated Statsig configs always resolving to their default in React
  Native. `FunkitStatsigProvider` initialized the client with an empty user `{}`,
  so configs gated on the customer (e.g. `enableswappeddeposit`) never matched and
  fell back to `false` for every apiKey. The provider now builds the Statsig user
  with `{ userID, customIDs: { apiKey } }` from the resolved identity — mirroring
  web's `useTrack.updateUserAsync` — so customer-scoped configs evaluate correctly
  (this is what lets the Swapped cash methods appear for keys that have them on).
- abc0c49: Make the transfer screen's network selector open the Supported tokens screen. The chain-cluster + label + a new ⓘ info affordance is now its own tap target (`onShowSupportedTokens`), separate from "Change" (`onChangeNetwork`) — matching the Figma. The managed flow wires it to navigate to the supported-tokens screen (previously only reachable from the QR screen's "supported chains" link).
- 72b959f: Fix supported-tokens icons not matching the web SDK. The deposit-token list now
  resolves each icon exactly like web's token-transfer screen
  (`getTokenIconUrl` → `getLocalTokenIconUrl` in
  `packages/connect/src/components/Dropdown/TokenDropdown.tsx`): **purely by
  symbol** — `ASSET_LOGO_SRCS[symbol]` (a map duplicated from `@funkit/fun-relay`,
  which has no RN-safe subpath export), falling back to
  `https://sdk-cdn.fun.xyz/images/<symbol>.svg`.

  Previously the row used the `/assets/supported` API metadata `logo` first (the
  wallet-holdings resolver, `asset.logo || getAssetLogoSrc`), so tokens whose API
  `logo` is a third-party URL rendered a different icon than web — e.g. TRUMP
  showed an Arweave URL in RN but `trump.png` on web. The API `logo` is no longer
  consulted on this screen, and the dead `logo` plumbing (`SupportedToken.logo`)
  is removed.

  `FunIcon` also gains a `fallbackUri` prop; the token row passes the dollar-circle
  (`FALLBACK_ASSET_LOGO`) so a dead CDN URL degrades to the same icon web shows
  via `AsyncImage`'s `fallbackSrc`, instead of a blank placeholder.

- 611deff: `TransferCryptoScreen`: add an in-screen "copied" confirmation. Pressing copy now shows a transient confirmation (the label flips to "Copied!" and the icon to a check) for `copiedFeedbackMs` (default 1800ms) while still invoking `onCopyAddress` for the host's clipboard write.
- Updated dependencies [4428292]
- Updated dependencies [383c4b7]
  - @funkit/connect-core@0.4.0-next.0
