FunkitConnectCore
@funkit/connect-core holds the headless, platform-agnostic business logic shared by
@funkit/connect (web) and @funkit/connect-rn (React Native): domains,
utils, hooks, Statsig wrappers, theme factories, and the FunLogger class.
Invariant: no DOM, vanilla-extract, or wagmi imports anywhere under src/**. Platform
concerns (rendering, transports, storage) are supplied by the consuming package through the
contracts defined here. See ../connect-rn/README.md for the core/web/RN architecture.
Solana
@funkit/connect-core/clients/solana runs Solana withdrawals, deposits and Convert
through a FunkitSolanaAdapter the host builds with @funkit/solana-kit (Kit Rpc
and TransactionSigner) or @funkit/solana-web3 (web3.js Connection and signer
callbacks). Core imports no Solana library. It calls adapter.createRelayWallet()
only when an execution starts, and logs solanaSigner:resolved with the adapter's
address, engine and signing path.
Fiat routing tables
useFiatQuote takes a required routingTableSessionId and quotes through the
routing table unless unstable_routingOverrides is set.
The table sends the corridor and a methods array in its JSON body. An optional
getRoutingProviderInputs callback supplies client-held provider inputs at request time;
React Native reads MoonPay's access token once the buyer's connection is active. Tokens
are omitted when unavailable and never enter query keys, request logs (including debug
logs) or cached errors.
After provider authentication, the existing table invalidation marks the table stale,
so its next fetch reads fresh credentials.
Host provider overrides always use POST /fiat/quote.
A listed provider whose own checkout the client runs is handed off, never quoted there,
and MoonPay guest, which has no shared checkout, is dropped while its flow is off.
That endpoint persists the host allowlist through backend KYC rediscovery; the
routing quote endpoint only accepts the provider selected for the current quote.
Moving pinned flows onto the table requires an API contract that preserves the
host allowlist separately from that selection.
The client does not throttle table requests; the server rate limits them per buyer.
Try again and a session remount fetch at once, and a refresh joins a request in flight.
Provider exhaustion refreshes the table once per route and amount, and once per interval.
A table's lifetime is read from expiresAt relative to its arrival, so a wrong phone
clock does not expire it early; it is held for at least 17 seconds and at most 60. The
replacement is requested 5 seconds before that deadline, and a table stops supplying
providers and bounds at the deadline. A failed refresh keeps the held table until then.
A failed table request is retried once (a 429 after 12 seconds), then surfaced as a quote
error; unpinned table flows do not fall back to the legacy endpoint.