import { useContext, useCallback, useState } from 'react' import { ConnectionContext } from '../providers/ConnectionProvider' import type { EIP712TypedData, UseSignTypedDataReturn, WalletError } from '@meshconnect/uwc-types' /** * Hook for signing EIP-712 typed structured data (eth_signTypedData_v4). * * Used by ERC-3009 (Transfer With Authorization) and EIP-2612 (Permit) relay * flows — the user signs an off-chain authorization and Mesh's backend submits * the transaction and pays gas. EVM-only (eip155); throws for TON connections. * * @returns Object containing signTypedData function, loading state, last signature, and error * @throws Error if used outside of ConnectionProvider * @example * ```tsx * const { signTypedData, isLoading, signature } = useSignTypedData() * * const handleSign = async () => { * try { * const sig = await signTypedData(typedData) * // send sig to the relay endpoint * } catch (error) { * console.error('Failed to sign:', error) * } * } * ``` */ export function useSignTypedData(): UseSignTypedDataReturn { const context = useContext(ConnectionContext) if (!context) { throw new Error('useSignTypedData must be used within a ConnectionProvider') } const { connector, session } = context const [isLoading, setIsLoading] = useState(false) const [signature, setSignature] = useState() const [error, setError] = useState() const signTypedData = useCallback( async (typedData: EIP712TypedData): Promise => { if (!session.activeAddress) { throw new Error('No wallet connected') } setIsLoading(true) setError(undefined) try { const sig = await connector.signTypedData(typedData) setSignature(sig) return sig } catch (err) { const walletError = err as WalletError setError(walletError) throw err } finally { setIsLoading(false) } }, [connector, session.activeAddress] ) return { signTypedData, isLoading, signature, error } }