@rialo/frost 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/FrostContext.tsx","../src/hooks/useActiveAccount.ts","../src/hooks/useActiveWallet.ts","../src/hooks/useConnectionStatus.ts","../src/hooks/useConnectWallet.ts","../src/components/icons.tsx","../src/hooks/useWallets.ts","../src/components/WalletModal.tsx","../src/components/ConnectButton.tsx","../src/hooks/useAccounts.ts","../src/hooks/useChain.ts","../src/hooks/useClient.ts","../src/hooks/useNativeBalance.ts","../src/hooks/useSignMessage.ts","../src/hooks/useSignTransaction.ts"],"names":["useStore","jsx","connect","useRef","useEffect","jsxs","defaultStyles","disconnect","useCallback","useMemo","useMutation"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n type FrostConfig,\n initializeConfig,\n reconnect,\n WalletEventBridge,\n WalletRegistry,\n} from \"@rialo/frost-core\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport type { Context, ReactNode } from \"react\";\nimport { createContext, useContext, useEffect, useRef } from \"react\";\n\n/** Context holding the Frost configuration */\nconst FrostContext: Context<FrostConfig | null> = createContext<FrostConfig | null>(null);\n\nexport interface FrostProviderProps {\n children: ReactNode;\n /**\n * Frost configuration object created with `createConfig()`.\n *\n * **Important:** Create the config outside of React components to ensure\n * it's only created once and remains stable across re-renders.\n *\n * @example\n * ```tsx\n * // config.ts\n * import { createConfig, getDefaultRialoClientConfig } from '@rialo/frost-core';\n *\n * export const config = createConfig({\n * clientConfig: getDefaultRialoClientConfig('devnet'),\n * });\n *\n * // App.tsx\n * import { FrostProvider } from '@rialo/frost';\n * import { config } from './config';\n *\n * function App() {\n * return (\n * <FrostProvider config={config}>\n * <YourApp />\n * </FrostProvider>\n * );\n * }\n * ```\n */\n config: FrostConfig;\n /** Optional external QueryClient (for sharing with app) */\n queryClient?: QueryClient;\n}\n\n/**\n * Provider component for Frost.\n * Initializes wallet discovery, event handling, and provides config to hooks.\n */\nexport function FrostProvider({\n children,\n config,\n queryClient: externalQueryClient,\n}: Readonly<FrostProviderProps>): ReactNode {\n // Create QueryClient if not provided externally\n const queryClientRef = useRef<QueryClient | null>(null);\n if (!queryClientRef.current && !externalQueryClient) {\n queryClientRef.current = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n gcTime: 1000 * 60 * 5, // 5 minutes\n },\n },\n });\n }\n const queryClient = externalQueryClient ?? (queryClientRef.current as QueryClient);\n\n // Initialize registry, bridge, and auto-reconnect\n useEffect(() => {\n if (!config._registry) {\n const registry = new WalletRegistry(config);\n const bridge = new WalletEventBridge(config);\n\n initializeConfig(config, registry, bridge);\n }\n\n const shouldAutoReconnect =\n config.options.autoConnect &&\n config.store.state.walletName &&\n !config.store.state.userDisconnected;\n\n if (shouldAutoReconnect) {\n void reconnect(config);\n }\n }, [config]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FrostContext.Provider value={config}>{children}</FrostContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access the DappKit config.\n * Must be used within a FrostProvider.\n */\nexport function useFrostConfig(): FrostConfig {\n const config = useContext(FrostContext);\n if (!config) {\n throw new Error(\"useFrostConfig must be used within a FrostProvider\");\n }\n return config;\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { AccountEntity, FrostAppState } from \"@rialo/frost-core\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useFrostConfig } from \"../context\";\n\n/**\n * Selector for the active account.\n * Defined at module level since it has no dependencies and never changes,\n * preventing unnecessary re-subscriptions in TanStack Store.\n */\nconst selectActiveAccount = (state: FrostAppState): AccountEntity | null => {\n if (!state.accountAddress) return null;\n return state.accounts.get(state.accountAddress) ?? null;\n};\n\n/**\n * Hook to get the currently active account.\n *\n * @returns Active account or null if not connected\n *\n * @example\n * ```tsx\n * function AccountInfo() {\n * const account = useActiveAccount();\n *\n * if (!account) return <div>Not connected</div>;\n * return <div>Address: {account.address}</div>;\n * }\n * ```\n */\nexport function useActiveAccount(): AccountEntity | null {\n const config = useFrostConfig();\n return useStore(config.store, selectActiveAccount);\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { FrostAppState, WalletEntity } from \"@rialo/frost-core\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useFrostConfig } from \"../context\";\n\n/**\n * Selector for the active wallet.\n * Defined at module level since it has no dependencies and never changes,\n * preventing unnecessary re-subscriptions in TanStack Store.\n */\nconst selectActiveWallet = (state: FrostAppState): WalletEntity | null => {\n if (!state.walletName) return null;\n return state.wallets.get(state.walletName) ?? null;\n};\n\n/**\n * Hook to get the currently active wallet.\n *\n * @returns Active wallet or null if not connected\n *\n * @example\n * ```tsx\n * function WalletInfo() {\n * const wallet = useActiveWallet();\n *\n * if (!wallet) return <div>No wallet connected</div>;\n * return <div>Connected to: {wallet.name}</div>;\n * }\n * ```\n */\nexport function useActiveWallet(): WalletEntity | null {\n const config = useFrostConfig();\n return useStore(config.store, selectActiveWallet);\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ConnectionStatus, FrostAppState } from \"@rialo/frost-core\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useFrostConfig } from \"../context\";\n\n/**\n * Selector for connection status.\n * Defined at module level since it has no dependencies and never changes.\n */\nconst selectStatus = (state: FrostAppState): ConnectionStatus => state.status;\n\n/**\n * Selector for connected state.\n * Defined at module level since it has no dependencies and never changes.\n */\nconst selectIsConnected = (state: FrostAppState): boolean => state.status === \"connected\";\n\n/**\n * Hook to get the current connection status.\n *\n * @returns Connection status: \"disconnected\" | \"connecting\" | \"connected\" | \"reconnecting\"\n *\n * @example\n * ```tsx\n * function StatusIndicator() {\n * const status = useConnectionStatus();\n * return <div>Status: {status}</div>;\n * }\n * ```\n */\nexport function useConnectionStatus(): ConnectionStatus {\n const config = useFrostConfig();\n return useStore(config.store, selectStatus);\n}\n\n/**\n * Hook to check if currently connected.\n *\n * @returns True if a wallet is connected\n *\n * @example\n * ```tsx\n * function App() {\n * const isConnected = useIsConnected();\n * return isConnected ? <Dashboard /> : <ConnectPrompt />;\n * }\n * ```\n */\nexport function useIsConnected(): boolean {\n const config = useFrostConfig();\n return useStore(config.store, selectIsConnected);\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ConnectOptions, ConnectResult } from \"@rialo/frost-core\";\nimport { connect, disconnect } from \"@rialo/frost-core\";\nimport type { UseMutationResult } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useFrostConfig } from \"../context\";\n\nexport interface UseConnectWalletOptions {\n onSuccess?: (result: ConnectResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook to connect to a wallet.\n *\n * @param options - Callbacks for success/error handling\n * @returns Mutation to trigger wallet connection\n *\n * @example\n * ```tsx\n * function ConnectButton() {\n * const { mutate: connect, isPending } = useConnectWallet({\n * onSuccess: () => console.log('Connected!'),\n * });\n *\n * return (\n * <button onClick={() => connect({ walletName: 'Rialo' })} disabled={isPending}>\n * Connect\n * </button>\n * );\n * }\n * ```\n */\nexport function useConnectWallet(\n options?: UseConnectWalletOptions\n): UseMutationResult<ConnectResult, Error, ConnectOptions> {\n const config = useFrostConfig();\n\n return useMutation({\n mutationKey: [\"frost\", \"connect\"],\n mutationFn: (connectOptions: ConnectOptions) => connect(config, connectOptions),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n}\n\nexport interface UseDisconnectWalletOptions {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook to disconnect the current wallet.\n *\n * @param options - Callbacks for success/error handling\n * @returns Mutation to trigger wallet disconnection\n *\n * @example\n * ```tsx\n * function DisconnectButton() {\n * const { mutate: disconnect } = useDisconnectWallet();\n * return <button onClick={() => disconnect()}>Disconnect</button>;\n * }\n * ```\n */\nexport function useDisconnectWallet(\n options?: UseDisconnectWalletOptions\n): UseMutationResult<void, Error, void> {\n const config = useFrostConfig();\n\n return useMutation({\n mutationKey: [\"frost\", \"disconnect\"],\n mutationFn: () => disconnect(config),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ReactNode } from \"react\";\n\nexport function CloseIcon(): ReactNode {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Close modal\"\n >\n <path\n d=\"M15 5L5 15M5 5L15 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function WalletPlaceholderIcon(): ReactNode {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Wallet placeholder icon\"\n >\n <rect x=\"2\" y=\"6\" width=\"20\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M6 6V5C6 3.89543 6.89543 3 8 3H16C17.1046 3 18 3.89543 18 5V6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <circle cx=\"16\" cy=\"13\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function DisconnectIcon(): ReactNode {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Disconnect icon\"\n >\n <path\n d=\"M5.25 12.25H3.5C2.53333 12.25 1.75 11.4667 1.75 10.5V3.5C1.75 2.53333 2.53333 1.75 3.5 1.75H5.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M9.33331 9.91669L12.25 7.00002L9.33331 4.08335\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M12.25 7H5.25\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function ChevronIcon({ direction }: { direction: \"up\" | \"down\" }): ReactNode {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Chevron icon\"\n style={{\n marginLeft: \"0.25rem\",\n transition: \"transform 0.15s ease\",\n transform: direction === \"up\" ? \"rotate(180deg)\" : undefined,\n }}\n >\n <path\n d=\"M2.5 4.5L6 8L9.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CopyIcon(): ReactNode {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Copy icon\"\n >\n <rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path\n d=\"M10 4V3C10 2.17157 9.32843 1.5 8.5 1.5H3C2.17157 1.5 1.5 2.17157 1.5 3V8.5C1.5 9.32843 2.17157 10 3 10H4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n />\n </svg>\n );\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { FrostAppState, WalletEntity } from \"@rialo/frost-core\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useMemo } from \"react\";\nimport { useFrostConfig } from \"../context\";\n\n/**\n * Selector for wallets map.\n * Defined at module level since it has no dependencies and never changes.\n */\nconst selectWalletsMap = (state: FrostAppState): Map<string, WalletEntity> => state.wallets;\n\n/**\n * Selector for wallets ready state.\n * Defined at module level since it has no dependencies and never changes.\n */\nconst selectWalletsReady = (state: FrostAppState): boolean => state.wallets.size > 0;\n\n/**\n * Hook to get sorted wallets list.\n * Wallets are sorted by priority (higher first) then by last connected time.\n *\n * @returns Sorted array of wallet entities (memoized)\n *\n * @example\n * ```tsx\n * function WalletList() {\n * const wallets = useWallets();\n *\n * return (\n * <ul>\n * {wallets.map(w => (\n * <li key={w.name}>{w.name}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useWallets(): WalletEntity[] {\n const config = useFrostConfig();\n // Select just the Map reference - this is stable when wallets haven't changed\n const walletsMap = useStore(config.store, selectWalletsMap);\n\n // Memoize the sorted array derivation\n return useMemo(\n () =>\n Array.from(walletsMap.values()).sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return (b.lastConnectedAt ?? 0) - (a.lastConnectedAt ?? 0);\n }),\n [walletsMap]\n );\n}\n\n/**\n * Hook to check if wallets have been discovered.\n *\n * @returns True if at least one wallet has been discovered\n *\n * @example\n * ```tsx\n * function ConnectButton() {\n * const walletsReady = useWalletsReady();\n *\n * if (!walletsReady) return <div>Searching for wallets...</div>;\n * return <button>Connect Wallet</button>;\n * }\n * ```\n */\nexport function useWalletsReady(): boolean {\n const config = useFrostConfig();\n return useStore(config.store, selectWalletsReady);\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ConnectResult, WalletEntity } from \"@rialo/frost-core\";\nimport type { CSSProperties, KeyboardEvent, MouseEvent, ReactNode } from \"react\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useConnectionStatus } from \"../hooks/useConnectionStatus\";\nimport { useConnectWallet } from \"../hooks/useConnectWallet\";\nimport { useWallets } from \"../hooks/useWallets\";\nimport { CloseIcon, WalletPlaceholderIcon } from \"./icons\";\n\nexport interface WalletModalProps {\n /** Whether the modal is open */\n open: boolean;\n /** Callback when modal should close */\n onClose: () => void;\n /** Callback when wallet connection succeeds */\n onConnect?: (walletName: string, address: string) => void;\n /** Callback when wallet connection fails */\n onError?: (error: Error, walletName: string) => void;\n /** Modal title */\n title?: string;\n /** Additional class name for the modal overlay */\n className?: string;\n /** Additional class name for the modal content */\n contentClassName?: string;\n /** Custom styles for the modal */\n style?: CSSProperties;\n /** Render prop for custom wallet item rendering */\n renderWallet?: (wallet: WalletEntity, connect: () => void, isConnecting: boolean) => ReactNode;\n}\n\nconst defaultStyles: Record<string, CSSProperties> = {\n overlay: {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"var(--frost-overlay-bg, rgba(0, 0, 0, 0.5))\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: \"var(--frost-z-index, 9999)\" as unknown as number,\n padding: \"1rem\",\n },\n content: {\n backgroundColor: \"var(--frost-modal-bg, #ffffff)\",\n borderRadius: \"var(--frost-border-radius, 12px)\",\n boxShadow: \"var(--frost-shadow, 0 4px 24px rgba(0, 0, 0, 0.15))\",\n maxWidth: \"var(--frost-modal-max-width, 400px)\",\n width: \"100%\",\n maxHeight: \"80vh\",\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"1rem 1.25rem\",\n borderBottom: \"1px solid var(--frost-border-color, #e5e7eb)\",\n },\n title: {\n margin: 0,\n fontSize: \"1.125rem\",\n fontWeight: 600,\n color: \"var(--frost-text-color, #111827)\",\n },\n closeButton: {\n background: \"none\",\n border: \"none\",\n padding: \"0.5rem\",\n cursor: \"pointer\",\n borderRadius: \"var(--frost-border-radius-sm, 6px)\",\n color: \"var(--frost-text-secondary, #6b7280)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"background-color 0.15s ease\",\n },\n walletList: {\n listStyle: \"none\",\n margin: 0,\n padding: \"0.5rem\",\n overflowY: \"auto\",\n flex: 1,\n },\n walletItem: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"0.875rem 1rem\",\n borderRadius: \"var(--frost-border-radius-sm, 8px)\",\n cursor: \"pointer\",\n border: \"none\",\n background: \"none\",\n width: \"100%\",\n textAlign: \"left\",\n transition: \"background-color 0.15s ease\",\n color: \"var(--frost-text-color, #111827)\",\n },\n walletIcon: {\n width: 40,\n height: 40,\n borderRadius: \"var(--frost-border-radius-sm, 8px)\",\n objectFit: \"contain\",\n backgroundColor: \"var(--frost-icon-bg, #f3f4f6)\",\n },\n walletInfo: {\n flex: 1,\n minWidth: 0,\n },\n walletName: {\n margin: 0,\n fontSize: \"0.9375rem\",\n fontWeight: 500,\n color: \"inherit\",\n },\n walletStatus: {\n margin: 0,\n fontSize: \"0.8125rem\",\n color: \"var(--frost-text-secondary, #6b7280)\",\n },\n spinner: {\n width: 20,\n height: 20,\n border: \"2px solid var(--frost-border-color, #e5e7eb)\",\n borderTopColor: \"var(--frost-primary, #3b82f6)\",\n borderRadius: \"50%\",\n animation: \"frost-spin 0.8s linear infinite\",\n },\n emptyState: {\n padding: \"2rem 1rem\",\n textAlign: \"center\",\n color: \"var(--frost-text-secondary, #6b7280)\",\n },\n};\n\nconst SPINNER_KEYFRAMES = `\n@keyframes frost-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n`;\n\nlet stylesInjected = false;\n\nfunction injectStyles(): void {\n if (stylesInjected || typeof document === \"undefined\") return;\n const style = document.createElement(\"style\");\n style.textContent = SPINNER_KEYFRAMES;\n document.head.appendChild(style);\n stylesInjected = true;\n}\n\nexport function WalletModal({\n open,\n onClose,\n onConnect,\n onError,\n title = \"Connect Wallet\",\n className,\n contentClassName,\n style,\n renderWallet,\n}: WalletModalProps): ReactNode {\n const wallets = useWallets();\n const status = useConnectionStatus();\n const {\n mutate: connect,\n variables: connectingWallet,\n isPending,\n } = useConnectWallet({\n onSuccess: (result: ConnectResult) => {\n onConnect?.(result.walletName, result.accountAddress);\n },\n onError: (error: Error) => {\n onError?.(error, connectingWallet?.walletName ?? \"unknown\");\n },\n });\n\n const modalRef = useRef<HTMLDivElement>(null);\n const previousActiveElement = useRef<HTMLElement | null>(null);\n const wasOpen = useRef(false);\n\n useEffect(() => {\n injectStyles();\n }, []);\n\n // Handle focus restoration when modal closes\n useEffect(() => {\n if (open && !wasOpen.current) {\n // Modal just opened - save the active element\n previousActiveElement.current = document.activeElement as HTMLElement;\n modalRef.current?.focus();\n } else if (!open && wasOpen.current) {\n // Modal just closed - restore focus\n previousActiveElement.current?.focus();\n }\n wasOpen.current = open;\n }, [open]);\n\n // Handle keyboard and scroll lock\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = (e: globalThis.KeyboardEvent): void => {\n if (e.key === \"Escape\") {\n onClose();\n return;\n }\n\n if (e.key === \"Tab\" && modalRef.current) {\n const focusableElements = modalRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault();\n lastElement?.focus();\n } else if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = originalOverflow;\n };\n }, [open, onClose]);\n\n const handleOverlayClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n },\n [onClose]\n );\n\n const handleWalletClick = useCallback(\n (walletName: string) => {\n connect({ walletName });\n },\n [connect]\n );\n\n const handleWalletKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>, walletName: string) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n connect({ walletName });\n }\n },\n [connect]\n );\n\n if (!open) return null;\n\n const isConnecting = status === \"connecting\" || isPending;\n\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: <modal>\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"frost-modal-title\"\n className={className}\n style={{ ...defaultStyles.overlay, ...style }}\n onClick={handleOverlayClick}\n >\n <div\n ref={modalRef}\n className={contentClassName}\n style={defaultStyles.content}\n tabIndex={-1}\n data-frost=\"modal-content\"\n >\n <div style={defaultStyles.header} data-frost=\"modal-header\">\n <h2 id=\"frost-modal-title\" style={defaultStyles.title}>\n {title}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n style={defaultStyles.closeButton}\n aria-label=\"Close modal\"\n data-frost=\"modal-close\"\n >\n <CloseIcon />\n </button>\n </div>\n\n <ul style={defaultStyles.walletList} data-frost=\"wallet-list\">\n {wallets.length === 0 ? (\n <li style={defaultStyles.emptyState} data-frost=\"empty-state\">\n <p>No wallets detected.</p>\n <p style={{ marginTop: \"0.5rem\", fontSize: \"0.875rem\" }}>\n Please install a Rialo-compatible wallet extension.\n </p>\n </li>\n ) : (\n wallets.map(wallet => {\n const isThisConnecting = isConnecting && connectingWallet?.walletName === wallet.name;\n\n if (renderWallet) {\n return (\n <li key={wallet.name}>\n {renderWallet(wallet, () => handleWalletClick(wallet.name), isThisConnecting)}\n </li>\n );\n }\n\n return (\n <li key={wallet.name}>\n <button\n type=\"button\"\n onClick={() => handleWalletClick(wallet.name)}\n onKeyDown={(e: KeyboardEvent<HTMLButtonElement>) =>\n handleWalletKeyDown(e, wallet.name)\n }\n disabled={isConnecting}\n style={{\n ...defaultStyles.walletItem,\n opacity: isConnecting && !isThisConnecting ? 0.5 : 1,\n cursor: isConnecting ? \"not-allowed\" : \"pointer\",\n }}\n data-frost=\"wallet-item\"\n data-connecting={isThisConnecting ? \"true\" : undefined}\n onMouseEnter={(e: MouseEvent<HTMLButtonElement>) => {\n if (!isConnecting) {\n e.currentTarget.style.backgroundColor = \"var(--frost-hover-bg, #f3f4f6)\";\n }\n }}\n onMouseLeave={(e: MouseEvent<HTMLButtonElement>) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n {wallet.icon ? (\n <img\n src={wallet.icon}\n alt={`${wallet.name} icon`}\n style={defaultStyles.walletIcon}\n data-frost=\"wallet-icon\"\n />\n ) : (\n <div\n style={{\n ...defaultStyles.walletIcon,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--frost-text-secondary, #6b7280)\",\n }}\n data-frost=\"wallet-icon-placeholder\"\n >\n <WalletPlaceholderIcon />\n </div>\n )}\n\n <div style={defaultStyles.walletInfo}>\n <p style={defaultStyles.walletName}>{wallet.name}</p>\n {wallet.installedVersion && (\n <p style={defaultStyles.walletStatus}>v{wallet.installedVersion}</p>\n )}\n </div>\n\n {isThisConnecting && <div style={defaultStyles.spinner} data-frost=\"spinner\" />}\n </button>\n </li>\n );\n })\n )}\n </ul>\n </div>\n </div>\n );\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/** biome-ignore-all lint/nursery/useExplicitType: <mouse events> */\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useActiveAccount } from \"../hooks/useActiveAccount\";\nimport { useActiveWallet } from \"../hooks/useActiveWallet\";\nimport { useConnectionStatus } from \"../hooks/useConnectionStatus\";\nimport { useDisconnectWallet } from \"../hooks/useConnectWallet\";\nimport { ChevronIcon, CopyIcon, DisconnectIcon } from \"./icons\";\nimport { WalletModal } from \"./WalletModal\";\n\nexport interface ConnectButtonProps {\n /** Label shown when disconnected */\n label?: string;\n /** Label shown while connecting */\n connectingLabel?: string;\n /** Label or formatter for connected state */\n connectedLabel?: string | ((address: string, walletName: string) => string);\n /** Callback when wallet successfully connects */\n onConnect?: (walletName: string, address: string) => void;\n /** Callback when wallet disconnects */\n onDisconnect?: () => void;\n /** Callback when connection fails */\n onError?: (error: Error) => void;\n /** Additional class name for the button */\n className?: string;\n /** Additional styles for the button */\n style?: CSSProperties;\n /** Whether the button is disabled */\n disabled?: boolean;\n /** Title for the wallet selection modal */\n modalTitle?: string;\n /** Whether to show the connected dropdown menu @default true */\n showDropdown?: boolean;\n /** Additional class for the dropdown menu */\n dropdownClassName?: string;\n}\n\nconst defaultStyles: Record<string, CSSProperties> = {\n container: {\n position: \"relative\",\n display: \"inline-block\",\n },\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0.5rem\",\n padding: \"0.625rem 1rem\",\n fontSize: \"0.9375rem\",\n fontWeight: 500,\n color: \"var(--frost-button-text, #ffffff)\",\n backgroundColor: \"var(--frost-primary, #3b82f6)\",\n border: \"none\",\n borderRadius: \"var(--frost-border-radius, 8px)\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n minWidth: \"140px\",\n fontFamily: \"inherit\",\n },\n buttonDisabled: {\n opacity: 0.6,\n cursor: \"not-allowed\",\n },\n buttonConnected: {\n backgroundColor: \"var(--frost-button-connected-bg, #f3f4f6)\",\n color: \"var(--frost-button-connected-text, #111827)\",\n },\n walletIcon: {\n width: 20,\n height: 20,\n borderRadius: 4,\n objectFit: \"contain\",\n },\n dropdown: {\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n right: 0,\n minWidth: \"100%\",\n backgroundColor: \"var(--frost-dropdown-bg, #ffffff)\",\n borderRadius: \"var(--frost-border-radius, 8px)\",\n boxShadow: \"var(--frost-shadow, 0 4px 16px rgba(0, 0, 0, 0.12))\",\n border: \"1px solid var(--frost-border-color, #e5e7eb)\",\n overflow: \"hidden\",\n zIndex: \"var(--frost-z-index, 9999)\" as unknown as number,\n },\n dropdownItem: {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n width: \"100%\",\n padding: \"0.75rem 1rem\",\n fontSize: \"0.875rem\",\n color: \"var(--frost-text-color, #111827)\",\n backgroundColor: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: \"inherit\",\n transition: \"background-color 0.15s ease\",\n },\n dropdownDivider: {\n height: 1,\n backgroundColor: \"var(--frost-border-color, #e5e7eb)\",\n margin: 0,\n },\n addressDisplay: {\n padding: \"0.75rem 1rem\",\n fontSize: \"0.75rem\",\n color: \"var(--frost-text-secondary, #6b7280)\",\n fontFamily: \"monospace\",\n wordBreak: \"break-all\",\n },\n spinner: {\n width: 16,\n height: 16,\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n borderTopColor: \"#ffffff\",\n borderRadius: \"50%\",\n animation: \"frost-spin 0.8s linear infinite\",\n },\n};\n\nfunction truncateAddress(address: string, startChars: number = 6, endChars: number = 4): string {\n if (address.length <= startChars + endChars) return address;\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\nexport function ConnectButton({\n label = \"Connect Wallet\",\n connectingLabel = \"Connecting...\",\n connectedLabel,\n onConnect,\n onDisconnect,\n onError,\n className,\n style,\n disabled = false,\n modalTitle,\n showDropdown = true,\n dropdownClassName,\n}: ConnectButtonProps): ReactNode {\n const [modalOpen, setModalOpen] = useState(false);\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const copyTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const status = useConnectionStatus();\n const account = useActiveAccount();\n const wallet = useActiveWallet();\n\n const { mutate: disconnect } = useDisconnectWallet({\n onSuccess: () => {\n setDropdownOpen(false);\n onDisconnect?.();\n },\n });\n\n const isConnected = status === \"connected\" && account;\n const isConnecting = status === \"connecting\" || status === \"reconnecting\";\n\n // Use refs to avoid circular dependencies in useCallback\n const handlersRef = useRef<{\n clickOutside: (e: globalThis.MouseEvent) => void;\n escape: (e: globalThis.KeyboardEvent) => void;\n } | null>(null);\n\n const removeListeners = useCallback(() => {\n if (handlersRef.current) {\n document.removeEventListener(\"mousedown\", handlersRef.current.clickOutside);\n document.removeEventListener(\"keydown\", handlersRef.current.escape);\n }\n }, []);\n\n const addListeners = useCallback(() => {\n if (handlersRef.current) {\n document.addEventListener(\"mousedown\", handlersRef.current.clickOutside);\n document.addEventListener(\"keydown\", handlersRef.current.escape);\n }\n }, []);\n\n // Initialize handlers once\n if (!handlersRef.current) {\n handlersRef.current = {\n clickOutside: (e: globalThis.MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setDropdownOpen(false);\n removeListeners();\n }\n },\n escape: (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setDropdownOpen(false);\n removeListeners();\n }\n },\n };\n }\n\n const setDropdownOpenWithListeners = useCallback(\n (open: boolean) => {\n setDropdownOpen(open);\n if (open) {\n addListeners();\n } else {\n removeListeners();\n }\n },\n [addListeners, removeListeners]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n removeListeners();\n if (copyTimeoutRef.current) {\n clearTimeout(copyTimeoutRef.current);\n }\n };\n }, [removeListeners]);\n\n const handleButtonClick = useCallback(() => {\n if (isConnected) {\n if (showDropdown) {\n setDropdownOpenWithListeners(!dropdownOpen);\n } else {\n disconnect();\n }\n } else if (!isConnecting) {\n setModalOpen(true);\n }\n }, [\n isConnected,\n isConnecting,\n showDropdown,\n disconnect,\n setDropdownOpenWithListeners,\n dropdownOpen,\n ]);\n\n const handleCopyAddress = useCallback(async () => {\n if (!account?.address) return;\n try {\n await navigator.clipboard.writeText(account.address);\n setCopied(true);\n if (copyTimeoutRef.current) {\n clearTimeout(copyTimeoutRef.current);\n }\n copyTimeoutRef.current = setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error(\"Failed to copy address:\", err);\n }\n }, [account?.address]);\n\n const handleModalConnect = useCallback(\n (walletName: string, address: string) => {\n setModalOpen(false);\n onConnect?.(walletName, address);\n },\n [onConnect]\n );\n\n const getButtonLabel = (): string => {\n if (isConnecting) return connectingLabel;\n if (isConnected && account) {\n if (typeof connectedLabel === \"function\") {\n return connectedLabel(account.address, wallet?.name ?? \"\");\n }\n if (typeof connectedLabel === \"string\") return connectedLabel;\n return truncateAddress(account.address);\n }\n return label;\n };\n\n const buttonStyles: CSSProperties = {\n ...defaultStyles.button,\n ...(isConnected ? defaultStyles.buttonConnected : {}),\n ...(disabled || isConnecting ? defaultStyles.buttonDisabled : {}),\n ...style,\n };\n\n return (\n <div ref={containerRef} style={defaultStyles.container} data-frost=\"connect-button-container\">\n <button\n type=\"button\"\n onClick={handleButtonClick}\n disabled={disabled || isConnecting}\n className={className}\n style={buttonStyles}\n data-frost=\"connect-button\"\n data-connected={isConnected ? \"true\" : undefined}\n data-connecting={isConnecting ? \"true\" : undefined}\n aria-expanded={dropdownOpen}\n aria-haspopup={isConnected && showDropdown ? \"menu\" : undefined}\n onMouseEnter={e => {\n if (!disabled && !isConnecting) e.currentTarget.style.opacity = \"0.9\";\n }}\n onMouseLeave={e => {\n e.currentTarget.style.opacity = \"1\";\n }}\n >\n {isConnecting && <div style={defaultStyles.spinner} data-frost=\"spinner\" />}\n {isConnected && wallet?.icon && (\n <img\n src={wallet.icon}\n alt={wallet.name}\n style={defaultStyles.walletIcon}\n data-frost=\"wallet-icon\"\n />\n )}\n <span>{getButtonLabel()}</span>\n {isConnected && showDropdown && <ChevronIcon direction={dropdownOpen ? \"up\" : \"down\"} />}\n </button>\n\n {isConnected && showDropdown && dropdownOpen && (\n <div\n role=\"menu\"\n className={dropdownClassName}\n style={defaultStyles.dropdown}\n data-frost=\"dropdown\"\n >\n <div style={defaultStyles.addressDisplay} data-frost=\"address-display\">\n {account.address}\n </div>\n <hr style={defaultStyles.dropdownDivider} />\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={handleCopyAddress}\n style={defaultStyles.dropdownItem}\n data-frost=\"dropdown-item\"\n onMouseEnter={e => {\n e.currentTarget.style.backgroundColor = \"var(--frost-hover-bg, #f3f4f6)\";\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <CopyIcon />\n <span>{copied ? \"Copied!\" : \"Copy Address\"}</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={() => disconnect()}\n style={{ ...defaultStyles.dropdownItem, color: \"var(--frost-danger, #ef4444)\" }}\n data-frost=\"dropdown-item\"\n data-action=\"disconnect\"\n onMouseEnter={e => {\n e.currentTarget.style.backgroundColor = \"var(--frost-hover-bg, #f3f4f6)\";\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <DisconnectIcon />\n <span>Disconnect</span>\n </button>\n </div>\n )}\n\n <WalletModal\n open={modalOpen}\n onClose={() => setModalOpen(false)}\n onConnect={handleModalConnect}\n onError={onError}\n title={modalTitle}\n />\n </div>\n );\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { AccountEntity, FrostAppState } from \"@rialo/frost-core\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useMemo } from \"react\";\nimport { useFrostConfig } from \"../context\";\n\n/**\n * Selector for accounts map.\n * Defined at module level since it has no dependencies and never changes.\n */\nconst selectAccountsMap = (state: FrostAppState): Map<string, AccountEntity> => state.accounts;\n\n/**\n * Hook to get all known accounts.\n *\n * @returns Array of account entities (memoized)\n *\n * @example\n * ```tsx\n * function AccountList() {\n * const accounts = useAccounts();\n *\n * return (\n * <ul>\n * {accounts.map(acc => (\n * <li key={acc.address}>{acc.address}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useAccounts(): AccountEntity[] {\n const config = useFrostConfig();\n // Select just the Map reference - this is stable when accounts haven't changed\n const accountsMap = useStore(config.store, selectAccountsMap);\n\n // Memoize the array derivation\n return useMemo(() => Array.from(accountsMap.values()), [accountsMap]);\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { FrostAppState, RialoClientConfig } from \"@rialo/frost-core\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useCallback } from \"react\";\nimport { useFrostConfig } from \"../context\";\n\nexport interface UseSwitchChainOptions {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Selector for chain ID.\n * Defined at module level since it has no dependencies and never changes.\n */\nconst selectChainId = (state: FrostAppState): string => state.chainId;\n\n/**\n * Hook to switch to a different chain/network.\n *\n * @example\n * ```tsx\n * import { getDefaultRialoClientConfig } from '@rialo/ts-cdk';\n *\n * function NetworkSwitcher() {\n * const switchChain = useSwitchChain();\n *\n * return (\n * <button\n * onClick={() => switchChain(getDefaultRialoClientConfig('mainnet'))}\n * >\n * Switch to Mainnet\n * </button>\n * );\n * }\n * ```\n */\nexport function useSwitchChain(): (clientConfig: RialoClientConfig) => void {\n const config = useFrostConfig();\n\n const switchChain = useCallback(\n () =>\n (clientConfig: RialoClientConfig): void => {\n config.switchChain(clientConfig);\n },\n [config]\n );\n\n return switchChain;\n}\n\n/**\n * Hook to get the current chain ID.\n * Reactively updates when chain changes.\n *\n * The selector is stable (defined at module level) to prevent\n * unnecessary re-subscriptions.\n *\n * @example\n * ```tsx\n * function NetworkDisplay() {\n * const chainId = useChainId();\n * return <div>Connected to: {chainId}</div>;\n * }\n * ```\n */\nexport function useChainId(): string {\n const config = useFrostConfig();\n return useStore(config.store, selectChainId);\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { RialoClient } from \"@rialo/frost-core\";\nimport { useFrostConfig } from \"../context/FrostContext\";\n\n/**\n * Hook to access the RialoClient instance.\n *\n * The client can be used for blockchain queries and transactions:\n * - Query balances and account info\n * - Get transaction details\n * - Send signed transactions directly\n * - Request airdrops (devnet/testnet)\n *\n * @example\n * ```tsx\n * function BalanceDisplay({ address }: { address: string }) {\n * const client = useClient();\n * const [balance, setBalance] = useState<bigint | null>(null);\n *\n * useEffect(() => {\n * client.getBalance(PublicKey.fromString(address))\n * .then(setBalance);\n * }, [client, address]);\n *\n * return <div>Balance: {balance?.toString() ?? 'Loading...'}</div>;\n * }\n * ```\n */\nexport function useClient(): RialoClient {\n const config = useFrostConfig();\n return config.client;\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { FrostAppState } from \"@rialo/frost-core\";\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useFrostConfig } from \"../context\";\n\nexport interface UseNativeBalanceOptions {\n /**\n * Address to query balance for.\n * Defaults to the active account address if not provided.\n */\n address?: string;\n\n /**\n * Number of decimal places for the native token.\n * Used for formatting the balance.\n * @default 9 (standard for Solana-based chains)\n */\n decimals?: number;\n}\n\nexport interface UseNativeBalanceResult {\n /** Raw balance in lamports/smallest unit */\n balance: bigint | undefined;\n\n /** Human-readable formatted balance (e.g., \"1.5\") */\n formatted: string | undefined;\n\n /** Whether the query is currently loading */\n isLoading: boolean;\n\n /** Whether the query is fetching (initial or refetch) */\n isFetching: boolean;\n\n /** Whether the query encountered an error */\n isError: boolean;\n\n /** Error object if query failed */\n error: Error | null;\n\n /** Manually trigger a refetch */\n refetch: () => void;\n}\n\n/**\n * Selector for active account address.\n * Defined at module level for stability.\n */\nconst selectAccountAddress = (state: FrostAppState): string | null => state.accountAddress;\n\n/**\n * Formats a raw balance (in lamports) to a human-readable string.\n */\nfunction formatBalance(balance: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const integerPart = balance / divisor;\n const fractionalPart = balance % divisor;\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmed = fractionalStr.replace(/0+$/, \"\");\n\n if (!trimmed) {\n return integerPart.toString();\n }\n\n return `${integerPart}.${trimmed}`;\n}\n\n/**\n * Hook to query the native token balance for an address.\n *\n * @example\n * ```tsx\n * function MyBalance() {\n * const { balance, formatted, isLoading } = useNativeBalance();\n * if (isLoading) return <div>Loading...</div>;\n * return <div>Balance: {formatted} RIA</div>;\n * }\n * ```\n */\nexport function useNativeBalance(options: UseNativeBalanceOptions = {}): UseNativeBalanceResult {\n const { decimals = 9 } = options;\n\n const config = useFrostConfig();\n const activeAddress = useStore(config.store, selectAccountAddress);\n\n const address = options.address ?? activeAddress;\n\n const hasAddress = !!address;\n\n const query = useQuery({\n queryKey: [\"frost\", \"nativeBalance\", address, config.getChainId()],\n queryFn: (): Promise<bigint> => {\n if (!address) throw new Error(\"No address provided\");\n\n return config.client.getBalance(PublicKey.fromString(address));\n },\n enabled: hasAddress,\n });\n\n return {\n balance: query.data,\n formatted: query.data !== undefined ? formatBalance(query.data, decimals) : undefined,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n isError: query.isError,\n error: query.error,\n refetch: () => {\n void query.refetch();\n },\n };\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { SignMessageOptions, SignMessageResult } from \"@rialo/frost-core\";\nimport { signMessage } from \"@rialo/frost-core\";\nimport type { UseMutationResult } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useFrostConfig } from \"../context\";\n\nexport interface UseSignMessageOptions {\n onSuccess?: (result: SignMessageResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook to sign an arbitrary message.\n *\n * @param options - Callbacks for success/error handling\n * @returns Mutation to trigger message signing\n *\n * @example\n * ```tsx\n * function SignButton() {\n * const { mutate: sign, isPending } = useSignMessage({\n * onSuccess: (result) => console.log('Signature:', result.signature),\n * });\n *\n * return (\n * <button onClick={() => sign({ message: 'Hello World' })} disabled={isPending}>\n * Sign Message\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignMessage(\n options?: UseSignMessageOptions\n): UseMutationResult<SignMessageResult, Error, SignMessageOptions> {\n const config = useFrostConfig();\n\n return useMutation({\n mutationKey: [\"frost\", \"signMessage\"],\n mutationFn: (msgOptions: SignMessageOptions) => signMessage(config, msgOptions),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n}","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n SendTransactionResult,\n SendTransactionType,\n SignAndSendTransactionOptions,\n SignAndSendTransactionResult,\n SignTransactionOptions,\n SignTransactionResult,\n} from \"@rialo/frost-core\";\nimport { sendTransaction, signAndSendTransaction, signTransaction } from \"@rialo/frost-core\";\nimport type { UseMutationResult } from \"@tanstack/react-query\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useFrostConfig } from \"../context\";\n\nexport interface UseSignTransactionOptions {\n onSuccess?: (result: SignTransactionResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook to sign a transaction without sending.\n *\n * @param options - Callbacks for success/error handling\n * @returns Mutation to trigger transaction signing\n *\n * @example\n * ```tsx\n * function SignTxButton({ transaction }: { transaction: Uint8Array }) {\n * const { mutate: sign, isPending } = useSignTransaction();\n *\n * return (\n * <button onClick={() => sign({ transaction })} disabled={isPending}>\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignTransaction(\n options?: UseSignTransactionOptions\n): UseMutationResult<SignTransactionResult, Error, SignTransactionOptions> {\n const config = useFrostConfig();\n\n return useMutation({\n mutationKey: [\"frost\", \"signTransaction\"],\n mutationFn: (txOptions: SignTransactionOptions) => signTransaction(config, txOptions),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n}\n\nexport interface UseSendTransactionOptions {\n onSuccess?: (result: SendTransactionResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook to sign and send a transaction using the wallet's built-in send feature.\n *\n * @param options - Callbacks for success/error handling\n * @returns Mutation to trigger transaction signing and sending\n *\n * @example\n * ```tsx\n * function SendTxButton({ transaction }: { transaction: Uint8Array }) {\n * const { mutate: send, isPending } = useSendTransaction();\n *\n * return (\n * <button onClick={() => send({ transaction })} disabled={isPending}>\n * Send Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSendTransaction(\n options?: UseSendTransactionOptions\n): UseMutationResult<SendTransactionResult, Error, SendTransactionType> {\n const config = useFrostConfig();\n\n return useMutation({\n mutationKey: [\"frost\", \"sendTransaction\"],\n mutationFn: (txOptions: SendTransactionType) => sendTransaction(config, txOptions),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n}\n\nexport interface UseSignAndSendTransactionOptions {\n onSuccess?: (result: SignAndSendTransactionResult) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook to sign a transaction with the wallet, send it via Frost's RPC client,\n * and wait for confirmation.\n *\n * This provides more control over transaction submission compared to useSendTransaction,\n * as it uses Frost's own RPC client instead of the wallet's built-in send.\n * This is useful when you want to:\n * - Use a custom RPC URL (configured via ChainDefinition.rpcUrl)\n * - Have more control over retry logic and confirmation\n * - Not rely on the wallet's send implementation\n *\n * @returns Mutation that resolves with confirmed transaction details (signature, executed)\n * @throws {TransactionFailedError} If the transaction is confirmed but execution failed on-chain\n *\n * @example\n * ```tsx\n * function SendButton() {\n * const { mutate: signAndSend, isPending } = useSignAndSendTransaction({\n * onSuccess: (result) => {\n * console.log('Confirmed and executed:', result.signature);\n * },\n * onError: (error) => {\n * if (error instanceof TransactionFailedError) {\n * console.error('Transaction failed on-chain:', error.reason);\n * }\n * },\n * });\n *\n * const handleSend = () => {\n * signAndSend({\n * transaction: myTransaction,\n * sendOptions: { skipPreflight: false, maxRetries: 3 },\n * });\n * };\n *\n * return <button onClick={handleSend} disabled={isPending}>Send</button>;\n * }\n * ```\n */\nexport function useSignAndSendTransaction(\n options?: UseSignAndSendTransactionOptions\n): UseMutationResult<SignAndSendTransactionResult, Error, SignAndSendTransactionOptions> {\n const config = useFrostConfig();\n\n return useMutation({\n mutationKey: [\"frost\", \"signAndSendTransaction\"],\n mutationFn: (txOptions: SignAndSendTransactionOptions) =>\n signAndSendTransaction(config, txOptions),\n onSuccess: options?.onSuccess,\n onError: options?.onError,\n });\n}"]}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@rialo/frost",
3
+ "version": "0.1.0",
4
+ "description": "React wallet integration library for Rialo DApps",
5
+ "keywords": [
6
+ "rialo",
7
+ "react",
8
+ "wallet",
9
+ "web3",
10
+ "blockchain",
11
+ "hooks"
12
+ ],
13
+ "license": "Apache-2.0",
14
+ "author": "Subzero Labs <build@subzero.xyz>",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/SubzeroLabs/rialo.git",
18
+ "directory": "cdk/frost/react"
19
+ },
20
+ "homepage": "https://github.com/SubzeroLabs/rialo/tree/main/cdk/frost",
21
+ "bugs": {
22
+ "url": "https://github.com/SubzeroLabs/rialo/issues"
23
+ },
24
+ "sideEffects": false,
25
+ "type": "module",
26
+ "main": "./dist/index.cjs",
27
+ "module": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js",
33
+ "require": "./dist/index.cjs"
34
+ }
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "LICENSE"
40
+ ],
41
+ "peerDependencies": {
42
+ "react": "^18.0.0 || ^19.0.0"
43
+ },
44
+ "dependencies": {
45
+ "@rialo/ts-cdk": "0.1.5",
46
+ "@tanstack/react-query": "5.90.10",
47
+ "@tanstack/react-store": "0.8.0",
48
+ "@rialo/frost-core": "^0.1.0"
49
+ },
50
+ "devDependencies": {
51
+ "@testing-library/jest-dom": "6.9.1",
52
+ "@testing-library/react": "16.3.0",
53
+ "@testing-library/user-event": "14.6.1",
54
+ "@types/react": "19.1.10",
55
+ "@vitejs/plugin-react": "5.1.1",
56
+ "jsdom": "26.1.0",
57
+ "react": "19.1.0",
58
+ "react-dom": "19.1.0",
59
+ "tsup": "8.3.5",
60
+ "typescript": "5.9.3",
61
+ "vitest": "3.2.4"
62
+ },
63
+ "engines": {
64
+ "node": ">=18.0.0"
65
+ },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
69
+ "scripts": {
70
+ "build": "tsup",
71
+ "dev": "tsup --watch",
72
+ "check-types": "tsc --noEmit",
73
+ "lint": "biome check src/",
74
+ "lint:fix": "biome check --write src/",
75
+ "test": "vitest run --pass-with-no-tests",
76
+ "test:watch": "vitest"
77
+ }
78
+ }