sendaifun/phantom-connect
> Build wallet-connected applications with the Phantom Connect SDK for Solana. Use when integrating Phantom wallets into React, React Native, or vanilla JS/TS apps — including wallet connection, social login (Google/Apple), transaction signing, message signing, token-gated access, crypto payments, and NFT minting. Covers @phantom/react-sdk, @phantom/react-native-sdk, and @phantom/browser-sdk.
npx skills add https://github.com/sendaifun/skills --skill phantom-connect
Build wallet-connected Solana applications with the Phantom Connect SDK ecosystem.
| Platform | SDK | Package |
|----------|-----|---------|
| React web apps | React SDK | @phantom/react-sdk |
| React Native / Expo | React Native SDK | @phantom/react-native-sdk |
| Vanilla JS / Vue / Angular | Browser SDK | @phantom/browser-sdk |
| Provider | Description | Requires appId |
|----------|-------------|----------------|
| "injected" | Phantom browser extension | No |
| "google" | Google OAuth (embedded wallet) | Yes |
| "apple" | Apple ID (embedded wallet) | Yes |
signAndSendTransaction — signTransaction and signAllTransactions are NOT supported for embedded walletsLAMPORTS_PER_SOL from @solana/web3.js for amount conversion — never hardcode 1000000000isConnected before signing — verify wallet connection before any operationreact-native-get-random-values must be the FIRST import — before any other importsAddressType from @phantom/browser-sdk only10. Embedded wallet spending limit: $1,000 USD per day per app per user
11. Social login sessions persist 7 days from last auth event — handle expiration gracefully
import { PhantomProvider, useModal, usePhantom, darkTheme } from "@phantom/react-sdk";
import { AddressType } from "@phantom/browser-sdk";
function App() {
return (
<PhantomProvider
config={{
providers: ["google", "apple", "injected"],
appId: "your-app-id",
addressTypes: [AddressType.solana],
authOptions: { redirectUrl: "https://yourapp.com/callback" },
}}
theme={darkTheme}
>
<YourApp />
</PhantomProvider>
);
}
// CRITICAL: Must be first import
import "react-native-get-random-values";
import { PhantomProvider, AddressType, darkTheme } from "@phantom/react-native-sdk";
// Requires app.json: { "expo": { "scheme": "myapp", "plugins": [...] } }
import { BrowserSDK, AddressType } from "@phantom/browser-sdk";
const sdk = new BrowserSDK({
providers: ["google", "apple", "injected"],
appId: "your-app-id",
addressTypes: [AddressType.solana],
autoConnect: true,
});
For detailed implementation patterns, read these files:
| Issue | Solution |
|-------|----------|
| "appId required" | Add appId from Phantom Portal when using google/apple providers |
| Redirect not working | Allowlist redirectUrl in Phantom Portal |
| React Native crashes | Import react-native-get-random-values as FIRST import |
| Extension not detected | Use waitForPhantomExtension() with timeout |
| signTransaction error | Use signAndSendTransaction instead — embedded wallets don't support signTransaction |
Take sendaifun/phantom-connect from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.