UNPKG

@stablecoin.xyz/react

Version:

React hooks and components for SBC Account Abstraction

377 lines (365 loc) 12.9 kB
import * as _stablecoin_xyz_core from '@stablecoin.xyz/core'; import { AccountInfo, SbcAppKitConfig, SbcAppKit, SendUserOperationParams, UserOperationResult, UserOperationEstimate, SupportedWalletType, WalletConnectionResult, DetectedWallet } from '@stablecoin.xyz/core'; export { AccountInfo, CallParams, ChainConfig, LoggingConfig, SbcAppKitConfig, SendUserOperationParams, SupportedWalletType, UserOperationEstimate, UserOperationParams, UserOperationResult, WalletOptions } from '@stablecoin.xyz/core'; import { ReactNode } from 'react'; import * as viem from 'viem'; import { Chain } from 'viem'; import * as react_jsx_runtime from 'react/jsx-runtime'; interface UseSbcAppReturn { /** SBC App Kit instance */ sbcAppKit: _stablecoin_xyz_core.SbcAppKit | null; /** Whether the SDK is initialized */ isInitialized: boolean; /** Initialization error if any */ error: Error | null; /** Account information */ account: AccountInfo | null; /** Whether account info is loading */ isLoadingAccount: boolean; /** Error loading account info */ accountError: Error | null; /** Refresh account information */ refreshAccount: () => Promise<void>; /** EOA address (MetaMask, etc) that owns the smart account */ ownerAddress: string | null; /** Disconnect the wallet and clear all state */ disconnectWallet: () => void; } /** * Main hook for accessing SBC App Kit functionality */ declare function useSbcApp(): UseSbcAppReturn; interface SbcProviderProps { /** SBC App Kit configuration */ config: SbcAppKitConfig; /** Child components */ children: ReactNode; /** Optional: Custom error boundary */ onError?: (error: Error) => void; } interface SbcContextValue { /** SBC App Kit instance */ sbcAppKit: SbcAppKit | null; /** Whether the SDK is initialized */ isInitialized: boolean; /** Initialization error if any */ error: Error | null; } interface UseUserOperationOptions { /** Callback fired on successful transaction */ onSuccess?: (result: _stablecoin_xyz_core.UserOperationResult) => void; /** Callback fired on transaction error */ onError?: (error: Error) => void; /** Auto-refresh account after successful transaction */ refreshAccount?: boolean; } interface UserOperationState { /** Whether a transaction is currently being sent */ isLoading: boolean; /** Whether the last transaction was successful */ isSuccess: boolean; /** Whether the last transaction failed */ isError: boolean; /** Error from the last transaction */ error: Error | null; /** Result from the last successful transaction */ data: _stablecoin_xyz_core.UserOperationResult | null; /** Reset the state */ reset: () => void; } interface UseUserOperationReturn extends UserOperationState { /** Send a user operation */ sendUserOperation: (params: SendUserOperationParams) => Promise<UserOperationResult | undefined>; /** Estimate gas for a user operation */ estimateUserOperation: (params: SendUserOperationParams) => Promise<UserOperationEstimate | undefined>; } /** * Hook for sending user operations with automatic state management */ declare function useUserOperation(options?: UseUserOperationOptions): UseUserOperationReturn; interface UseSbcDynamicReturn { /** SBC App Kit instance */ sbcAppKit: SbcAppKit | null; /** Whether the SDK is initialized */ isInitialized: boolean; /** Initialization error if any */ error: Error | null; /** Account information */ account: AccountInfo | null; /** Whether account info is loading */ isLoadingAccount: boolean; /** Error loading account info */ accountError: Error | null; /** Refresh account information */ refreshAccount: () => Promise<void>; /** EOA address from Dynamic that owns the smart account */ ownerAddress: string | null; /** Disconnect the wallet and clear all state */ disconnectWallet: () => void; } interface UseSbcDynamicConfig { /** Your SBC API key */ apiKey: string; /** Blockchain network to operate on */ chain: viem.Chain; /** Dynamic primary wallet from useDynamicContext() */ primaryWallet: any; /** Optional: Custom RPC URL */ rpcUrl?: string; /** Optional: Enable debug logging */ debug?: boolean; } /** * Simplified hook for Dynamic + SBC integration * Automatically handles wallet client creation and SBC initialization */ declare function useSbcDynamic(config: UseSbcDynamicConfig): UseSbcDynamicReturn; interface UseSbcParaConfig { /** SBC API key */ apiKey: string; /** Target blockchain chain */ chain: Chain; /** Para account object from the useAccount hook */ paraAccount: any; /** Optional RPC URL override */ rpcUrl?: string; /** Enable debug logging */ debug?: boolean; /** Para viem clients from useParaViem hook */ paraViemClients?: { publicClient: any; walletClient: any; account: any; } | null; } interface UseSbcParaResult { /** SBC AppKit instance (available when initialized) */ sbcAppKit: SbcAppKit | null; /** Whether SBC is initialized and ready */ isInitialized: boolean; /** Initialization or runtime error */ error: Error | null; /** Smart account information */ account: any; /** Whether account information is loading */ isLoadingAccount: boolean; /** Account loading error */ accountError: Error | null; /** Owner address (Para wallet address) */ ownerAddress: string | null; /** Function to refresh account data */ refreshAccount: () => Promise<void>; /** Function to disconnect and cleanup */ disconnectWallet: () => Promise<void>; } /** * React hook for integrating SBC AppKit with Para embedded wallets * * This hook should be used within a ParaProvider context and requires * a Para account from the useAccount hook. * * @example * ```tsx * import { ParaProvider, useAccount } from "@getpara/react-sdk"; * import "@getpara/react-sdk/styles.css"; * * function App() { * return ( * <ParaProvider * paraClientConfig={{ * env: "development", * apiKey: "your-para-api-key", * }} * config={{ * appName: "Your App Name", * }} * > * <YourAppComponent /> * </ParaProvider> * ); * } * * function YourAppComponent() { * const paraAccount = useAccount(); * * const { * sbcAppKit, * isInitialized, * account, * ownerAddress * } = useSbcPara({ * apiKey: 'your-sbc-api-key', * chain: baseSepolia, * paraAccount * }); * * return <div>Smart Account: {account?.address}</div>; * } * ``` */ declare function useSbcPara(config: UseSbcParaConfig): UseSbcParaResult; interface UseSbcTurnkeyReturn { /** SBC App Kit instance */ sbcAppKit: SbcAppKit | null; /** Whether the SDK is initialized */ isInitialized: boolean; /** Initialization error if any */ error: Error | null; /** Account information */ account: AccountInfo | null; /** Whether account info is loading */ isLoadingAccount: boolean; /** Error loading account info */ accountError: Error | null; /** Refresh account information */ refreshAccount: () => Promise<void>; /** EOA address from Turnkey that owns the smart account */ ownerAddress: string | null; /** Disconnect the wallet and clear all state */ disconnectWallet: () => void; } interface UseSbcTurnkeyConfig { /** Your SBC API key */ apiKey: string; /** Blockchain network to operate on */ chain: viem.Chain; /** Turnkey client from getActiveClient() */ turnkeyClient: any; /** Organization ID from Turnkey */ organizationId: string; /** Optional: Custom RPC URL */ rpcUrl?: string; /** Optional: Enable debug logging */ debug?: boolean; /** Optional: Pre-created Turnkey viem wallet client */ turnkeyWalletClient?: any; } /** * Simplified hook for Turnkey + SBC integration * Automatically handles wallet client creation and SBC initialization * * @example * ```tsx * import { TurnkeyProvider, useTurnkey } from "@turnkey/sdk-react"; * import { useSbcTurnkey } from "@stablecoin.xyz/react"; * import { baseSepolia } from "viem/chains"; * import { useState, useEffect } from "react"; * * function App() { * return ( * <TurnkeyProvider config={turnkeyConfig}> * <YourComponent /> * </TurnkeyProvider> * ); * } * * function YourComponent() { * const { turnkey, passkeyClient } = useTurnkey(); * const [turnkeyClient, setTurnkeyClient] = useState(null); * const [organizationId, setOrganizationId] = useState(''); * * // Check authentication and get organization ID * useEffect(() => { * const checkAuth = async () => { * if (turnkey) { * const session = await turnkey.getSession(); * if (session?.organizationId) { * setOrganizationId(session.organizationId); * setTurnkeyClient(passkeyClient); * } * } * }; * checkAuth(); * }, [turnkey, passkeyClient]); * * const { * sbcAppKit, * isInitialized, * account, * ownerAddress * } = useSbcTurnkey({ * apiKey: 'your-sbc-api-key', * chain: baseSepolia, * turnkeyClient, * organizationId, * }); * * return <div>Smart Account: {account?.address}</div>; * } * ``` */ declare function useSbcTurnkey(config: UseSbcTurnkeyConfig): UseSbcTurnkeyReturn; declare function SbcProvider({ config, children, onError }: SbcProviderProps): react_jsx_runtime.JSX.Element; declare function useSbcContext(): SbcContextValue; interface WalletConnectProps { /** Custom className for styling */ className?: string; /** Callback when wallet connection changes */ onConnectionChange?: (connected: boolean) => void; } /** * WalletConnect component - placeholder for future wallet integration * * This component will be expanded in the future to handle: * - Multiple wallet providers (MetaMask, WalletConnect, Coinbase Wallet, etc.) * - Wallet switching * - Connection state management * - Network switching */ declare function WalletConnect({ className, onConnectionChange }: WalletConnectProps): react_jsx_runtime.JSX.Element; interface WalletButtonProps { /** Wallet type to connect to ('auto' for automatic detection) */ walletType?: SupportedWalletType; /** Custom className for styling */ className?: string; /** Callback when wallet connection succeeds */ onConnect?: (result: WalletConnectionResult) => void; /** Callback when wallet connection fails */ onError?: (error: Error) => void; /** Custom button text */ children?: React.ReactNode; /** Show loading state */ showLoading?: boolean; /** Disabled state */ disabled?: boolean; /** Custom render prop for full control */ render?: (props: { onClick: () => void; isConnecting: boolean; disabled: boolean; children: React.ReactNode; className: string; }) => React.ReactNode; } /** * WalletButton - Simple button component for connecting to wallets * * Automatically detects available wallets and connects with one click */ declare function WalletButton({ walletType, className, onConnect, onError, children, showLoading, disabled, render, }: WalletButtonProps): react_jsx_runtime.JSX.Element; interface WalletSelectorProps { /** Custom className for styling */ className?: string; /** Callback when wallet connection succeeds */ onConnect?: (result: WalletConnectionResult) => void; /** Callback when wallet connection fails */ onError?: (error: Error) => void; /** Show only available wallets */ showOnlyAvailable?: boolean; /** Custom wallet list (overrides auto-detection) */ wallets?: DetectedWallet[]; } /** * WalletSelector - Component that displays available wallets and allows selection * * Automatically detects installed wallets and shows connection options */ declare function WalletSelector({ className, onConnect, onError, showOnlyAvailable, wallets: customWallets, }: WalletSelectorProps): react_jsx_runtime.JSX.Element; declare global { interface Window { ethereum?: any; coinbaseWalletExtension?: any; } } export { SbcProvider, WalletButton, WalletConnect, WalletSelector, useSbcApp, useSbcContext, useSbcDynamic, useSbcPara, useSbcTurnkey, useUserOperation }; export type { SbcContextValue, SbcProviderProps, UseSbcAppReturn, UseSbcDynamicConfig, UseSbcDynamicReturn, UseSbcParaConfig, UseSbcParaResult, UseSbcTurnkeyConfig, UseSbcTurnkeyReturn, UseUserOperationOptions, UseUserOperationReturn, UserOperationState, WalletButtonProps, WalletConnectProps, WalletSelectorProps };