--- name: setup-react-native-app description: Scaffold a React Native (Expo) app with Phantom React Native SDK for mobile wallet integration, including polyfills and deep linking --- # Scaffold React Native App with Phantom Connect ## When to use - User asks to set up a React Native app with Phantom Connect - User wants to create a mobile wallet integration - User wants to scaffold a Phantom integration for iOS/Android ## Workflow ### Step 1: Install Dependencies ```bash npx expo install @phantom/react-native-sdk react-native-get-random-values @expo/browser expo-web-browser expo-crypto ``` ### Step 2: Add the Polyfill (CRITICAL — Must Be First Import) In your app's entry file (e.g. `App.tsx` or `index.ts`), add this as the **very first import**: ```tsx import "react-native-get-random-values"; // MUST be the first import import { PhantomProvider } from "@phantom/react-native-sdk"; // ... other imports ``` **This is non-negotiable.** The polyfill must execute before any other code that uses crypto. ### Step 3: Configure `app.json` Add the custom URL scheme and required plugins: ```json { "expo": { "scheme": "your-app-scheme", "plugins": [ [ "expo-web-browser" ] ] } } ``` ### Step 4: Wrap App in PhantomProvider ```tsx import "react-native-get-random-values"; import { PhantomProvider } from "@phantom/react-native-sdk"; export default function App() { return ( ); } ``` **Mobile-specific config fields:** - `scheme` — Your app's custom URL scheme, must match `app.json`. - `redirectUrl` — Deep link URL using your custom scheme for OAuth callbacks. ### Step 5: Use Hooks (Same as React SDK) The hooks API is identical to `@phantom/react-sdk`: ```tsx import { useConnect, useAccounts, useDisconnect, useSolana, } from "@phantom/react-native-sdk"; function WalletScreen() { const { connect, isConnected } = useConnect(); const { accounts } = useAccounts(); const { disconnect } = useDisconnect(); const handleConnect = async () => { try { await connect(); } catch (error) { console.error("Connection failed:", error); } }; if (!isConnected) { return