NewPasskey smart-wallet SDK for Solana

Smart Wallets. Powered by Passkeys.

Passwordless, phishing-resistant auth for Solana. Users sign in with Face ID/Touch ID—no seed phrases, no extensions. Fast, secure, and ready to ship.

npm i @lazorkit/wallet

WebAuthn verified

Passkey bound smart wallet

Built for developers

A clean API surface, batteries included, and battle‑tested primitives.

No Private Keys to Manage
Users authenticate with passkeys — no seed phrases.
Lightning-Fast Onboarding
1‑tap biometric sign‑in with minimal friction.
Plug‑and‑Play SDK
Drop‑in components for React / React Native.
Secure by Design
WebAuthn passkeys with on‑chain smart wallet verification.

Embedded React code

Two quick snippets to integrate LazorKit in React.

Setup the Provider
Wrap your app with LazorkitProvider
React (TSX) · read-only
import { LazorkitProvider } from '@lazorkit/wallet';
export default function App() {
return (
  <LazorkitProvider
    rpcUrl={process.env.LAZORKIT_RPC_URL}
    ipfsUrl={process.env.LAZORKIT_PORTAL_URL}
    paymasterUrl={process.env.LAZORKIT_PAYMASTER_URL}
  >
    <YourApp />
  </LazorkitProvider>
);
}
Use the Wallet Hook
Connect, sign, and send transactions
React (TSX) · read-only
import { useWallet } from '@lazorkit/wallet';
import { SystemProgram, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js';

function WalletDemo() {
const {
  // State
  smartWalletPubkey,    // PublicKey | null - Smart wallet address
  isConnected,          // boolean - Connection status (!!account)
  isLoading,            // boolean - Loading state (isConnecting || isSigning)
  isConnecting,         // boolean - Connection in progress
  isSigning,            // boolean - Signing in progress
  error,                // Error | null - Latest error if any
  account,              // WalletAccount | null - Wallet account data

  // Actions
  connect,              // () => Promise<WalletAccount> - Connect wallet (auto-reconnect first)
  disconnect,           // () => Promise<void> - Disconnect wallet (preserves communication)
  signTransaction,      // (instruction: TransactionInstruction) => Promise<string>
  signAndSendTransaction, // (instruction: TransactionInstruction) => Promise<string>

  // New methods for flexible workflows
  createPasskeyOnly,    // () => Promise<ConnectResponse> - Create passkey only
  createSmartWalletOnly, // (passkeyData: ConnectResponse) => Promise<{smartWalletAddress: string, account: WalletAccount}>
  reconnect,            // () => Promise<WalletAccount> - Reconnect using stored credentials
} = useWallet();

// 1. Connect wallet (tries auto-reconnect first)
const handleConnect = async () => {
  try {
    const account = await connect();
    console.log('Connected:', account.smartWallet);
  } catch (error) {
    console.error('Connection failed:', error);
  }
};

// 2. Sign and send transaction
const handleTransfer = async () => {
  if (!smartWalletPubkey) return;

  try {
    const instruction = SystemProgram.transfer({
      fromPubkey: smartWalletPubkey,
      toPubkey: new PublicKey('7BeWr6tVa1pYgrEddekYTnQENU22bBw9H8HYJUkbrN71'),
      lamports: LAMPORTS_PER_SOL * 0.1,
    });

    const signature = await signAndSendTransaction(instruction);
    console.log('Transfer sent:', signature);
  } catch (error) {
    console.error('Transfer failed:', error);
  }
};

// 3. Disconnect (can reconnect later)
const handleDisconnect = async () => {
  try {
    await disconnect();
    console.log('Disconnected successfully');
  } catch (error) {
    console.error('Disconnect failed:', error);
  }
};

return (
  <div style={{ padding: '20px' }}>
    <h2>LazorKit Wallet Demo</h2>

    {!isConnected ? (
      <button
        onClick={handleConnect}
        disabled={isConnecting}
      >
        {isConnecting ? 'Connecting...' : 'Connect Wallet'}
      </button>
    ) : (
      <div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
        <p>Wallet: {smartWalletPubkey?.toString().slice(0, 8)}...</p>

        <button onClick={handleTransfer} disabled={isLoading}>
          {isSigning ? 'Sending...' : 'Transfer SOL'}
        </button>

        <button
          onClick={handleDisconnect}
          style={{ backgroundColor: '#ff6b6b' }}
        >
          Disconnect
        </button>
      </div>
    )}

    {error && (
      <p style={{ color: 'red' }}>
        Error: {error.message}
      </p>
    )}
  </div>
);
}

Build passwordless Solana experiences today.

Ship a passkey‑controlled smart wallet in minutes.

Install the SDK

npm i @lazorkit/wallet

Or with pnpm / yarn

pnpm add @lazorkit/wallet
yarn add @lazorkit/wallet